puppet 6.11.1 → 6.16.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (395) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +3 -8
  3. data/CONTRIBUTING.md +7 -13
  4. data/Gemfile +1 -0
  5. data/Gemfile.lock +39 -36
  6. data/README.md +17 -24
  7. data/ext/build_defaults.yaml +1 -0
  8. data/ext/project_data.yaml +1 -1
  9. data/ext/windows/service/daemon.rb +25 -20
  10. data/lib/puppet.rb +52 -13
  11. data/lib/puppet/agent.rb +20 -14
  12. data/lib/puppet/application/agent.rb +12 -14
  13. data/lib/puppet/application/describe.rb +7 -5
  14. data/lib/puppet/application/device.rb +2 -2
  15. data/lib/puppet/application/filebucket.rb +19 -15
  16. data/lib/puppet/application/plugin.rb +1 -0
  17. data/lib/puppet/application/resource.rb +1 -1
  18. data/lib/puppet/application/ssl.rb +4 -4
  19. data/lib/puppet/concurrent.rb +2 -0
  20. data/lib/puppet/concurrent/lock.rb +16 -0
  21. data/lib/puppet/concurrent/synchronized.rb +15 -0
  22. data/lib/puppet/concurrent/thread_local_singleton.rb +14 -0
  23. data/lib/puppet/configurer.rb +85 -83
  24. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  25. data/lib/puppet/context/trusted_information.rb +14 -8
  26. data/lib/puppet/daemon.rb +13 -27
  27. data/lib/puppet/defaults.rb +158 -40
  28. data/lib/puppet/environments.rb +30 -20
  29. data/lib/puppet/error.rb +9 -1
  30. data/lib/puppet/face/facts.rb +8 -5
  31. data/lib/puppet/face/help.rb +29 -3
  32. data/lib/puppet/face/module/search.rb +5 -0
  33. data/lib/puppet/face/plugin.rb +2 -2
  34. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  35. data/lib/puppet/file_system/file_impl.rb +13 -9
  36. data/lib/puppet/file_system/memory_file.rb +6 -0
  37. data/lib/puppet/file_system/memory_impl.rb +13 -0
  38. data/lib/puppet/file_system/uniquefile.rb +4 -0
  39. data/lib/puppet/file_system/windows.rb +7 -10
  40. data/lib/puppet/forge.rb +3 -3
  41. data/lib/puppet/forge/errors.rb +2 -2
  42. data/lib/puppet/forge/repository.rb +31 -86
  43. data/lib/puppet/functions/call.rb +1 -1
  44. data/lib/puppet/functions/camelcase.rb +2 -2
  45. data/lib/puppet/functions/epp.rb +4 -4
  46. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  47. data/lib/puppet/functions/filter.rb +1 -0
  48. data/lib/puppet/functions/find_file.rb +9 -9
  49. data/lib/puppet/functions/find_template.rb +63 -0
  50. data/lib/puppet/functions/inline_epp.rb +5 -5
  51. data/lib/puppet/functions/reduce.rb +2 -4
  52. data/lib/puppet/http.rb +7 -0
  53. data/lib/puppet/http/client.rb +341 -54
  54. data/lib/puppet/http/errors.rb +2 -0
  55. data/lib/puppet/http/external_client.rb +90 -0
  56. data/lib/puppet/http/redirector.rb +34 -0
  57. data/lib/puppet/http/resolver.rb +57 -1
  58. data/lib/puppet/http/resolver/server_list.rb +98 -0
  59. data/lib/puppet/http/resolver/settings.rb +23 -2
  60. data/lib/puppet/http/resolver/srv.rb +36 -4
  61. data/lib/puppet/http/response.rb +68 -1
  62. data/lib/puppet/http/retry_after_handler.rb +39 -0
  63. data/lib/puppet/http/service.rb +179 -3
  64. data/lib/puppet/http/service/ca.rb +84 -21
  65. data/lib/puppet/http/service/compiler.rb +319 -0
  66. data/lib/puppet/http/service/file_server.rb +206 -0
  67. data/lib/puppet/http/service/report.rb +66 -0
  68. data/lib/puppet/http/session.rb +106 -31
  69. data/lib/puppet/indirector/catalog/compiler.rb +10 -0
  70. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  71. data/lib/puppet/indirector/facts/rest.rb +42 -0
  72. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  73. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  74. data/lib/puppet/indirector/file_content/http.rb +5 -0
  75. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  76. data/lib/puppet/indirector/file_metadata/http.rb +4 -4
  77. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  78. data/lib/puppet/indirector/json.rb +1 -1
  79. data/lib/puppet/indirector/msgpack.rb +1 -1
  80. data/lib/puppet/indirector/node/rest.rb +24 -0
  81. data/lib/puppet/indirector/report/rest.rb +19 -0
  82. data/lib/puppet/indirector/report/yaml.rb +23 -0
  83. data/lib/puppet/indirector/rest.rb +12 -0
  84. data/lib/puppet/indirector/status/rest.rb +18 -0
  85. data/lib/puppet/loaders.rb +6 -0
  86. data/lib/puppet/metatype/manager.rb +80 -80
  87. data/lib/puppet/network/http/base_pool.rb +19 -1
  88. data/lib/puppet/network/http/compression.rb +7 -0
  89. data/lib/puppet/network/http/connection.rb +6 -0
  90. data/lib/puppet/network/http/connection_adapter.rb +182 -0
  91. data/lib/puppet/network/http/nocache_pool.rb +2 -0
  92. data/lib/puppet/network/http/pool.rb +13 -6
  93. data/lib/puppet/network/http_pool.rb +2 -1
  94. data/lib/puppet/node/environment.rb +24 -8
  95. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  96. data/lib/puppet/pal/pal_impl.rb +9 -29
  97. data/lib/puppet/parser/ast/pops_bridge.rb +6 -11
  98. data/lib/puppet/parser/compiler.rb +42 -32
  99. data/lib/puppet/parser/functions.rb +18 -13
  100. data/lib/puppet/parser/functions/epp.rb +3 -3
  101. data/lib/puppet/parser/functions/filter.rb +1 -0
  102. data/lib/puppet/parser/functions/inline_epp.rb +5 -5
  103. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
  105. data/lib/puppet/pops/evaluator/runtime3_support.rb +1 -1
  106. data/lib/puppet/pops/loader/puppet_plan_instantiator.rb +12 -3
  107. data/lib/puppet/pops/loaders.rb +7 -5
  108. data/lib/puppet/pops/lookup/invocation.rb +10 -3
  109. data/lib/puppet/pops/model/pn_transformer.rb +5 -9
  110. data/lib/puppet/pops/parser/evaluating_parser.rb +8 -11
  111. data/lib/puppet/pops/serialization/json_path.rb +3 -3
  112. data/lib/puppet/pops/time/timespan.rb +3 -5
  113. data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
  114. data/lib/puppet/pops/types/string_converter.rb +6 -9
  115. data/lib/puppet/pops/types/type_calculator.rb +30 -10
  116. data/lib/puppet/pops/types/type_formatter.rb +9 -11
  117. data/lib/puppet/pops/types/type_parser.rb +3 -3
  118. data/lib/puppet/pops/validation/checker4_0.rb +1 -1
  119. data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
  120. data/lib/puppet/provider/aix_object.rb +4 -2
  121. data/lib/puppet/provider/group/aix.rb +1 -0
  122. data/lib/puppet/provider/group/groupadd.rb +57 -24
  123. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  124. data/lib/puppet/provider/package/aix.rb +17 -2
  125. data/lib/puppet/provider/package/apt.rb +78 -4
  126. data/lib/puppet/provider/package/dnfmodule.rb +69 -15
  127. data/lib/puppet/provider/package/dpkg.rb +14 -7
  128. data/lib/puppet/provider/package/fink.rb +20 -3
  129. data/lib/puppet/provider/package/gem.rb +41 -7
  130. data/lib/puppet/provider/package/openbsd.rb +13 -1
  131. data/lib/puppet/provider/package/pacman.rb +2 -5
  132. data/lib/puppet/provider/package/pip.rb +143 -48
  133. data/lib/puppet/provider/package/pip3.rb +0 -2
  134. data/lib/puppet/provider/package/pkg.rb +18 -5
  135. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  136. data/lib/puppet/provider/package/pkgng.rb +16 -4
  137. data/lib/puppet/provider/package/portage.rb +5 -5
  138. data/lib/puppet/provider/package/puppet_gem.rb +6 -2
  139. data/lib/puppet/provider/package/rpm.rb +6 -213
  140. data/lib/puppet/provider/package/yum.rb +108 -24
  141. data/lib/puppet/provider/package/zypper.rb +59 -1
  142. data/lib/puppet/provider/package_targetable.rb +5 -4
  143. data/lib/puppet/provider/service/systemd.rb +23 -5
  144. data/lib/puppet/provider/user/aix.rb +1 -0
  145. data/lib/puppet/provider/user/directoryservice.rb +30 -5
  146. data/lib/puppet/provider/user/hpux.rb +1 -1
  147. data/lib/puppet/provider/user/useradd.rb +11 -8
  148. data/lib/puppet/reports/http.rb +13 -9
  149. data/lib/puppet/reports/store.rb +1 -1
  150. data/lib/puppet/resource/type_collection.rb +20 -16
  151. data/lib/puppet/runtime.rb +32 -1
  152. data/lib/puppet/settings.rb +4 -0
  153. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  154. data/lib/puppet/ssl.rb +1 -0
  155. data/lib/puppet/ssl/certificate.rb +2 -1
  156. data/lib/puppet/ssl/host.rb +4 -4
  157. data/lib/puppet/ssl/oids.rb +1 -0
  158. data/lib/puppet/ssl/ssl_provider.rb +20 -0
  159. data/lib/puppet/ssl/state_machine.rb +81 -35
  160. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  161. data/lib/puppet/test/test_helper.rb +7 -1
  162. data/lib/puppet/transaction.rb +33 -11
  163. data/lib/puppet/transaction/report.rb +2 -2
  164. data/lib/puppet/transaction/resource_harness.rb +1 -1
  165. data/lib/puppet/type.rb +7 -2
  166. data/lib/puppet/type/file.rb +13 -0
  167. data/lib/puppet/type/file/data_sync.rb +5 -1
  168. data/lib/puppet/type/file/source.rb +49 -58
  169. data/lib/puppet/type/group.rb +5 -4
  170. data/lib/puppet/type/package.rb +102 -10
  171. data/lib/puppet/type/service.rb +6 -8
  172. data/lib/puppet/type/user.rb +6 -30
  173. data/lib/puppet/util.rb +34 -11
  174. data/lib/puppet/util/at_fork.rb +1 -1
  175. data/lib/puppet/util/autoload.rb +4 -18
  176. data/lib/puppet/util/instance_loader.rb +14 -10
  177. data/lib/puppet/util/log/destinations.rb +2 -11
  178. data/lib/puppet/util/logging.rb +30 -18
  179. data/lib/puppet/util/package/version/debian.rb +175 -0
  180. data/lib/puppet/util/package/version/gem.rb +15 -0
  181. data/lib/puppet/util/package/version/pip.rb +167 -0
  182. data/lib/puppet/util/package/version/range.rb +53 -0
  183. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  184. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  185. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  186. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  187. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  188. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  189. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  190. data/lib/puppet/util/package/version/rpm.rb +73 -0
  191. data/lib/puppet/util/pidlock.rb +36 -10
  192. data/lib/puppet/util/platform.rb +5 -0
  193. data/lib/puppet/util/plist.rb +6 -0
  194. data/lib/puppet/util/rpm_compare.rb +193 -0
  195. data/lib/puppet/util/storage.rb +0 -1
  196. data/lib/puppet/util/windows/adsi.rb +50 -20
  197. data/lib/puppet/util/windows/process.rb +15 -14
  198. data/lib/puppet/util/windows/security.rb +1 -0
  199. data/lib/puppet/util/windows/sid.rb +3 -3
  200. data/lib/puppet/util/yaml.rb +1 -1
  201. data/lib/puppet/version.rb +1 -1
  202. data/lib/puppet/x509/cert_provider.rb +9 -5
  203. data/locales/puppet.pot +640 -521
  204. data/man/man5/puppet.conf.5 +88 -9
  205. data/man/man8/puppet-agent.8 +6 -6
  206. data/man/man8/puppet-apply.8 +1 -1
  207. data/man/man8/puppet-catalog.8 +1 -1
  208. data/man/man8/puppet-config.8 +1 -1
  209. data/man/man8/puppet-describe.8 +1 -1
  210. data/man/man8/puppet-device.8 +2 -2
  211. data/man/man8/puppet-doc.8 +1 -1
  212. data/man/man8/puppet-epp.8 +1 -1
  213. data/man/man8/puppet-facts.8 +1 -1
  214. data/man/man8/puppet-filebucket.8 +17 -2
  215. data/man/man8/puppet-generate.8 +1 -1
  216. data/man/man8/puppet-help.8 +6 -3
  217. data/man/man8/puppet-key.8 +1 -1
  218. data/man/man8/puppet-lookup.8 +1 -1
  219. data/man/man8/puppet-man.8 +1 -1
  220. data/man/man8/puppet-module.8 +4 -1
  221. data/man/man8/puppet-node.8 +1 -1
  222. data/man/man8/puppet-parser.8 +1 -1
  223. data/man/man8/puppet-plugin.8 +1 -1
  224. data/man/man8/puppet-report.8 +1 -1
  225. data/man/man8/puppet-resource.8 +1 -1
  226. data/man/man8/puppet-script.8 +1 -1
  227. data/man/man8/puppet-ssl.8 +2 -2
  228. data/man/man8/puppet-status.8 +1 -1
  229. data/man/man8/puppet.8 +2 -2
  230. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  231. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  232. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  233. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  234. data/spec/fixtures/unit/forge/bacula.json +76 -0
  235. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  236. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  237. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  238. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  239. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  240. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -102
  241. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +1 -106
  242. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -106
  243. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -102
  244. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -98
  245. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -102
  246. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +1 -102
  247. data/spec/integration/application/agent_spec.rb +394 -0
  248. data/spec/integration/application/apply_spec.rb +132 -3
  249. data/spec/integration/application/filebucket_spec.rb +190 -0
  250. data/spec/integration/application/plugin_spec.rb +73 -0
  251. data/spec/integration/configurer_spec.rb +26 -7
  252. data/spec/integration/http/client_spec.rb +154 -0
  253. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  254. data/spec/integration/indirector/report/yaml.rb +83 -0
  255. data/spec/integration/module_tool/forge_spec.rb +51 -0
  256. data/spec/integration/network/http_pool_spec.rb +76 -20
  257. data/spec/integration/node/environment_spec.rb +15 -0
  258. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  259. data/spec/lib/puppet/test_ca.rb +2 -2
  260. data/spec/lib/puppet_spec/https.rb +20 -9
  261. data/spec/lib/puppet_spec/puppetserver.rb +119 -0
  262. data/spec/shared_contexts/https.rb +29 -0
  263. data/spec/spec_helper.rb +6 -2
  264. data/spec/unit/agent_spec.rb +80 -26
  265. data/spec/unit/application/agent_spec.rb +9 -5
  266. data/spec/unit/application/apply_spec.rb +2 -12
  267. data/spec/unit/application/describe_spec.rb +88 -50
  268. data/spec/unit/application/device_spec.rb +2 -2
  269. data/spec/unit/application/filebucket_spec.rb +22 -2
  270. data/spec/unit/application/resource_spec.rb +2 -2
  271. data/spec/unit/concurrent/lock_spec.rb +29 -0
  272. data/spec/unit/configurer/fact_handler_spec.rb +0 -4
  273. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  274. data/spec/unit/configurer_spec.rb +400 -406
  275. data/spec/unit/context/trusted_information_spec.rb +17 -0
  276. data/spec/unit/daemon_spec.rb +5 -64
  277. data/spec/unit/defaults_spec.rb +38 -4
  278. data/spec/unit/environments_spec.rb +65 -28
  279. data/spec/unit/face/facts_spec.rb +24 -20
  280. data/spec/unit/face/module/search_spec.rb +17 -0
  281. data/spec/unit/face/plugin_spec.rb +12 -10
  282. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  283. data/spec/unit/file_system_spec.rb +26 -2
  284. data/spec/unit/forge/errors_spec.rb +1 -1
  285. data/spec/unit/forge/forge_spec.rb +12 -54
  286. data/spec/unit/forge/module_release_spec.rb +19 -6
  287. data/spec/unit/forge/repository_spec.rb +63 -157
  288. data/spec/unit/forge_spec.rb +46 -116
  289. data/spec/unit/functions/find_template_spec.rb +69 -0
  290. data/spec/unit/functions/lookup_spec.rb +13 -0
  291. data/spec/unit/http/client_spec.rb +395 -27
  292. data/spec/unit/http/external_client_spec.rb +201 -0
  293. data/spec/unit/http/resolver_spec.rb +81 -12
  294. data/spec/unit/http/response_spec.rb +69 -0
  295. data/spec/unit/http/service/ca_spec.rb +100 -7
  296. data/spec/unit/http/service/compiler_spec.rb +627 -0
  297. data/spec/unit/http/service/file_server_spec.rb +308 -0
  298. data/spec/unit/http/service/report_spec.rb +118 -0
  299. data/spec/unit/http/service_spec.rb +117 -4
  300. data/spec/unit/http/session_spec.rb +237 -19
  301. data/spec/unit/indirector/catalog/compiler_spec.rb +47 -29
  302. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  303. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  304. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  305. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  306. data/spec/unit/indirector/file_metadata/http_spec.rb +167 -0
  307. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  308. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  309. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  310. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  311. data/spec/unit/indirector/rest_spec.rb +13 -0
  312. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  313. data/spec/unit/network/http/connection_spec.rb +549 -176
  314. data/spec/unit/network/http/nocache_pool_spec.rb +25 -3
  315. data/spec/unit/network/http/pool_spec.rb +89 -11
  316. data/spec/unit/network/http_pool_spec.rb +63 -57
  317. data/spec/unit/network/http_spec.rb +1 -1
  318. data/spec/unit/node/environment_spec.rb +16 -0
  319. data/spec/unit/node/facts_spec.rb +2 -1
  320. data/spec/unit/node_spec.rb +7 -4
  321. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
  322. data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
  323. data/spec/unit/pops/validator/validator_spec.rb +7 -2
  324. data/spec/unit/provider/aix_object_spec.rb +16 -2
  325. data/spec/unit/provider/group/groupadd_spec.rb +181 -56
  326. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  327. data/spec/unit/provider/package/aix_spec.rb +29 -0
  328. data/spec/unit/provider/package/apt_spec.rb +43 -2
  329. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  330. data/spec/unit/provider/package/dnfmodule_spec.rb +76 -15
  331. data/spec/unit/provider/package/dpkg_spec.rb +28 -6
  332. data/spec/unit/provider/package/gem_spec.rb +40 -0
  333. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  334. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  335. data/spec/unit/provider/package/pip_spec.rb +68 -19
  336. data/spec/unit/provider/package/pkg_spec.rb +15 -1
  337. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  338. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  339. data/spec/unit/provider/package/portage_spec.rb +9 -4
  340. data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
  341. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  342. data/spec/unit/provider/package/yum_spec.rb +292 -0
  343. data/spec/unit/provider/package/zypper_spec.rb +84 -0
  344. data/spec/unit/provider/package_targetable_spec.rb +60 -0
  345. data/spec/unit/provider/service/init_spec.rb +1 -0
  346. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  347. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  348. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  349. data/spec/unit/provider/service/systemd_spec.rb +92 -12
  350. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  351. data/spec/unit/provider/user/hpux_spec.rb +2 -2
  352. data/spec/unit/provider/user/useradd_spec.rb +21 -8
  353. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  354. data/spec/unit/puppet_pal_2pec.rb +0 -26
  355. data/spec/unit/puppet_pal_catalog_spec.rb +46 -0
  356. data/spec/unit/puppet_spec.rb +47 -0
  357. data/spec/unit/reports/http_spec.rb +70 -52
  358. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  359. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  360. data/spec/unit/ssl/certificate_spec.rb +7 -0
  361. data/spec/unit/ssl/host_spec.rb +4 -2
  362. data/spec/unit/ssl/oids_spec.rb +1 -0
  363. data/spec/unit/ssl/ssl_provider_spec.rb +71 -0
  364. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  365. data/spec/unit/transaction/persistence_spec.rb +1 -10
  366. data/spec/unit/transaction/report_spec.rb +4 -0
  367. data/spec/unit/transaction_spec.rb +45 -1
  368. data/spec/unit/type/file/content_spec.rb +9 -3
  369. data/spec/unit/type/file/ensure_spec.rb +1 -2
  370. data/spec/unit/type/file/source_spec.rb +86 -35
  371. data/spec/unit/type/package_spec.rb +8 -0
  372. data/spec/unit/type/service_spec.rb +9 -8
  373. data/spec/unit/type/user_spec.rb +1 -2
  374. data/spec/unit/util/at_fork_spec.rb +3 -2
  375. data/spec/unit/util/autoload_spec.rb +2 -1
  376. data/spec/unit/util/log/destinations_spec.rb +1 -29
  377. data/spec/unit/util/log_spec.rb +0 -138
  378. data/spec/unit/util/logging_spec.rb +200 -0
  379. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  380. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  381. data/spec/unit/util/package/version/range_spec.rb +175 -0
  382. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  383. data/spec/unit/util/pidlock_spec.rb +112 -42
  384. data/spec/unit/util/plist_spec.rb +20 -0
  385. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  386. data/spec/unit/util/storage_spec.rb +1 -8
  387. data/spec/unit/util/windows/adsi_spec.rb +55 -4
  388. data/spec/unit/util/windows/sid_spec.rb +2 -2
  389. data/spec/unit/x509/cert_provider_spec.rb +24 -4
  390. data/tasks/generate_cert_fixtures.rake +15 -1
  391. data/tasks/manpages.rake +6 -35
  392. metadata +92 -12
  393. data/COMMITTERS.md +0 -244
  394. data/spec/integration/faces/plugin_spec.rb +0 -61
  395. data/spec/lib/puppet_spec/validators.rb +0 -37
