puppet 6.12.0-x64-mingw32 → 6.17.0-x64-mingw32

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 (412) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -7
  3. data/CONTRIBUTING.md +7 -13
  4. data/Gemfile +4 -2
  5. data/Gemfile.lock +39 -36
  6. data/README.md +18 -25
  7. data/ext/project_data.yaml +1 -1
  8. data/ext/windows/service/daemon.rb +3 -3
  9. data/lib/puppet.rb +52 -13
  10. data/lib/puppet/agent.rb +20 -14
  11. data/lib/puppet/application/agent.rb +26 -17
  12. data/lib/puppet/application/describe.rb +7 -5
  13. data/lib/puppet/application/device.rb +2 -2
  14. data/lib/puppet/application/filebucket.rb +19 -15
  15. data/lib/puppet/application/plugin.rb +1 -0
  16. data/lib/puppet/application/resource.rb +1 -1
  17. data/lib/puppet/application/ssl.rb +4 -4
  18. data/lib/puppet/configurer.rb +65 -69
  19. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  20. data/lib/puppet/confine.rb +1 -1
  21. data/lib/puppet/context/trusted_information.rb +14 -8
  22. data/lib/puppet/daemon.rb +13 -27
  23. data/lib/puppet/defaults.rb +154 -58
  24. data/lib/puppet/environments.rb +27 -20
  25. data/lib/puppet/face/facts.rb +8 -5
  26. data/lib/puppet/face/help.rb +29 -3
  27. data/lib/puppet/face/module/search.rb +5 -0
  28. data/lib/puppet/face/plugin.rb +2 -2
  29. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  30. data/lib/puppet/file_serving/metadata.rb +4 -1
  31. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  32. data/lib/puppet/file_system/file_impl.rb +14 -10
  33. data/lib/puppet/file_system/memory_file.rb +6 -0
  34. data/lib/puppet/file_system/memory_impl.rb +13 -0
  35. data/lib/puppet/file_system/uniquefile.rb +12 -16
  36. data/lib/puppet/file_system/windows.rb +7 -10
  37. data/lib/puppet/forge.rb +1 -1
  38. data/lib/puppet/forge/cache.rb +1 -1
  39. data/lib/puppet/forge/repository.rb +4 -7
  40. data/lib/puppet/functions/call.rb +1 -1
  41. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  42. data/lib/puppet/functions/filter.rb +1 -0
  43. data/lib/puppet/functions/reduce.rb +2 -4
  44. data/lib/puppet/http.rb +5 -0
  45. data/lib/puppet/http/client.rb +293 -73
  46. data/lib/puppet/http/errors.rb +2 -0
  47. data/lib/puppet/http/external_client.rb +90 -0
  48. data/lib/puppet/http/redirector.rb +43 -7
  49. data/lib/puppet/http/resolver.rb +46 -3
  50. data/lib/puppet/http/resolver/server_list.rb +76 -16
  51. data/lib/puppet/http/resolver/settings.rb +23 -3
  52. data/lib/puppet/http/resolver/srv.rb +29 -3
  53. data/lib/puppet/http/response.rb +87 -1
  54. data/lib/puppet/http/retry_after_handler.rb +39 -0
  55. data/lib/puppet/http/service.rb +151 -7
  56. data/lib/puppet/http/service/ca.rb +76 -14
  57. data/lib/puppet/http/service/compiler.rb +319 -0
  58. data/lib/puppet/http/service/file_server.rb +206 -0
  59. data/lib/puppet/http/service/report.rb +49 -23
  60. data/lib/puppet/http/session.rb +103 -7
  61. data/lib/puppet/indirector.rb +1 -1
  62. data/lib/puppet/indirector/catalog/compiler.rb +10 -0
  63. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  64. data/lib/puppet/indirector/facts/rest.rb +42 -0
  65. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  66. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  67. data/lib/puppet/indirector/file_content/http.rb +5 -0
  68. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  69. data/lib/puppet/indirector/file_metadata/http.rb +27 -8
  70. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  71. data/lib/puppet/indirector/json.rb +1 -1
  72. data/lib/puppet/indirector/msgpack.rb +1 -1
  73. data/lib/puppet/indirector/node/rest.rb +24 -0
  74. data/lib/puppet/indirector/report/rest.rb +19 -0
  75. data/lib/puppet/indirector/report/yaml.rb +23 -0
  76. data/lib/puppet/indirector/request.rb +1 -1
  77. data/lib/puppet/indirector/rest.rb +12 -0
  78. data/lib/puppet/indirector/status/rest.rb +18 -0
  79. data/lib/puppet/loaders.rb +6 -0
  80. data/lib/puppet/metatype/manager.rb +80 -80
  81. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  82. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  83. data/lib/puppet/network/http/base_pool.rb +7 -2
  84. data/lib/puppet/network/http/compression.rb +7 -0
  85. data/lib/puppet/network/http/connection.rb +6 -0
  86. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  87. data/lib/puppet/network/http/nocache_pool.rb +2 -0
  88. data/lib/puppet/network/http/pool.rb +13 -6
  89. data/lib/puppet/network/http_pool.rb +2 -1
  90. data/lib/puppet/node/environment.rb +11 -1
  91. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  92. data/lib/puppet/pal/pal_impl.rb +4 -29
  93. data/lib/puppet/parser/ast/leaf.rb +5 -5
  94. data/lib/puppet/parser/ast/pops_bridge.rb +6 -15
  95. data/lib/puppet/parser/compiler.rb +43 -33
  96. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  97. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  98. data/lib/puppet/parser/environment_compiler.rb +4 -1
  99. data/lib/puppet/parser/functions.rb +18 -13
  100. data/lib/puppet/parser/functions/filter.rb +1 -0
  101. data/lib/puppet/parser/resource.rb +3 -2
  102. data/lib/puppet/parser/resource/param.rb +6 -0
  103. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +6 -6
  105. data/lib/puppet/pops/issues.rb +5 -0
  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/parser/evaluating_parser.rb +5 -7
  109. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  110. data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
  111. data/lib/puppet/pops/types/type_calculator.rb +24 -0
  112. data/lib/puppet/pops/validation/checker4_0.rb +11 -1
  113. data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
  114. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  115. data/lib/puppet/provider/aix_object.rb +4 -2
  116. data/lib/puppet/provider/group/aix.rb +1 -0
  117. data/lib/puppet/provider/group/groupadd.rb +57 -24
  118. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  119. data/lib/puppet/provider/package/aix.rb +17 -2
  120. data/lib/puppet/provider/package/apt.rb +78 -4
  121. data/lib/puppet/provider/package/aptitude.rb +1 -1
  122. data/lib/puppet/provider/package/dnfmodule.rb +69 -15
  123. data/lib/puppet/provider/package/dpkg.rb +14 -7
  124. data/lib/puppet/provider/package/fink.rb +20 -3
  125. data/lib/puppet/provider/package/gem.rb +41 -7
  126. data/lib/puppet/provider/package/openbsd.rb +13 -1
  127. data/lib/puppet/provider/package/pacman.rb +2 -5
  128. data/lib/puppet/provider/package/pip.rb +143 -48
  129. data/lib/puppet/provider/package/pip3.rb +0 -2
  130. data/lib/puppet/provider/package/pkg.rb +18 -5
  131. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  132. data/lib/puppet/provider/package/pkgng.rb +16 -4
  133. data/lib/puppet/provider/package/portage.rb +2 -2
  134. data/lib/puppet/provider/package/puppet_gem.rb +6 -2
  135. data/lib/puppet/provider/package/rpm.rb +6 -213
  136. data/lib/puppet/provider/package/yum.rb +109 -25
  137. data/lib/puppet/provider/package/zypper.rb +59 -1
  138. data/lib/puppet/provider/service/systemd.rb +22 -4
  139. data/lib/puppet/provider/service/windows.rb +23 -7
  140. data/lib/puppet/provider/user/aix.rb +1 -0
  141. data/lib/puppet/provider/user/directoryservice.rb +30 -5
  142. data/lib/puppet/provider/user/useradd.rb +22 -12
  143. data/lib/puppet/reports/http.rb +15 -9
  144. data/lib/puppet/reports/store.rb +1 -1
  145. data/lib/puppet/resource.rb +2 -1
  146. data/lib/puppet/resource/type.rb +8 -0
  147. data/lib/puppet/resource/type_collection.rb +20 -16
  148. data/lib/puppet/runtime.rb +31 -1
  149. data/lib/puppet/settings.rb +4 -0
  150. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  151. data/lib/puppet/ssl.rb +1 -0
  152. data/lib/puppet/ssl/certificate.rb +2 -1
  153. data/lib/puppet/ssl/host.rb +4 -4
  154. data/lib/puppet/ssl/oids.rb +1 -0
  155. data/lib/puppet/ssl/ssl_context.rb +2 -2
  156. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  157. data/lib/puppet/ssl/state_machine.rb +81 -35
  158. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  159. data/lib/puppet/test/test_helper.rb +15 -11
  160. data/lib/puppet/transaction/report.rb +2 -2
  161. data/lib/puppet/transaction/resource_harness.rb +1 -1
  162. data/lib/puppet/trusted_external.rb +29 -1
  163. data/lib/puppet/type.rb +18 -6
  164. data/lib/puppet/type/file.rb +51 -13
  165. data/lib/puppet/type/file/checksum.rb +4 -4
  166. data/lib/puppet/type/file/source.rb +51 -60
  167. data/lib/puppet/type/group.rb +2 -2
  168. data/lib/puppet/type/package.rb +102 -10
  169. data/lib/puppet/type/service.rb +55 -8
  170. data/lib/puppet/type/user.rb +3 -28
  171. data/lib/puppet/util.rb +39 -15
  172. data/lib/puppet/util/at_fork.rb +1 -1
  173. data/lib/puppet/util/autoload.rb +4 -18
  174. data/lib/puppet/util/checksums.rb +19 -4
  175. data/lib/puppet/util/fileparsing.rb +2 -2
  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/package/version/debian.rb +175 -0
  179. data/lib/puppet/util/package/version/gem.rb +15 -0
  180. data/lib/puppet/util/package/version/pip.rb +167 -0
  181. data/lib/puppet/util/package/version/range.rb +53 -0
  182. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  183. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  184. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  185. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  186. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  187. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  188. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  189. data/lib/puppet/util/package/version/rpm.rb +73 -0
  190. data/lib/puppet/util/pidlock.rb +36 -10
  191. data/lib/puppet/util/platform.rb +5 -0
  192. data/lib/puppet/util/plist.rb +6 -0
  193. data/lib/puppet/util/provider_features.rb +1 -1
  194. data/lib/puppet/util/reference.rb +1 -1
  195. data/lib/puppet/util/rpm_compare.rb +193 -0
  196. data/lib/puppet/util/storage.rb +0 -1
  197. data/lib/puppet/util/windows/adsi.rb +2 -2
  198. data/lib/puppet/util/windows/api_types.rb +45 -32
  199. data/lib/puppet/util/windows/eventlog.rb +1 -6
  200. data/lib/puppet/util/windows/principal.rb +8 -6
  201. data/lib/puppet/util/windows/process.rb +15 -14
  202. data/lib/puppet/util/windows/registry.rb +11 -11
  203. data/lib/puppet/util/windows/security.rb +1 -0
  204. data/lib/puppet/util/windows/service.rb +43 -26
  205. data/lib/puppet/util/windows/sid.rb +3 -3
  206. data/lib/puppet/util/windows/user.rb +23 -8
  207. data/lib/puppet/util/yaml.rb +1 -1
  208. data/lib/puppet/version.rb +1 -1
  209. data/locales/puppet.pot +707 -574
  210. data/man/man5/puppet.conf.5 +74 -14
  211. data/man/man8/puppet-agent.8 +7 -7
  212. data/man/man8/puppet-apply.8 +1 -1
  213. data/man/man8/puppet-catalog.8 +1 -1
  214. data/man/man8/puppet-config.8 +1 -1
  215. data/man/man8/puppet-describe.8 +1 -1
  216. data/man/man8/puppet-device.8 +2 -2
  217. data/man/man8/puppet-doc.8 +1 -1
  218. data/man/man8/puppet-epp.8 +1 -1
  219. data/man/man8/puppet-facts.8 +1 -1
  220. data/man/man8/puppet-filebucket.8 +17 -2
  221. data/man/man8/puppet-generate.8 +1 -1
  222. data/man/man8/puppet-help.8 +6 -3
  223. data/man/man8/puppet-key.8 +1 -1
  224. data/man/man8/puppet-lookup.8 +1 -1
  225. data/man/man8/puppet-man.8 +1 -1
  226. data/man/man8/puppet-module.8 +4 -1
  227. data/man/man8/puppet-node.8 +1 -1
  228. data/man/man8/puppet-parser.8 +1 -1
  229. data/man/man8/puppet-plugin.8 +1 -1
  230. data/man/man8/puppet-report.8 +1 -1
  231. data/man/man8/puppet-resource.8 +1 -1
  232. data/man/man8/puppet-script.8 +1 -1
  233. data/man/man8/puppet-ssl.8 +2 -2
  234. data/man/man8/puppet-status.8 +1 -1
  235. data/man/man8/puppet.8 +2 -2
  236. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  237. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  238. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  239. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  240. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  241. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  242. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  243. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  244. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  245. 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
  246. 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
  247. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -106
  248. 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
  249. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -98
  250. 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
  251. 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
  252. data/spec/integration/application/agent_spec.rb +483 -0
  253. data/spec/integration/application/apply_spec.rb +132 -3
  254. data/spec/integration/application/filebucket_spec.rb +190 -0
  255. data/spec/integration/application/plugin_spec.rb +73 -0
  256. data/spec/integration/configurer_spec.rb +26 -7
  257. data/spec/integration/defaults_spec.rb +1 -2
  258. data/spec/integration/http/client_spec.rb +47 -37
  259. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  260. data/spec/integration/indirector/report/yaml.rb +83 -0
  261. data/spec/integration/module_tool/forge_spec.rb +2 -15
  262. data/spec/integration/network/http_pool_spec.rb +93 -20
  263. data/spec/integration/node/environment_spec.rb +15 -0
  264. data/spec/integration/parser/compiler_spec.rb +11 -0
  265. data/spec/integration/type/file_spec.rb +1 -1
  266. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  267. data/spec/integration/util/windows/registry_spec.rb +7 -7
  268. data/spec/integration/util/windows/user_spec.rb +40 -5
  269. data/spec/lib/puppet/test_ca.rb +2 -2
  270. data/spec/lib/puppet_spec/https.rb +16 -7
  271. data/spec/lib/puppet_spec/puppetserver.rb +119 -0
  272. data/spec/shared_contexts/https.rb +29 -0
  273. data/spec/unit/agent_spec.rb +80 -26
  274. data/spec/unit/application/agent_spec.rb +9 -5
  275. data/spec/unit/application/apply_spec.rb +2 -12
  276. data/spec/unit/application/describe_spec.rb +88 -50
  277. data/spec/unit/application/device_spec.rb +2 -2
  278. data/spec/unit/application/filebucket_spec.rb +22 -2
  279. data/spec/unit/application/resource_spec.rb +2 -2
  280. data/spec/unit/configurer/fact_handler_spec.rb +4 -8
  281. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  282. data/spec/unit/configurer_spec.rb +17 -18
  283. data/spec/unit/context/trusted_information_spec.rb +25 -2
  284. data/spec/unit/daemon_spec.rb +5 -64
  285. data/spec/unit/defaults_spec.rb +25 -2
  286. data/spec/unit/environments_spec.rb +65 -28
  287. data/spec/unit/face/facts_spec.rb +24 -20
  288. data/spec/unit/face/module/search_spec.rb +17 -0
  289. data/spec/unit/face/plugin_spec.rb +12 -10
  290. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  291. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  292. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  293. data/spec/unit/file_system_spec.rb +26 -2
  294. data/spec/unit/functions/lookup_spec.rb +13 -0
  295. data/spec/unit/http/client_spec.rb +327 -35
  296. data/spec/unit/http/external_client_spec.rb +201 -0
  297. data/spec/unit/http/resolver_spec.rb +34 -2
  298. data/spec/unit/http/response_spec.rb +75 -0
  299. data/spec/unit/http/service/ca_spec.rb +53 -11
  300. data/spec/unit/http/service/compiler_spec.rb +627 -0
  301. data/spec/unit/http/service/file_server_spec.rb +308 -0
  302. data/spec/unit/http/service/report_spec.rb +27 -9
  303. data/spec/unit/http/service_spec.rb +98 -5
  304. data/spec/unit/http/session_spec.rb +190 -7
  305. data/spec/unit/indirector/catalog/compiler_spec.rb +47 -29
  306. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  307. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  308. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  309. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  310. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  311. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  312. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  313. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  314. data/spec/unit/indirector/request_spec.rb +1 -1
  315. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  316. data/spec/unit/indirector/rest_spec.rb +13 -0
  317. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  318. data/spec/unit/interface_spec.rb +3 -3
  319. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  320. data/spec/unit/network/http/connection_spec.rb +559 -175
  321. data/spec/unit/network/http/nocache_pool_spec.rb +25 -3
  322. data/spec/unit/network/http/pool_spec.rb +89 -11
  323. data/spec/unit/network/http_pool_spec.rb +63 -57
  324. data/spec/unit/network/http_spec.rb +1 -1
  325. data/spec/unit/node/environment_spec.rb +16 -0
  326. data/spec/unit/node/facts_spec.rb +2 -1
  327. data/spec/unit/node_spec.rb +7 -4
  328. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  329. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  330. data/spec/unit/parser/scope_spec.rb +1 -1
  331. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  332. data/spec/unit/pops/loaders/loaders_spec.rb +1 -1
  333. data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
  334. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  335. data/spec/unit/pops/validator/validator_spec.rb +7 -2
  336. data/spec/unit/provider/aix_object_spec.rb +16 -2
  337. data/spec/unit/provider/group/groupadd_spec.rb +181 -56
  338. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  339. data/spec/unit/provider/package/aix_spec.rb +29 -0
  340. data/spec/unit/provider/package/apt_spec.rb +43 -2
  341. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  342. data/spec/unit/provider/package/dnfmodule_spec.rb +76 -15
  343. data/spec/unit/provider/package/dpkg_spec.rb +28 -6
  344. data/spec/unit/provider/package/gem_spec.rb +40 -0
  345. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  346. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  347. data/spec/unit/provider/package/pip_spec.rb +68 -19
  348. data/spec/unit/provider/package/pkg_spec.rb +15 -1
  349. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  350. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  351. data/spec/unit/provider/package/portage_spec.rb +5 -0
  352. data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
  353. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  354. data/spec/unit/provider/package/yum_spec.rb +292 -0
  355. data/spec/unit/provider/package/zypper_spec.rb +84 -0
  356. data/spec/unit/provider/service/init_spec.rb +1 -0
  357. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  358. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  359. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  360. data/spec/unit/provider/service/systemd_spec.rb +92 -12
  361. data/spec/unit/provider/service/windows_spec.rb +22 -14
  362. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  363. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  364. data/spec/unit/provider/user/useradd_spec.rb +43 -24
  365. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  366. data/spec/unit/puppet_pal_2pec.rb +0 -26
  367. data/spec/unit/puppet_pal_catalog_spec.rb +46 -0
  368. data/spec/unit/puppet_spec.rb +47 -0
  369. data/spec/unit/reports/http_spec.rb +70 -52
  370. data/spec/unit/resource_spec.rb +3 -3
  371. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  372. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  373. data/spec/unit/ssl/certificate_spec.rb +7 -0
  374. data/spec/unit/ssl/host_spec.rb +4 -2
  375. data/spec/unit/ssl/oids_spec.rb +1 -0
  376. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  377. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  378. data/spec/unit/test/test_helper_spec.rb +17 -0
  379. data/spec/unit/transaction/persistence_spec.rb +1 -10
  380. data/spec/unit/transaction/report_spec.rb +5 -1
  381. data/spec/unit/transaction_spec.rb +0 -2
  382. data/spec/unit/type/file/ensure_spec.rb +1 -2
  383. data/spec/unit/type/file/source_spec.rb +89 -38
  384. data/spec/unit/type/file_spec.rb +122 -96
  385. data/spec/unit/type/package_spec.rb +8 -0
  386. data/spec/unit/type/service_spec.rb +185 -8
  387. data/spec/unit/type/user_spec.rb +1 -2
  388. data/spec/unit/type_spec.rb +50 -0
  389. data/spec/unit/util/at_fork_spec.rb +3 -2
  390. data/spec/unit/util/autoload_spec.rb +2 -1
  391. data/spec/unit/util/checksums_spec.rb +16 -0
  392. data/spec/unit/util/log/destinations_spec.rb +1 -29
  393. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  394. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  395. data/spec/unit/util/package/version/range_spec.rb +175 -0
  396. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  397. data/spec/unit/util/pidlock_spec.rb +112 -42
  398. data/spec/unit/util/plist_spec.rb +20 -0
  399. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  400. data/spec/unit/util/storage_spec.rb +1 -8
  401. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  402. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  403. data/spec/unit/util/windows/service_spec.rb +4 -4
  404. data/spec/unit/util/windows/sid_spec.rb +2 -2
  405. data/spec/unit/util_spec.rb +3 -3
  406. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  407. data/tasks/generate_cert_fixtures.rake +15 -1
  408. data/tasks/manpages.rake +5 -35
  409. metadata +73 -12
  410. data/COMMITTERS.md +0 -244
  411. data/spec/integration/faces/plugin_spec.rb +0 -61
  412. data/spec/integration/test/test_helper_spec.rb +0 -31
