puppet 6.13.0-x86-mingw32 → 6.18.0-x86-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 (461) 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 +36 -32
  6. data/README.md +17 -24
  7. data/ext/windows/service/daemon.rb +3 -3
  8. data/lib/puppet.rb +33 -9
  9. data/lib/puppet/agent.rb +20 -14
  10. data/lib/puppet/application/agent.rb +26 -17
  11. data/lib/puppet/application/apply.rb +18 -20
  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/lookup.rb +16 -4
  16. data/lib/puppet/application/plugin.rb +1 -0
  17. data/lib/puppet/application/ssl.rb +4 -4
  18. data/lib/puppet/configurer.rb +58 -57
  19. data/lib/puppet/configurer/downloader.rb +31 -10
  20. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  21. data/lib/puppet/confine.rb +2 -2
  22. data/lib/puppet/confine/any.rb +1 -1
  23. data/lib/puppet/context/trusted_information.rb +14 -8
  24. data/lib/puppet/daemon.rb +13 -27
  25. data/lib/puppet/defaults.rb +92 -12
  26. data/lib/puppet/environments.rb +4 -5
  27. data/lib/puppet/face/facts.rb +1 -1
  28. data/lib/puppet/face/help.rb +29 -3
  29. data/lib/puppet/face/module/search.rb +5 -0
  30. data/lib/puppet/face/plugin.rb +2 -2
  31. data/lib/puppet/feature/base.rb +1 -1
  32. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  33. data/lib/puppet/file_serving/metadata.rb +4 -1
  34. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  35. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  36. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  37. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  38. data/lib/puppet/file_system/file_impl.rb +17 -13
  39. data/lib/puppet/file_system/uniquefile.rb +12 -16
  40. data/lib/puppet/forge.rb +1 -1
  41. data/lib/puppet/forge/cache.rb +1 -1
  42. data/lib/puppet/forge/repository.rb +4 -7
  43. data/lib/puppet/functions/call.rb +1 -1
  44. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  45. data/lib/puppet/functions/filter.rb +1 -0
  46. data/lib/puppet/functions/lstrip.rb +4 -4
  47. data/lib/puppet/functions/reduce.rb +2 -4
  48. data/lib/puppet/functions/reverse_each.rb +1 -1
  49. data/lib/puppet/functions/rstrip.rb +4 -4
  50. data/lib/puppet/functions/step.rb +1 -1
  51. data/lib/puppet/functions/strip.rb +4 -4
  52. data/lib/puppet/gettext/config.rb +5 -5
  53. data/lib/puppet/gettext/module_translations.rb +4 -4
  54. data/lib/puppet/http.rb +3 -0
  55. data/lib/puppet/http/client.rb +263 -73
  56. data/lib/puppet/http/external_client.rb +90 -0
  57. data/lib/puppet/http/redirector.rb +43 -7
  58. data/lib/puppet/http/resolver.rb +46 -3
  59. data/lib/puppet/http/resolver/server_list.rb +76 -16
  60. data/lib/puppet/http/resolver/settings.rb +23 -3
  61. data/lib/puppet/http/resolver/srv.rb +29 -3
  62. data/lib/puppet/http/response.rb +87 -1
  63. data/lib/puppet/http/retry_after_handler.rb +39 -0
  64. data/lib/puppet/http/service.rb +97 -12
  65. data/lib/puppet/http/service/ca.rb +76 -14
  66. data/lib/puppet/http/service/compiler.rb +249 -16
  67. data/lib/puppet/http/service/file_server.rb +141 -20
  68. data/lib/puppet/http/service/report.rb +47 -17
  69. data/lib/puppet/http/session.rb +96 -7
  70. data/lib/puppet/indirector.rb +1 -1
  71. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  72. data/lib/puppet/indirector/exec.rb +1 -1
  73. data/lib/puppet/indirector/facts/facter.rb +3 -3
  74. data/lib/puppet/indirector/facts/rest.rb +42 -0
  75. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  76. data/lib/puppet/indirector/file_content/http.rb +5 -0
  77. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  78. data/lib/puppet/indirector/file_metadata/http.rb +28 -8
  79. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  80. data/lib/puppet/indirector/hiera.rb +4 -0
  81. data/lib/puppet/indirector/indirection.rb +1 -1
  82. data/lib/puppet/indirector/node/rest.rb +24 -0
  83. data/lib/puppet/indirector/report/processor.rb +2 -2
  84. data/lib/puppet/indirector/report/rest.rb +19 -0
  85. data/lib/puppet/indirector/report/yaml.rb +23 -0
  86. data/lib/puppet/indirector/request.rb +1 -1
  87. data/lib/puppet/indirector/rest.rb +12 -0
  88. data/lib/puppet/indirector/status/rest.rb +18 -0
  89. data/lib/puppet/loaders.rb +6 -0
  90. data/lib/puppet/metatype/manager.rb +80 -80
  91. data/lib/puppet/module.rb +1 -2
  92. data/lib/puppet/network/format_support.rb +2 -2
  93. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  94. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  95. data/lib/puppet/network/http/base_pool.rb +7 -2
  96. data/lib/puppet/network/http/compression.rb +7 -0
  97. data/lib/puppet/network/http/connection.rb +2 -0
  98. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  99. data/lib/puppet/network/http/nocache_pool.rb +1 -0
  100. data/lib/puppet/network/http/pool.rb +8 -5
  101. data/lib/puppet/network/http/route.rb +2 -2
  102. data/lib/puppet/network/http_pool.rb +2 -1
  103. data/lib/puppet/node/environment.rb +22 -5
  104. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  105. data/lib/puppet/pal/pal_impl.rb +30 -31
  106. data/lib/puppet/parameter.rb +1 -1
  107. data/lib/puppet/parser/ast/leaf.rb +5 -5
  108. data/lib/puppet/parser/ast/pops_bridge.rb +0 -4
  109. data/lib/puppet/parser/compiler.rb +43 -33
  110. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  111. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  112. data/lib/puppet/parser/environment_compiler.rb +4 -1
  113. data/lib/puppet/parser/functions.rb +18 -9
  114. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  115. data/lib/puppet/parser/functions/filter.rb +1 -0
  116. data/lib/puppet/parser/resource.rb +3 -2
  117. data/lib/puppet/parser/resource/param.rb +6 -0
  118. data/lib/puppet/parser/type_loader.rb +2 -2
  119. data/lib/puppet/pops/adaptable.rb +7 -13
  120. data/lib/puppet/pops/adapters.rb +8 -4
  121. data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
  122. data/lib/puppet/pops/issues.rb +5 -0
  123. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  124. data/lib/puppet/pops/loaders.rb +24 -15
  125. data/lib/puppet/pops/lookup/context.rb +1 -1
  126. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  127. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  128. data/lib/puppet/pops/types/iterable.rb +34 -8
  129. data/lib/puppet/pops/validation/checker4_0.rb +29 -15
  130. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  131. data/lib/puppet/provider/file/windows.rb +1 -1
  132. data/lib/puppet/provider/group/groupadd.rb +9 -4
  133. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  134. data/lib/puppet/provider/package/aix.rb +17 -2
  135. data/lib/puppet/provider/package/apt.rb +98 -1
  136. data/lib/puppet/provider/package/aptitude.rb +1 -1
  137. data/lib/puppet/provider/package/dnfmodule.rb +61 -14
  138. data/lib/puppet/provider/package/gem.rb +45 -9
  139. data/lib/puppet/provider/package/pacman.rb +2 -5
  140. data/lib/puppet/provider/package/pip.rb +143 -48
  141. data/lib/puppet/provider/package/pip3.rb +0 -2
  142. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  143. data/lib/puppet/provider/package/pkgng.rb +16 -4
  144. data/lib/puppet/provider/package/portage.rb +2 -2
  145. data/lib/puppet/provider/package/puppet_gem.rb +11 -2
  146. data/lib/puppet/provider/package/rpm.rb +6 -213
  147. data/lib/puppet/provider/package/yum.rb +100 -20
  148. data/lib/puppet/provider/package/zypper.rb +62 -1
  149. data/lib/puppet/provider/service/systemd.rb +22 -4
  150. data/lib/puppet/provider/service/windows.rb +23 -7
  151. data/lib/puppet/provider/user/aix.rb +1 -1
  152. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  153. data/lib/puppet/provider/user/useradd.rb +16 -5
  154. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  155. data/lib/puppet/reports/http.rb +15 -9
  156. data/lib/puppet/resource.rb +2 -1
  157. data/lib/puppet/resource/type.rb +8 -0
  158. data/lib/puppet/resource/type_collection.rb +20 -16
  159. data/lib/puppet/runtime.rb +31 -1
  160. data/lib/puppet/settings.rb +3 -1
  161. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  162. data/lib/puppet/ssl.rb +1 -0
  163. data/lib/puppet/ssl/host.rb +4 -4
  164. data/lib/puppet/ssl/oids.rb +1 -0
  165. data/lib/puppet/ssl/ssl_context.rb +2 -2
  166. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  167. data/lib/puppet/ssl/state_machine.rb +81 -35
  168. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  169. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  170. data/lib/puppet/test/test_helper.rb +21 -14
  171. data/lib/puppet/transaction.rb +2 -2
  172. data/lib/puppet/transaction/persistence.rb +1 -1
  173. data/lib/puppet/transaction/report.rb +3 -3
  174. data/lib/puppet/trusted_external.rb +29 -1
  175. data/lib/puppet/type.rb +21 -8
  176. data/lib/puppet/type/file.rb +51 -13
  177. data/lib/puppet/type/file/checksum.rb +4 -4
  178. data/lib/puppet/type/file/source.rb +75 -64
  179. data/lib/puppet/type/notify.rb +2 -2
  180. data/lib/puppet/type/package.rb +41 -3
  181. data/lib/puppet/type/service.rb +59 -8
  182. data/lib/puppet/type/user.rb +19 -29
  183. data/lib/puppet/util.rb +41 -3
  184. data/lib/puppet/util/at_fork.rb +1 -1
  185. data/lib/puppet/util/autoload.rb +13 -25
  186. data/lib/puppet/util/character_encoding.rb +9 -5
  187. data/lib/puppet/util/checksums.rb +19 -4
  188. data/lib/puppet/util/execution.rb +2 -2
  189. data/lib/puppet/util/fileparsing.rb +2 -2
  190. data/lib/puppet/util/instance_loader.rb +14 -10
  191. data/lib/puppet/util/log/destinations.rb +1 -10
  192. data/lib/puppet/util/package/version/debian.rb +175 -0
  193. data/lib/puppet/util/package/version/gem.rb +15 -0
  194. data/lib/puppet/util/package/version/pip.rb +167 -0
  195. data/lib/puppet/util/package/version/range.rb +53 -0
  196. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  197. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  198. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  199. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  200. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  201. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  202. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  203. data/lib/puppet/util/package/version/rpm.rb +73 -0
  204. data/lib/puppet/util/pidlock.rb +13 -7
  205. data/lib/puppet/util/platform.rb +5 -0
  206. data/lib/puppet/util/provider_features.rb +1 -1
  207. data/lib/puppet/util/reference.rb +1 -1
  208. data/lib/puppet/util/rpm_compare.rb +193 -0
  209. data/lib/puppet/util/windows.rb +1 -0
  210. data/lib/puppet/util/windows/adsi.rb +2 -2
  211. data/lib/puppet/util/windows/api_types.rb +60 -33
  212. data/lib/puppet/util/windows/eventlog.rb +1 -6
  213. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  214. data/lib/puppet/util/windows/principal.rb +8 -6
  215. data/lib/puppet/util/windows/process.rb +15 -14
  216. data/lib/puppet/util/windows/registry.rb +11 -11
  217. data/lib/puppet/util/windows/security.rb +5 -4
  218. data/lib/puppet/util/windows/service.rb +43 -26
  219. data/lib/puppet/util/windows/sid.rb +3 -3
  220. data/lib/puppet/util/windows/user.rb +242 -8
  221. data/lib/puppet/version.rb +1 -1
  222. data/locales/puppet.pot +641 -511
  223. data/man/man5/puppet.conf.5 +75 -10
  224. data/man/man8/puppet-agent.8 +7 -7
  225. data/man/man8/puppet-apply.8 +1 -1
  226. data/man/man8/puppet-catalog.8 +1 -1
  227. data/man/man8/puppet-config.8 +1 -1
  228. data/man/man8/puppet-describe.8 +1 -1
  229. data/man/man8/puppet-device.8 +2 -2
  230. data/man/man8/puppet-doc.8 +1 -1
  231. data/man/man8/puppet-epp.8 +1 -1
  232. data/man/man8/puppet-facts.8 +1 -1
  233. data/man/man8/puppet-filebucket.8 +17 -2
  234. data/man/man8/puppet-generate.8 +1 -1
  235. data/man/man8/puppet-help.8 +6 -3
  236. data/man/man8/puppet-key.8 +1 -1
  237. data/man/man8/puppet-lookup.8 +2 -2
  238. data/man/man8/puppet-man.8 +1 -1
  239. data/man/man8/puppet-module.8 +4 -1
  240. data/man/man8/puppet-node.8 +1 -1
  241. data/man/man8/puppet-parser.8 +1 -1
  242. data/man/man8/puppet-plugin.8 +1 -1
  243. data/man/man8/puppet-report.8 +1 -1
  244. data/man/man8/puppet-resource.8 +1 -1
  245. data/man/man8/puppet-script.8 +1 -1
  246. data/man/man8/puppet-ssl.8 +2 -2
  247. data/man/man8/puppet-status.8 +1 -1
  248. data/man/man8/puppet.8 +2 -2
  249. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  250. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  251. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  252. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  253. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  254. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  255. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  256. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  257. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  258. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  259. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  260. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  261. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  262. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -67
  263. 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 -69
  264. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -69
  265. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -67
  266. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -65
  267. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -67
  268. 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 -67
  269. data/spec/integration/application/agent_spec.rb +475 -0
  270. data/spec/integration/application/apply_spec.rb +279 -150
  271. data/spec/integration/application/config_spec.rb +74 -0
  272. data/spec/integration/application/doc_spec.rb +16 -6
  273. data/spec/integration/application/filebucket_spec.rb +239 -0
  274. data/spec/integration/application/help_spec.rb +42 -0
  275. data/spec/integration/application/lookup_spec.rb +13 -0
  276. data/spec/integration/application/module_spec.rb +68 -0
  277. data/spec/integration/application/plugin_spec.rb +123 -0
  278. data/spec/integration/data_binding_spec.rb +82 -0
  279. data/spec/integration/defaults_spec.rb +1 -2
  280. data/spec/integration/directory_environments_spec.rb +17 -17
  281. data/spec/integration/http/client_spec.rb +47 -37
  282. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  283. data/spec/integration/indirector/report/yaml.rb +83 -0
  284. data/spec/integration/network/http_pool_spec.rb +93 -20
  285. data/spec/integration/node/environment_spec.rb +15 -0
  286. data/spec/integration/parser/compiler_spec.rb +11 -0
  287. data/spec/integration/type/file_spec.rb +1 -1
  288. data/spec/integration/util/execution_spec.rb +22 -0
  289. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  290. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  291. data/spec/integration/util/windows/process_spec.rb +26 -32
  292. data/spec/integration/util/windows/registry_spec.rb +7 -7
  293. data/spec/integration/util/windows/user_spec.rb +47 -5
  294. data/spec/integration/util_spec.rb +7 -33
  295. data/spec/lib/puppet/test_ca.rb +2 -2
  296. data/spec/lib/puppet_spec/https.rb +16 -7
  297. data/spec/lib/puppet_spec/matchers.rb +0 -80
  298. data/spec/lib/puppet_spec/puppetserver.rb +127 -0
  299. data/spec/shared_contexts/https.rb +29 -0
  300. data/spec/unit/agent_spec.rb +80 -26
  301. data/spec/unit/application/agent_spec.rb +12 -9
  302. data/spec/unit/application/describe_spec.rb +88 -50
  303. data/spec/unit/application/device_spec.rb +2 -2
  304. data/spec/unit/application/face_base_spec.rb +6 -4
  305. data/spec/unit/application/facts_spec.rb +39 -10
  306. data/spec/unit/application/filebucket_spec.rb +22 -2
  307. data/spec/unit/application/man_spec.rb +52 -0
  308. data/spec/unit/application/resource_spec.rb +3 -1
  309. data/spec/unit/application/ssl_spec.rb +15 -2
  310. data/spec/unit/configurer/downloader_spec.rb +10 -0
  311. data/spec/unit/configurer/fact_handler_spec.rb +4 -4
  312. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  313. data/spec/unit/configurer_spec.rb +64 -46
  314. data/spec/unit/confine_spec.rb +2 -1
  315. data/spec/unit/context/trusted_information_spec.rb +25 -2
  316. data/spec/unit/daemon_spec.rb +5 -64
  317. data/spec/unit/defaults_spec.rb +24 -1
  318. data/spec/unit/environments_spec.rb +8 -0
  319. data/spec/unit/face/config_spec.rb +3 -1
  320. data/spec/unit/face/module/search_spec.rb +17 -0
  321. data/spec/unit/face/plugin_spec.rb +12 -10
  322. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  323. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  324. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  325. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  326. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  327. data/spec/unit/file_system/uniquefile_spec.rb +29 -0
  328. data/spec/unit/file_system_spec.rb +10 -0
  329. data/spec/unit/functions/lookup_spec.rb +13 -0
  330. data/spec/unit/http/client_spec.rb +321 -36
  331. data/spec/unit/http/external_client_spec.rb +201 -0
  332. data/spec/unit/http/resolver_spec.rb +34 -3
  333. data/spec/unit/http/response_spec.rb +75 -0
  334. data/spec/unit/http/service/ca_spec.rb +53 -12
  335. data/spec/unit/http/service/compiler_spec.rb +332 -28
  336. data/spec/unit/http/service/file_server_spec.rb +100 -12
  337. data/spec/unit/http/service/report_spec.rb +19 -9
  338. data/spec/unit/http/service_spec.rb +94 -6
  339. data/spec/unit/http/session_spec.rb +159 -8
  340. data/spec/unit/indirector/catalog/compiler_spec.rb +1 -0
  341. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  342. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  343. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  344. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  345. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  346. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  347. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  348. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  349. data/spec/unit/indirector/request_spec.rb +1 -1
  350. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  351. data/spec/unit/indirector/rest_spec.rb +13 -0
  352. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  353. data/spec/unit/interface_spec.rb +3 -3
  354. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  355. data/spec/unit/network/format_support_spec.rb +3 -2
  356. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  357. data/spec/unit/network/http/connection_spec.rb +552 -190
  358. data/spec/unit/network/http/nocache_pool_spec.rb +22 -0
  359. data/spec/unit/network/http/pool_spec.rb +59 -13
  360. data/spec/unit/network/http_pool_spec.rb +63 -57
  361. data/spec/unit/network/http_spec.rb +1 -1
  362. data/spec/unit/node/environment_spec.rb +33 -0
  363. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  364. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  365. data/spec/unit/parser/scope_spec.rb +1 -1
  366. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  367. data/spec/unit/pops/loaders/loaders_spec.rb +71 -1
  368. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  369. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  370. data/spec/unit/provider/group/groupadd_spec.rb +22 -8
  371. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  372. data/spec/unit/provider/package/aix_spec.rb +29 -0
  373. data/spec/unit/provider/package/apt_spec.rb +107 -0
  374. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  375. data/spec/unit/provider/package/dnfmodule_spec.rb +54 -15
  376. data/spec/unit/provider/package/gem_spec.rb +40 -0
  377. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  378. data/spec/unit/provider/package/pip_spec.rb +68 -19
  379. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  380. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  381. data/spec/unit/provider/package/portage_spec.rb +5 -0
  382. data/spec/unit/provider/package/puppet_gem_spec.rb +12 -1
  383. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  384. data/spec/unit/provider/package/yum_spec.rb +243 -1
  385. data/spec/unit/provider/package/zypper_spec.rb +98 -0
  386. data/spec/unit/provider/service/init_spec.rb +42 -0
  387. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  388. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  389. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  390. data/spec/unit/provider/service/systemd_spec.rb +93 -18
  391. data/spec/unit/provider/service/windows_spec.rb +50 -14
  392. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  393. data/spec/unit/provider/user/useradd_spec.rb +30 -16
  394. data/spec/unit/provider/user/windows_adsi_spec.rb +85 -3
  395. data/spec/unit/puppet_pal_2pec.rb +11 -0
  396. data/spec/unit/puppet_pal_catalog_spec.rb +43 -0
  397. data/spec/unit/puppet_spec.rb +33 -0
  398. data/spec/unit/reports/http_spec.rb +70 -52
  399. data/spec/unit/reports/store_spec.rb +17 -13
  400. data/spec/unit/resource_spec.rb +3 -3
  401. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  402. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  403. data/spec/unit/ssl/host_spec.rb +4 -2
  404. data/spec/unit/ssl/oids_spec.rb +1 -0
  405. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  406. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  407. data/spec/unit/test/test_helper_spec.rb +17 -0
  408. data/spec/unit/transaction/persistence_spec.rb +15 -0
  409. data/spec/unit/transaction/report_spec.rb +5 -1
  410. data/spec/unit/transaction_spec.rb +0 -2
  411. data/spec/unit/type/file/ensure_spec.rb +1 -2
  412. data/spec/unit/type/file/source_spec.rb +89 -38
  413. data/spec/unit/type/file_spec.rb +122 -96
  414. data/spec/unit/type/service_spec.rb +218 -8
  415. data/spec/unit/type/user_spec.rb +32 -3
  416. data/spec/unit/type_spec.rb +50 -0
  417. data/spec/unit/util/at_fork_spec.rb +3 -2
  418. data/spec/unit/util/autoload_spec.rb +2 -1
  419. data/spec/unit/util/character_encoding_spec.rb +4 -4
  420. data/spec/unit/util/checksums_spec.rb +16 -0
  421. data/spec/unit/util/command_line_spec.rb +11 -6
  422. data/spec/unit/util/log/destinations_spec.rb +1 -29
  423. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  424. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  425. data/spec/unit/util/package/version/range_spec.rb +175 -0
  426. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  427. data/spec/unit/util/pidlock_spec.rb +102 -54
  428. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  429. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  430. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  431. data/spec/unit/util/windows/service_spec.rb +4 -4
  432. data/spec/unit/util/windows/sid_spec.rb +2 -2
  433. data/spec/unit/util_spec.rb +3 -3
  434. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  435. data/tasks/generate_cert_fixtures.rake +15 -1
  436. data/tasks/manpages.rake +5 -35
  437. metadata +84 -52
  438. data/COMMITTERS.md +0 -244
  439. data/spec/integration/faces/config_spec.rb +0 -91
  440. data/spec/integration/faces/documentation_spec.rb +0 -57
  441. data/spec/integration/faces/plugin_spec.rb +0 -61
  442. data/spec/integration/file_bucket/file_spec.rb +0 -50
  443. data/spec/integration/file_serving/content_spec.rb +0 -7
  444. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  445. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  446. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  447. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  448. data/spec/integration/module_tool/forge_spec.rb +0 -64
  449. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  450. data/spec/integration/provider/service/init_spec.rb +0 -48
  451. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  452. data/spec/integration/provider/service/windows_spec.rb +0 -50
  453. data/spec/integration/reference/providers_spec.rb +0 -21
  454. data/spec/integration/reports_spec.rb +0 -13
  455. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  456. data/spec/integration/ssl/host_spec.rb +0 -72
  457. data/spec/integration/ssl/key_spec.rb +0 -99
  458. data/spec/integration/test/test_helper_spec.rb +0 -31
  459. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  460. data/spec/unit/face/man_spec.rb +0 -25
  461. data/spec/unit/man_spec.rb +0 -31
