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
@@ -2,7 +2,7 @@ Puppet::Type.type(:package).provide :zypper, :parent => :rpm, :source => :rpm do
2
2
  desc "Support for SuSE `zypper` package manager. Found in SLES10sp2+ and SLES11.
3
3
 
4
4
  This provider supports the `install_options` attribute, which allows command-line flags to be passed to zypper.
5
- These options should be specified as an array where each element is either a
5
+ These options should be specified as an array where each element is either a
6
6
  string or a hash."
7
7
 
8
8
  has_feature :versionable, :install_options, :virtual_packages
@@ -50,6 +50,41 @@ Puppet::Type.type(:package).provide :zypper, :parent => :rpm, :source => :rpm do
50
50
  execute(cmd, { :failonfail => false, :combine => true})
51
51
  end
52
52
 
53
+ def best_version(should)
54
+ if should.is_a?(String)
55
+ begin
56
+ should_range = Puppet::Util::Package::Version::Range.parse(should, Puppet::Util::Package::Version::Rpm)
57
+ rescue Puppet::Util::Package::Version::Range::ValidationFailure, Puppet::Util::Package::Version::Rpm::ValidationFailure
58
+ Puppet.debug("Cannot parse #{should} as a RPM version range")
59
+ return should
60
+ end
61
+
62
+ if should_range.is_a?(Puppet::Util::Package::Version::Range::Eq)
63
+ return should
64
+ end
65
+
66
+ sorted_versions = SortedSet.new
67
+
68
+ output = zypper('search', '--match-exact', '--type', 'package', '--uninstalled-only', '-s', @resource[:name])
69
+ output.lines.each do |line|
70
+ pkg_ver = line.split(/\s*\|\s*/)
71
+ next unless pkg_ver[1] == @resource[:name]
72
+ begin
73
+ rpm_version = Puppet::Util::Package::Version::Rpm.parse(pkg_ver[3])
74
+
75
+ sorted_versions << rpm_version if should_range.include?(rpm_version)
76
+ rescue Puppet::Util::Package::Version::Rpm::ValidationFailure
77
+ Puppet.debug("Cannot parse #{pkg_ver[3]} as a RPM version")
78
+ end
79
+ end
80
+
81
+ return sorted_versions.entries.last if sorted_versions.any?
82
+
83
+ Puppet.debug("No available version for package #{@resource[:name]} is included in range #{should_range}")
84
+ should
85
+ end
86
+ end
87
+
53
88
  # Install a package using 'zypper'.
54
89
  def install
55
90
  should = @resource.should(:ensure)
@@ -62,6 +97,7 @@ Puppet::Type.type(:package).provide :zypper, :parent => :rpm, :source => :rpm do
62
97
  should = nil
63
98
  else
64
99
  # Add the package version
100
+ should = best_version(should)
65
101
  wanted = "#{wanted}-#{should}"
66
102
  end
67
103
 
@@ -89,6 +125,7 @@ Puppet::Type.type(:package).provide :zypper, :parent => :rpm, :source => :rpm do
89
125
  options = []
90
126
  options << quiet
91
127
  options << '--no-gpg-check' unless inst_opts.delete('--no-gpg-check').nil?
128
+ options << '--no-gpg-checks' unless inst_opts.delete('--no-gpg-checks').nil?
92
129
  options << :install
93
130
 
94
131
  #zypper 0.6.13 (OpenSuSE 10.2) does not support auto agree with licenses
@@ -142,4 +179,25 @@ Puppet::Type.type(:package).provide :zypper, :parent => :rpm, :source => :rpm do
142
179
  end
143
180
 
144
181
  end
182
+
183
+ def insync?(is)
184
+ return false if [:purged, :absent].include?(is)
185
+
186
+ should = @resource[:ensure]
187
+ if should.is_a?(String)
188
+ begin
189
+ should_version = Puppet::Util::Package::Version::Range.parse(should, Puppet::Util::Package::Version::Rpm)
190
+ rescue Puppet::Util::Package::Version::Range::ValidationFailure, Puppet::Util::Package::Version::Rpm::ValidationFailure
191
+ Puppet.debug("Cannot parse #{should} as a RPM version range")
192
+ return super
193
+ end
194
+
195
+ begin
196
+ is_version = Puppet::Util::Package::Version::Rpm.parse(is)
197
+ should_version.include?(is_version)
198
+ rescue Puppet::Util::Package::Version::Rpm::ValidationFailure
199
+ Puppet.debug("Cannot parse #{is} as a RPM version")
200
+ end
201
+ end
202
+ end
145
203
  end