@@ -3,6 +3,7 @@
3
3
  # @api private
4
4
  class Puppet::Network::HTTP::NoCachePool < Puppet::Network::HTTP::BasePool
5
5
  def initialize(factory = Puppet::Network::HTTP::Factory.new)
6
+ Puppet.deprecation_warning(_('Puppet::Network::HTTP::NoCachePool is deprecated.'))
6
7
  @factory = factory
7
8
  end
8
9
 
@@ -15,6 +16,7 @@ class Puppet::Network::HTTP::NoCachePool < Puppet::Network::HTTP::BasePool
15
16
  begin
16
17
  yield http
17
18
  ensure
19
+ return unless http.started?
18
20
  Puppet.debug("Closing connection for #{site}")
19
21
  http.finish
20
22
  end
@@ -9,11 +9,9 @@
9
9
  # @api private
10
10
  #
11
11
  class Puppet::Network::HTTP::Pool < Puppet::Network::HTTP::BasePool
12
- FIFTEEN_SECONDS = 15
12
+ attr_reader :factory, :keepalive_timeout
13
13
 
14
- attr_reader :factory
15
-
16
- def initialize(keepalive_timeout = FIFTEEN_SECONDS)
14
+ def initialize(keepalive_timeout)
17
15
  @pool = {}
