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
@@ -1,18 +1,62 @@
1
1
  require 'puppet/file_serving/metadata'
2
2
 
3
+ #
4
+ # @api private
5
+ #
6
+ # The FileServer service is used to retrieve file metadata and content
7
+ #
3
8
  class Puppet::HTTP::Service::FileServer < Puppet::HTTP::Service
9
+ # @api private
10
+ # @return [String] Default API for the FileServer service
4
11
  API = '/puppet/v3'.freeze
12
+
13
+ # @api private
14
+ # @return [RegEx] RegEx used to determine if a path contains a leading slash
5
15
  PATH_REGEX = /^\//
6
16
 
7
- def initialize(client, server, port)
17
+ #
18
+ # @api private
19
+ #
20
+ # @param [Puppet::HTTP::Client] client
21
+ # @param [Puppet::HTTP::Session] session
22
+ # @param [String] server (Puppet[:ca_server]) If an explicit server is given,
23
+ # create a service using that server. If server is nil, the default value
24
+ # is used to create the service.
25
+ # @param [Integer] port (Puppet[:ca_port]) If an explicit port is given, create
26
+ # a service using that port. If port is nil, the default value is used to
27
+ # create the service.
28
+ #
29
+ def initialize(client, session, server, port)
8
30
  url = build_url(API, server || Puppet[:server], port || Puppet[:masterport])
9
- super(client, url)
31
+ super(client, session, url)
10
32
  end
11
33
 
12
- def get_file_metadata(path:, environment:, links: :manage, checksum_type: Puppet[:digest_algorithm], source_permissions: :ignore, ssl_context: nil)
34
+ #
35
+ # @api private
36
+ #
37
+ # Submit a GET request to the server to retrieve the metadata for a specified
38
+ # file
39
+ #
40
+ # @param [String] path path to the file to retrieve data from
41
+ # @param [String] environment the name of the environment we are operating in
42
+ # @param [Symbol] links Can be one of either `:follow` or `:manage`, defines
43
+ # how links are handled.
44
+ # @param [String] checksum_type The digest algorithm used to verify the file.
45
+ # Currently if fips is enabled, this defaults to `sha256`. Otherwise, it
46
+ # defaults to `md5`.
47
+ # @param [Symbol] source_permissions Can be one of `:use`, `:use_when_creating`,
48
+ # or `:ignore`. This parameter tells the server if it should include the
49
+ # file permissions in the response. If set to `:ignore`, the server will
50
+ # return default permissions.
51
+ #
52
+ # @return [Array<Puppet::HTTP::Response, Puppet::FileServing::Metadata>] An
53
+ # array with the request response and the deserialized metadata for the
54
+ # file returned from the server
55
+ #
56
+ def get_file_metadata(path:, environment:, links: :manage, checksum_type: Puppet[:digest_algorithm], source_permissions: :ignore)
13
57
  validate_path(path)
14
58
 
15
- headers = add_puppet_headers({ 'Accept' => get_mime_types(Puppet::FileServing::Metadata).join(', ') })
59
+ headers = add_puppet_headers('Accept' => get_mime_types(Puppet::FileServing::Metadata).join(', '))
16
60
 
17
61
  response = @client.get(
18
62
  with_base_url("/file_metadata#{path}"),
@@ -22,19 +66,50 @@ class Puppet::HTTP::Service::FileServer < Puppet::HTTP::Service
22
66
  checksum_type: checksum_type,
23
67
  source_permissions: source_permissions,
24
68
  environment: environment
25
- },
26
- ssl_context: ssl_context
69
+ }
27
70
  )
28
71
 
29
- return deserialize(response, Puppet::FileServing::Metadata) if response.success?
72
+ process_response(response)
30
73
 
31
- raise Puppet::HTTP::ResponseError.new(response)
74
+ [response, deserialize(response, Puppet::FileServing::Metadata)]
32
75
  end
33
76
 