@@ -38,6 +38,7 @@
38
38
  # $data = { "orange" => 0, "blueberry" => 1, "raspberry" => 2 }
39
39
  # $filtered_data = $data.filter |$items| { $items[0] =~ /berry$/ }
40
40
  # # $filtered_data = {blueberry => 1, raspberry => 2}
41
+ # ```
41
42
  #
42
43
  # When the first argument is an array and the lambda has two parameters, Puppet passes the
43
44
  # array's indexes (enumerated from 0) in the first parameter and its values in the second
@@ -12,15 +12,15 @@
12
12
  #
13
13
  # @example Removing leading space from a String
14
14
  # ```puppet
15
- # "\n\thello".lstrip()
16
- # camelcase("\n\thello")
15
+ # "\n\thello ".lstrip()
16
+ # lstrip("\n\thello ")
17
17
  # ```
18
18
  # Would both result in `"hello"`
19
19
  #
20
20
  # @example Removing leading space from strings in an Array
21
21
  # ```puppet
22
- # ["\n\thello", "\n\thi"].lstrip()
23
- # lstrip(["\n\thello", "\n\thi"])
22
+ # ["\n\thello ", "\n\thi "].lstrip()
23
+ # lstrip(["\n\thello ", "\n\thi "])
24
24
  # ```