18
16
  @factory = Puppet::Network::HTTP::Factory.new
19
17
  @keepalive_timeout = keepalive_timeout
@@ -33,7 +31,7 @@ class Puppet::Network::HTTP::Pool < Puppet::Network::HTTP::BasePool
33
31
  reuse = false
34
32
  raise detail
35
33
  ensure
36
- if reuse
34
+ if reuse && http.started?
37
35
  release(site, verifier, http)
38
36
  else
39
37
  close_connection(site, http)
@@ -56,13 +54,17 @@ class Puppet::Network::HTTP::Pool < Puppet::Network::HTTP::BasePool
56
54
  end
57
55
 
58
56
  # Safely close a persistent connection.
57
+ # Don't try to close a connection that's already closed.
59
58
  #
60
59
  # @api private
61
60
  def close_connection(site, http)
61
+ return false unless http.started?
62
62
  Puppet.debug("Closing connection for #{site}")
63
63
  http.finish
64
+ true
64
65
  rescue => detail
65
66
  Puppet.log_exception(detail, _("Failed to close connection for %{site}: %{detail}") % { site: site, detail: detail })
67
+ nil
66
68
  end
67
69
 
68
70
  # Borrow and take ownership of a persistent connection. If a new
@@ -71,9 +73,14 @@ class Puppet::Network::HTTP::Pool < Puppet::Network::HTTP::BasePool
71
73
  # @api private