34
- def get_file_metadatas(path: nil, environment:, recurse: :false, recurselimit: nil, ignore: nil, links: :manage, checksum_type: Puppet[:digest_algorithm], source_permissions: :ignore, ssl_context: nil)
77
+ #
78
+ # @api private
79
+ #
80
+ # Submit a GET request to the server to retrieve the metadata for multiple files
81
+ #
82
+ # @param [String] path path to the file(s) to retrieve data from
83
+ # @param [String] environment the name of the environment we are operating in
84
+ # @param [Symbol] recurse Can be `:true`, `:false`, or `:remote`. Defines if
85
+ # we recursively return the contents of the directory. Used in conjunction
86
+ # with `:recurselimit`. See the reference documentation for the file type
87
+ # for more details.
88
+ # @param [Integer] recurselimit When `recurse` is set, `recurselimit` defines
89
+ # how far Puppet should descend into subdirectories. `0` is effectively the
90
+ # same as `recurse => false`, `1` will return files and directories directly
91
+ # inside the defined directory, `2` will return the direct content of the
92
+ # directory as well as the contents of the _first_ level of subdirectories.
93
+ # The pattern continues for each incremental value. See the reference
94
+ # documentation for the file type for more details.
95
+ # @param [Array<String>] ignore An optional array of files to ignore, ie `['CVS', '.git', '.hg']`
96
+ # @param [Symbol] links Can be one of either `:follow` or `:manage`, defines
97
+ # how links are handled.
98
+ # @param [String] checksum_type The digest algorithm used to verify the file.
99
+ # Currently if fips is enabled, this defaults to `sha256`. Otherwise, it's `md5`.
100
+ # @param [Symbol] source_permissions Can be one of `:use`, `:use_when_creating`,
101
+ # or `:ignore`. This parameter tells the server if it should include the
102
+ # file permissions in the report. If set to `:ignore`, the server will return
103
+ # default permissions.
104
+ #
105
+ # @return [Array<Puppet::HTTP::Response, Array<Puppet::FileServing::Metadata>>]
106
+ # An array with the request response and an array of the deserialized
107
+ # metadata for each file returned from the server
108
+ #
109
+ def get_file_metadatas(path: nil, environment:, recurse: :false, recurselimit: nil, ignore: nil, links: :manage, checksum_type: Puppet[:digest_algorithm], source_permissions: :ignore)
35
110
  validate_path(path)
36
111
 
37
- headers = add_puppet_headers({ 'Accept' => get_mime_types(Puppet::FileServing::Metadata).join(', ') })
112
+ headers = add_puppet_headers('Accept' => get_mime_types(Puppet::FileServing::Metadata).join(', '))
38
113
 
39
114
  response = @client.get(
40
115
  with_base_url("/file_metadatas#{path}"),
@@ -47,36 +122,82 @@ class Puppet::HTTP::Service::FileServer < Puppet::HTTP::Service
47
122
  checksum_type: checksum_type,
48
123
  source_permissions: source_permissions,
49
124
  environment: environment,
50
- },
51
- ssl_context: ssl_context
125
+ }
52
126
  )
53
127
 
54
- return deserialize_multiple(response, Puppet::FileServing::Metadata) if response.success?
128
+ process_response(response)
55
129
 
56
- raise Puppet::HTTP::ResponseError.new(response)
130
+ [response, deserialize_multiple(response, Puppet::FileServing::Metadata)]
57
131
  end
58
132
 
59
- def get_file_content(path:, environment:, ssl_context: nil, &block)
133
+ #
134
+ # @api private
135
+ #
136
+ # Submit a GET request to the server to retrieve content of a file
137
+ #
138
+ # @param [String] path path to the file to retrieve data from
139
+ # @param [String] environment the name of the environment we are operating in
140
+ #
141
+ # @yield [Sting] Yields the body of the response returned from the server
142
+ #
143
+ # @return [Puppet::HTTP::Response] The request response
144
+ #
145
+ def get_file_content(path:, environment:, &block)
60
146
  validate_path(path)
61
147
 
62
- headers = add_puppet_headers({'Accept' => 'application/octet-stream' })
148
+ headers = add_puppet_headers('Accept' => 'application/octet-stream')
63
149
  response = @client.get(
64
150
  with_base_url("/file_content#{path}"),
65
151
  headers: headers,
66
152
  params: {
67
153
  environment: environment
68
- },
69
- ssl_context: ssl_context
154
+ }
70
155
  ) do |res|
71
156
  if res.success?
72
157
  res.read_body(&block)
73
158
  end
74
159
  end
75
160
 
76
- return nil if response.success?
161
+ process_response(response)
77
162
 
78
- raise Puppet::HTTP::ResponseError.new(response)
163
+ response
79
164
  end
