puppet 6.12.0 → 6.17.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 (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
@@ -43,6 +43,7 @@ class Puppet::Agent
43
43
  end
44
44
 
45
45
  result = nil
46
+ wait_for_lock_deadline = nil
46
47
  block_run = Puppet::Application.controlled_run do
47
48
  splay client_options.fetch :splay, Puppet[:splay]
48
49
  result = run_in_fork(should_fork) do
@@ -60,16 +61,29 @@ class Puppet::Agent
60
61
  end
61
62
  end
62
63
  rescue Puppet::LockError
63
- Puppet.notice _("Run of %{client_class} already in progress; skipping (%{lockfile_path} exists)") % { client_class: client_class, lockfile_path: lockfile_path }
64
- return
64
+ now = Time.now.to_i
65
+ wait_for_lock_deadline ||= now + Puppet[:maxwaitforlock]
66
+
67
+ if Puppet[:waitforlock] < 1
68
+ Puppet.notice _("Run of %{client_class} already in progress; skipping (%{lockfile_path} exists)") % { client_class: client_class, lockfile_path: lockfile_path }
69
+ nil
70
+ elsif now >= wait_for_lock_deadline
71
+ Puppet.notice _("Exiting now because the maxwaitforlock timeout has been exceeded.")
72
+ nil
73
+ else
74
+ Puppet.info _("Another puppet instance is already running; --waitforlock flag used, waiting for running instance to finish.")
75
+ Puppet.info _("Will try again in %{time} seconds.") % {time: Puppet[:waitforlock]}
76
+ sleep Puppet[:waitforlock]
77
+ retry
78
+ end
65
79
  rescue RunTimeoutError => detail
66
80
  Puppet.log_exception(detail, _("Execution of %{client_class} did not complete within %{runtimeout} seconds and was terminated.") %
67
81
  {client_class: client_class,
68
82
  runtimeout: Puppet[:runtimeout]})
69
- return 1
83
+ nil
70
84
  rescue StandardError => detail
71
85
  Puppet.log_exception(detail, _("Could not run %{client_class}: %{detail}") % { client_class: client_class, detail: detail })
72
- 1
86
+ nil
73
87
  end
74
88
  end
75
89
  end
@@ -95,11 +109,9 @@ class Puppet::Agent
95
109
  atForkHandler.child
96
110
  $0 = _("puppet agent: applying configuration")
97
111
  begin
98
- exit(yield)
99
- rescue SystemExit
100
- exit(-1)
112
+ exit(yield || 1)
101
113
  rescue NoMemoryError
102
- exit(-2)
114
+ exit(254)
103
115
  end
104
116
  end
105
117
  ensure
@@ -107,12 +119,6 @@ class Puppet::Agent
107
119
  end
108
120
 
109
121
  exit_code = Process.waitpid2(child_pid)
110
- case exit_code[1].exitstatus
111
- when -1
112
- raise SystemExit
113
- when -2
114
- raise NoMemoryError
115
- end
116
122
  exit_code[1].exitstatus
117
123
  end
118
124
 
@@ -39,6 +39,7 @@ class Puppet::Application::Agent < Puppet::Application
39
39
  :graph => true,
40
40
  :fingerprint => false,
41
41
  :sourceaddress => nil,
42
+ :start_time => Time.now,
42
43
  }.each do |opt,val|
43
44
  options[opt] = val
44
45
  end
@@ -90,7 +91,7 @@ puppet-agent(8) -- #{summary}
90
91
 
91
92
  SYNOPSIS
92
93
  --------
93
- Retrieves the client configuration from the puppet master and applies it to
94
+ Retrieves the client configuration from the Puppet master and applies it to
94
95
  the local host.
95
96
 
96
97
  This service may be run as a daemon, run periodically using cron (or something
@@ -164,13 +165,15 @@ when signing certificates).
164
165
  only resources not tagged with the specified tags will be applied.
165
166
  Values must be comma-separated.
166
167
 
168
+
167
169
  OPTIONS