@@ -25,24 +25,25 @@ require 'puppet/provider/package'
25
25
  class Puppet::Provider::Package::Targetable < Puppet::Provider::Package
26
26
  # Prefetch our package list, yo.
27
27
  def self.prefetch(packages)
28
- catalog_packages = packages.first[1]::catalog::resources.select{ |p| p.provider.class == self }
28
+ catalog_packages = packages.values.first.catalog.resources.select{ |p| p.provider.class == self }
29
29
  package_commands = catalog_packages.map { |catalog_package| catalog_package::original_parameters[:command] }.uniq
30
30
  package_commands.each do |command|
31
31
  instances(command).each do |instance|
32
32
  catalog_packages.each do |catalog_package|
33
- if catalog_package[:name] == instance.name && catalog_package::original_parameters[:command] == command
33
+ if catalog_package[:name] == instance.name && catalog_package.original_parameters[:command] == command
34
34
  catalog_package.provider = instance
35
- self.debug "Prefetched instance: %{name} via command: %{command}" % { name: instance.name, cmd: (command || :default)}
35
+ self.debug "Prefetched instance: %{name} via command: %{cmd}" % { name: instance.name, cmd: (command || :default) }
36
36
  end
37
37
  end
38
38
  end
39
39
  end
40
+ package_commands
40
41
  end
41
42
 
42
43
  # Returns the resource command or provider command.
43
44
 
44
45
  def resource_or_provider_command
45
- resource::original_parameters[:command] || self.class.provider_command
46
+ resource.original_parameters[:command] || self.class.provider_command
46
47
  end
47
48
 
48
49
  # Targetable providers use has_command/is_optional to defer validation of provider suitability.
@@ -25,12 +25,13 @@ Puppet::Type.type(:service).provide :systemd, :parent => :base do
25
25
  notdefaultfor :operatingsystem => :LinuxMint, :operatingsystemmajrelease => ["10", "11", "12", "13", "14", "15", "16", "17"] # These are using upstart
26
26
  defaultfor :operatingsystem => :ubuntu
27
27
  notdefaultfor :operatingsystem => :ubuntu, :operatingsystemmajrelease => ["10.04", "12.04", "14.04", "14.10"] # These are using upstart
28
- defaultfor :operatingsystem => :cumuluslinux, :operatingsystemmajrelease => ["3"]
28
+ defaultfor :operatingsystem => :cumuluslinux, :operatingsystemmajrelease => ["3", "4"]
29
29
 
30
30
  def self.instances
31
31
  i = []
32
32
  output = systemctl('list-unit-files', '--type', 'service', '--full', '--all', '--no-pager')
33
- output.scan(/^(\S+)\s+(disabled|enabled|masked|indirect)\s*$/i).each do |m|
33
+ output.scan(/^(\S+)\s+(disabled|enabled|masked|indirect|bad|static)\s*$/i).each do |m|
34
+ Puppet.debug("#{m[0]} marked as bad by `systemctl`. It is recommended to be further checked.") if m[1] == "bad"
34
35
  i << new(:name => m[0])
35
36
  end
36
37
  return i
@@ -38,6 +39,22 @@ Puppet::Type.type(:service).provide :systemd, :parent => :base do
38
39
  return []
39
40
  end
40
41
 
42
+ # Static services cannot be enabled or disabled manually. Indirect services
43
+ # should not be enabled or disabled due to limitations in systemd (see
44
+ # https://github.com/systemd/systemd/issues/6681).
45
+ def enabled_insync?(current)
46
+ case cached_enabled?[:output]
47
+ when 'static'
48
+ Puppet.debug("Unable to enable or disable static service #{@resource[:name]}")
49
+ return true
50
+ when 'indirect'
51
+ Puppet.debug("Service #{@resource[:name]} is in 'indirect' state and cannot be enabled/disabled")
52
+ return true
53
+ else
54
+ current == @resource[:enable]
55
+ end
56
+ end
57
+
41
58
  # This helper ensures that the enable state cache is always reset
42
59
  # after a systemctl enable operation. A particular service state is not guaranteed
43
60
  # after such an operation, so the cache must be emptied to prevent inconsistencies
@@ -69,12 +86,13 @@ Puppet::Type.type(:service).provide :systemd, :parent => :base do
69
86
  def cached_enabled?
70
87
  return @cached_enabled if @cached_enabled
71
88
  cmd = [command(:systemctl), 'is-enabled', '--', @resource[:name]]
72
- @cached_enabled = execute(cmd, :failonfail => false).strip
89
+ result = execute(cmd, :failonfail => false)
90
+ @cached_enabled = { output: result.chomp, exitcode: result.exitstatus }
73
91
  end