165
+
166
+ #
167
+ # @api private
168
+ #
169
+ # Submit a GET request to
170
+ #
171
+ # @param [String] path path to the file to retrieve data from
172
+ # @param [String] environment the name of the environment we are operating in
173
+ # @param [String] code_id Defines the version of the resource to return
174
+ #
175
+ # @yield [String] Yields the body of the response returned
176
+ #
177
+ # @return [Puppet::HTTP::Response] The request response
178
+ #
179
+ def get_static_file_content(path:, environment:, code_id:, &block)
180
+ validate_path(path)
181
+
182
+ headers = add_puppet_headers('Accept' => 'application/octet-stream')
183
+ response = @client.get(
184
+ with_base_url("/static_file_content#{path}"),
185
+ headers: headers,
186
+ params: {
187
+ environment: environment,
188
+ code_id: code_id,
189
+ }
190
+ ) do |res|
191
+ if res.success?
192
+ res.read_body(&block)
193
+ end
194
+ end
195
+
196
+ process_response(response)
197
+
198
+ response
199
+ end
200
+
80
201
  private
81
202
 
82
203
  def validate_path(path)
@@ -1,36 +1,66 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # The Report service is used to submit run reports to the report server
5
+ #
1
6
  class Puppet::HTTP::Service::Report < Puppet::HTTP::Service
2
- API = '/puppet/v3'.freeze
3
7
 
4
- # puppet major version where JSON is enabled by default
5
- MAJOR_VERSION_JSON_DEFAULT = 5
8
+ # @api private
9
+ # @return [String] Default API for the report service
10
+ API = '/puppet/v3'.freeze
6
11
 
7
- def initialize(client, server, port)
12
+ #
13
+ # @api private
14
+ #
15
+ # @param [Puppet::HTTP::Client] client
16
+ # @param [Puppet::HTTP::Session] session
17
+ # @param [String] server (Puppet[:ca_server]) If an explicit server is given,
18
+ # create a service using that server. If server is nil, the default value
19
+ # is used to create the service.
20
+ # @param [Integer] port (Puppet[:ca_port]) If an explicit port is given, create
21
+ # a service using that port. If port is nil, the default value is used to
22
+ # create the service.
23
+ #
24
+ def initialize(client, session, server, port)
8
25
  url = build_url(API, server || Puppet[:report_server], port || Puppet[:report_port])
9
- super(client, url)
26
+ super(client, session, url)
10
27
  end
11
28
 
12
- def put_report(name, report, environment:, ssl_context: nil)
29
+ #
30
+ # @api private
31
+ #
32
+ # Submit a report to the report server
33
+ #
34
+ # @param [String] name the name of the report being submitted
35
+ # @param [Puppet::Transaction::Report] report run report to be submitted
36
+ # @param [String] environment name of the agent environment
37
+ #
38
+ # @return [Puppet::HTTP::Response] response returned by the server
39
+ #
40
+ def put_report(name, report, environment:)
13
41
  formatter = Puppet::Network::FormatHandler.format_for(Puppet[:preferred_serialization_format])
14
- headers = add_puppet_headers('Accept' => get_mime_types(Puppet::Transaction::Report).join(', '))
42
+ headers = add_puppet_headers(
43
+ 'Accept' => get_mime_types(Puppet::Transaction::Report).join(', '),
44
+ 'Content-Type' => formatter.mime
45
+ )
15
46
 
16
47
  response = @client.put(
17
48
  with_base_url("/report/#{name}"),
49
+ serialize(formatter, report),
18
50
  headers: headers,
19
51
  params: { environment: environment },
20
- content_type: formatter.mime,
21
- body: serialize(formatter, report),
22
- ssl_context: ssl_context
23
52
  )
24
53
 
25
- return response.body.to_s if response.success?
54
+ # override parent's process_response handling
55
+ @session.process_response(response)
26
56
 
27
- server_version = response[Puppet::Network::HTTP::HEADER_PUPPET_VERSION]
28
- if server_version && SemanticPuppet::Version.parse(server_version).major < MAJOR_VERSION_JSON_DEFAULT &&
29
- Puppet[:preferred_serialization_format] != 'pson'
57
+ if response.success?
58
+ response
59
+ elsif !@session.supports?(:report, 'json') && Puppet[:preferred_serialization_format] != 'pson'
30
60
  #TRANSLATORS "pson", "preferred_serialization_format", and "puppetserver" should not be translated