168
170
  -------
169
171
 
170
172
  Note that any Puppet setting that's valid in the configuration file is also a
171
173
  valid long argument. For example, 'server' is a valid setting, so you can
172
- specify '--server <servername>' as an argument. Boolean settings translate into
173
- '--setting' and '--no-setting' pairs.
174
+ specify '--server <servername>' as an argument. Boolean settings accept a '--no-'
175
+ prefix to turn off a behavior, translating into '--setting' and '--no-setting'
176
+ pairs, such as `--daemonize` and `--no-daemonize`.
174
177
 
175
178
  See the configuration file documentation at
176
179
  https://puppet.com/docs/puppet/latest/configuration.html for the
@@ -237,15 +240,14 @@ generated by running puppet agent with '--genconfig'.
237
240
  * --enable:
238
241
  Enable working on the local system. This removes any lock file,
239
242
  causing 'puppet agent' to start managing the local system again
240
- (although it will continue to use its normal scheduling, so it might
241
- not start for another half hour).
243
+ However, it continues to use its normal scheduling, so it might
244
+ not start for another half hour.
242
245
 
243
246
  'puppet agent' exits after executing this.
244
247
 
245
248
  * --evaltrace:
246
249
  Logs each resource as it is being evaluated. This allows you to interactively see exactly what is being done. (This is a Puppet setting, and can go in puppet.conf. Note the special 'no-' prefix for boolean settings on the command line.)
247
250
 
248
-
249
251
  * --fingerprint:
250
252
  Display the current certificate or certificate signing request
251
253
  fingerprint and then exit. Use the '--digest' option to change the
@@ -256,7 +258,9 @@ generated by running puppet agent with '--genconfig'.
256
258
 
257
259
  * --job-id:
258
260
  Attach the specified job id to the catalog request and the report used for
259
- this agent run. This option only works when '--onetime' is used.
261
+ this agent run. This option only works when '--onetime' is used. When using
262
+ Puppet Enterprise this flag should not be used as the orchestrator sets the
263
+ job-id for you and it must be unique.
260
264
 
261
265
  * --logdest:
262
266
  Where to send log messages. Choose between 'syslog' (the POSIX syslog
@@ -278,7 +282,7 @@ generated by running puppet agent with '--genconfig'.
278
282
 
279
283
  * --noop:
280
284
  Use 'noop' mode where the daemon runs in a no-op or dry-run mode. This
281
- is useful for seeing what changes Puppet will make without actually
285
+ is useful for seeing what changes Puppet would make without actually
282
286
  executing the changes.
283
287
  (This is a Puppet setting, and can go in puppet.conf. Note the special 'no-'
284
288
  prefix for boolean settings on the command line.)
@@ -302,8 +306,6 @@ generated by running puppet agent with '--genconfig'.
302
306
  * --trace
303
307
  Prints stack traces on some errors. (This is a Puppet setting, and can go in puppet.conf. Note the special 'no-' prefix for boolean settings on the command line.)
304
308
 
305
-
306
-
307
309
  * --verbose:
308
310
  Turn on verbose reporting.
309
311
 
@@ -317,8 +319,7 @@ generated by running puppet agent with '--genconfig'.
317
319
  it to sign a certificate request. This is useful for the initial setup
318
320
  of a puppet client. You can turn off waiting for certificates by
319
321
  specifying a time of 0.
320
- (This is a Puppet setting, and can go in puppet.conf. Note the special 'no-'
321
- prefix for boolean settings on the command line.)
322
+ (This is a Puppet setting, and can go in puppet.conf.)
322
323
 
323
324
 
324
325
  EXAMPLE
@@ -364,8 +365,17 @@ Copyright (c) 2011 Puppet Inc., LLC Licensed under the Apache 2.0 License
364
365
  daemon.set_signal_traps
365
366
 
366
367
  log_config if Puppet[:daemonize]
367
-
368
- Puppet.override(ssl_context: wait_for_certificates) do
368
+
369
+ # run ssl state machine, waiting if needed
370
+ ssl_context = wait_for_certificates
371
+
372
+ # Each application is responsible for pushing loaders onto the context.
373
+ # Use the current environment that has already been established, though
374
+ # it may change later during the configurer run.
375
+ env = Puppet.lookup(:current_environment)
376
+ Puppet.override(ssl_context: ssl_context,
377
+ current_environment: env,
378
+ loaders: Puppet::Pops::Loaders.new(env, true)) do
369
379
  if Puppet[:onetime]
370
380
  onetime(daemon)
371
381
  else
@@ -407,7 +417,7 @@ Copyright (c) 2011 Puppet Inc., LLC Licensed under the Apache 2.0 License
407
417
 
408
418
  def onetime(daemon)
409
419
  begin
410
- exitstatus = daemon.agent.run(:job_id => options[:job_id])
420
+ exitstatus = daemon.agent.run({:job_id => options[:job_id], :start_time => options[:start_time]})
411
421
  rescue => detail
412
422
  Puppet.log_exception(detail)
413
423
  end
@@ -490,9 +500,8 @@ Copyright (c) 2011 Puppet Inc., LLC Licensed under the Apache 2.0 License
490
500
  end
491
501
 
492
502
  def daemonize_process_when(should_daemonize)
493
- daemon = Puppet::Daemon.new(Puppet::Util::Pidlock.new(Puppet[:pidfile]))
503
+ daemon = Puppet::Daemon.new(@agent, Puppet::Util::Pidlock.new(Puppet[:pidfile]))
494
504
  daemon.argv = @argv
495
- daemon.agent = @agent
496
505
 
497
506
  daemon.daemonize if should_daemonize
498
507
 
@@ -67,13 +67,15 @@ class TypeDoc
67
67
  @types.keys.sort_by(&:to_s).each do |name|
68
68
  type = @types[name]
69
69
  s = type.doc.gsub(/\s+/, " ")
70
- n = s.index(". ")
71
- if n.nil?
70
+ if s.empty?
72
71
  s = ".. no documentation .."
73
- elsif n > 45
74
- s = s[0, 45] + " ..."
75
72
  else
76
- s = s[0, n]
73
+ n = s.index(".") || s.length
74
+ if n > 45
75
+ s = s[0, 45] + " ..."
76
+ else
77
+ s = s[0, n]
78
+ end
77
79
  end
78
80
  printf "%-15s - %s\n", name, s
79
81
  end
@@ -194,7 +194,7 @@ you can specify '--server ' as an argument.
194
194
 
195
195
  * --resource:
196
196
  Displays a resource state as Puppet code, roughly equivalent to
197
- `puppet resource`. Can be filterd by title. Requires --target be specified.
197
+ `puppet resource`. Can be filtered by title. Requires --target be specified.
198
198
 
199
199
  * --target:
200
200
  Target a specific device/certificate in the device.conf. Doing so will perform a
@@ -259,7 +259,7 @@ Licensed under the Apache 2.0 License
259
259
  end
260
260
  end
261
261
  devices.collect do |devicename,device|
262
- pool = Puppet::Network::HTTP::Pool.new(Puppet[:http_keepalive_timeout])
262
+ pool = Puppet.runtime[:http].pool
263
263
  Puppet.override(:http_pool => pool) do
264
264
  # TODO when we drop support for ruby < 2.5 we can remove the extra block here
265
265
  begin
@@ -69,6 +69,19 @@ running as a user with valid Puppet certificates. Alternatively, you can
69
69
  use your local file bucket by specifying '--local', or by specifying
70
70
  '--bucket' with a local path.
71
71
 
72
+ > **Note**: Enabling and using the backup option, and by extension the
73
+ filebucket resource, requires appropriate planning and management to ensure
74
+ that sufficient disk space is available for the file backups. Generally, you
75
+ can implement this using one of the following two options:
76
+ - Use a `find` command and `crontab` entry to retain only the last X days
77
+ of file backups. For example:
78
+
79
+ ```shell
80
+ find /opt/puppetlabs/server/data/puppetserver/bucket -type f -mtime +45 -atime +45 -print0 | xargs -0 rm
81
+ ```
82
+
83
+ - Restrict the directory to a maximum size after which the oldest items are removed.
84
+
72
85
 
73
86
  OPTIONS
74
87
  -------
@@ -108,7 +121,7 @@ configuration options can also be generated by running puppet with
108
121
  by default.
109
122
 
110
123
  * --server_list:
111
- A list of comma seperated servers; only the first entry is used for file storage.
124
+ A list of comma separated servers; only the first entry is used for file storage.
112
125
  This setting takes precidence over `server`.
113
126
 
114
127
  * --server:
@@ -279,7 +292,7 @@ Copyright (c) 2011 Puppet Inc., LLC Licensed under the Apache 2.0 License
279
292
  Puppet::Log.level = :info
280
293
  end
281
294
 
282
- exit(Puppet.settings.print_configs ? 0 : 1) if Puppet.settings.print_configs?
295
+ exit(Puppet.settings.print_configs ? 0 : 1) if Puppet.settings.print_configs?
283
296
 
284
297
  require 'puppet/file_bucket/dipper'
285
298
  begin
@@ -287,19 +300,10 @@ Copyright (c) 2011 Puppet Inc., LLC Licensed under the Apache 2.0 License
287
300
  path = options[:bucket] || Puppet[:clientbucketdir]
288
301
  @client = Puppet::FileBucket::Dipper.new(:Path => path)
289
302
  else
290
- if Puppet[:server_list] && !Puppet[:server_list].empty?
291
- server = Puppet[:server_list].first
292
- #TRANSLATORS 'server_list' is the name of a setting and should not be translated
293
- Puppet.debug _("Selected server from first entry of the `server_list` setting: %{server}:%{port}") % {server: server[0], port: server[1]}
294
- @client = Puppet::FileBucket::Dipper.new(
295
- :Server => server[0],
296
- :Port => server[1]
297
- )
298
- else
299
- #TRANSLATORS 'server' is the name of a setting and should not be translated
300
- Puppet.debug _("Selected server from the `server` setting: %{server}") % {server: Puppet[:server]}
301
- @client = Puppet::FileBucket::Dipper.new(:Server => Puppet[:server])
302
- end
303
+ session = Puppet.lookup(:http_session)
304
+ api = session.route_to(:puppet)
305
+
306
+ @client = Puppet::FileBucket::Dipper.new(Server: api.url.host, Port: api.url.port)
303
307
  end
304
308
  rescue => detail
305
309
  Puppet.log_exception(detail)
@@ -1,3 +1,4 @@
1
1
  require 'puppet/application/face_base'
2
2
  class Puppet::Application::Plugin < Puppet::Application::FaceBase
3
+ environment_mode :not_required
3
4
  end
@@ -5,7 +5,7 @@ class Puppet::Application::Resource < Puppet::Application
5
5
  attr_accessor :host, :extra_params
6
6
 
7
7
  def preinit
8
- @extra_params = []
8
+ @extra_params = [:provider]
9
9
  end
10
10
 
11
11
  option("--debug","-d")
@@ -28,7 +28,7 @@ OPTIONS
28
28
  -------
29
29
 
30
30
  * --help:
31
- Print this help messsge.
31
+ Print this help message.
32
32
 
33
33
  * --verbose:
34
34
  Print extra information.
@@ -90,7 +90,7 @@ HELP
90
90
  @cert_provider = Puppet::X509::CertProvider.new
91
91
  @ssl_provider = Puppet::SSL::SSLProvider.new
92
92
  @machine = Puppet::SSL::StateMachine.new
93
- @session = Puppet.runtime['http'].create_session
93
+ @session = Puppet.runtime[:http].create_session
94
94
  end
95
95
 
96
96
  def setup_logs
@@ -182,7 +182,7 @@ HELP
182
182
  route = create_route(ssl_context)
183
183
  Puppet.info _("Downloading certificate '%{name}' from %{url}") % { name: Puppet[:certname], url: route.url }
184
184
 
185
- x509 = route.get_certificate(Puppet[:certname], ssl_context: ssl_context)
185
+ _, x509 = route.get_certificate(Puppet[:certname], ssl_context: ssl_context)
186
186
  cert = OpenSSL::X509::Certificate.new(x509)
187
187
  Puppet.notice _("Downloaded certificate '%{name}' with fingerprint %{fingerprint}") % { name: Puppet[:certname], fingerprint: fingerprint(cert) }
188
188
 
@@ -226,7 +226,7 @@ HELP
226
226
  begin
227
227
  ssl_context = @machine.ensure_ca_certificates
228
228
  route = create_route(ssl_context)
229
- cert = route.get_certificate(certname, ssl_context: ssl_context)
229
+ _, cert = route.get_certificate(certname, ssl_context: ssl_context)
230
230
  rescue Puppet::HTTP::ResponseError => e
231
231
  if e.response.code.to_i != 404
232
232
  raise Puppet::Error.new(_("Failed to connect to the CA to determine if certificate %{certname} has been cleaned") % { certname: certname }, e)
@@ -1,7 +1,5 @@
1
1
  # The client for interacting with the puppetmaster config server.
2
- require 'sync'
3
2
  require 'timeout'
4
- require 'puppet/network/http_pool'
5
3
  require 'puppet/util'
6
4
  require 'securerandom'
7
5
  #require 'puppet/parser/script_compiler'
@@ -65,7 +63,7 @@ class Puppet::Configurer
65
63
  end
66
64
 
67
65
  # Get the remote catalog, yo. Returns nil if no catalog can be found.
68
- def retrieve_catalog(query_options)
66
+ def retrieve_catalog(facts, query_options)
69
67
  query_options ||= {}
70
68
  result = retrieve_catalog_from_cache(query_options) if Puppet[:use_cached_catalog]
71
69
  if result
@@ -73,7 +71,7 @@ class Puppet::Configurer
73
71
 
74
72
  Puppet.info _("Using cached catalog from environment '%{environment}'") % { environment: result.environment }
75
73
  else
76
- result = retrieve_new_catalog(query_options)
74
+ result = retrieve_new_catalog(facts, query_options)
77
75
 
78
76
  if !result
79
77
  if !Puppet[:usecacheonfailure]
@@ -100,12 +98,11 @@ class Puppet::Configurer
100
98
  end
101
99
 
102
100
  # Convert a plain resource catalog into our full host catalog.
103
- def convert_catalog(result, duration, options = {})
101
+ def convert_catalog(result, duration, facts, options = {})
104
102
  catalog = nil
105
103
 
106
104
  catalog_conversion_time = thinmark do
107
105
  # Will mutate the result and replace all Deferred values with resolved values
108
- facts = options[:convert_with_facts]
109
106
  if facts
110
107
  Puppet::Pops::Evaluator::DeferredResolver.resolve_and_replace(facts, result)
111
108
  end
@@ -134,6 +131,7 @@ class Puppet::Configurer
134
131
  end
135
132
 
136
133
  facts_hash = {}
134
+ facts = nil
137
135
  if Puppet::Resource::Catalog.indirection.terminus_class == :rest
138
136
  # This is a bit complicated. We need the serialized and escaped facts,
139
137
  # and we need to know which format they're encoded in. Thus, we
@@ -142,15 +140,14 @@ class Puppet::Configurer
142
140
  # facts_for_uploading may set Puppet[:node_name_value] as a side effect
143
141
  facter_time = thinmark do
144
142
  facts = find_facts
145
- options[:convert_with_facts] = facts
146
143
  facts_hash = encode_facts(facts) # encode for uploading # was: facts_for_uploading
147
144
  end
148
145
  options[:report].add_times(:fact_generation, facter_time) if options[:report]
149
146
  end
150
- facts_hash
147
+ [facts_hash, facts]
151
148
  end
152
149
 
153
- def prepare_and_retrieve_catalog(cached_catalog, options, query_options)
150
+ def prepare_and_retrieve_catalog(cached_catalog, facts, options, query_options)
154
151
  # set report host name now that we have the fact
155
152
  options[:report].host = Puppet[:node_name_value]
156
153
 
@@ -166,7 +163,7 @@ class Puppet::Configurer
166
163
  catalog = cached_catalog || options[:catalog]
167
164
  unless catalog
168
165
  # retrieve_catalog returns resource catalog
169
- catalog = retrieve_catalog(query_options)
166
+ catalog = retrieve_catalog(facts, query_options)
170
167
  Puppet.err _("Could not retrieve catalog; skipping run") unless catalog
171
168
  end
172
169
  catalog
@@ -197,12 +194,12 @@ class Puppet::Configurer
197
194
  # This just passes any options on to the catalog,
198
195
  # which accepts :tags and :ignoreschedules.
199
196
  def run(options = {})
200
- pool = Puppet::Network::HTTP::Pool.new(Puppet[:http_keepalive_timeout])
197
+ pool = Puppet.runtime[:http].pool
201
198
  # We create the report pre-populated with default settings for
202
199
  # environment and transaction_uuid very early, this is to ensure
203
200
  # they are sent regardless of any catalog compilation failures or
204
201
  # exceptions.
205
- options[:report] ||= Puppet::Transaction::Report.new(nil, @environment, @transaction_uuid, @job_id)
202
+ options[:report] ||= Puppet::Transaction::Report.new(nil, @environment, @transaction_uuid, @job_id, options[:start_time] || Time.now)
206
203
  report = options[:report]
207
204
  init_storage
208
205
 
@@ -211,13 +208,9 @@ class Puppet::Configurer
211
208
  completed = nil
212
209
  begin
213
210
  Puppet.override(:http_pool => pool) do
214
-
215
211
  # Skip failover logic if the server_list setting is empty
216
- if Puppet.settings[:server_list].nil? || Puppet.settings[:server_list].empty?
217
- do_failover = false
218
- else
219
- do_failover = true
220
- end
212
+ do_failover = Puppet.settings[:server_list] && !Puppet.settings[:server_list].empty?
213
+
221
214
  # When we are passed a catalog, that means we're in apply
222
215
  # mode. We shouldn't try to do any failover in that case.
223
216
  if options[:catalog].nil? && do_failover
@@ -225,8 +218,6 @@ class Puppet::Configurer
225
218
  if server.nil?
226
219
  raise Puppet::Error, _("Could not select a functional puppet master from server_list: '%{server_list}'") % { server_list: Puppet.settings.value(:server_list, Puppet[:environment].to_sym, true) }
227
220
  else
228
- #TRANSLATORS 'server_list' is the name of a setting and should not be translated
229
- Puppet.debug _("Selected puppet server from the `server_list` setting: %{server}:%{port}") % { server: server, port: port }
230
221
  report.master_used = "#{server}:#{port}"
231
222
  end
232
223
  Puppet.override(server: server, serverport: port) do
@@ -244,9 +235,13 @@ class Puppet::Configurer
244
235
  end
245
236
 
246
237
  def run_internal(options)
247
- start = Time.now
248
238
  report = options[:report]
249
239
 
240
+ if options[:start_time]
241
+ startup_time = Time.now - options[:start_time]
242
+ report.add_times(:startup_time, startup_time)
243
+ end
244
+
250
245
  # If a cached catalog is explicitly requested, attempt to retrieve it. Skip the node request,
251
246
  # don't pluginsync and switch to the catalog's environment if we successfully retrieve it.
252
247
  if Puppet[:use_cached_catalog]
@@ -274,7 +269,7 @@ class Puppet::Configurer
274
269
 
275
270
  begin
276
271
  unless Puppet[:node_name_fact].empty?
277
- query_options = get_facts(options)
272
+ query_options, facts = get_facts(options)
278
273
  end
279
274
 
280
275
  configured_environment = Puppet[:environment] if Puppet.settings.set_by_config?(:environment)
@@ -307,6 +302,16 @@ class Puppet::Configurer
307
302
  @environment = node.environment.to_s
308
303
  report.environment = @environment
309
304
  query_options = nil
305
+ facts = nil
306
+
307
+ new_env = Puppet::Node::Environment.remote(@environment)
308
+ Puppet.push_context(
309
+ {
310
+ current_environment: new_env,
311
+ loaders: Puppet::Pops::Loaders.new(new_env, true)
312
+ },
313
+ "Local node environment #{@environment} for configurer transaction"
314
+ )
310
315
  else
311
316
  Puppet.info _("Using configured environment '%{env}'") % { env: @environment }
312
317
  end
@@ -317,25 +322,24 @@ class Puppet::Configurer
317
322
  end
318
323
  end
319
324
 
320
- current_environment = Puppet.lookup(:current_environment)
321
- if current_environment.name == @environment.intern
322
- local_node_environment = current_environment
323
- else
324
- local_node_environment = Puppet::Node::Environment.create(@environment,
325
- current_environment.modulepath,
326
- current_environment.manifest,
327
- current_environment.config_version)
325
+ # This is to maintain compatibility with anyone using this class
326
+ # aside from agent, apply, device.
327
+ unless Puppet.lookup(:loaders) { nil }
328
+ new_env = Puppet::Node::Environment.remote(@environment)
329
+ Puppet.push_context(
330
+ {
331
+ current_environment: new_env,
332
+ loaders: Puppet::Pops::Loaders.new(new_env, true)
333
+ },
334
+ "Local node environment #{@environment} for configurer transaction"
335
+ )
328
336
  end
329
- Puppet.push_context({
330
- :current_environment => local_node_environment,
331
- :loaders => Puppet::Pops::Loaders.new(local_node_environment, true)
332
- }, "Local node environment for configurer transaction")
333
337
 
334
- query_options = get_facts(options) unless query_options
338
+ query_options, facts = get_facts(options) unless query_options
335
339
  query_options[:configured_environment] = configured_environment
336
340
  options[:convert_for_node] = node
337
341
 
338
- catalog = prepare_and_retrieve_catalog(cached_catalog, options, query_options)
342
+ catalog = prepare_and_retrieve_catalog(cached_catalog, facts, options, query_options)
339
343
  unless catalog
340
344
  return nil
341
345
  end
@@ -358,11 +362,11 @@ class Puppet::Configurer
358
362
  @environment = catalog.environment
359
363
  report.environment = @environment
360
364
 
361
- query_options = get_facts(options)
365
+ query_options, facts = get_facts(options)
362
366
  query_options[:configured_environment] = configured_environment
363
367
 
364
368
  # if we get here, ignore the cached catalog
365
- catalog = prepare_and_retrieve_catalog(nil, options, query_options)
369
+ catalog = prepare_and_retrieve_catalog(nil, facts, options, query_options)
366
370
  return nil unless catalog
367
371
  tries += 1
368
372
  end
@@ -374,7 +378,7 @@ class Puppet::Configurer
374
378
  else
375
379
  # REMIND @duration is the time spent loading the last catalog, and doesn't
376
380
  # account for things like we failed to download and fell back to the cache
377
- ral_catalog = convert_catalog(catalog, @duration, options)
381
+ ral_catalog = convert_catalog(catalog, @duration, facts, options)
378
382
 
379
383
  # If not noop, commit the cached resource catalog (not ral catalog). Ideally
380
384
  # we'd just copy the downloaded response body, instead of serializing the
@@ -410,7 +414,7 @@ class Puppet::Configurer
410
414
  end
411
415
 
412
416
  report.cached_catalog_status ||= @cached_catalog_status
413
- report.add_times(:total, Time.now - start)
417
+ report.add_times(:total, Time.now - report.time)
414
418
  report.finalize_report
415
419
  Puppet::Util::Log.close(report)
416
420
  send_report(report)
@@ -419,21 +423,16 @@ class Puppet::Configurer
419
423
  private :run_internal
420
424
 
421
425
  def find_functional_server
422
- Puppet.settings[:server_list].each do |server|
423
- host = server[0]
424
- port = server[1] || Puppet[:masterport]
425
- begin
426
- ssl_context = Puppet.lookup(:ssl_context)
427
- http = Puppet::Network::HttpPool.connection(host, port.to_i, ssl_context: ssl_context)
428
- response = http.get('/status/v1/simple/master')
429
- return [host, port] if response.is_a?(Net::HTTPOK)
430
-
431
- Puppet.debug(_("Puppet server %{host}:%{port} is unavailable: %{code} %{reason}") %
432
- { host: host, port: port, code: response.code, reason: response.message })
433
- rescue => detail
434
- #TRANSLATORS 'server_list' is the name of a setting and should not be translated
435
- Puppet.debug _("Unable to connect to server from server_list setting: %{detail}") % {detail: detail}
436
- end
426
+ begin
427
+ session = Puppet.lookup(:http_session)
428
+ service = session.route_to(:puppet)
429
+ return [service.url.host, service.url.port]
430
+ rescue Puppet::HTTP::ResponseError => e
431
+ Puppet.debug(_("Puppet server %{host}:%{port} is unavailable: %{code} %{reason}") %
432
+ { host: e.response.url.host, port: e.response.url.port, code: e.response.code, reason: e.response.reason })
433
+ rescue => detail
434
+ #TRANSLATORS 'server_list' is the name of a setting and should not be translated
435
+ Puppet.debug _("Unable to connect to server from server_list setting: %{detail}") % {detail: detail}
437
436
  end
438
437
  [nil, nil]
439
438
  end
@@ -468,21 +467,17 @@ class Puppet::Configurer
468
467
  ::Facter.clear
469
468
  facts = find_facts
470
469
 
471
- saved_fact_terminus = Puppet::Node::Facts.indirection.terminus_class
472
- begin
473
- Puppet::Node::Facts.indirection.terminus_class = :rest
470
+ client = Puppet.runtime[:http]
471
+ session = client.create_session
472
+ puppet = session.route_to(:puppet)
474
473
 
475
- server = Puppet::Node::Facts::Rest.server
476
- Puppet.info(_("Uploading facts for %{node} to %{server}") % {
477
- node: facts.name,
478
- server: server})
474
+ Puppet.info(_("Uploading facts for %{node} to %{server}") % {
475
+ node: facts.name,
476
+ server: puppet.url.hostname})
479
477
 
480
- Puppet::Node::Facts.indirection.save(facts, nil, :environment => Puppet::Node::Environment.remote(@environment))
478
+ puppet.put_facts(facts.name, facts: facts, environment: Puppet.lookup(:current_environment).name.to_s)
481
479
 
482
- return true
483
- ensure
484
- Puppet::Node::Facts.indirection.terminus_class = saved_fact_terminus
485
- end
480
+ return true
486
481
  rescue => detail
487
482
  Puppet.log_exception(detail, _("Failed to submit facts: %{detail}") %
488
483
  { detail: detail })
@@ -521,7 +516,7 @@ class Puppet::Configurer
521
516
  return nil
522
517
  end
523
518
 
524
- def retrieve_new_catalog(query_options)
519
+ def retrieve_new_catalog(facts, query_options)
525
520
  result = nil
526
521
  @duration = thinmark do
527
522
  result = Puppet::Resource::Catalog.indirection.find(
@@ -531,7 +526,8 @@ class Puppet::Configurer
531
526
  # don't update cache until after environment converges
532
527
  :ignore_cache_save => true,
533
528
  :environment => Puppet::Node::Environment.remote(@environment),
534
- :fail_on_404 => true
529
+ :fail_on_404 => true,
530
+ :facts_for_catalog => facts
535
531
  )
536
532
  )
537
533
  end