72
74
  def borrow(site, verifier)
73
75
  @pool[site] = active_sessions(site)
74
- index = @pool[site].index { |session| verifier.reusable?(session.verifier) }
76
+ index = @pool[site].index do |session|
77
+ (verifier.nil? && session.verifier.nil?) ||
78
+ (!verifier.nil? && verifier.reusable?(session.verifier))
79
+ end
75
80
  session = index ? @pool[site].delete_at(index) : nil
76
81
  if session
82
+ @pool.delete(site) if @pool[site].empty?
83
+
77
84
  Puppet.debug("Using cached connection for #{site}")
78
85
  session.connection
79
86
  else
@@ -1,4 +1,5 @@
1
1
  require 'puppet/network/http/connection'
2
+ require 'puppet/network/http/connection_adapter'
2
3
  require 'puppet/util/platform'
3
4
 
4
5
  module Puppet::Network; end
@@ -12,7 +13,7 @@ module Puppet::Network; end
12
13
  #
13
14
  module Puppet::Network::HttpPool
14
15
 
15
- @http_client_class = Puppet::Network::HTTP::Connection
16
+ @http_client_class = Puppet::Network::HTTP::ConnectionAdapter
16
17
 
17
18
  def self.http_client_class
18
19
  @http_client_class
@@ -1,6 +1,7 @@
1
1
  require 'puppet/util'