@@ -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
@@ -30,7 +30,8 @@ Puppet::Type.type(:service).provide :systemd, :parent => :base do
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
@@ -14,29 +14,28 @@ Puppet::Type.type(:service).provide :windows, :parent => :service do
14
14
  defaultfor :operatingsystem => :windows
15
15
  confine :operatingsystem => :windows
16
16
 
17
- has_feature :refreshable
18
- has_feature :configurable_timeout
17
+ has_feature :refreshable, :configurable_timeout, :manages_logon_credentials
19
18
 
20
19
  def enable
21
- Puppet::Util::Windows::Service.set_startup_mode( @resource[:name], :SERVICE_AUTO_START )
20
+ Puppet::Util::Windows::Service.set_startup_configuration(@resource[:name], options: {startup_type: :SERVICE_AUTO_START})
22
21
  rescue => detail
23
22
  raise Puppet::Error.new(_("Cannot enable %{resource_name}, error was: %{detail}") % { resource_name: @resource[:name], detail: detail }, detail )
24
23
  end
25
24
 
26
25
  def disable
27
- Puppet::Util::Windows::Service.set_startup_mode( @resource[:name], :SERVICE_DISABLED )
26
+ Puppet::Util::Windows::Service.set_startup_configuration(@resource[:name], options: {startup_type: :SERVICE_DISABLED})
28
27
  rescue => detail