31
- raise Puppet::HTTP::ProtocolError.new(_("To submit reports to a server running puppetserver %{server_version}, set preferred_serialization_format to pson") % { server_version: server_version })
61
+ raise Puppet::HTTP::ProtocolError.new(_("To submit reports to a server running puppetserver %{server_version}, set preferred_serialization_format to pson") % { server_version: response[Puppet::HTTP::HEADER_PUPPET_VERSION]})
62
+ else
63
+ raise Puppet::HTTP::ResponseError.new(response)
32
64
  end
33
-
34
- raise Puppet::HTTP::ResponseError.new(response)
35
65
  end
36
66
  end
@@ -1,17 +1,62 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # The session is the mechanism by which services may be connected to and accessed.
5
+ #
1
6
  class Puppet::HTTP::Session
7
+ # capabilities for a site
8
+ CAP_LOCALES = 'locales'.freeze
9
+ CAP_JSON = 'json'.freeze
10
+
11
+ # puppet version where locales mount was added
12
+ SUPPORTED_LOCALES_MOUNT_AGENT_VERSION = Gem::Version.new("5.3.4")
13
+
14
+ # puppet version where JSON was enabled by default
15
+ SUPPORTED_JSON_DEFAULT = Gem::Version.new("5.0.0")
16
+
17
+ #
18
+ # @api private
19
+ #
20
+ # Create a new HTTP session. The session is the mechanism by which services
21
+ # may be connected to and accessed.
22
+ #
23
+ # @param [Puppet::HTTP::Client] client the container for this session
24
+ # @param [Array<Puppet::HTTP::Resolver>] resolvers array of resolver strategies
25
+ # to implement.
26
+ #
2
27
  def initialize(client, resolvers)
3
28
  @client = client
4
29
  @resolvers = resolvers
5
30
  @resolved_services = {}
6
- @resolution_exceptions = []
31
+ @server_versions = {}
7
32
  end
8
33
 
34
+ #
35
+ # @api private
36
+ #
37
+ # If an explicit server and port are specified on the command line or
38
+ # configuration file, this method always returns a Service with that host and
39
+ # port. Otherwise, we walk the list of resolvers in priority order:
40
+ # - DNS SRV
41
+ # - Server List
42
+ # - Puppet server/port settings
43
+ # If a given resolver fails to connect, it tries the next available resolver
44
+ # until a successful connection is found and returned. The successful service
45
+ # is cached and returned if `route_to` is called again.
46
+ #
47
+ # @param [Symbol] name the service to resolve
48
+ # @param [URI] url (nil) optional explicit url to use, if it is already known
49
+ # @param [Puppet::SSL::SSLContext] ssl_context ssl_context ssl context to be
50
+ # used for connections
51
+ #
52
+ # @return [Puppet::HTTP::Service] the resolved service
53
+ #
9
54
  def route_to(name, url: nil, ssl_context: nil)
10
55
  raise ArgumentError, "Unknown service #{name}" unless Puppet::HTTP::Service.valid_name?(name)
11
56
 
12
57
  # short circuit if explicit URL host & port given
13
58
  if url && url.host != nil && !url.host.empty?
14
- service = Puppet::HTTP::Service.create_service(@client, name, url.host, url.port)
59
+ service = Puppet::HTTP::Service.create_service(@client, self, name, url.host, url.port)
15
60
  service.connect(ssl_context: ssl_context)
16
61
  return service
17
62
  end
@@ -19,11 +64,12 @@ class Puppet::HTTP::Session
19
64
  cached = @resolved_services[name]
20
65
  return cached if cached
21
66
 
22
- @resolution_exceptions = []
67
+ resolution_exceptions = []
68
+ error_handler = proc { |e| resolution_exceptions << e }
23
69
 
24
70
  @resolvers.each do |resolver|
25
71
  Puppet.debug("Resolving service '#{name}' using #{resolver.class}")
26
- service = resolver.resolve(self, name, ssl_context: ssl_context)
72
+ service = resolver.resolve(self, name, ssl_context: ssl_context, error_handler: error_handler)
27
73
  if service
28
74
  @resolved_services[name] = service
29
75
  Puppet.debug("Resolved service '#{name}' to #{service.url}")
@@ -31,11 +77,54 @@ class Puppet::HTTP::Session
31
77
  end
32
78
  end