2
2
  require 'monitor'
3
3
  require 'puppet/parser/parser_factory'
4
+ require 'puppet/concurrent/lock'
4
5
 
5
6
  # Just define it, so this class has fewer load dependencies.
6
7
  class Puppet::Node
@@ -70,6 +71,7 @@ class Puppet::Node::Environment
70
71
  #
71
72
  # @param name [Symbol] The environment name
72
73
  def initialize(name, modulepath, manifest, config_version)
74
+ @lock = Puppet::Concurrent::Lock.new
73
75
  @name = name.intern
74
76
  @modulepath = self.class.expand_dirs(self.class.extralibs() + modulepath)
75
77
  @manifest = manifest == NO_MANIFEST ? manifest : Puppet::FileSystem.expand_path(manifest)
@@ -160,6 +162,10 @@ class Puppet::Node::Environment
160
162
  # @api private
161
163
  attr_accessor :loaders
162
164
 
165
+ # Lock for compilation that needs exclusive access to the environment
166
+ # @api private
167
+ attr_reader :lock
168
+
163
169
  # Checks to make sure that this environment did not have a manifest set in
164
170
  # its original environment.conf if Puppet is configured with
165
171
  # +disable_per_environment_manifest+ set true. If it did, the environment's
@@ -232,11 +238,13 @@ class Puppet::Node::Environment
232
238
  # @api public