25
25
  # Would both result in `['hello', 'hi']`
26
26
  #
@@ -39,11 +39,9 @@
39
39
  # values to the lambda.
40
40
  #
41
41
  # Puppet calls the lambda for each of the data structure's remaining values. For each
42
- # call, it passes the result of the previous call as the first parameter ($memo in the
42
+ # call, it passes the result of the previous call as the first parameter (`$memo` in the
43
43
  # above examples) and the next value from the data structure as the second parameter
44
- # ($value).
45
- #
46
- # If the structure has one value, Puppet returns the value and does not call the lambda.
44
+ # (`$value`).
47
45
  #
48
46
  # @example Using the `reduce` function
49
47
  #
@@ -84,7 +84,7 @@ Puppet::Functions.create_function(:reverse_each) do
84
84
 
85
85
  def reverse_each(iterable)
86
86
  # produces an Iterable
87
- Puppet::Pops::Types::Iterable.asserted_iterable(self, iterable).reverse_each
87
+ Puppet::Pops::Types::Iterable.asserted_iterable(self, iterable, true).reverse_each
88
88
  end
89
89
 
90
90
  def reverse_each_block(iterable, &block)
@@ -12,15 +12,15 @@
12
12
  #
13
13
  # @example Removing trailing space from a String
14
14
  # ```puppet
