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,12 +1,37 @@
1
1
  require 'date'
2
2
  require 'time'
3
3
 
4
+ #
5
+ # @api private
6
+ #
7
+ # Parse information relating to responses containing a Retry-After headers
8
+ #
4
9
  class Puppet::HTTP::RetryAfterHandler
10
+ #
11
+ # @api private
12
+ #
13
+ # Create a handler to allow the system to sleep between HTTP requests
14
+ #
15
+ # @param [Integer] retry_limit number of retries allowed
16
+ # @param [Integer] max_sleep maximum sleep time allowed
17
+ #
5
18
  def initialize(retry_limit, max_sleep)
6
19
  @retry_limit = retry_limit
7
20
  @max_sleep = max_sleep
8
21
  end
9
22
 
23
+ #
24
+ # @api private
25
+ #
26
+ # Does the response from the server tell us to wait until we attempt the next
27
+ # retry?
28
+ #
29
+ # @param [Net::HTTP] request
30
+ # @param [Puppet::HTTP::Response] response
31
+ #
32
+ # @return [Boolean] Return true if the response code is 429 or 503, return
33
+ # false otherwise
34
+ #
10
35
  def retry_after?(request, response)
11
36
  case response.code
12
37
  when 429, 503
@@ -16,6 +41,20 @@ class Puppet::HTTP::RetryAfterHandler
16
41
  end
17
42
  end
18
43
 
44
+ #
45
+ # @api private
46
+ #
47
+ # The amount of time to wait before attempting a retry
48
+ #
49
+ # @param [Net::HTTP] request
50
+ # @param [Puppet::HTTP::Response] response
51
+ # @param [Integer] retries number of retries attempted so far
52
+ #
53
+ # @return [Integer] the amount of time to wait
54
+ #
55
+ # @raise [Puppet::HTTP::TooManyRetryAfters] raise if we have hit our retry
56
+ # limit
57
+ #
19
58
  def retry_after_interval(request, response, retries)
20
59
  raise Puppet::HTTP::TooManyRetryAfters.new(request.uri) if retries >= @retry_limit
21
60
 
@@ -1,48 +1,130 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # Represents a puppet web service
5
+ #
1
6
  class Puppet::HTTP::Service
7
+ # @api private
8
+ # @return [URI] the url associated with this service
2
9
  attr_reader :url
3
10
 
11
+ # @api private
12
+ # @return [Array<Symbol>] available services
4
13
  SERVICE_NAMES = [:ca, :fileserver, :puppet, :report].freeze
14
+
15
+ # @api private
16
+ # @return [Array<Symbol>] format types that are unsupported
5
17
  EXCLUDED_FORMATS = [:yaml, :b64_zlib_yaml, :dot].freeze
6
18
 
7
- def self.create_service(client, name, server = nil, port = nil)
19
+ #
20
+ # @api private
21
+ #
22
+ # Create a new web service, which contains the URL used to connect to the
23
+ # service. The four services implemented are `:ca`, `:fileserver`, `:puppet`,
24
+ # and `:report`.
25
+ #
26
+ # The `:ca` and `:report` services handle certs and reports, respectively. The
27
+ # `:fileserver` service handles puppet file metadata and content requests. And
28
+ # the default service, `:puppet`, handles nodes, facts, and catalogs.
29
+ #
30
+ # @param [Puppet::HTTP::Client] client the owner of the session
31
+ # @param [Puppet::HTTP::Session] session the owner of the service
32
+ # @param [Symbol] name the type of service to create
33
+ # @param [<Type>] server optional, the server to connect to
34
+ # @param [<Type>] port optional, the port to connect to
35
+ #
36
+ # @return [Puppet::HTTP::Service] an instance of the service type requested
37
+ #
38
+ def self.create_service(client, session, name, server = nil, port = nil)
8
39
  case name
9
40
  when :ca
10
- Puppet::HTTP::Service::Ca.new(client, server, port)
41
+ Puppet::HTTP::Service::Ca.new(client, session, server, port)
11
42
  when :fileserver
12
- Puppet::HTTP::Service::FileServer.new(client, server, port)
43
+ Puppet::HTTP::Service::FileServer.new(client, session, server, port)
13
44
  when :puppet
