puppet 6.11.1-x64-mingw32 → 6.16.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 (395) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +3 -8
  3. data/CONTRIBUTING.md +7 -13
  4. data/Gemfile +1 -0
  5. data/Gemfile.lock +39 -36
  6. data/README.md +17 -24
  7. data/ext/build_defaults.yaml +1 -0
  8. data/ext/project_data.yaml +1 -1
  9. data/ext/windows/service/daemon.rb +25 -20
  10. data/lib/puppet.rb +52 -13
  11. data/lib/puppet/agent.rb +20 -14
  12. data/lib/puppet/application/agent.rb +12 -14
  13. data/lib/puppet/application/describe.rb +7 -5
  14. data/lib/puppet/application/device.rb +2 -2
  15. data/lib/puppet/application/filebucket.rb +19 -15
  16. data/lib/puppet/application/plugin.rb +1 -0
  17. data/lib/puppet/application/resource.rb +1 -1
  18. data/lib/puppet/application/ssl.rb +4 -4
  19. data/lib/puppet/concurrent.rb +2 -0
  20. data/lib/puppet/concurrent/lock.rb +16 -0
  21. data/lib/puppet/concurrent/synchronized.rb +15 -0
  22. data/lib/puppet/concurrent/thread_local_singleton.rb +14 -0
  23. data/lib/puppet/configurer.rb +85 -83
  24. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  25. data/lib/puppet/context/trusted_information.rb +14 -8
  26. data/lib/puppet/daemon.rb +13 -27
  27. data/lib/puppet/defaults.rb +158 -40
  28. data/lib/puppet/environments.rb +30 -20
  29. data/lib/puppet/error.rb +9 -1
  30. data/lib/puppet/face/facts.rb +8 -5
  31. data/lib/puppet/face/help.rb +29 -3
  32. data/lib/puppet/face/module/search.rb +5 -0
  33. data/lib/puppet/face/plugin.rb +2 -2
  34. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  35. data/lib/puppet/file_system/file_impl.rb +13 -9
  36. data/lib/puppet/file_system/memory_file.rb +6 -0
  37. data/lib/puppet/file_system/memory_impl.rb +13 -0
  38. data/lib/puppet/file_system/uniquefile.rb +4 -0
  39. data/lib/puppet/file_system/windows.rb +7 -10
  40. data/lib/puppet/forge.rb +3 -3
  41. data/lib/puppet/forge/errors.rb +2 -2
  42. data/lib/puppet/forge/repository.rb +31 -86
  43. data/lib/puppet/functions/call.rb +1 -1
  44. data/lib/puppet/functions/camelcase.rb +2 -2
  45. data/lib/puppet/functions/epp.rb +4 -4
  46. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  47. data/lib/puppet/functions/filter.rb +1 -0
  48. data/lib/puppet/functions/find_file.rb +9 -9
  49. data/lib/puppet/functions/find_template.rb +63 -0
  50. data/lib/puppet/functions/inline_epp.rb +5 -5
  51. data/lib/puppet/functions/reduce.rb +2 -4
  52. data/lib/puppet/http.rb +7 -0
  53. data/lib/puppet/http/client.rb +341 -54
  54. data/lib/puppet/http/errors.rb +2 -0
  55. data/lib/puppet/http/external_client.rb +90 -0
  56. data/lib/puppet/http/redirector.rb +34 -0
  57. data/lib/puppet/http/resolver.rb +57 -1
  58. data/lib/puppet/http/resolver/server_list.rb +98 -0
  59. data/lib/puppet/http/resolver/settings.rb +23 -2
  60. data/lib/puppet/http/resolver/srv.rb +36 -4
  61. data/lib/puppet/http/response.rb +68 -1
  62. data/lib/puppet/http/retry_after_handler.rb +39 -0
  63. data/lib/puppet/http/service.rb +179 -3
  64. data/lib/puppet/http/service/ca.rb +84 -21
  65. data/lib/puppet/http/service/compiler.rb +319 -0
  66. data/lib/puppet/http/service/file_server.rb +206 -0
  67. data/lib/puppet/http/service/report.rb +66 -0
  68. data/lib/puppet/http/session.rb +106 -31
  69. data/lib/puppet/indirector/catalog/compiler.rb +10 -0
  70. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  71. data/lib/puppet/indirector/facts/rest.rb +42 -0
  72. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  73. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  74. data/lib/puppet/indirector/file_content/http.rb +5 -0
  75. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  76. data/lib/puppet/indirector/file_metadata/http.rb +4 -4
  77. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  78. data/lib/puppet/indirector/json.rb +1 -1
  79. data/lib/puppet/indirector/msgpack.rb +1 -1
  80. data/lib/puppet/indirector/node/rest.rb +24 -0
  81. data/lib/puppet/indirector/report/rest.rb +19 -0
  82. data/lib/puppet/indirector/report/yaml.rb +23 -0
  83. data/lib/puppet/indirector/rest.rb +12 -0
  84. data/lib/puppet/indirector/status/rest.rb +18 -0
  85. data/lib/puppet/loaders.rb +6 -0
  86. data/lib/puppet/metatype/manager.rb +80 -80
  87. data/lib/puppet/network/http/base_pool.rb +19 -1
  88. data/lib/puppet/network/http/compression.rb +7 -0
  89. data/lib/puppet/network/http/connection.rb +6 -0
  90. data/lib/puppet/network/http/connection_adapter.rb +182 -0
  91. data/lib/puppet/network/http/nocache_pool.rb +2 -0
  92. data/lib/puppet/network/http/pool.rb +13 -6
  93. data/lib/puppet/network/http_pool.rb +2 -1
  94. data/lib/puppet/node/environment.rb +24 -8
  95. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  96. data/lib/puppet/pal/pal_impl.rb +9 -29
  97. data/lib/puppet/parser/ast/pops_bridge.rb +6 -11
  98. data/lib/puppet/parser/compiler.rb +42 -32
  99. data/lib/puppet/parser/functions.rb +18 -13
  100. data/lib/puppet/parser/functions/epp.rb +3 -3
  101. data/lib/puppet/parser/functions/filter.rb +1 -0
  102. data/lib/puppet/parser/functions/inline_epp.rb +5 -5
  103. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
  105. data/lib/puppet/pops/evaluator/runtime3_support.rb +1 -1
  106. data/lib/puppet/pops/loader/puppet_plan_instantiator.rb +12 -3
  107. data/lib/puppet/pops/loaders.rb +7 -5
  108. data/lib/puppet/pops/lookup/invocation.rb +10 -3
  109. data/lib/puppet/pops/model/pn_transformer.rb +5 -9
  110. data/lib/puppet/pops/parser/evaluating_parser.rb +8 -11
  111. data/lib/puppet/pops/serialization/json_path.rb +3 -3
  112. data/lib/puppet/pops/time/timespan.rb +3 -5
  113. data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
  114. data/lib/puppet/pops/types/string_converter.rb +6 -9
  115. data/lib/puppet/pops/types/type_calculator.rb +30 -10
  116. data/lib/puppet/pops/types/type_formatter.rb +9 -11
  117. data/lib/puppet/pops/types/type_parser.rb +3 -3
  118. data/lib/puppet/pops/validation/checker4_0.rb +1 -1
  119. data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
  120. data/lib/puppet/provider/aix_object.rb +4 -2
  121. data/lib/puppet/provider/group/aix.rb +1 -0
  122. data/lib/puppet/provider/group/groupadd.rb +57 -24
  123. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  124. data/lib/puppet/provider/package/aix.rb +17 -2
  125. data/lib/puppet/provider/package/apt.rb +78 -4
  126. data/lib/puppet/provider/package/dnfmodule.rb +69 -15
  127. data/lib/puppet/provider/package/dpkg.rb +14 -7
  128. data/lib/puppet/provider/package/fink.rb +20 -3
  129. data/lib/puppet/provider/package/gem.rb +41 -7
  130. data/lib/puppet/provider/package/openbsd.rb +13 -1
  131. data/lib/puppet/provider/package/pacman.rb +2 -5
  132. data/lib/puppet/provider/package/pip.rb +143 -48
  133. data/lib/puppet/provider/package/pip3.rb +0 -2
  134. data/lib/puppet/provider/package/pkg.rb +18 -5
  135. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  136. data/lib/puppet/provider/package/pkgng.rb +16 -4
  137. data/lib/puppet/provider/package/portage.rb +5 -5
  138. data/lib/puppet/provider/package/puppet_gem.rb +6 -2
  139. data/lib/puppet/provider/package/rpm.rb +6 -213
  140. data/lib/puppet/provider/package/yum.rb +108 -24
  141. data/lib/puppet/provider/package/zypper.rb +59 -1
  142. data/lib/puppet/provider/package_targetable.rb +5 -4
  143. data/lib/puppet/provider/service/systemd.rb +23 -5
  144. data/lib/puppet/provider/user/aix.rb +1 -0
  145. data/lib/puppet/provider/user/directoryservice.rb +30 -5
  146. data/lib/puppet/provider/user/hpux.rb +1 -1
  147. data/lib/puppet/provider/user/useradd.rb +11 -8
  148. data/lib/puppet/reports/http.rb +13 -9
  149. data/lib/puppet/reports/store.rb +1 -1
  150. data/lib/puppet/resource/type_collection.rb +20 -16
  151. data/lib/puppet/runtime.rb +32 -1
  152. data/lib/puppet/settings.rb +4 -0
  153. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  154. data/lib/puppet/ssl.rb +1 -0
  155. data/lib/puppet/ssl/certificate.rb +2 -1
  156. data/lib/puppet/ssl/host.rb +4 -4
  157. data/lib/puppet/ssl/oids.rb +1 -0
  158. data/lib/puppet/ssl/ssl_provider.rb +20 -0
  159. data/lib/puppet/ssl/state_machine.rb +81 -35
  160. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  161. data/lib/puppet/test/test_helper.rb +7 -1
  162. data/lib/puppet/transaction.rb +33 -11
  163. data/lib/puppet/transaction/report.rb +2 -2
  164. data/lib/puppet/transaction/resource_harness.rb +1 -1
  165. data/lib/puppet/type.rb +7 -2
  166. data/lib/puppet/type/file.rb +13 -0
  167. data/lib/puppet/type/file/data_sync.rb +5 -1
  168. data/lib/puppet/type/file/source.rb +49 -58
  169. data/lib/puppet/type/group.rb +5 -4
  170. data/lib/puppet/type/package.rb +102 -10
  171. data/lib/puppet/type/service.rb +6 -8
  172. data/lib/puppet/type/user.rb +6 -30
  173. data/lib/puppet/util.rb +34 -11
  174. data/lib/puppet/util/at_fork.rb +1 -1
  175. data/lib/puppet/util/autoload.rb +4 -18
  176. data/lib/puppet/util/instance_loader.rb +14 -10
  177. data/lib/puppet/util/log/destinations.rb +2 -11
  178. data/lib/puppet/util/logging.rb +30 -18
  179. data/lib/puppet/util/package/version/debian.rb +175 -0
  180. data/lib/puppet/util/package/version/gem.rb +15 -0
  181. data/lib/puppet/util/package/version/pip.rb +167 -0
  182. data/lib/puppet/util/package/version/range.rb +53 -0
  183. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  184. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  185. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  186. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  187. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  188. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  189. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  190. data/lib/puppet/util/package/version/rpm.rb +73 -0
  191. data/lib/puppet/util/pidlock.rb +36 -10
  192. data/lib/puppet/util/platform.rb +5 -0
  193. data/lib/puppet/util/plist.rb +6 -0
  194. data/lib/puppet/util/rpm_compare.rb +193 -0
  195. data/lib/puppet/util/storage.rb +0 -1
  196. data/lib/puppet/util/windows/adsi.rb +50 -20
  197. data/lib/puppet/util/windows/process.rb +15 -14
  198. data/lib/puppet/util/windows/security.rb +1 -0
  199. data/lib/puppet/util/windows/sid.rb +3 -3
  200. data/lib/puppet/util/yaml.rb +1 -1
  201. data/lib/puppet/version.rb +1 -1
  202. data/lib/puppet/x509/cert_provider.rb +9 -5
  203. data/locales/puppet.pot +640 -521
  204. data/man/man5/puppet.conf.5 +88 -9
  205. data/man/man8/puppet-agent.8 +6 -6
  206. data/man/man8/puppet-apply.8 +1 -1
  207. data/man/man8/puppet-catalog.8 +1 -1
  208. data/man/man8/puppet-config.8 +1 -1
  209. data/man/man8/puppet-describe.8 +1 -1
  210. data/man/man8/puppet-device.8 +2 -2
  211. data/man/man8/puppet-doc.8 +1 -1
  212. data/man/man8/puppet-epp.8 +1 -1
  213. data/man/man8/puppet-facts.8 +1 -1
  214. data/man/man8/puppet-filebucket.8 +17 -2
  215. data/man/man8/puppet-generate.8 +1 -1
  216. data/man/man8/puppet-help.8 +6 -3
  217. data/man/man8/puppet-key.8 +1 -1
  218. data/man/man8/puppet-lookup.8 +1 -1
  219. data/man/man8/puppet-man.8 +1 -1
  220. data/man/man8/puppet-module.8 +4 -1
  221. data/man/man8/puppet-node.8 +1 -1
  222. data/man/man8/puppet-parser.8 +1 -1
  223. data/man/man8/puppet-plugin.8 +1 -1
  224. data/man/man8/puppet-report.8 +1 -1
  225. data/man/man8/puppet-resource.8 +1 -1
  226. data/man/man8/puppet-script.8 +1 -1
  227. data/man/man8/puppet-ssl.8 +2 -2
  228. data/man/man8/puppet-status.8 +1 -1
  229. data/man/man8/puppet.8 +2 -2
  230. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  231. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  232. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  233. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  234. data/spec/fixtures/unit/forge/bacula.json +76 -0
  235. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  236. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  237. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  238. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  239. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  240. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -102
  241. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +1 -106
  242. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -106
  243. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -102
  244. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -98
  245. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -102
  246. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +1 -102
  247. data/spec/integration/application/agent_spec.rb +394 -0
  248. data/spec/integration/application/apply_spec.rb +132 -3
  249. data/spec/integration/application/filebucket_spec.rb +190 -0
  250. data/spec/integration/application/plugin_spec.rb +73 -0
  251. data/spec/integration/configurer_spec.rb +26 -7
  252. data/spec/integration/http/client_spec.rb +154 -0
  253. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  254. data/spec/integration/indirector/report/yaml.rb +83 -0
  255. data/spec/integration/module_tool/forge_spec.rb +51 -0
  256. data/spec/integration/network/http_pool_spec.rb +76 -20
  257. data/spec/integration/node/environment_spec.rb +15 -0
  258. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  259. data/spec/lib/puppet/test_ca.rb +2 -2
  260. data/spec/lib/puppet_spec/https.rb +20 -9
  261. data/spec/lib/puppet_spec/puppetserver.rb +119 -0
  262. data/spec/shared_contexts/https.rb +29 -0
  263. data/spec/spec_helper.rb +6 -2
  264. data/spec/unit/agent_spec.rb +80 -26
  265. data/spec/unit/application/agent_spec.rb +9 -5
  266. data/spec/unit/application/apply_spec.rb +2 -12
  267. data/spec/unit/application/describe_spec.rb +88 -50
  268. data/spec/unit/application/device_spec.rb +2 -2
  269. data/spec/unit/application/filebucket_spec.rb +22 -2
  270. data/spec/unit/application/resource_spec.rb +2 -2
  271. data/spec/unit/concurrent/lock_spec.rb +29 -0
  272. data/spec/unit/configurer/fact_handler_spec.rb +0 -4
  273. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  274. data/spec/unit/configurer_spec.rb +400 -406
  275. data/spec/unit/context/trusted_information_spec.rb +17 -0
  276. data/spec/unit/daemon_spec.rb +5 -64
  277. data/spec/unit/defaults_spec.rb +38 -4
  278. data/spec/unit/environments_spec.rb +65 -28
  279. data/spec/unit/face/facts_spec.rb +24 -20
  280. data/spec/unit/face/module/search_spec.rb +17 -0
  281. data/spec/unit/face/plugin_spec.rb +12 -10
  282. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  283. data/spec/unit/file_system_spec.rb +26 -2
  284. data/spec/unit/forge/errors_spec.rb +1 -1
  285. data/spec/unit/forge/forge_spec.rb +12 -54
  286. data/spec/unit/forge/module_release_spec.rb +19 -6
  287. data/spec/unit/forge/repository_spec.rb +63 -157
  288. data/spec/unit/forge_spec.rb +46 -116
  289. data/spec/unit/functions/find_template_spec.rb +69 -0
  290. data/spec/unit/functions/lookup_spec.rb +13 -0
  291. data/spec/unit/http/client_spec.rb +395 -27
  292. data/spec/unit/http/external_client_spec.rb +201 -0
  293. data/spec/unit/http/resolver_spec.rb +81 -12
  294. data/spec/unit/http/response_spec.rb +69 -0
  295. data/spec/unit/http/service/ca_spec.rb +100 -7
  296. data/spec/unit/http/service/compiler_spec.rb +627 -0
  297. data/spec/unit/http/service/file_server_spec.rb +308 -0
  298. data/spec/unit/http/service/report_spec.rb +118 -0
  299. data/spec/unit/http/service_spec.rb +117 -4
  300. data/spec/unit/http/session_spec.rb +237 -19
  301. data/spec/unit/indirector/catalog/compiler_spec.rb +47 -29
  302. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  303. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  304. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  305. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  306. data/spec/unit/indirector/file_metadata/http_spec.rb +167 -0
  307. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  308. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  309. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  310. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  311. data/spec/unit/indirector/rest_spec.rb +13 -0
  312. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  313. data/spec/unit/network/http/connection_spec.rb +549 -176
  314. data/spec/unit/network/http/nocache_pool_spec.rb +25 -3
  315. data/spec/unit/network/http/pool_spec.rb +89 -11
  316. data/spec/unit/network/http_pool_spec.rb +63 -57
  317. data/spec/unit/network/http_spec.rb +1 -1
  318. data/spec/unit/node/environment_spec.rb +16 -0
  319. data/spec/unit/node/facts_spec.rb +2 -1
  320. data/spec/unit/node_spec.rb +7 -4
  321. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
  322. data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
  323. data/spec/unit/pops/validator/validator_spec.rb +7 -2
  324. data/spec/unit/provider/aix_object_spec.rb +16 -2
  325. data/spec/unit/provider/group/groupadd_spec.rb +181 -56
  326. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  327. data/spec/unit/provider/package/aix_spec.rb +29 -0
  328. data/spec/unit/provider/package/apt_spec.rb +43 -2
  329. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  330. data/spec/unit/provider/package/dnfmodule_spec.rb +76 -15
  331. data/spec/unit/provider/package/dpkg_spec.rb +28 -6
  332. data/spec/unit/provider/package/gem_spec.rb +40 -0
  333. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  334. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  335. data/spec/unit/provider/package/pip_spec.rb +68 -19
  336. data/spec/unit/provider/package/pkg_spec.rb +15 -1
  337. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  338. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  339. data/spec/unit/provider/package/portage_spec.rb +9 -4
  340. data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
  341. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  342. data/spec/unit/provider/package/yum_spec.rb +292 -0
  343. data/spec/unit/provider/package/zypper_spec.rb +84 -0
  344. data/spec/unit/provider/package_targetable_spec.rb +60 -0
  345. data/spec/unit/provider/service/init_spec.rb +1 -0
  346. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  347. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  348. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  349. data/spec/unit/provider/service/systemd_spec.rb +92 -12
  350. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  351. data/spec/unit/provider/user/hpux_spec.rb +2 -2
  352. data/spec/unit/provider/user/useradd_spec.rb +21 -8
  353. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  354. data/spec/unit/puppet_pal_2pec.rb +0 -26
  355. data/spec/unit/puppet_pal_catalog_spec.rb +46 -0
  356. data/spec/unit/puppet_spec.rb +47 -0
  357. data/spec/unit/reports/http_spec.rb +70 -52
  358. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  359. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  360. data/spec/unit/ssl/certificate_spec.rb +7 -0
  361. data/spec/unit/ssl/host_spec.rb +4 -2
  362. data/spec/unit/ssl/oids_spec.rb +1 -0
  363. data/spec/unit/ssl/ssl_provider_spec.rb +71 -0
  364. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  365. data/spec/unit/transaction/persistence_spec.rb +1 -10
  366. data/spec/unit/transaction/report_spec.rb +4 -0
  367. data/spec/unit/transaction_spec.rb +45 -1
  368. data/spec/unit/type/file/content_spec.rb +9 -3
  369. data/spec/unit/type/file/ensure_spec.rb +1 -2
  370. data/spec/unit/type/file/source_spec.rb +86 -35
  371. data/spec/unit/type/package_spec.rb +8 -0
  372. data/spec/unit/type/service_spec.rb +9 -8
  373. data/spec/unit/type/user_spec.rb +1 -2
  374. data/spec/unit/util/at_fork_spec.rb +3 -2
  375. data/spec/unit/util/autoload_spec.rb +2 -1
  376. data/spec/unit/util/log/destinations_spec.rb +1 -29
  377. data/spec/unit/util/log_spec.rb +0 -138
  378. data/spec/unit/util/logging_spec.rb +200 -0
  379. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  380. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  381. data/spec/unit/util/package/version/range_spec.rb +175 -0
  382. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  383. data/spec/unit/util/pidlock_spec.rb +112 -42
  384. data/spec/unit/util/plist_spec.rb +20 -0
  385. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  386. data/spec/unit/util/storage_spec.rb +1 -8
  387. data/spec/unit/util/windows/adsi_spec.rb +55 -4
  388. data/spec/unit/util/windows/sid_spec.rb +2 -2
  389. data/spec/unit/x509/cert_provider_spec.rb +24 -4
  390. data/tasks/generate_cert_fixtures.rake +15 -1
  391. data/tasks/manpages.rake +6 -35
  392. metadata +92 -12
  393. data/COMMITTERS.md +0 -244
  394. data/spec/integration/faces/plugin_spec.rb +0 -61
  395. data/spec/lib/puppet_spec/validators.rb +0 -37