33
79
 
34
- @resolution_exceptions.each { |e| Puppet.log_exception(e) }
80
+ resolution_exceptions.each { |e| Puppet.log_exception(e) }
35
81
  raise Puppet::HTTP::RouteError, "No more routes to #{name}"
36
82
  end
37
83
 
38
- def add_exception(exception)
39
- @resolution_exceptions << exception
84
+ #
85
+ # @api private
86
+ #
87
+ # Collect per-site server versions. This will allow us to modify future
88
+ # requests based on the version of puppetserver we are talking to.
89
+ #
90
+ # @param [Puppet::HTTP::Response] response the request response containing headers
91
+ #
92
+ def process_response(response)
93
+ version = response[Puppet::HTTP::HEADER_PUPPET_VERSION]
94
+ if version
95
+ site = Puppet::Network::HTTP::Site.from_uri(response.url)
96
+ @server_versions[site] = version
97
+ end
98
+ end
99
+
100
+ #
101
+ # @api private
102
+ #
103
+ # Determine if a session supports a capability. Depending on the server version
104
+ # we are talking to, we know certain features are available or not. These
105
+ # specifications are defined here so we can modify our requests appropriately.
106
+ #
107
+ # @param [Symbol] name name of the service to check
108
+ # @param [String] capability the capability, ie `locales` or `json`
109
+ #
110
+ # @return [Boolean]
111
+ #
112
+ def supports?(name, capability)
113
+ raise ArgumentError, "Unknown service #{name}" unless Puppet::HTTP::Service.valid_name?(name)
114
+
115
+ service = @resolved_services[name]
116
+ return false unless service
117
+
118
+ site = Puppet::Network::HTTP::Site.from_uri(service.url)
119
+ server_version = @server_versions[site]
120
+
121
+ case capability
122
+ when CAP_LOCALES
123
+ !server_version.nil? && Gem::Version.new(server_version) >= SUPPORTED_LOCALES_MOUNT_AGENT_VERSION
124
+ when CAP_JSON
125
+ server_version.nil? || Gem::Version.new(server_version) >= SUPPORTED_JSON_DEFAULT
126
+ else
127
+ false
128
+ end
40
129
  end
41
130
  end
@@ -46,7 +46,7 @@ module Puppet::Indirector
46
46
 
47
47
  # instantiate the actual Terminus for that type and this name (:ldap, w/ args :node)
48
48
  # & hook the instantiated Terminus into this class (Node: @indirection = terminus)
49
- @indirection = Puppet::Indirector::Indirection.new(self, indirection, options)
49
+ @indirection = Puppet::Indirector::Indirection.new(self, indirection, **options)
50
50
  end
51
51
 
52
52
  module ClassMethods
@@ -3,4 +3,38 @@ require 'puppet/indirector/rest'
3
3
 
4
4
  class Puppet::Resource::Catalog::Rest < Puppet::Indirector::REST
5
5
  desc "Find resource catalogs over HTTP via REST."
6
+
7
+ def find(request)
8
+ return super unless use_http_client?
9
+
10
+ checksum_type = if request.options[:checksum_type]
11
+ request.options[:checksum_type].split('.')
12
+ else
13
+ Puppet[:supported_checksum_types]
14
+ end
15
+
16
+ session = Puppet.lookup(:http_session)
17
+ api = session.route_to(:puppet)
18
+ _, catalog = api.post_catalog(
19
+ request.key,
20
+ facts: request.options[:facts_for_catalog],
21
+ environment: request.environment.to_s,
22
+ configured_environment: request.options[:configured_environment],
23
+ transaction_uuid: request.options[:transaction_uuid],
24
+ job_uuid: request.options[:job_id],
25
+ static_catalog: request.options[:static_catalog],
26
+ checksum_type: checksum_type
27
+ )
28
+ catalog
29
+ rescue Puppet::HTTP::ResponseError => e
30
+ if e.response.code == 404
31
+ return nil unless request.options[:fail_on_404]
32
+
33
+ _, body = parse_response(e.response.nethttp)
34
+ msg = _("Find %{uri} resulted in 404 with the message: %{body}") % { uri: elide(e.response.url.path, 100), body: body }
35
+ raise Puppet::Error, msg
36
+ else
37
+ raise convert_to_http_error(e.response.nethttp)
38
+ end
39
+ end
6
40
  end