29
28
  raise Puppet::Error.new(_("Cannot disable %{resource_name}, error was: %{detail}") % { resource_name: @resource[:name], detail: detail }, detail )
30
29
  end
31
30
 
32
31
  def manual_start
33
- Puppet::Util::Windows::Service.set_startup_mode( @resource[:name], :SERVICE_DEMAND_START )
32
+ Puppet::Util::Windows::Service.set_startup_configuration(@resource[:name], options: {startup_type: :SERVICE_DEMAND_START})
34
33
  rescue => detail
35
34
  raise Puppet::Error.new(_("Cannot enable %{resource_name} for manual start, error was: %{detail}") % { resource_name: @resource[:name], detail: detail }, detail )
36
35
  end
37
36
 
38
37
  def delayed_start
39
- Puppet::Util::Windows::Service.set_startup_mode( @resource[:name], :SERVICE_AUTO_START, true )
38
+ Puppet::Util::Windows::Service.set_startup_configuration(@resource[:name], options: {startup_type: :SERVICE_AUTO_START, delayed: true})
40
39
  rescue => detail
41
40
  raise Puppet::Error.new(_("Cannot enable %{resource_name} for delayed start, error was: %{detail}") % { resource_name: @resource[:name], detail: detail }, detail )
42
41
  end