15
- # "hello\n\t".lstrip()
16
- # camelcase("hello\n\t")
15
+ # " hello\n\t".rstrip()
16
+ # rstrip(" hello\n\t")
17
17
  # ```
18
18
  # Would both result in `"hello"`
19
19
  #
20
20
  # @example Removing trailing space from strings in an Array
21
21
  # ```puppet
22
- # ["hello\n\t", "hi\n\t"].lstrip()
23
- # lstrip(["hello\n\t", "hi\n\t"])
22
+ # [" hello\n\t", " hi\n\t"].rstrip()
23
+ # rstrip([" hello\n\t", " hi\n\t"])
24
24
  # ```
25
25
  # Would both result in `['hello', 'hi']`
26
26
  #
@@ -88,7 +88,7 @@ Puppet::Functions.create_function(:step) do
88
88
 
89
89
  def step(iterable, step)
90
90
  # produces an Iterable
91
- Puppet::Pops::Types::Iterable.asserted_iterable(self, iterable).step(step)
91
+ Puppet::Pops::Types::Iterable.asserted_iterable(self, iterable, true).step(step)
92
92
  end
93
93
 
94
94
  def step_block(iterable, step, &block)
@@ -12,15 +12,15 @@
12
12
  #
13
13
  # @example Removing leading and trailing space from a String