74
92
 
75
93
  def enabled?
76
- output = cached_enabled?
77
- code = $CHILD_STATUS.exitstatus
94
+ output = cached_enabled?[:output]
95
+ code = cached_enabled?[:exitcode]
78
96
 
79
97
  # The masked state is equivalent to the disabled state in terms of
80
98
  # comparison so we only care to check if it is masked if we want to keep
@@ -32,6 +32,7 @@ Puppet::Type.type(:user).provide :aix, :parent => Puppet::Provider::AixObject do
32
32
  has_features :manages_aix_lam
33
33
  has_features :manages_homedir, :manages_passwords, :manages_shell
34
34
  has_features :manages_expiry, :manages_password_age
35
+ has_features :manages_local_users_and_groups
35
36
 
36
37
  class << self
37
38
  def group_provider
@@ -387,7 +387,7 @@ Puppet::Type.type(:user).provide :directoryservice do
387
387
  if (Puppet::Util::Package.versioncmp(self.class.get_os_version, '10.7') > 0)
388
388
  assert_full_pbkdf2_password
389
389
 
390
- sleep 2
390
+ sleep 3
391
391
  flush_dscl_cache
392
392
  users_plist = get_users_plist(@resource.name)
393
393
  shadow_hash_data = get_shadow_hash_data(users_plist)
@@ -404,7 +404,7 @@ Puppet::Type.type(:user).provide :directoryservice do
404
404
  if (Puppet::Util::Package.versioncmp(self.class.get_os_version, '10.7') > 0)
405
405
  assert_full_pbkdf2_password
406
406
 
407
- sleep 2
407
+ sleep 3
408
408
  flush_dscl_cache
409
409
  users_plist = get_users_plist(@resource.name)
410
410
  shadow_hash_data = get_shadow_hash_data(users_plist)
@@ -435,8 +435,8 @@ Puppet::Type.type(:user).provide :directoryservice do
435
435
  ['home', 'uid', 'gid', 'comment', 'shell'].each do |setter_method|
436
436
  define_method("#{setter_method}=") do |value|
437
437
  if @property_hash[setter_method.intern]
438
- if self.class.get_os_version == '10.14' && %w(home uid).include?(setter_method)
439
- raise Puppet::Error, "OS X version 10\.14 does not allow changing #{setter_method} using puppet"
438
+ if self.class.get_os_version.split('.').last.to_i >= 14 && %w(home uid).include?(setter_method)
439
+ raise Puppet::Error, "OS X version #{self.class.get_os_version} does not allow changing #{setter_method} using puppet"
440
440
  end
441
441
  begin
442
442
  dscl '.', '-change', "/Users/#{resource.name}", self.class.ns_to_ds_attribute_map[setter_method.intern], @property_hash[setter_method.intern], value
@@ -572,7 +572,32 @@ Puppet::Type.type(:user).provide :directoryservice do
572
572
  else
573
573
  users_plist['ShadowHashData'] = [binary_plist]
574
574
  end
575
- write_users_plist_to_disk(users_plist)
575
+ if Puppet::Util::Package.versioncmp(self.class.get_os_version, '10.15') < 0
576
+ write_users_plist_to_disk(users_plist)
577
+ else
578
+ write_and_import_shadow_hash_data(users_plist['ShadowHashData'].first)
579
+ end
580
+ end
581
+
582
+ # This method writes the ShadowHashData plist in a temporary file,
583
+ # then imports it using dsimport. macOS versions 10.15 and newer do
584
+ # not support directly managing binary plists, so we have to use an
585
+ # intermediary.
586
+ # dsimport is an archaic utilitary with hard-to-find documentation
587
+ #
588
+ # See http://web.archive.org/web/20090106120111/http://support.apple.com/kb/TA21305?viewlocale=en_US
589
+ # for information regarding the dsimport syntax
590
+ def write_and_import_shadow_hash_data(data_plist)
591
+ Tempfile.create("dsimport_#{@resource.name}", :encoding => Encoding::ASCII) do |dsimport_file|
592
+ dsimport_file.write <<-DSIMPORT
593
+ 0x0A 0x5C 0x3A 0x2C dsRecTypeStandard:Users 2 dsAttrTypeStandard:RecordName base64:dsAttrTypeNative:ShadowHashData
594
+ #{@resource.name}:#{Base64.strict_encode64(data_plist)}
595
+ DSIMPORT
596
+ dsimport_file.flush
597
+ # Delete the user's existing ShadowHashData, since dsimport appends, not replaces
598
+ dscl('.', 'delete', "/Users/#{@resource.name}", 'ShadowHashData')
599
+ dsimport(dsimport_file.path, '/Local/Default', 'M')
600
+ end
576
601
  end