@@ -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
@@ -278,7 +280,7 @@ generated by running puppet agent with '--genconfig'.
278
280
 
279
281
  * --noop:
280
282
  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
283
+ is useful for seeing what changes Puppet would make without actually
282
284
  executing the changes.
283
285
  (This is a Puppet setting, and can go in puppet.conf. Note the special 'no-'
284
286
  prefix for boolean settings on the command line.)
@@ -302,8 +304,6 @@ generated by running puppet agent with '--genconfig'.
302
304
  * --trace
303
305
  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
306
 
305
-
306
-
307
307
  * --verbose:
308
308
  Turn on verbose reporting.
309
309
 
@@ -317,8 +317,7 @@ generated by running puppet agent with '--genconfig'.
317
317
  it to sign a certificate request. This is useful for the initial setup
318
318
  of a puppet client. You can turn off waiting for certificates by
319
319
  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.)
320
+ (This is a Puppet setting, and can go in puppet.conf.)
322
321
 
323
322
 
324
323
  EXAMPLE
@@ -407,7 +406,7 @@ Copyright (c) 2011 Puppet Inc., LLC Licensed under the Apache 2.0 License
407
406
 
408
407
  def onetime(daemon)
409
408
  begin
410
- exitstatus = daemon.agent.run(:job_id => options[:job_id])
409
+ exitstatus = daemon.agent.run({:job_id => options[:job_id], :start_time => options[:start_time]})
411
410
  rescue => detail