233
239
  # @return [Puppet::Resource::TypeCollection] The current global TypeCollection
234
240
  def known_resource_types
235
- if @known_resource_types.nil?
236
- @known_resource_types = Puppet::Resource::TypeCollection.new(self)
237
- @known_resource_types.import_ast(perform_initial_import(), '')
241
+ @lock.synchronize do
242
+ if @known_resource_types.nil?
243
+ @known_resource_types = Puppet::Resource::TypeCollection.new(self)
244
+ @known_resource_types.import_ast(perform_initial_import(), '')
245
+ end
246
+ @known_resource_types
238
247
  end
239
- @known_resource_types
240
248
  end
241
249
 
242
250
  # Yields each modules' plugin directory if the plugin directory (modulename/lib)
@@ -289,7 +297,13 @@ class Puppet::Node::Environment
289
297
  def modules
290
298
  if @modules.nil?
291
299
  module_references = []
292
- seen_modules = {}
300
+ project = Puppet.lookup(:bolt_project) { nil }
301
+ seen_modules = if project
302
+ module_references << project.to_h
303
+ { project.name => true }
304
+ else
305
+ {}
306
+ end
293
307
  modulepath.each do |path|
294
308
  Dir.entries(path).each do |name|
295
309
  next unless Puppet::Module.is_module_directory?(name, path)
@@ -429,9 +443,11 @@ class Puppet::Node::Environment
429
443
  # Checks if a reparse is required (cache of files is stale).
430
444
  #
431
445
  def check_for_reparse
432
- if (Puppet[:code] != @parsed_code || @known_resource_types.parse_failed?)
433
- @parsed_code = nil
434
- @known_resource_types = nil
446
+ @lock.synchronize do
447
+ if (Puppet[:code] != @parsed_code || @known_resource_types.parse_failed?)
448
+ @parsed_code = nil
449
+ @known_resource_types = nil
450
+ end
435
451
  end
436
452
  end
437
453
 
@@ -97,6 +97,11 @@ module Pal
97
97
  internal_compiler.evaluate_additions
98
98
  end
99
99
 
100
+ # Attempts to evaluate AST for node defnintions https://puppet.com/docs/puppet/latest/lang_node_definitions.html
101
+ # if there are any.
102
+ def evaluate_ast_node
103
+ internal_compiler.evaluate_ast_node
104
+ end
100
105
  end
101
106
 
102
107
  end
@@ -83,6 +83,8 @@ module Pal
83
83
  end
84
84
  end
85
85
 
86
+ previous_tasks_value = Puppet[:tasks]
87
+ previous_code_value = Puppet[:code]
86
88
  Puppet[:tasks] = true
87
89
  # After the assertions, if code_string is non nil - it has the highest precedence
88
90
  Puppet[:code] = code_string unless code_string.nil?
@@ -90,6 +92,9 @@ module Pal
90
92
  # If manifest_file is nil, the #main method will use the env configured manifest
91
93
  # to do things in the block while a Script Compiler is in effect
92
94
  main(manifest_file, facts, variables, :script, &block)
95
+ ensure
96
+ Puppet[:tasks] = previous_tasks_value
97
+ Puppet[:code] = previous_code_value
93
98
  end
94
99
 
95
100
  # Evaluates a Puppet Language script string.
@@ -417,37 +422,8 @@ module Pal
417
422
  # TRANSLATORS, the string "For puppet PAL" is not user facing
418
423
  Puppet.override({:current_environment => apply_environment}, "For puppet PAL") do
419
424
  begin
420
- # support the following features when evaluating puppet code
421
- # * $facts with facts from host running the script
422
- # * $settings with 'settings::*' namespace populated, and '$settings::all_local' hash
423
- # * $trusted as setup when using puppet apply
424
- # * an environment
425
- #
426
-
427
- # fixup trusted information
428
425
  node.sanitize()
429
-
430
426
  compiler = create_internal_compiler(internal_compiler_class, node)