@@ -110,7 +109,10 @@ Puppet::Type.type(:service).provide :windows, :parent => :service do
110
109
  raise Puppet::Error.new(_("Unknown service state '%{current_state}' for service '%{resource_name}'") % { current_state: current_state, resource_name: @resource[:name] })
111
110
  end
112
111
  debug("Service #{@resource[:name]} is #{current_state}")
113
- return state
112
+ state
113
+ rescue => detail
114
+ Puppet.warning("Status for service #{@resource[:name]} could not be retrieved: #{detail}")
115
+ :stopped
114
116
  end
115
117
 
116
118
  def default_timeout
@@ -125,4 +127,18 @@ Puppet::Type.type(:service).provide :windows, :parent => :service do
125
127
  end
126
128
  services
127
129
  end
130
+
131
+ def logonaccount
132
+ return unless Puppet::Util::Windows::Service.exists?(@resource[:name])
133
+ Puppet::Util::Windows::Service.logon_account(@resource[:name])
134
+ end
135
+
136
+ def logonaccount=(value)
137
+ Puppet::Util::Windows::Service.set_startup_configuration(@resource[:name], options: {logon_account: value, logon_password: @resource[:logonpassword]})
138
+ restart if @resource[:ensure] == :running && [:running, :paused].include?(status)
139
+ end
140
+
141
+ def logonpassword=(value)
142
+ Puppet::Util::Windows::Service.set_startup_configuration(@resource[:name], options: {logon_password: value})
143
+ end
128
144
  end