14
14
  # ```puppet
15
- # " hello\n\t".lstrip()
16
- # camelcase(" hello\n\t")
15
+ # " hello\n\t".strip()
16
+ # strip(" hello\n\t")
17
17
  # ```
18
18
  # Would both result in `"hello"`
19
19
  #
20
20
  # @example Removing trailing space from strings in an Array
21
21
  # ```puppet
22
- # [" hello\n\t", " hi\n\t"].lstrip()
23
- # lstrip([" hello\n\t", " hi\n\t"])
22
+ # [" hello\n\t", " hi\n\t"].strip()
23
+ # strip([" hello\n\t", " hi\n\t"])
24
24
  # ```
25
25
  # Would both result in `['hello', 'hi']`
26
26
  #
@@ -65,7 +65,7 @@ module Puppet::GettextConfig
65
65
  return if @gettext_disabled || !gettext_loaded?
66
66
  domain_name = domain_name.to_sym
67
67
 
68
- Puppet.debug "Reset text domain to #{domain_name.inspect}"
68
+ Puppet.debug { "Reset text domain to #{domain_name.inspect}" }
69
69
  FastGettext.add_text_domain(domain_name,
70
70
  type: :chain,
71
71
  chain: [],
@@ -115,10 +115,10 @@ module Puppet::GettextConfig
115
115
  domain_name = domain_name.to_sym
116
116
 
117
117
  if FastGettext.translation_repositories.include?(domain_name)
118
- Puppet.debug "Use text domain #{domain_name.inspect}"
118
+ Puppet.debug { "Use text domain #{domain_name.inspect}" }
119
119
  FastGettext.text_domain = domain_name
120
120
  else
121
- Puppet.debug "Requested unknown text domain #{domain_name.inspect}"
121
+ Puppet.debug { "Requested unknown text domain #{domain_name.inspect}" }
122
122
  end
123
123
  end
124
124
 
@@ -139,10 +139,10 @@ module Puppet::GettextConfig
139
139
 
140
140
  deleted = FastGettext.translation_repositories.delete(domain_name)
141
141
  if FastGettext.text_domain == domain_name
142
- Puppet.debug "Deleted current text domain #{domain_name.inspect}: #{!deleted.nil?}"
142
+ Puppet.debug { "Deleted current text domain #{domain_name.inspect}: #{!deleted.nil?}" }
143
143
  FastGettext.text_domain = nil
144
144
  else
145
- Puppet.debug "Deleted text domain #{domain_name.inspect}: #{!deleted.nil?}"
145
+ Puppet.debug { "Deleted text domain #{domain_name.inspect}: #{!deleted.nil?}" }
146
146
  end
147
147
  end
148
148
 
@@ -13,9 +13,9 @@ module Puppet::ModuleTranslations
13
13
 
14
14
  module_name = mod.forge_name.tr('/', '-')
15
15
  if Puppet::GettextConfig.load_translations(module_name, mod.locale_directory, :po)
16
- Puppet.debug "Loaded translations for #{module_name}."
16
+ Puppet.debug { "Loaded translations for #{module_name}." }
17
17
  elsif Puppet::GettextConfig.gettext_loaded?
18
- Puppet.debug "Could not find translation files for #{module_name} at #{mod.locale_directory}. Skipping translation initialization."
18
+ Puppet.debug { "Could not find translation files for #{module_name} at #{mod.locale_directory}. Skipping translation initialization." }
19
19
  else
20
20
  Puppet.warn_once("gettext_unavailable", "gettext_unavailable", "No gettext library found, skipping translation initialization.")
21
21
  end
@@ -31,9 +31,9 @@ module Puppet::ModuleTranslations
31
31
  Dir.glob("#{vardir}/locales/#{locale}/*.po") do |f|
32
32
  module_name = File.basename(f, ".po")
33
33
  if Puppet::GettextConfig.load_translations(module_name, File.join(vardir, "locales"), :po)
34
- Puppet.debug "Loaded translations for #{module_name}."
34
+ Puppet.debug { "Loaded translations for #{module_name}." }
35
35
  elsif Puppet::GettextConfig.gettext_loaded?
36
- Puppet.debug "Could not load translations for #{module_name}."
36
+ Puppet.debug { "Could not load translations for #{module_name}." }
37
37
  else
38
38
  Puppet.warn_once("gettext_unavailable", "gettext_unavailable", "No gettext library found, skipping translation initialization.")
39
39
  end
@@ -11,8 +11,10 @@ module Puppet
11
11
  end
12
12
  end
13
13
 
14
+ # @api private
14
15
  module HTTP
15
16
  ACCEPT_ENCODING = "gzip;q=1.0,deflate;q=0.6,identity;q=0.3".freeze
17
+ HEADER_PUPPET_VERSION = "X-Puppet-Version".freeze
16
18
 
17
19
  require 'puppet/http/errors'
18
20
  require 'puppet/http/response'
@@ -29,5 +31,6 @@ module Puppet
29
31
  require 'puppet/http/client'
30
32
  require 'puppet/http/redirector'
31
33
  require 'puppet/http/retry_after_handler'
34
+ require 'puppet/http/external_client'
32
35
  end
33
36
  end
@@ -1,27 +1,85 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # The client contains a pool of persistent HTTP connections and creates HTTP
5
+ # sessions.
6
+ #
1
7
  class Puppet::HTTP::Client
2
- def initialize(pool: Puppet::Network::HTTP::Pool.new, ssl_context: nil, redirect_limit: 10, retry_limit: 100)
8
+
9
+ # @api private
10
+ # @return [Puppet::Network::HTTP::Pool] the pool instance associated with
11
+ # this client
12
+ attr_reader :pool
13
+
14
+ #
15
+ # @api private
16
+ #
17
+ # Create a new http client instance. The client contains a pool of persistent
18
+ # HTTP connections and creates HTTP sessions.
19
+ #
20
+ # @param [Puppet::Network::HTTP::Pool] pool pool of persistent Net::HTTP
21
+ # connections
22
+ # @param [Puppet::SSL::SSLContext] ssl_context ssl context to be used for
23
+ # connections
24
+ # @param [Puppet::SSL::SSLContext] system_ssl_context the system ssl context
25
+ # used if :include_system_store is set to true
26
+ # @param [Integer] redirect_limit default number of HTTP redirections to allow
27
+ # in a given request. Can also be specified per-request.
28
+ # @param [Integer] retry_limit number of HTTP reties allowed in a given
29
+ # request
30
+ #
31
+ def initialize(pool: Puppet::Network::HTTP::Pool.new(Puppet[:http_keepalive_timeout]), ssl_context: nil, system_ssl_context: nil, redirect_limit: 10, retry_limit: 100)
3
32
  @pool = pool
4
33
  @default_headers = {
5
34
  'X-Puppet-Version' => Puppet.version,
6
35
  'User-Agent' => Puppet[:http_user_agent],
7
36
  }.freeze
8
37
  @default_ssl_context = ssl_context
9
- @redirector = Puppet::HTTP::Redirector.new(redirect_limit)
38
+ @default_system_ssl_context = system_ssl_context
39
+ @default_redirect_limit = redirect_limit
10
40
  @retry_after_handler = Puppet::HTTP::RetryAfterHandler.new(retry_limit, Puppet[:runinterval])
11
- @resolvers = build_resolvers
12
41
  end
13
42
 
43
+ #
44
+ # @api private
45
+ #
46
+ # Create a new HTTP session. A session is the object through which services
47
+ # may be connected to and accessed.
48
+ #
49
+ # @return [Puppet::HTTP::Session] the newly created HTTP session
50
+ #
14
51
  def create_session
15
- Puppet::HTTP::Session.new(self, @resolvers)
52
+ Puppet::HTTP::Session.new(self, build_resolvers)
16
53
  end
17
54
 
18
- def connect(uri, ssl_context: nil, &block)
55
+ #
56
+ # @api private
57
+ #
58
+ # Open a connection to the given URI
59
+ #
60
+ # @param [URI] uri the connection destination
61
+ # @param [Hash] options
62
+ # @option options [Puppet::SSL::SSLContext] :ssl_context (nil) ssl context to
63
+ # be used for connections
64
+ # @option options [Boolean] :include_system_store (false) if we should include
65
+ # the system store for connection
66
+ #
67
+ # @yield [Net::HTTP] If a block is given, yields an active http connection
68
+ # from the pool
69
+ #
70
+ def connect(uri, options: {}, &block)
19
71
  start = Time.now
20
- ctx = ssl_context ? ssl_context : default_ssl_context
21
- site = Puppet::Network::HTTP::Site.from_uri(uri)
22
- verifier = Puppet::SSL::Verifier.new(site.host, ctx)
72
+ verifier = nil
23
73
  connected = false
24
74
 
75
+ site = Puppet::Network::HTTP::Site.from_uri(uri)
76
+ if site.use_ssl?
77
+ ssl_context = options.fetch(:ssl_context, nil)
78
+ include_system_store = options.fetch(:include_system_store, false)
79
+ ctx = resolve_ssl_context(ssl_context, include_system_store)
80
+ verifier = Puppet::SSL::Verifier.new(site.host, ctx)
81
+ end
82
+
25
83
  @pool.with_connection(site, verifier) do |http|
26
84
  connected = true
27
85
  if block_given?
@@ -43,117 +101,228 @@ class Puppet::HTTP::Client
43
101
  {uri: uri, elapsed: elapsed(start), message: e.message}, e, connected)