431
- # compiler = Puppet::Parser::ScriptCompiler.new(node.environment, node.name)
432
- topscope = compiler.topscope
433
-
434
- # When scripting the trusted data are always local, but set them anyway
435
- # When compiling for a catalog, the catalog compiler does this
436
- unless internal_compiler_class == :catalog
437
- topscope.set_trusted(node.trusted_data)
438
-
439
- # Server facts are always about the local node's version etc.
440
- topscope.set_server_facts(node.server_facts)
441
-
442
- # Set $facts for the node running the script
443
- facts_hash = node.facts.nil? ? {} : node.facts.values
444
- topscope.set_facts(facts_hash)
445
-
446
- # create the $settings:: variables
447
- topscope.merge_settings(node.environment.name, false)
448
- end
449
-
450
- add_variables(topscope, pal_variables)
451
427
 
452
428
  case internal_compiler_class
453
429
  when :script
@@ -463,6 +439,10 @@ module Pal
463
439
  # TRANSLATORS: Do not translate, symbolic name
464
440
  Puppet.override(overrides, "PAL::with_#{internal_compiler_class}_compiler") do
465
441
  compiler.compile do | compiler_yield |
442
+ # In case the varaibles passed to the compiler are PCore types defined in modules, they
443
+ # need to be deserialized and added from within the this scope, so that loaders are
444
+ # available during deserizlization.
445
+ add_variables(compiler.topscope, Puppet::Pops::Serialization::FromDataConverter.convert(pal_variables))
466
446
  # wrap the internal compiler to prevent it from leaking in the PAL API
467
447
  if block_given?
468
448
  yield(pal_compiler)
@@ -13,12 +13,6 @@ class Puppet::Parser::AST::PopsBridge
13
13
  # expression.
14
14
  #
15
15
  class Expression < Puppet::Parser::AST::Leaf
16
-
17
- def initialize args
18
- super
19
- @@evaluator ||= Puppet::Pops::Parser::EvaluatingParser.new()
20
- end
21
-
22
16
  def to_s
23
17
  Puppet::Pops::Model::ModelTreeDumper.new.dump(@value)
24
18
  end
@@ -29,8 +23,9 @@ class Puppet::Parser::AST::PopsBridge
29
23
  end
30
24
 
31
25
  def evaluate(scope)
32
- object = @@evaluator.evaluate(scope, @value)
33
- @@evaluator.convert_to_3x(object, scope)
26
+ evaluator = Puppet::Pops::Parser::EvaluatingParser.singleton
27
+ object = evaluator.evaluate(scope, @value)
28
+ evaluator.convert_to_3x(object, scope)
34
29
  end
35
30
 
36
31
  # Adapts to 3x where top level constructs needs to have each to iterate over children. Short circuit this
@@ -87,7 +82,6 @@ class Puppet::Parser::AST::PopsBridge
87
82
  @program_model = program_model
88
83
  @context = context
89
84
  @ast_transformer ||= Puppet::Pops::Model::AstTransformer.new(@context[:file])
90
- @@evaluator ||= Puppet::Pops::Parser::EvaluatingParser.new()
91
85
  end
92
86
 
93
87
  # This is the 3x API, the 3x AST searches through all code to find the instructions that can be instantiated.
@@ -122,7 +116,7 @@ class Puppet::Parser::AST::PopsBridge
122
116
  end
123
117
 
124
118
  def evaluate(scope)
125
- @@evaluator.evaluate(scope, program_model)
119
+ Puppet::Pops::Parser::EvaluatingParser.singleton.evaluate(scope, program_model)
126
120
  end
127
121
 
128
122
  # Adapts to 3x where top level constructs needs to have each to iterate over children. Short circuit this
@@ -178,8 +172,9 @@ class Puppet::Parser::AST::PopsBridge
178
172
  #
179
173
  scope = obtain_scope
180
174
  if scope
175
+ evaluator = Puppet::Pops::Parser::EvaluatingParser.singleton
181
176
  typed_parameters.each do |p|
182
- result[p.name] = @@evaluator.evaluate(scope, p.type_expr)
177
+ result[p.name] = evaluator.evaluate(scope, p.type_expr)
183
178
  end
184
179
  end
185
180
  result
@@ -348,6 +348,34 @@ class Puppet::Parser::Compiler
348
348
  end
349
349
  end
350
350
 
351
+
352
+ # If ast nodes are enabled, then see if we can find and evaluate one.
353
+ #
354
+ # @api private
355
+ def evaluate_ast_node
356
+ krt = environment.known_resource_types
357
+ return unless krt.nodes? #ast_nodes?
358
+
359
+ # Now see if we can find the node.
360
+ astnode = nil
361
+ @node.names.each do |name|
362
+ astnode = krt.node(name.to_s.downcase)
363
+ break if astnode
364
+ end
365
+
366
+ unless (astnode ||= krt.node("default"))
367
+ raise Puppet::ParseError, _("Could not find node statement with name 'default' or '%{names}'") % { names: node.names.join(", ") }
368
+ end
369
+
370
+ # Create a resource to model this node, and then add it to the list
371
+ # of resources.
372
+ resource = astnode.ensure_in_catalog(topscope)
373
+
374
+ resource.evaluate
375
+
376
+ @node_scope = topscope.class_scope(astnode)
377
+ end
378
+
351
379
  # Evaluates each specified class in turn. If there are any classes that
352
380
  # can't be found, an error is raised. This method really just creates resource objects
353
381
  # that point back to the classes, and then the resources are themselves
@@ -486,31 +514,6 @@ class Puppet::Parser::Compiler
486
514
  krt.capability_mappings.clear # No longer needed
487
515
  end
488
516
 