@@ -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
@@ -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
@@ -135,10 +138,17 @@ Puppet::Type.type(:user).provide :useradd, :parent => Puppet::Provider::NameServ
135
138
 
136
139
  def check_manage_home
137
140
  cmd = []
138
- if @resource.managehome? && (!@resource.forcelocal?)
139
- cmd << "-m"
140
- elsif (!@resource.managehome?) && Facter.value(:osfamily) == 'RedHat'
141
- cmd << "-M"
141
+ if @resource.managehome?
142
+ # libuser does not implement the -m flag
143
+ cmd << "-m" unless @resource.forcelocal?
144
+ else
145
+ osfamily = Facter.value(:osfamily)
146
+ osversion = Facter.value(:operatingsystemmajrelease).to_i
147
+ # SLES 11 uses pwdutils instead of shadow, which does not have -M
148
+ # Solaris and OpenBSD use different useradd flavors
149
+ unless osfamily =~ /Solaris|OpenBSD/ || osfamily == 'Suse' && osversion <= 11
150
+ cmd << "-M"
151
+ end
142
152
  end
143
153
  cmd
144
154
  end
@@ -20,19 +20,25 @@ 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
+
28
+ # Puppet's http client implementation accepts userinfo in the URL
29
+ # but puppetserver's does not. So pass credentials explicitly.
24
30
  if url.user && url.password