412
411
  Puppet.log_exception(detail)
413
412
  end
@@ -490,9 +489,8 @@ Copyright (c) 2011 Puppet Inc., LLC Licensed under the Apache 2.0 License
490
489
  end
491
490
 
492
491
  def daemonize_process_when(should_daemonize)
493
- daemon = Puppet::Daemon.new(Puppet::Util::Pidlock.new(Puppet[:pidfile]))
492
+ daemon = Puppet::Daemon.new(@agent, Puppet::Util::Pidlock.new(Puppet[:pidfile]))
494
493
  daemon.argv = @argv
495
- daemon.agent = @agent
496
494
 
497
495
  daemon.daemonize if should_daemonize
498
496
 
@@ -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)
@@ -0,0 +1,2 @@
1
+ module Puppet::Concurrent
2
+ end
@@ -0,0 +1,16 @@
1
+ require 'puppet/concurrent/synchronized'
2
+
3
+ module Puppet
4
+ module Concurrent
5
+
6
+ # A simple lock that at the moment only does any locking on jruby
7
+ class Lock
8
+ include Puppet::Concurrent::Synchronized
9
+ def synchronize
10
+ yield
11
+ end
12
+ end
13
+
14
+ end
15
+ end
16
+
@@ -0,0 +1,15 @@
1
+ module Puppet
2
+ module Concurrent
3
+
4
+ # Including Puppet::Concurrent::Synchronized into a class when running on JRuby
5
+ # causes all of its instance methods to be synchronized on the instance itself.
6
+ # When running on MRI it has no effect.
7
+ if RUBY_PLATFORM == 'java'
8
+ require 'jruby/synchronized'
9
+ Synchronized = JRuby::Synchronized
10
+ else
11
+ module Synchronized; end
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ module Puppet
2
+ module Concurrent
3
+ module ThreadLocalSingleton
4
+ def singleton
5
+ key = (name + ".singleton").intern
6
+ thread = Thread.current
7
+ unless thread.thread_variable?(key)
8
+ thread.thread_variable_set(key, new)
9
+ end
10
+ thread.thread_variable_get(key)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -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,17 +140,17 @@ 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(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]
153
+
156
154
  query_options[:transaction_uuid] = @transaction_uuid