489
- # If ast nodes are enabled, then see if we can find and evaluate one.
490
- def evaluate_ast_node
491
- krt = environment.known_resource_types
492
- return unless krt.nodes? #ast_nodes?
493
-
494
- # Now see if we can find the node.
495
- astnode = nil
496
- @node.names.each do |name|
497
- astnode = krt.node(name.to_s.downcase)
498
- break if astnode
499
- end
500
-
501
- unless (astnode ||= krt.node("default"))
502
- raise Puppet::ParseError, _("Could not find node statement with name 'default' or '%{names}'") % { names: node.names.join(", ") }
503
- end
504
-
505
- # Create a resource to model this node, and then add it to the list
506
- # of resources.
507
- resource = astnode.ensure_in_catalog(topscope)
508
-
509
- resource.evaluate
510
-
511
- @node_scope = topscope.class_scope(astnode)
512
- end
513
-
514
517
  # Evaluate our collections and return true if anything returned an object.
515
518
  # The 'true' is used to continue a loop, so it's important.
516
519
  def evaluate_collections
@@ -777,13 +780,7 @@ class Puppet::Parser::Compiler
777
780
  SETTINGS = 'settings'.freeze
778
781
 
779
782
  def create_settings_scope
780
- resource_types = environment.known_resource_types
781
- settings_type = resource_types.hostclass(SETTINGS)
782
- if settings_type.nil?
783
- settings_type = Puppet::Resource::Type.new(:hostclass, SETTINGS)
784
- resource_types.add(settings_type)
785
- end
786
-
783
+ settings_type = create_settings_type
787
784
  settings_resource = Puppet::Parser::Resource.new('class', SETTINGS, :scope => @topscope)
788
785
 
789
786
  @catalog.add_resource(settings_resource)
@@ -794,6 +791,19 @@ class Puppet::Parser::Compiler
794
791
  scope.merge_settings(environment.name)
795
792
  end
796
793
 
794
+ def create_settings_type
795
+ environment.lock.synchronize do
796
+ resource_types = environment.known_resource_types
797
+ settings_type = resource_types.hostclass(SETTINGS)
798
+ if settings_type.nil?
799
+ settings_type = Puppet::Resource::Type.new(:hostclass, SETTINGS)
800
+ resource_types.add(settings_type)
801
+ end
802
+
803
+ settings_type
804
+ end
805
+ end
806
+
797
807
  # Return an array of all of the unevaluated resources. These will be definitions,
798
808
  # which need to get evaluated into native resources.
799
809
  def unevaluated_resources
@@ -1,6 +1,7 @@
1
1
  require 'puppet/util/autoload'
2
2
  require 'puppet/parser/scope'
3
3
  require 'puppet/pops/adaptable'
4
+ require 'puppet/concurrent/lock'
4
5
 
5
6
  # A module for managing parser functions. Each specified function
6
7
  # is added to a central module that then gets included into the Scope
@@ -78,28 +79,32 @@ module Puppet::Parser::Functions
78
79
  attr_accessor :module
79
80
  end
80
81
 
82
+ @environment_module_lock = Puppet::Concurrent::Lock.new
83
+
81
84
  # Get the module that functions are mixed into corresponding to an
82
85
  # environment
83
86
  #
84
87
  # @api private
85
88
  def self.environment_module(env)
86
- AnonymousModuleAdapter.adapt(env) do |a|
87
- a.module ||= Module.new do
88
- @metadata = {}
89
+ @environment_module_lock.synchronize do
90
+ AnonymousModuleAdapter.adapt(env) do |a|
91
+ a.module ||= Module.new do
92
+ @metadata = {}
89
93
 
90
- def self.all_function_info
91
- @metadata
92
- end
94
+ def self.all_function_info
95
+ @metadata
96
+ end
93
97
 
94
- def self.get_function_info(name)
95
- @metadata[name]
96
- end
98
+ def self.get_function_info(name)
99
+ @metadata[name]
100
+ end
97
101
 
98
- def self.add_function_info(name, info)
99
- @metadata[name] = info
102
+ def self.add_function_info(name, info)
103
+ @metadata[name] = info
104
+ end
100
105
  end
101
- end
102
- end.module
106
+ end.module
107
+ end
103
108
  end
104
109
 
105
110
  # Create a new Puppet DSL function.
@@ -7,12 +7,12 @@ result as a String.
7
7
  The first argument to this function should be a `<MODULE NAME>/<TEMPLATE FILE>`
8
8
  reference, which loads `<TEMPLATE FILE>` from `<MODULE NAME>`'s `templates`
9
9
  directory. In most cases, the last argument is optional; if used, it should be a
10
- [hash](/puppet/latest/reference/lang_data_hash.html) that contains parameters to
10
+ [hash](https://puppet.com/docs/puppet/latest/lang_data_hash.html) that contains parameters to
11
11
  pass to the template.
12
12
 
13
- - See the [template](/puppet/latest/reference/lang_template.html) documentation
13
+ - See the [template](https://puppet.com/docs/puppet/latest/lang_template.html) documentation
14
14
  for general template usage information.
15
- - See the [EPP syntax](/puppet/latest/reference/lang_template_epp.html)
15
+ - See the [EPP syntax](https://puppet.com/docs/puppet/latest/lang_template_epp.html)
16
16
  documentation for examples of EPP.
17
17
 
18
18
  For example, to call the apache module's `templates/vhost/_docroot.epp`