577
602
 
578
603
  # This method accepts an argument of a hex password hash, and base64
@@ -29,7 +29,7 @@ Puppet::Type.type(:user).provide :hpuxuseradd, :parent => :useradd do
29
29
 
30
30
  def modifycmd(param,value)
31
31
  cmd = super(param, value)
32
- cmd << "-F"
32
+ cmd.insert(1,"-F")
33
33
  if trusted then
34
34
  # Append an additional command to reset the password age to 0
35
35
  # until a workaround with expiry module can be found for trusted
@@ -21,7 +21,11 @@ Puppet::Type.type(:user).provide :useradd, :parent => Puppet::Provider::NameServ
21
21
  options :expiry, :method => :sp_expire,
22
22
  :munge => proc { |value|
23
23
  if value == :absent
24
- ''
24
+ if Facter.value(:operatingsystem)=='SLES' && Facter.value(:operatingsystemmajrelease) == "11"
25
+ -1
26
+ else
27
+ ''
28
+ end
25
29
  else
26
30
  case Facter.value(:operatingsystem)
27
31
  when 'Solaris'
@@ -43,7 +47,7 @@ Puppet::Type.type(:user).provide :useradd, :parent => Puppet::Provider::NameServ
43
47
  }
44
48
 
45
49
  optional_commands :localadd => "luseradd", :localdelete => "luserdel", :localmodify => "lusermod", :localpassword => "lchage"
46
- has_feature :libuser if Puppet.features.libuser?
50
+ has_feature :manages_local_users_and_groups if Puppet.features.libuser?
47
51
 
48
52
  def exists?
49
53
  return !!localuid if @resource.forcelocal?
@@ -64,12 +68,11 @@ Puppet::Type.type(:user).provide :useradd, :parent => Puppet::Provider::NameServ
64
68
  passwd_file = "/etc/passwd"
65
69
  passwd_keys = [:account, :password, :uid, :gid, :gecos, :directory, :shell]
66
70
  index = passwd_keys.index(key)
67
- File.open(passwd_file) do |f|
68
- f.each_line do |line|
69
- user = line.split(":")
70
- if user[index] == value
71
- return Hash[passwd_keys.zip(user)]
72
- end
71
+ @passwd_content ||= File.read(passwd_file)
72
+ @passwd_content.each_line do |line|
73
+ user = line.split(":")
74
+ if user[index] == value
75
+ return Hash[passwd_keys.zip(user)]
73
76
  end
74
77
  end
75
78
  false
@@ -20,19 +20,23 @@ Puppet::Reports.register_report(:http) do
20
20
  # (Puppet::Network::HTTP) but is used by Puppet Server's http client
21
21
  # (Puppet::Server::HttpClient) to track metrics on the request made to the
22
22
  # `reporturl` to store a report.
23
- options = { :metric_id => [:puppet, :report, :http] }
23
+ options = {
24
+ :metric_id => [:puppet, :report, :http],
25
+ :include_system_store => Puppet[:report_include_system_store],
26
+ }
27
+
24
28
  if url.user && url.password
25
29
  options[:basic_auth] = {
26
- :user => url.user,
27
- :password => url.password
30
+ user: url.user,
31
+ password: url.password
28
32
  }
29
33
  end
30
- use_ssl = url.scheme == 'https'
31
- ssl_context = use_ssl ? Puppet.lookup(:ssl_context) : nil
32
- conn = Puppet::Network::HttpPool.connection(url.host, url.port, use_ssl: use_ssl, ssl_context: ssl_context)
33
- response = conn.post(url.path, self.to_yaml, headers, options)
34
- unless response.kind_of?(Net::HTTPSuccess)
35
- Puppet.err _("Unable to submit report to %{url} [%{code}] %{message}") % { url: Puppet[:reporturl].to_s, code: response.code, message: response.msg }
34
+
35
+ client = Puppet.runtime[:http]
36
+ client.post(url, self.to_yaml, headers: headers, options: options) do |response|
37
+ unless response.success?
38
+ Puppet.err _("Unable to submit report to %{url} [%{code}] %{message}") % { url: Puppet[:reporturl].to_s, code: response.code, message: response.reason }
39
+ end
36
40
  end
37
41
  end
38
42
  end
@@ -32,7 +32,7 @@ Puppet::Reports.register_report(:store) do
32
32
  file = File.join(dir, name)
33
33
 
34
34
  begin
35
- Puppet::Util.replace_file(file, 0640) do |fh|
35
+ Puppet::FileSystem.replace_file(file, 0640) do |fh|
36
36
  fh.print to_yaml