157
155
  query_options[:job_id] = @job_id
158
156
  query_options[:static_catalog] = @static_catalog
@@ -162,26 +160,19 @@ class Puppet::Configurer
162
160
  query_options[:checksum_type] = @checksum_type.join('.')
163
161
 
164
162
  # apply passes in ral catalog
165
- catalog = options.delete(:catalog)
166
- return catalog if catalog
167
-
168
- # retrieve_catalog returns json catalog
169
- catalog = retrieve_catalog(query_options)
170
- return convert_catalog(catalog, @duration, options) if catalog
171
-
172
- Puppet.err _("Could not retrieve catalog; skipping run")
173
- nil
163
+ catalog = cached_catalog || options[:catalog]
164
+ unless catalog
165
+ # retrieve_catalog returns resource catalog
166
+ catalog = retrieve_catalog(facts, query_options)
167
+ Puppet.err _("Could not retrieve catalog; skipping run") unless catalog
168
+ end
169
+ catalog
174
170
  end
175
171
 
176
172
  def prepare_and_retrieve_catalog_from_cache(options = {})
177
173
  result = retrieve_catalog_from_cache({:transaction_uuid => @transaction_uuid, :static_catalog => @static_catalog})
178
- if result
179
- Puppet.info _("Using cached catalog from environment '%{catalog_env}'") % { catalog_env: result.environment }
180
- # get facts now so that the convert_catalog method can resolve deferred values
181
- get_facts(options)
182
- return convert_catalog(result, @duration, options)
183
- end
184
- nil
174
+ Puppet.info _("Using cached catalog from environment '%{catalog_env}'") % { catalog_env: result.environment } if result
175
+ result
185
176
  end