14
- ::Puppet::HTTP::Service::Compiler.new(client, server, port)
45
+ ::Puppet::HTTP::Service::Compiler.new(client, session, server, port)
15
46
  when :report
16
- Puppet::HTTP::Service::Report.new(client, server, port)
47
+ Puppet::HTTP::Service::Report.new(client, session, server, port)
17
48
  else
18
49
  raise ArgumentError, "Unknown service #{name}"
19
50
  end
20
51
  end
21
52
 
53
+ #
54
+ # @api private
55
+ #
56
+ # Check if the service named is included in the list of available services.
57
+ #
58
+ # @param [Symbol] name
59
+ #
60
+ # @return [Boolean]
61
+ #
22
62
  def self.valid_name?(name)
23
63
  SERVICE_NAMES.include?(name)
24
64
  end
25
65
 
26
- def initialize(client, url)
66
+ #
67
+ # @api private
68
+ #
69
+ # Create a new service
70
+ #
71
+ # @param [Puppet::HTTP::Client] client
72
+ # @param [Puppet::HTTP::Session] session
73
+ # @param [URI] url The url to connect to
74
+ #
75
+ def initialize(client, session, url)
27
76
  @client = client
77
+ @session = session
28
78
  @url = url
29
79
  end
30
80
 
81
+ #
82
+ # @api private
83
+ #
84
+ # Return the url with the given path encoded and appended
85
+ #
86
+ # @param [String] path the string to append to the base url
87
+ #
88
+ # @return [URI] the URI object containing the encoded path
89
+ #
31
90
  def with_base_url(path)
32
91
  u = @url.dup
33
92
  u.path += Puppet::Util.uri_encode(path)
34
93
  u
35
94
  end
36
95
 
96
+ #
97
+ # @api private
98
+ #
99
+ # Open a connection using the given ssl context
100
+ #
101
+ # @param [Puppet::SSL::SSLContext] ssl_context (nil) optional ssl context to
102
+ # connect with
103
+ #
37
104
  def connect(ssl_context: nil)
38
- @client.connect(@url, ssl_context: ssl_context)
105
+ @client.connect(@url, options: {ssl_context: ssl_context})
39
106
  end
40
107
 
41
108
  protected
42
109
 
43
110
  def add_puppet_headers(headers)
44
111
  modified_headers = headers.dup
112
+
113
+ # Add 'X-Puppet-Profiling' to enable performance profiling if turned on
45
114
  modified_headers['X-Puppet-Profiling'] = 'true' if Puppet[:profile]
115
+
116
+ # Add additional user-defined headers if they are defined
117
+ Puppet[:http_extra_headers].each do |name, value|
118
+ if modified_headers.keys.find { |key| key.casecmp(name) == 0 }
119
+ Puppet.warning(_('Ignoring extra header "%{name}" as it was previously set.') % { name: name })
120
+ else
121
+ if value.nil? || value.empty?
122
+ Puppet.warning(_('Ignoring extra header "%{name}" as it has no value.') % { name: name })
123
+ else
124
+ modified_headers[name] = value
125
+ end
126
+ end
127
+ end
46
128
  modified_headers
47
129
  end
48
130
 
@@ -54,11 +136,8 @@ class Puppet::HTTP::Service
54
136
  end
55
137
 
56
138
  def get_mime_types(model)
57
- unless @mime_types
58
- network_formats = model.supported_formats - EXCLUDED_FORMATS
59
- @mime_types = network_formats.map { |f| model.get_format(f).mime }
60
- end
61
- @mime_types
139
+ network_formats = model.supported_formats - EXCLUDED_FORMATS
140
+ network_formats.map { |f| model.get_format(f).mime }
62
141
  end
63
142
 
64
143
  def formatter_for_response(response)
@@ -106,4 +185,10 @@ class Puppet::HTTP::Service
106
185
  raise Puppet::HTTP::SerializationError.new("Failed to deserialize multiple #{model} from #{formatter.name}: #{err.message}", err)
107
186
  end
108
187
  end
188
+
189
+ def process_response(response)
190
+ @session.process_response(response)
191
+
192
+ raise Puppet::HTTP::ResponseError.new(response) unless response.success?
193
+ end
109
194
  end
@@ -1,24 +1,70 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # The Ca service is used to handle certificate requests
5
+ #
1
6
  class Puppet::HTTP::Service::Ca < Puppet::HTTP::Service