44
102
  end
45
103
 
46
- def get(url, headers: {}, params: {}, ssl_context: nil, user: nil, password: nil, &block)
47
- query = encode_params(params)
48
- unless query.empty?
49
- url = url.dup
50
- url.query = query
51
- end
104
+ #
105
+ # @api private
106
+ #
107
+ # Submits a GET HTTP request to the given url
108
+ #
109
+ # @param [URI] url the location to submit the http request
110
+ # @param [Hash] headers merged with the default headers defined by the client
111
+ # @param [Hash] params encoded and set as the url query
112
+ # @param [Hash] options passed through to the request execution
113
+ # @option options [Puppet::SSL::SSLContext] :ssl_context (nil) ssl context to
114
+ # be used for connections
115
+ # @option options [Boolean] :include_system_store (false) if we should include
116
+ # the system store for connection
117
+ # @param options [Integer] :redirect_limit number of HTTP redirections to allow
118
+ # for this request.
119
+ #
120
+ # @yield [Puppet::HTTP::Response] if a block is given yields the response
121
+ #
122
+ # @return [String] if a block is not given, returns the response body
123
+ #
124
+ def get(url, headers: {}, params: {}, options: {}, &block)
125
+ url = encode_query(url, params)
52
126
 
53
127
  request = Net::HTTP::Get.new(url, @default_headers.merge(headers))