186
177
 
187
178
  # Apply supplied catalog and return associated application report
@@ -203,12 +194,12 @@ class Puppet::Configurer
203
194
  # This just passes any options on to the catalog,
204
195
  # which accepts :tags and :ignoreschedules.
205
196
  def run(options = {})
206
- pool = Puppet::Network::HTTP::Pool.new(Puppet[:http_keepalive_timeout])
197
+ pool = Puppet.runtime[:http].pool
207
198
  # We create the report pre-populated with default settings for
208
199
  # environment and transaction_uuid very early, this is to ensure
209
200
  # they are sent regardless of any catalog compilation failures or
210
201
  # exceptions.
211
- 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)
212
203
  report = options[:report]
213
204
  init_storage
214
205
 
@@ -217,13 +208,9 @@ class Puppet::Configurer
217
208
  completed = nil
218
209
  begin
219
210
  Puppet.override(:http_pool => pool) do
220
-
221
211
  # Skip failover logic if the server_list setting is empty
222
- if Puppet.settings[:server_list].nil? || Puppet.settings[:server_list].empty?
223
- do_failover = false
224
- else
225
- do_failover = true
226
- end
212
+ do_failover = Puppet.settings[:server_list] && !Puppet.settings[:server_list].empty?
213
+
227
214
  # When we are passed a catalog, that means we're in apply