7
+ # @api private
8
+ # @return [Hash] default headers for the ca service
2
9
  HEADERS = { 'Accept' => 'text/plain' }.freeze
10
+
11
+ # @api private
12
+ # @return [String] default API for the ca service
3
13
  API = '/puppet-ca/v1'.freeze
4
14
 
5
- def initialize(client, server, port)
15
+ #
16
+ # @api private
17
+ #
18
+ # @param [Puppet::HTTP::Client] client
19
+ # @param [Puppet::HTTP::Session] session
20
+ # @param [String] server (Puppet[:ca_server]) If an explicit server is given,
21
+ # create a service using that server. If server is nil, the default value
22
+ # is used to create the service.
23
+ # @param [Integer] port (Puppet[:ca_port]) If an explicit port is given, create
24
+ # a service using that port. If port is nil, the default value is used to
25
+ # create the service.
26
+ #
27
+ def initialize(client, session, server, port)
6
28
  url = build_url(API, server || Puppet[:ca_server], port || Puppet[:ca_port])
7
- super(client, url)
29
+ super(client, session, url)
8
30
  end
9
31
 
32
+ #
33
+ # @api private
34
+ #
35
+ # Submit a GET request to retrieve the named certificate from the server
36
+ #
37
+ # @param [String] name name of the certificate to request
38
+ # @param [Puppet::SSL::SSLContext] ssl_context
39
+ #
40
+ # @return [Array<Puppet::HTTP::Response, String>] An array containing the
41
+ # request response and the stringified body of the request response
42
+ #
10
43
  def get_certificate(name, ssl_context: nil)
11
44
  response = @client.get(
12
45
  with_base_url("/certificate/#{name}"),
13
46
  headers: add_puppet_headers(HEADERS),
14
- ssl_context: ssl_context
47
+ options: {ssl_context: ssl_context}
15
48
  )
16
49
 
17
- return response.body.to_s if response.success?
50
+ process_response(response)
18
51
 
19
- raise Puppet::HTTP::ResponseError.new(response)
52
+ [response, response.body.to_s]
20
53
  end
21
54
 
55
+ #
56
+ # @api private
57
+ #
58
+ # Submit a GET request to retrieve the certificate revocation list from the
59
+ # server
60
+ #
61
+ # @param [Time] if_modified_since If not nil, only download the CRL if it has
62
+ # been modified since the specified time.
63
+ # @param [Puppet::SSL::SSLContext] ssl_context
64
+ #
65
+ # @return [Array<Puppet::HTTP::Response, String>] An array containing the
66
+ # request response and the stringified body of the request response
67
+ #
22
68
  def get_certificate_revocation_list(if_modified_since: nil, ssl_context: nil)
23
69
  headers = add_puppet_headers(HEADERS)
24
70
  headers['If-Modified-Since'] = if_modified_since.httpdate if if_modified_since
@@ -26,25 +72,41 @@ class Puppet::HTTP::Service::Ca < Puppet::HTTP::Service
26
72
  response = @client.get(
27
73
  with_base_url("/certificate_revocation_list/ca"),
28
74
  headers: headers,
29
- ssl_context: ssl_context
75
+ options: {ssl_context: ssl_context}
30
76
  )
31
77
 
32
- return response.body.to_s if response.success?
78
+ process_response(response)
33
79
 
34
- raise Puppet::HTTP::ResponseError.new(response)
80
+ [response, response.body.to_s]
35
81
  end
36
82
 
83
+ #
84
+ # @api private
85
+ #
86
+ # Submit a PUT request to send a certificate request to the server
87
+ #
88
+ # @param [String] name The name of the certificate request being sent
89
+ # @param [OpenSSL::X509::Request] csr Certificate request to send to the
90
+ # server
91
+ # @param [Puppet::SSL::SSLContext] ssl_context
92
+ #
93
+ # @return [Puppet::HTTP::Response] The request response
94
+ #
37
95
  def put_certificate_request(name, csr, ssl_context: nil)