25
31
  options[:basic_auth] = {
26
- :user => url.user,
27
- :password => url.password
32
+ user: url.user,
33
+ password: url.password
28
34
  }
29
35
  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 }
36
+
37
+ client = Puppet.runtime[:http]
38
+ client.post(url, self.to_yaml, headers: headers, options: options) do |response|
39
+ unless response.success?
40
+ Puppet.err _("Unable to submit report to %{url} [%{code}] %{message}") % { url: Puppet[:reporturl].to_s, code: response.code, message: response.reason }
41
+ end
36
42
  end
37
43
  end
38
44
  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
@@ -628,7 +628,8 @@ class Puppet::Resource
628
628
  def self.extract_type_and_title(argtype, argtitle)
629
629
  if (argtype.nil? || argtype == :component || argtype == :whit) &&
630
630
  argtitle =~ /^([^\[\]]+)\[(.+)\]$/m then [ $1, $2 ]
631
- elsif argtitle.nil? && argtype =~ /^([^\[\]]+)\[(.+)\]$/m then [ $1, $2 ]
631
+ elsif argtitle.nil? && argtype.is_a?(String) &&
632
+ argtype =~ /^([^\[\]]+)\[(.+)\]$/m then [ $1, $2 ]
632
633
  elsif argtitle then [ argtype, argtitle ]