228
215
  # mode. We shouldn't try to do any failover in that case.
229
216
  if options[:catalog].nil? && do_failover
@@ -231,8 +218,6 @@ class Puppet::Configurer
231
218
  if server.nil?
232
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) }
233
220
  else
234
- #TRANSLATORS 'server_list' is the name of a setting and should not be translated
235
- Puppet.debug _("Selected puppet server from the `server_list` setting: %{server}:%{port}") % { server: server, port: port }
236
221
  report.master_used = "#{server}:#{port}"
237
222
  end
238
223
  Puppet.override(server: server, serverport: port) do
@@ -250,23 +235,26 @@ class Puppet::Configurer
250
235
  end
251
236
 
252
237
  def run_internal(options)
253
- start = Time.now
254
238
  report = options[:report]
255
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
+
256
245
  # If a cached catalog is explicitly requested, attempt to retrieve it. Skip the node request,
257
246
  # don't pluginsync and switch to the catalog's environment if we successfully retrieve it.
258
247
  if Puppet[:use_cached_catalog]
259
248
  Puppet::GettextConfig.reset_text_domain('agent')
260
249
  Puppet::ModuleTranslations.load_from_vardir(Puppet[:vardir])
261
250
 
262
- catalog = prepare_and_retrieve_catalog_from_cache(options)
263
- if catalog
264
- options[:catalog] = catalog
251
+ cached_catalog = prepare_and_retrieve_catalog_from_cache(options)
252
+ if cached_catalog
265
253
  @cached_catalog_status = 'explicitly_requested'