96
+ headers = add_puppet_headers(HEADERS)
97
+ headers['Content-Type'] = 'text/plain'
98
+
38
99
  response = @client.put(
39
100
  with_base_url("/certificate_request/#{name}"),
40
- headers: add_puppet_headers(HEADERS),
41
- content_type: 'text/plain',
42
- body: csr.to_pem,
43
- ssl_context: ssl_context
101
+ csr.to_pem,
102
+ headers: headers,
103
+ options: {
104
+ ssl_context: ssl_context
105
+ }
44
106
  )
45
107
 
46
- return response.body.to_s if response.success?
108
+ process_response(response)
47
109
 
48
- raise Puppet::HTTP::ResponseError.new(response)
110
+ response
49
111
  end
50
112
  end
@@ -1,11 +1,46 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # The Compiler service is used to submit and retrieve data from the
5
+ # puppetserver.
6
+ #
1
7
  class Puppet::HTTP::Service::Compiler < Puppet::HTTP::Service
8
+ # @api private
9
+ # @return [String] Default API for the Compiler service
2
10
  API = '/puppet/v3'.freeze
3
11
 
4
- 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)
5
25
  url = build_url(API, server || Puppet[:server], port || Puppet[:masterport])
6
- super(client, url)
26
+ super(client, session, url)
7
27
  end
8
28
 
29
+ #
30
+ # @api private
31
+ #
32
+ # Submit a GET request to retrieve a node from the server
33
+ #
34
+ # @param [String] name The name of the node being requested
35
+ # @param [String] environment The name of the environment we are operating in
36
+ # @param [String] configured_environment Optional, the name of the configured
37
+ # environment. If unset, `environment` is used.
38
+ # @param [String] transaction_uuid An agent generated transaction uuid, used
39
+ # for connecting catalogs and reports.
40
+ #
41
+ # @return [Array<Puppet::HTTP::Response, Puppet::Node>] An array containing
42
+ # the request response and the deserialized requested node
43
+ #
9
44
  def get_node(name, environment:, configured_environment: nil, transaction_uuid: nil)
10
45
  headers = add_puppet_headers('Accept' => get_mime_types(Puppet::Node).join(', '))
11
46
 
@@ -16,15 +51,41 @@ class Puppet::HTTP::Service::Compiler < Puppet::HTTP::Service
16
51
  environment: environment,
17
52
  configured_environment: configured_environment || environment,
18
53
  transaction_uuid: transaction_uuid,
19
- },
54
+ }
20
55
  )
21
56
 
22
- return deserialize(response, Puppet::Node) if response.success?
57
+ process_response(response)
23
58
 
24
- raise Puppet::HTTP::ResponseError.new(response)
59
+ [response, deserialize(response, Puppet::Node)]
25
60
  end
26
61
 
27
- def get_catalog(name, facts:, environment:, configured_environment: nil, transaction_uuid: nil, job_uuid: nil, static_catalog: true, checksum_type: Puppet[:supported_checksum_types])
62
+ #
63
+ # @api private
64
+ #
65
+ # Submit a POST request to submit a catalog to the server
66
+ #
67
+ # @param [String] name The name of the catalog to be submitted
68
+ # @param [Puppet::Node::Facts] facts Facts for this catalog
69
+ # @param [String] environment The name of the environment we are operating in
70
+ # @param [String] configured_environment Optional, the name of the configured
71
+ # environment. If unset, `environment` is used.
72
+ # @param [String] transaction_uuid An agent generated transaction uuid, used
73
+ # for connecting catalogs and reports.
74
+ # @param [String] job_uuid A unique job identifier defined when the orchestrator
75
+ # starts a puppet run via pxp-agent. This is used to correlate catalogs and
76
+ # reports with the orchestrator job.
77
+ # @param [Boolean] static_catalog Indicates if the file metadata(s) are inlined
78
+ # in the catalog. This informs the agent if it needs to make a second request
79
+ # to retrieve metadata in addition to the initial catalog request.
80
+ # @param [Array<String>] checksum_type An array of accepted checksum type.
81
+ # Currently defaults to `["md5", "sha256", "sha384", "sha512", "sha224"]`,
82
+ # or `["sha256", "sha384", "sha512", "sha224"]` if fips is enabled.
83
+ #
84
+ # @return [Array<Puppet::HTTP::Response, Puppet::Resource::Catalog>] An array
85
+ # containing the request response and the deserialized catalog returned by
86
+ # the server
87
+ #
88
+ def post_catalog(name, facts:, environment:, configured_environment: nil, transaction_uuid: nil, job_uuid: nil, static_catalog: true, checksum_type: Puppet[:supported_checksum_types])
28
89
  if Puppet[:preferred_serialization_format] == "pson"