54
128
 
55
- execute_streaming(request, ssl_context: ssl_context, user: user, password: password) do |response|
129
+ execute_streaming(request, options: options) do |response|
56
130
  if block_given?
57
131
  yield response
58
132
  else
59
- response.read_body
133
+ response.body
60
134
  end
61
135
  end
62
136
  end
63
137
 
64
- def head(url, headers: {}, params: {}, ssl_context: nil, user: nil, password: nil)
65
- query = encode_params(params)
66
- unless query.empty?
67
- url = url.dup
68
- url.query = query
69
- end
138
+ #
139
+ # @api private
140
+ #
141
+ # Submits a HEAD HTTP request to the given url
142
+ #
143
+ # @param [URI] url the location to submit the http request
144
+ # @param [Hash] headers merged with the default headers defined by the client
145
+ # @param [Hash] params encoded and set as the url query
146
+ # @param [Hash] options passed through to the request execution
147
+ # @option options [Puppet::SSL::SSLContext] :ssl_context (nil) ssl context to
148
+ # be used for connections
149
+ # @option options [Boolean] :include_system_store (false) if we should include
150
+ # the system store for connection
151
+ # @param options [Integer] :redirect_limit number of HTTP redirections to allow
152
+ # for this request.
153
+ #
154
+ # @return [String] the body of the request response
155
+ #
156
+ def head(url, headers: {}, params: {}, options: {})
157
+ url = encode_query(url, params)
70
158
 
71
159
  request = Net::HTTP::Head.new(url, @default_headers.merge(headers))
72
160
 
73
- execute_streaming(request, ssl_context: ssl_context, user: user, password: password) do |response|
74
- response.read_body
161
+ execute_streaming(request, options: options) do |response|
162
+ response.body
75
163
  end
76
164
  end
77
165
 
78
- def put(url, headers: {}, params: {}, content_type:, body:, ssl_context: nil, user: nil, password: nil)
79
- query = encode_params(params)
80
- unless query.empty?
81
- url = url.dup
82
- url.query = query
83
- end
166
+ #
167
+ # @api private
168
+ #
169
+ # Submits a PUT HTTP request to the given url
170
+ #
171
+ # @param [URI] url the location to submit the http request
172
+ # @param [String] body the body of the PUT request
173
+ # @param [Hash] headers merged with the default headers defined by the client
174
+ # @param [Hash] params encoded and set as the url query
175
+ # @param [Hash] options passed through to the request execution
176
+ # @option options [String] :content_type the type of the body content
177
+ # @option options [Puppet::SSL::SSLContext] :ssl_context (nil) ssl context to
178
+ # be used for connections
179
+ # @option options [Boolean] :include_system_store (false) if we should include
180
+ # the system store for connection
181
+ # @param options [Integer] :redirect_limit number of HTTP redirections to allow
182
+ # for this request.
183
+ #
184
+ # @return [String] the body of the request response
185
+ #
186
+ def put(url, body, headers: {}, params: {}, options: {})
187
+ raise ArgumentError, "'put' requires a string 'body' argument" unless body.is_a?(String)
188
+ url = encode_query(url, params)
84
189
 
85
190
  request = Net::HTTP::Put.new(url, @default_headers.merge(headers))
86
191
  request.body = body
87
- request['Content-Length'] = body.bytesize
88
- request['Content-Type'] = content_type
192
+ request.content_length = body.bytesize
89
193
 
90
- execute_streaming(request, ssl_context: ssl_context, user: user, password: password) do |response|
91
- response.read_body
194
+ raise ArgumentError, "'put' requires a 'content-type' header" unless request['Content-Type']
195
+
196
+ execute_streaming(request, options: options) do |response|
197
+ response.body
92
198
  end
93
199
  end
94
200
 
95
- def post(url, headers: {}, params: {}, content_type:, body:, ssl_context: nil, user: nil, password: nil, &block)
96
- query = encode_params(params)
97
- unless query.empty?
98
- url = url.dup
99
- url.query = query
100
- end
201
+ #
202
+ # @api private
203
+ #
204
+ # Submits a POST HTTP request to the given url
205
+ #
206
+ # @param [URI] url the location to submit the http request
207
+ # @param [String] body the body of the POST request
208
+ # @param [Hash] headers merged with the default headers defined by the client
209
+ # @param [Hash] params encoded and set as the url query
210
+ # @param [Hash] options passed through to the request execution
211
+ # @option options [String] :content_type the type of the body content
212
+ # @option options [Puppet::SSL::SSLContext] :ssl_context (nil) ssl context to
213
+ # be used for connections
214
+ # @option options [Boolean] :include_system_store (false) if we should include
215
+ # the system store for connection
216
+ # @param options [Integer] :redirect_limit number of HTTP redirections to allow
217
+ # for this request.
218
+ #
219
+ # @return [String] the body of the request response
220
+ #
221
+ def post(url, body, headers: {}, params: {}, options: {}, &block)
222
+ raise ArgumentError, "'post' requires a string 'body' argument" unless body.is_a?(String)
223
+ url = encode_query(url, params)
101
224
 
102
225
  request = Net::HTTP::Post.new(url, @default_headers.merge(headers))
103
226
  request.body = body
104
- request['Content-Length'] = body.bytesize
105
- request['Content-Type'] = content_type
227
+ request.content_length = body.bytesize
106
228
 
107
- execute_streaming(request, ssl_context: ssl_context, user: user, password: password) do |response|
229
+ raise ArgumentError, "'post' requires a 'content-type' header" unless request['Content-Type']
230
+
231
+ execute_streaming(request, options: options) do |response|
108
232
  if block_given?
109
233
  yield response
110
234
  else
111
- response.read_body
235
+ response.body
112
236
  end
113
237
  end
114
238
  end
115
239
 