266
254
 
267
- if @environment != catalog.environment && !Puppet[:strict_environment_mode]
268
- Puppet.notice _("Local environment: '%{local_env}' doesn't match the environment of the cached catalog '%{catalog_env}', switching agent to '%{catalog_env}'.") % { local_env: @environment, catalog_env: catalog.environment }
269
- @environment = catalog.environment
255
+ if @environment != cached_catalog.environment && !Puppet[:strict_environment_mode]
256
+ Puppet.notice _("Local environment: '%{local_env}' doesn't match the environment of the cached catalog '%{catalog_env}', switching agent to '%{catalog_env}'.") % { local_env: @environment, catalog_env: cached_catalog.environment }
257
+ @environment = cached_catalog.environment
270
258
  end
271
259
 
272
260
  report.environment = @environment
@@ -281,13 +269,13 @@ class Puppet::Configurer
281
269
 
282
270
  begin
283
271
  unless Puppet[:node_name_fact].empty?
284
- query_options = get_facts(options)
272
+ query_options, facts = get_facts(options)
285
273
  end
286
274
 
287
275
  configured_environment = Puppet[:environment] if Puppet.settings.set_by_config?(:environment)
288
276
 
289
277
  # We only need to find out the environment to run in if we don't already have a catalog
290
- unless (options[:catalog] || Puppet[:strict_environment_mode])
278
+ unless (cached_catalog || options[:catalog] || Puppet[:strict_environment_mode])
291
279
  begin
292
280
  node = nil
293
281
  node_retr_time = thinmark do
@@ -314,6 +302,7 @@ class Puppet::Configurer
314
302
  @environment = node.environment.to_s
315
303
  report.environment = @environment
316
304
  query_options = nil
305
+ facts = nil
317
306
  else
318
307
  Puppet.info _("Using configured environment '%{env}'") % { env: @environment }
319
308
  end
@@ -338,11 +327,11 @@ class Puppet::Configurer
338
327
  :loaders => Puppet::Pops::Loaders.new(local_node_environment, true)
339
328
  }, "Local node environment for configurer transaction")
340
329
 
341
- query_options = get_facts(options) unless query_options
330
+ query_options, facts = get_facts(options) unless query_options
342
331
  query_options[:configured_environment] = configured_environment
343
332
  options[:convert_for_node] = node
344
333
 
345
- catalog = prepare_and_retrieve_catalog(options, query_options)
334
+ catalog = prepare_and_retrieve_catalog(cached_catalog, facts, options, query_options)
346
335
  unless catalog
347
336
  return nil
348
337
  end
@@ -365,20 +354,41 @@ class Puppet::Configurer
365
354
  @environment = catalog.environment
366
355
  report.environment = @environment
367
356
 
368
- query_options = get_facts(options)
357
+ query_options, facts = get_facts(options)
369
358
  query_options[:configured_environment] = configured_environment
370
359
 
371
- catalog = prepare_and_retrieve_catalog(options, query_options)
360
+ # if we get here, ignore the cached catalog
361
+ catalog = prepare_and_retrieve_catalog(nil, facts, options, query_options)
372
362
  return nil unless catalog
373
363
  tries += 1
374
364
  end
375
365
 
366
+ # now that environment has converged, convert resource catalog into ral catalog
367
+ # unless we were given a RAL catalog
368
+ if !cached_catalog && options[:catalog]
369
+ ral_catalog = options[:catalog]
370
+ else
371
+ # REMIND @duration is the time spent loading the last catalog, and doesn't
372
+ # account for things like we failed to download and fell back to the cache
373
+ ral_catalog = convert_catalog(catalog, @duration, facts, options)
374
+
375
+ # If not noop, commit the cached resource catalog (not ral catalog). Ideally
376
+ # we'd just copy the downloaded response body, instead of serializing the
377
+ # in-memory catalog, but that's hard due to the indirector.
378
+ indirection = Puppet::Resource::Catalog.indirection
379
+ if !Puppet[:noop] && indirection.cache?
380
+ request = indirection.request(:save, nil, catalog, environment: Puppet::Node::Environment.remote(catalog.environment))
381
+ Puppet.info("Caching catalog for #{request.key}")
382
+ indirection.cache.save(request)
383
+ end
384
+ end
385
+
376
386
  execute_prerun_command or return nil
377
387
 