29
90
  formatter = Puppet::Network::FormatHandler.format_for(:pson)
30
91
  # must use 'pson' instead of 'text/pson'
@@ -50,37 +111,209 @@ class Puppet::HTTP::Service::Compiler < Puppet::HTTP::Service
50
111
  "#{key}=#{Puppet::Util.uri_query_encode(value.to_s)}"
51
112
  end.join("&")
52
113
 
53
- headers = add_puppet_headers('Accept' => get_mime_types(Puppet::Resource::Catalog).join(', '))
114
+ headers = add_puppet_headers(
115
+ 'Accept' => get_mime_types(Puppet::Resource::Catalog).join(', '),
116
+ 'Content-Type' => 'application/x-www-form-urlencoded'
117
+ )
54
118
 
55
119
  response = @client.post(
56
120
  with_base_url("/catalog/#{name}"),
121
+ body,
57
122
  headers: headers,
58
123
  # for legacy reasons we always send environment as a query parameter too
59
124
  params: { environment: environment },
60
- content_type: 'application/x-www-form-urlencoded',
61
- body: body,
62
125
  )
63
126
 
64
- return deserialize(response, Puppet::Resource::Catalog) if response.success?
127
+ process_response(response)
65
128
 
66
- raise Puppet::HTTP::ResponseError.new(response)
129
+ [response, deserialize(response, Puppet::Resource::Catalog)]
67
130
  end
68
131
 
132
+ #
133
+ # @api private
134
+ #
135
+ # Submit a GET request to retrieve the facts for the named node
136
+ #
137
+ # @param [String] name Name of the node to retrieve facts for
138
+ # @param [String] environment Name of the environment we are operating in
139
+ #
140
+ # @return [Array<Puppet::HTTP::Response, Puppet::Node::Facts>] An array
141
+ # containing the request response and the deserialized facts for the
142
+ # specified node
143
+ #
144
+ def get_facts(name, environment:)
145
+ headers = add_puppet_headers('Accept' => get_mime_types(Puppet::Node::Facts).join(', '))
146
+
147
+ response = @client.get(
148
+ with_base_url("/facts/#{name}"),
149
+ headers: headers,
150
+ params: { environment: environment }
151
+ )
152
+
153
+ process_response(response)
154
+
155
+ [response, deserialize(response, Puppet::Node::Facts)]
156
+ end
157
+
158
+ #
159
+ # @api private
160
+ #
161
+ # Submits a PUT request to submit facts for the node to the server
162
+ #
163
+ # @param [String] name Name of the node we are submitting facts for
164
+ # @param [String] environment Name of the environment we are operating in
165
+ # @param [Puppet::Node::Facts] facts Facts for the named node
166
+ #
167
+ # @return [Puppet::HTTP::Response] The request response
168
+ #
69
169
  def put_facts(name, environment:, facts:)
70
170
  formatter = Puppet::Network::FormatHandler.format_for(Puppet[:preferred_serialization_format])
71
171
 
72
- headers = add_puppet_headers('Accept' => get_mime_types(Puppet::Node::Facts).join(', '))
172
+ headers = add_puppet_headers(
173
+ 'Accept' => get_mime_types(Puppet::Node::Facts).join(', '),
174
+ 'Content-Type' => formatter.mime
175
+ )
73
176
 
74
177
  response = @client.put(
75
178
  with_base_url("/facts/#{name}"),
179
+ serialize(formatter, facts),
76
180
  headers: headers,
77
181
  params: { environment: environment },
78
- content_type: formatter.mime,
79
- body: serialize(formatter, facts),
80
182
  )
81
183
 