37
37
  end
38
38
  rescue => detail
@@ -1,6 +1,7 @@
1
1
  require 'puppet/parser/type_loader'
2
2
  require 'puppet/util/file_watcher'
3
3
  require 'puppet/util/warnings'
4
+ require 'puppet/concurrent/lock'
4
5
 
5
6
  # @api private
6
7
  class Puppet::Resource::TypeCollection
@@ -28,6 +29,7 @@ class Puppet::Resource::TypeCollection
28
29
  @nodes = {}
29
30
  @notfound = {}
30
31
  @sites = []
32
+ @lock = Puppet::Concurrent::Lock.new
31
33
 
32
34
  # So we can keep a list and match the first-defined regex
33
35
  @node_list = []
@@ -225,25 +227,27 @@ class Puppet::Resource::TypeCollection
225
227
  # Resolve namespaces and find the given object. Autoload it if
226
228
  # necessary.
227
229
  def find_or_load(name, type)
228
- # Name is always absolute, but may start with :: which must be removed
229
- fqname = (name[0,2] == COLON_COLON ? name[2..-1] : name)
230
-
231
- result = send(type, fqname)
232
- unless result
233
- if @notfound[ fqname ] && Puppet[ :ignoremissingtypes ]
234
- # do not try to autoload if we already tried and it wasn't conclusive
235
- # as this is a time consuming operation. Warn the user.
236
- # Check first if debugging is on since the call to debug_once is expensive
237
- if Puppet[:debug]
238
- debug_once _("Not attempting to load %{type} %{fqname} as this object was missing during a prior compilation") % { type: type, fqname: fqname }
230
+ @lock.synchronize do
231
+ # Name is always absolute, but may start with :: which must be removed
232
+ fqname = (name[0,2] == COLON_COLON ? name[2..-1] : name)
233
+
234
+ result = send(type, fqname)
235
+ unless result
236
+ if @notfound[ fqname ] && Puppet[ :ignoremissingtypes ]
237
+ # do not try to autoload if we already tried and it wasn't conclusive
238
+ # as this is a time consuming operation. Warn the user.
239
+ # Check first if debugging is on since the call to debug_once is expensive
240
+ if Puppet[:debug]
241
+ debug_once _("Not attempting to load %{type} %{fqname} as this object was missing during a prior compilation") % { type: type, fqname: fqname }
242
+ end
243
+ else
244
+ fqname = munge_name(fqname)
245
+ result = loader.try_load_fqname(type, fqname)
246
+ @notfound[ fqname ] = result.nil?
239
247
  end
240
- else
241
- fqname = munge_name(fqname)
242
- result = loader.try_load_fqname(type, fqname)
243
- @notfound[ fqname ] = result.nil?
244
248
  end
249
+ result
245
250
  end
246
- result
247
251
  end
248
252
 
249
253
  def munge_name(name)
@@ -1,13 +1,32 @@
1
1
  require 'puppet/http'
2
+ require 'singleton'
2
3
 
4
+ # Provides access to runtime implementations.
5
+ #
6
+ # @api private
3
7
  class Puppet::Runtime
4
8
  include Singleton
5
9
 
6
10
  def initialize
7
- @runtime_services = {}
11
+ @runtime_services = {
12
+ http: proc do
13
+ klass = Puppet::Network::HttpPool.http_client_class
14
+ if klass == Puppet::Network::HTTP::Connection ||
15
+ klass == Puppet::Network::HTTP::ConnectionAdapter
16
+ Puppet::HTTP::Client.new
17
+ else
18
+ Puppet::HTTP::ExternalClient.new(klass)
19
+ end
20
+ end
21
+ }
8
22
  end
9
23
  private :initialize
10
24
 
25
+ # Get a runtime implementation.
26
+ #
27
+ # @param name [Symbol] the name of the implementation
28
+ # @return [Object] the runtime implementation
29
+ # @api private
11
30
  def [](name)
12
31
  service = @runtime_services[name]
13
32
  raise ArgumentError, "Unknown service #{name}" unless service
@@ -19,7 +38,19 @@ class Puppet::Runtime
19
38
  end
20
39
  end
21
40
 
41
+ # Register a runtime implementation.
42
+ #
43
+ # @param name [Symbol] the name of the implementation
44
+ # @param impl [Object] the runtime implementation
45
+ # @api private
22
46
  def []=(name, impl)
23
47
  @runtime_services[name] = impl
24
48
  end
49
+
50
+ # Clears all implementations. This is used for testing.
51
+ #
52
+ # @api private
53
+ def clear
54
+ initialize
55
+ end
25
56
  end