378
- options[:report].code_id = catalog.code_id
379
- options[:report].catalog_uuid = catalog.catalog_uuid
388
+ options[:report].code_id = ral_catalog.code_id
389
+ options[:report].catalog_uuid = ral_catalog.catalog_uuid
380
390
  options[:report].cached_catalog_status = @cached_catalog_status
381
- apply_catalog(catalog, options)
391
+ apply_catalog(ral_catalog, options)
382
392
  true
383
393
  rescue => detail
384
394
  Puppet.log_exception(detail, _("Failed to apply catalog: %{detail}") % { detail: detail })
@@ -396,7 +406,7 @@ class Puppet::Configurer
396
406
  end
397
407
 
398
408
  report.cached_catalog_status ||= @cached_catalog_status
399
- report.add_times(:total, Time.now - start)
409
+ report.add_times(:total, Time.now - report.time)
400
410
  report.finalize_report
401
411
  Puppet::Util::Log.close(report)
402
412
  send_report(report)
@@ -405,21 +415,16 @@ class Puppet::Configurer
405
415
  private :run_internal
406
416
 
407
417
  def find_functional_server
408
- Puppet.settings[:server_list].each do |server|
409
- host = server[0]
410
- port = server[1] || Puppet[:masterport]
411
- begin
412
- ssl_context = Puppet.lookup(:ssl_context)
413
- http = Puppet::Network::HttpPool.connection(host, port.to_i, ssl_context: ssl_context)
414
- response = http.get('/status/v1/simple/master')
415
- return [host, port] if response.is_a?(Net::HTTPOK)
416
-
417
- Puppet.debug(_("Puppet server %{host}:%{port} is unavailable: %{code} %{reason}") %
418
- { host: host, port: port, code: response.code, reason: response.message })
419
- rescue => detail
420
- #TRANSLATORS 'server_list' is the name of a setting and should not be translated
421
- Puppet.debug _("Unable to connect to server from server_list setting: %{detail}") % {detail: detail}
422
- end
418
+ begin
419
+ session = Puppet.lookup(:http_session)
420
+ service = session.route_to(:puppet)
421
+ return [service.url.host, service.url.port]
422
+ rescue Puppet::HTTP::ResponseError => e
423
+ Puppet.debug(_("Puppet server %{host}:%{port} is unavailable: %{code} %{reason}") %
424
+ { host: e.response.url.host, port: e.response.url.port, code: e.response.code, reason: e.response.reason })
425
+ rescue => detail
426
+ #TRANSLATORS 'server_list' is the name of a setting and should not be translated
427
+ Puppet.debug _("Unable to connect to server from server_list setting: %{detail}") % {detail: detail}
423
428
  end
424
429
  [nil, nil]
425
430
  end
@@ -454,21 +459,17 @@ class Puppet::Configurer
454
459
  ::Facter.clear
455
460
  facts = find_facts
456
461
 
457
- saved_fact_terminus = Puppet::Node::Facts.indirection.terminus_class
458
- begin
459
- Puppet::Node::Facts.indirection.terminus_class = :rest
462
+ client = Puppet.runtime[:http]
463
+ session = client.create_session
464
+ puppet = session.route_to(:puppet)
460
465
 
461
- server = Puppet::Node::Facts::Rest.server
462
- Puppet.info(_("Uploading facts for %{node} to %{server}") % {
463
- node: facts.name,
464
- server: server})
466
+ Puppet.info(_("Uploading facts for %{node} to %{server}") % {
467
+ node: facts.name,
468
+ server: puppet.url.hostname})
465
469
 
466
- Puppet::Node::Facts.indirection.save(facts, nil, :environment => Puppet::Node::Environment.remote(@environment))
470
+ puppet.put_facts(facts.name, facts: facts, environment: Puppet.lookup(:current_environment).name.to_s)
467
471
 
468
- return true
469
- ensure
470
- Puppet::Node::Facts.indirection.terminus_class = saved_fact_terminus
471
- end
472
+ return true
472
473
  rescue => detail
473
474
  Puppet.log_exception(detail, _("Failed to submit facts: %{detail}") %
474
475
  { detail: detail })
@@ -507,17 +508,18 @@ class Puppet::Configurer
507
508
  return nil
508
509
  end
509
510
 
510
- def retrieve_new_catalog(query_options)
511
+ def retrieve_new_catalog(facts, query_options)
511
512
  result = nil
512
513
  @duration = thinmark do
513
514
  result = Puppet::Resource::Catalog.indirection.find(
514
515
  Puppet[:node_name_value],
515
516
  query_options.merge(
516
517
  :ignore_cache => true,
517
- # We never want to update the cached Catalog if we're running in noop mode.
518
- :ignore_cache_save => Puppet[:noop],
518
+ # don't update cache until after environment converges
519
+ :ignore_cache_save => true,
519
520
  :environment => Puppet::Node::Environment.remote(@environment),
520
- :fail_on_404 => true
521
+ :fail_on_404 => true,
522
+ :facts_for_catalog => facts
521
523
  )
522
524
  )
523
525
  end