82
- return true if response.success?
184
+ process_response(response)
185
+
186
+ response
187
+ end
188
+
189
+ #
190
+ # @api private
191
+ #
192
+ # Submit a GET request to find the status of a compiler
193
+ #
194
+ # @param [String] name The name of the node that a status being requested for
195
+ #
196
+ # @return [Array<Puppet::HTTP::Response, Puppet::Status>] An array containing
197
+ # the request response and the deserialized status returned from the server
198
+ #
199
+ def get_status(name)
200
+ headers = add_puppet_headers('Accept' => get_mime_types(Puppet::Status).join(', '))
201
+
202
+ response = @client.get(
203
+ with_base_url("/status/#{name}"),
204
+ headers: headers,
205
+ params: {
206
+ # environment is required, but meaningless, default to production
207
+ environment: 'production'
208
+ },
209
+ )
210
+
211
+ process_response(response)
212
+
213
+ [response, deserialize(response, Puppet::Status)]
214
+ end
215
+
216
+ #
217
+ # @api private
218
+ #
219
+ # Submit a GET request to retrieve a file stored with filebucket
220
+ #
221
+ # @param [String] path The request path, formatted by Puppet::FileBucket::Dipper
222
+ # @param [String] environment Name of the environment we are operating in.
223
+ # This should not impact filebucket at all, but is included to be consistent
224
+ # with legacy code.
225
+ # @param [String] bucket_path
226
+ # @param [String] diff_with a checksum to diff against if we are comparing
227
+ # files that are both stored in the bucket
228
+ # @param [String] list_all
229
+ # @param [String] fromdate
230
+ # @param [String] todate
231
+ #
232
+ # @return [Array<Puppet::HTTP::Response, Puppet::FileBucket::File>] An array
233
+ # containing the request response and the deserialized file returned from
234
+ # the server.
235
+ #
236
+ def get_filebucket_file(path, environment:, bucket_path: nil, diff_with: nil, list_all: nil, fromdate: nil, todate: nil)
237
+ headers = add_puppet_headers('Accept' => 'application/octet-stream')
238
+
239
+ response = @client.get(
240
+ with_base_url("/file_bucket_file/#{path}"),
241
+ headers: headers,
242
+ params: {
243
+ environment: environment,
244
+ bucket_path: bucket_path,
245
+ diff_with: diff_with,
246
+ list_all: list_all,
247
+ fromdate: fromdate,
248
+ todate: todate
249
+ }
250
+ )
251
+
252
+ process_response(response)
253
+
254
+ [response, deserialize(response, Puppet::FileBucket::File)]
255
+ end
256
+
257
+ #
258
+ # @api private
259
+ #
260
+ # Submit a PUT request to store a file with filebucket
261
+ #
262
+ # @param [String] path The request path, formatted by Puppet::FileBucket::Dipper
263
+ # @param [String] body The contents of the file to be backed
264
+ # @param [String] environment Name of the environment we are operating in.
265
+ # This should not impact filebucket at all, but is included to be consistent
266
+ # with legacy code.
267
+ #
268
+ # @return [Puppet::HTTP::Response] The response request
269
+ #
270
+ def put_filebucket_file(path, body:, environment:)
271
+ headers = add_puppet_headers({
272
+ 'Accept' => 'application/octet-stream',
273
+ 'Content-Type' => 'application/octet-stream'
274
+ })
275
+
276
+ response = @client.put(
277
+ with_base_url("/file_bucket_file/#{path}"),
278
+ body,
279
+ headers: headers,
280
+ params: {
281
+ environment: environment
282
+ }
283
+ )
284
+
285
+ process_response(response)
286
+
287
+ response
288
+ end
289
+
290
+ #
291
+ # @api private
292
+ #
293
+ # Submit a HEAD request to check the status of a file stored with filebucket
294
+ #
295
+ # @param [String] path The request path, formatted by Puppet::FileBucket::Dipper
296
+ # @param [String] environment Name of the environment we are operating in.
297
+ # This should not impact filebucket at all, but is included to be consistent
298
+ # with legacy code.
299
+ # @param [String] bucket_path
300
+ #
301
+ # @return [Puppet::HTTP::Response] The request response
302
+ #
303
+ def head_filebucket_file(path, environment:, bucket_path: nil)
304
+ headers = add_puppet_headers('Accept' => 'application/octet-stream')
305
+
306
+ response = @client.head(
307
+ with_base_url("/file_bucket_file/#{path}"),
308
+ headers: headers,
309
+ params: {
310
+ environment: environment,
311
+ bucket_path: bucket_path
312
+ }
313
+ )
314
+
315
+ process_response(response)
83
316
 
84
- raise Puppet::HTTP::ResponseError.new(response)
317
+ response
85
318
  end
86
319
  end