633
634
  elsif argtype.is_a?(Puppet::Type) then [ argtype.class.name, argtype.title ]
634
635
  else raise ArgumentError, _("No title provided and %{type} is not a valid resource reference") % { type: argtype.inspect }
@@ -11,6 +11,7 @@ class Puppet::Resource::Type
11
11
  include Puppet::Util::Warnings
12
12
  include Puppet::Util::Errors
13
13
 
14
+ # @deprecated application orchestration will be removed in puppet 7 (capability_mapping, application, site)
14
15
  RESOURCE_KINDS = [:hostclass, :node, :definition, :capability_mapping, :application, :site]
15
16
 
16
17
  # Map the names used in our documentation to the names used internally
@@ -69,6 +70,8 @@ class Puppet::Resource::Type
69
70
 
70
71
  # Evaluate the resources produced by the given resource. These resources are
71
72
  # evaluated in a separate but identical scope from the rest of the resource.
73
+ #
74
+ # @deprecated application orchestration will be removed in puppet 7
72
75
  def evaluate_produces(resource, scope)
73
76
  # Only defined types and classes can produce capabilities
74
77
  return unless definition? || hostclass?
@@ -161,19 +164,23 @@ class Puppet::Resource::Type
161
164
  @module_name = options[:module_name]
162
165
  end
163
166
 
167
+ # @deprecated application orchestration will be removed in puppet 7
164
168
  def produces
165
169
  @produces || EMPTY_ARRAY
166
170
  end
167
171
 
172
+ # @deprecated application orchestration will be removed in puppet 7
168
173
  def consumes
169
174
  @consumes || EMPTY_ARRAY
170
175
  end
171
176
 
177
+ # @deprecated application orchestration will be removed in puppet 7
172
178
  def add_produces(blueprint)
173
179
  @produces ||= []
174
180
  @produces << blueprint
175
181
  end
176
182
 
183
+ # @deprecated application orchestration will be removed in puppet 7
177
184
  def add_consumes(blueprint)
178
185
  @consumes ||= []
179
186
  @consumes << blueprint
@@ -235,6 +242,7 @@ class Puppet::Resource::Type
235
242
  when :node
236
243
  :node
237
244
  when :site
245
+ # @deprecated application orchestration will be removed in puppet 7
238
246
  :site
239
247
  end
240
248
 
@@ -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)