116
- def delete(url, headers: {}, params: {}, ssl_context: nil, user: nil, password: nil)
117
- query = encode_params(params)
118
- unless query.empty?
119
- url = url.dup
120
- url.query = query
121
- end
240
+ #
241
+ # @api private
242
+ #
243
+ # Submits a DELETE HTTP request to the given url
244
+ #
245
+ # @param [URI] url the location to submit the http request
246
+ # @param [Hash] headers merged with the default headers defined by the client
247
+ # @param [Hash] params encoded and set as the url query
248
+ # @param [Hash] options options hash passed through to the request execution
249
+ # @option options [Puppet::SSL::SSLContext] :ssl_context (nil) ssl context to
250
+ # be used for connections
251
+ # @option options [Boolean] :include_system_store (false) if we should include
252
+ # the system store for connection
253
+ # @param options [Integer] :redirect_limit number of HTTP redirections to allow
254
+ # for this request.
255
+ #
256
+ # @return [String] the body of the request response
257
+ #
258
+ def delete(url, headers: {}, params: {}, options: {})
259
+ url = encode_query(url, params)
122
260
 
123
261
  request = Net::HTTP::Delete.new(url, @default_headers.merge(headers))
124
262
 
125
- execute_streaming(request, ssl_context: ssl_context, user: user, password: password) do |response|
126
- response.read_body
263
+ execute_streaming(request, options: options) do |response|
264
+ response.body
127
265
  end
128
266
  end
129
267
 
268
+ #
269
+ # @api private
270
+ #
271
+ # Close persistent connections in the pool
272
+ #
130
273
  def close
131
274
  @pool.close
132
275
  end
133
276
 
277
+ protected
278
+
279
+ def encode_query(url, params)
280
+ return url if params.empty?
281
+
282
+ url = url.dup
283
+ url.query = encode_params(params)
284
+ url
285
+ end
286
+
134
287
  private
135
288
 
136
- def execute_streaming(request, ssl_context:, user: nil, password: nil, &block)
289
+ def execute_streaming(request, options: {}, &block)
290
+ redirector = Puppet::HTTP::Redirector.new(options.fetch(:redirect_limit, @default_redirect_limit))
291
+
292
+ basic_auth = options.fetch(:basic_auth, nil)
293
+ unless basic_auth
294
+ if request.uri.user && request.uri.password
295
+ basic_auth = { user: request.uri.user, password: request.uri.password }
296
+ end
297
+ end
298
+
137
299
  redirects = 0
138
300
  retries = 0
301
+ response = nil
302
+ done = false
139
303
 
140
- loop do
141
- connect(request.uri, ssl_context: ssl_context) do |http|
142
- apply_auth(request, user, password)
304
+ while !done do
305
+ connect(request.uri, options: options) do |http|
306
+ apply_auth(request, basic_auth)
143
307
 
308
+ # don't call return within the `request` block
144
309
  http.request(request) do |nethttp|
145
- response = Puppet::HTTP::Response.new(nethttp)
310
+ response = Puppet::HTTP::Response.new(nethttp, request.uri)
146
311
  begin
147
312
  Puppet.debug("HTTP #{request.method.upcase} #{request.uri} returned #{response.code} #{response.reason}")
148
313
 
149
- if @redirector.redirect?(request, response)
150
- request = @redirector.redirect_to(request, response, redirects)
314
+ if redirector.redirect?(request, response)
315
+ request = redirector.redirect_to(request, response, redirects)
151
316
  redirects += 1
152
317
  next
153
318
  elsif @retry_after_handler.retry_after?(request, response)
154
319
  interval = @retry_after_handler.retry_after_interval(request, response, retries)
155
320
  retries += 1
156
321
  if interval
322
+ if http.started?
323
+ Puppet.debug("Closing connection for #{Puppet::Network::HTTP::Site.from_uri(request.uri)}")
324
+ http.finish
325
+ end
157
326
  Puppet.warning(_("Sleeping for %{interval} seconds before retrying the request") % { interval: interval })
158
327
  ::Kernel.sleep(interval)
159
328
  next
@@ -165,10 +334,12 @@ class Puppet::HTTP::Client
165
334
  response.drain
166
335
  end
167
336
 
168
- return response
337
+ done = true
169
338
  end
170
339
  end
171
340
  end
341
+
342
+ response
172
343
  end
173
344
 
174
345
  def expand_into_parameters(data)
@@ -219,13 +390,30 @@ class Puppet::HTTP::Client
219
390
  end
220
391
  end
221
392
 
222
- def default_ssl_context
223
- @default_ssl_context || Puppet.lookup(:ssl_context)
393
+ def resolve_ssl_context(ssl_context, include_system_store)
394
+ if ssl_context
395
+ raise Puppet::HTTP::HTTPError, "The ssl_context and include_system_store parameters are mutually exclusive" if include_system_store
396
+ ssl_context
397
+ elsif include_system_store
398
+ system_ssl_context
399
+ else
400
+ @default_ssl_context || Puppet.lookup(:ssl_context)
401
+ end
224
402
  end
225
403
 
226
- def apply_auth(request, user, password)
227
- if user && password
228
- request.basic_auth(user, password)
404
+ def system_ssl_context
405
+ return @default_system_ssl_context if @default_system_ssl_context
406
+
407
+ cert_provider = Puppet::X509::CertProvider.new
408
+ cacerts = cert_provider.load_cacerts || []
409
+
410
+ ssl = Puppet::SSL::SSLProvider.new
411
+ @default_system_ssl_context = ssl.create_system_context(cacerts: cacerts)
412
+ end
413
+
414
+ def apply_auth(request, basic_auth)
415
+ if basic_auth
416
+ request.basic_auth(basic_auth[:user], basic_auth[:password])
229
417
  end
230
418
  end
231
419
 
@@ -238,14 +426,16 @@ class Puppet::HTTP::Client
238
426
 
239
427
  server_list_setting = Puppet.settings.setting(:server_list)
240
428
  if server_list_setting.value && !server_list_setting.value.empty?
241
- services = [:puppet]
242
-
243
- # If we have not explicitly set :ca_server either on the command line or
244
- # in puppet.conf, we want to be able to try the servers defined by
245
- # :server_list when resolving the :ca service. Otherwise, :server_list
246
- # should only be used with the :puppet service.
247
- if !Puppet.settings.set_by_config?(:ca_server)
248
- services << :ca
429
+ # use server list to resolve all services
430
+ services = Puppet::HTTP::Service::SERVICE_NAMES.dup
431
+
432
+ # except if it's been explicitly set
433
+ if Puppet.settings.set_by_config?(:ca_server)
434
+ services.delete(:ca)
435
+ end
436
+
437
+ if Puppet.settings.set_by_config?(:report_server)
438
+ services.delete(:report)
249
439
  end
250
440
 
251
441
  resolvers << Puppet::HTTP::Resolver::ServerList.new(self, server_list_setting: server_list_setting, default_port: Puppet[:masterport], services: services)