puppet 6.11.1 → 6.16.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (395) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +3 -8
  3. data/CONTRIBUTING.md +7 -13
  4. data/Gemfile +1 -0
  5. data/Gemfile.lock +39 -36
  6. data/README.md +17 -24
  7. data/ext/build_defaults.yaml +1 -0
  8. data/ext/project_data.yaml +1 -1
  9. data/ext/windows/service/daemon.rb +25 -20
  10. data/lib/puppet.rb +52 -13
  11. data/lib/puppet/agent.rb +20 -14
  12. data/lib/puppet/application/agent.rb +12 -14
  13. data/lib/puppet/application/describe.rb +7 -5
  14. data/lib/puppet/application/device.rb +2 -2
  15. data/lib/puppet/application/filebucket.rb +19 -15
  16. data/lib/puppet/application/plugin.rb +1 -0
  17. data/lib/puppet/application/resource.rb +1 -1
  18. data/lib/puppet/application/ssl.rb +4 -4
  19. data/lib/puppet/concurrent.rb +2 -0
  20. data/lib/puppet/concurrent/lock.rb +16 -0
  21. data/lib/puppet/concurrent/synchronized.rb +15 -0
  22. data/lib/puppet/concurrent/thread_local_singleton.rb +14 -0
  23. data/lib/puppet/configurer.rb +85 -83
  24. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  25. data/lib/puppet/context/trusted_information.rb +14 -8
  26. data/lib/puppet/daemon.rb +13 -27
  27. data/lib/puppet/defaults.rb +158 -40
  28. data/lib/puppet/environments.rb +30 -20
  29. data/lib/puppet/error.rb +9 -1
  30. data/lib/puppet/face/facts.rb +8 -5
  31. data/lib/puppet/face/help.rb +29 -3
  32. data/lib/puppet/face/module/search.rb +5 -0
  33. data/lib/puppet/face/plugin.rb +2 -2
  34. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  35. data/lib/puppet/file_system/file_impl.rb +13 -9
  36. data/lib/puppet/file_system/memory_file.rb +6 -0
  37. data/lib/puppet/file_system/memory_impl.rb +13 -0
  38. data/lib/puppet/file_system/uniquefile.rb +4 -0
  39. data/lib/puppet/file_system/windows.rb +7 -10
  40. data/lib/puppet/forge.rb +3 -3
  41. data/lib/puppet/forge/errors.rb +2 -2
  42. data/lib/puppet/forge/repository.rb +31 -86
  43. data/lib/puppet/functions/call.rb +1 -1
  44. data/lib/puppet/functions/camelcase.rb +2 -2
  45. data/lib/puppet/functions/epp.rb +4 -4
  46. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  47. data/lib/puppet/functions/filter.rb +1 -0
  48. data/lib/puppet/functions/find_file.rb +9 -9
  49. data/lib/puppet/functions/find_template.rb +63 -0
  50. data/lib/puppet/functions/inline_epp.rb +5 -5
  51. data/lib/puppet/functions/reduce.rb +2 -4
  52. data/lib/puppet/http.rb +7 -0
  53. data/lib/puppet/http/client.rb +341 -54
  54. data/lib/puppet/http/errors.rb +2 -0
  55. data/lib/puppet/http/external_client.rb +90 -0
  56. data/lib/puppet/http/redirector.rb +34 -0
  57. data/lib/puppet/http/resolver.rb +57 -1
  58. data/lib/puppet/http/resolver/server_list.rb +98 -0
  59. data/lib/puppet/http/resolver/settings.rb +23 -2
  60. data/lib/puppet/http/resolver/srv.rb +36 -4
  61. data/lib/puppet/http/response.rb +68 -1
  62. data/lib/puppet/http/retry_after_handler.rb +39 -0
  63. data/lib/puppet/http/service.rb +179 -3
  64. data/lib/puppet/http/service/ca.rb +84 -21
  65. data/lib/puppet/http/service/compiler.rb +319 -0
  66. data/lib/puppet/http/service/file_server.rb +206 -0
  67. data/lib/puppet/http/service/report.rb +66 -0
  68. data/lib/puppet/http/session.rb +106 -31
  69. data/lib/puppet/indirector/catalog/compiler.rb +10 -0
  70. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  71. data/lib/puppet/indirector/facts/rest.rb +42 -0
  72. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  73. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  74. data/lib/puppet/indirector/file_content/http.rb +5 -0
  75. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  76. data/lib/puppet/indirector/file_metadata/http.rb +4 -4
  77. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  78. data/lib/puppet/indirector/json.rb +1 -1
  79. data/lib/puppet/indirector/msgpack.rb +1 -1
  80. data/lib/puppet/indirector/node/rest.rb +24 -0
  81. data/lib/puppet/indirector/report/rest.rb +19 -0
  82. data/lib/puppet/indirector/report/yaml.rb +23 -0
  83. data/lib/puppet/indirector/rest.rb +12 -0
  84. data/lib/puppet/indirector/status/rest.rb +18 -0
  85. data/lib/puppet/loaders.rb +6 -0
  86. data/lib/puppet/metatype/manager.rb +80 -80
  87. data/lib/puppet/network/http/base_pool.rb +19 -1
  88. data/lib/puppet/network/http/compression.rb +7 -0
  89. data/lib/puppet/network/http/connection.rb +6 -0
  90. data/lib/puppet/network/http/connection_adapter.rb +182 -0
  91. data/lib/puppet/network/http/nocache_pool.rb +2 -0
  92. data/lib/puppet/network/http/pool.rb +13 -6
  93. data/lib/puppet/network/http_pool.rb +2 -1
  94. data/lib/puppet/node/environment.rb +24 -8
  95. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  96. data/lib/puppet/pal/pal_impl.rb +9 -29
  97. data/lib/puppet/parser/ast/pops_bridge.rb +6 -11
  98. data/lib/puppet/parser/compiler.rb +42 -32
  99. data/lib/puppet/parser/functions.rb +18 -13
  100. data/lib/puppet/parser/functions/epp.rb +3 -3
  101. data/lib/puppet/parser/functions/filter.rb +1 -0
  102. data/lib/puppet/parser/functions/inline_epp.rb +5 -5
  103. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
  105. data/lib/puppet/pops/evaluator/runtime3_support.rb +1 -1
  106. data/lib/puppet/pops/loader/puppet_plan_instantiator.rb +12 -3
  107. data/lib/puppet/pops/loaders.rb +7 -5
  108. data/lib/puppet/pops/lookup/invocation.rb +10 -3
  109. data/lib/puppet/pops/model/pn_transformer.rb +5 -9
  110. data/lib/puppet/pops/parser/evaluating_parser.rb +8 -11
  111. data/lib/puppet/pops/serialization/json_path.rb +3 -3
  112. data/lib/puppet/pops/time/timespan.rb +3 -5
  113. data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
  114. data/lib/puppet/pops/types/string_converter.rb +6 -9
  115. data/lib/puppet/pops/types/type_calculator.rb +30 -10
  116. data/lib/puppet/pops/types/type_formatter.rb +9 -11
  117. data/lib/puppet/pops/types/type_parser.rb +3 -3
  118. data/lib/puppet/pops/validation/checker4_0.rb +1 -1
  119. data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
  120. data/lib/puppet/provider/aix_object.rb +4 -2
  121. data/lib/puppet/provider/group/aix.rb +1 -0
  122. data/lib/puppet/provider/group/groupadd.rb +57 -24
  123. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  124. data/lib/puppet/provider/package/aix.rb +17 -2
  125. data/lib/puppet/provider/package/apt.rb +78 -4
  126. data/lib/puppet/provider/package/dnfmodule.rb +69 -15
  127. data/lib/puppet/provider/package/dpkg.rb +14 -7
  128. data/lib/puppet/provider/package/fink.rb +20 -3
  129. data/lib/puppet/provider/package/gem.rb +41 -7
  130. data/lib/puppet/provider/package/openbsd.rb +13 -1
  131. data/lib/puppet/provider/package/pacman.rb +2 -5
  132. data/lib/puppet/provider/package/pip.rb +143 -48
  133. data/lib/puppet/provider/package/pip3.rb +0 -2
  134. data/lib/puppet/provider/package/pkg.rb +18 -5
  135. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  136. data/lib/puppet/provider/package/pkgng.rb +16 -4
  137. data/lib/puppet/provider/package/portage.rb +5 -5
  138. data/lib/puppet/provider/package/puppet_gem.rb +6 -2
  139. data/lib/puppet/provider/package/rpm.rb +6 -213
  140. data/lib/puppet/provider/package/yum.rb +108 -24
  141. data/lib/puppet/provider/package/zypper.rb +59 -1
  142. data/lib/puppet/provider/package_targetable.rb +5 -4
  143. data/lib/puppet/provider/service/systemd.rb +23 -5
  144. data/lib/puppet/provider/user/aix.rb +1 -0
  145. data/lib/puppet/provider/user/directoryservice.rb +30 -5
  146. data/lib/puppet/provider/user/hpux.rb +1 -1
  147. data/lib/puppet/provider/user/useradd.rb +11 -8
  148. data/lib/puppet/reports/http.rb +13 -9
  149. data/lib/puppet/reports/store.rb +1 -1
  150. data/lib/puppet/resource/type_collection.rb +20 -16
  151. data/lib/puppet/runtime.rb +32 -1
  152. data/lib/puppet/settings.rb +4 -0
  153. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  154. data/lib/puppet/ssl.rb +1 -0
  155. data/lib/puppet/ssl/certificate.rb +2 -1
  156. data/lib/puppet/ssl/host.rb +4 -4
  157. data/lib/puppet/ssl/oids.rb +1 -0
  158. data/lib/puppet/ssl/ssl_provider.rb +20 -0
  159. data/lib/puppet/ssl/state_machine.rb +81 -35
  160. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  161. data/lib/puppet/test/test_helper.rb +7 -1
  162. data/lib/puppet/transaction.rb +33 -11
  163. data/lib/puppet/transaction/report.rb +2 -2
  164. data/lib/puppet/transaction/resource_harness.rb +1 -1
  165. data/lib/puppet/type.rb +7 -2
  166. data/lib/puppet/type/file.rb +13 -0
  167. data/lib/puppet/type/file/data_sync.rb +5 -1
  168. data/lib/puppet/type/file/source.rb +49 -58
  169. data/lib/puppet/type/group.rb +5 -4
  170. data/lib/puppet/type/package.rb +102 -10
  171. data/lib/puppet/type/service.rb +6 -8
  172. data/lib/puppet/type/user.rb +6 -30
  173. data/lib/puppet/util.rb +34 -11
  174. data/lib/puppet/util/at_fork.rb +1 -1
  175. data/lib/puppet/util/autoload.rb +4 -18
  176. data/lib/puppet/util/instance_loader.rb +14 -10
  177. data/lib/puppet/util/log/destinations.rb +2 -11
  178. data/lib/puppet/util/logging.rb +30 -18
  179. data/lib/puppet/util/package/version/debian.rb +175 -0
  180. data/lib/puppet/util/package/version/gem.rb +15 -0
  181. data/lib/puppet/util/package/version/pip.rb +167 -0
  182. data/lib/puppet/util/package/version/range.rb +53 -0
  183. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  184. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  185. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  186. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  187. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  188. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  189. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  190. data/lib/puppet/util/package/version/rpm.rb +73 -0
  191. data/lib/puppet/util/pidlock.rb +36 -10
  192. data/lib/puppet/util/platform.rb +5 -0
  193. data/lib/puppet/util/plist.rb +6 -0
  194. data/lib/puppet/util/rpm_compare.rb +193 -0
  195. data/lib/puppet/util/storage.rb +0 -1
  196. data/lib/puppet/util/windows/adsi.rb +50 -20
  197. data/lib/puppet/util/windows/process.rb +15 -14
  198. data/lib/puppet/util/windows/security.rb +1 -0
  199. data/lib/puppet/util/windows/sid.rb +3 -3
  200. data/lib/puppet/util/yaml.rb +1 -1
  201. data/lib/puppet/version.rb +1 -1
  202. data/lib/puppet/x509/cert_provider.rb +9 -5
  203. data/locales/puppet.pot +640 -521
  204. data/man/man5/puppet.conf.5 +88 -9
  205. data/man/man8/puppet-agent.8 +6 -6
  206. data/man/man8/puppet-apply.8 +1 -1
  207. data/man/man8/puppet-catalog.8 +1 -1
  208. data/man/man8/puppet-config.8 +1 -1
  209. data/man/man8/puppet-describe.8 +1 -1
  210. data/man/man8/puppet-device.8 +2 -2
  211. data/man/man8/puppet-doc.8 +1 -1
  212. data/man/man8/puppet-epp.8 +1 -1
  213. data/man/man8/puppet-facts.8 +1 -1
  214. data/man/man8/puppet-filebucket.8 +17 -2
  215. data/man/man8/puppet-generate.8 +1 -1
  216. data/man/man8/puppet-help.8 +6 -3
  217. data/man/man8/puppet-key.8 +1 -1
  218. data/man/man8/puppet-lookup.8 +1 -1
  219. data/man/man8/puppet-man.8 +1 -1
  220. data/man/man8/puppet-module.8 +4 -1
  221. data/man/man8/puppet-node.8 +1 -1
  222. data/man/man8/puppet-parser.8 +1 -1
  223. data/man/man8/puppet-plugin.8 +1 -1
  224. data/man/man8/puppet-report.8 +1 -1
  225. data/man/man8/puppet-resource.8 +1 -1
  226. data/man/man8/puppet-script.8 +1 -1
  227. data/man/man8/puppet-ssl.8 +2 -2
  228. data/man/man8/puppet-status.8 +1 -1
  229. data/man/man8/puppet.8 +2 -2
  230. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  231. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  232. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  233. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  234. data/spec/fixtures/unit/forge/bacula.json +76 -0
  235. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  236. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  237. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  238. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  239. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  240. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -102
  241. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +1 -106
  242. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -106
  243. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -102
  244. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -98
  245. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -102
  246. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +1 -102
  247. data/spec/integration/application/agent_spec.rb +394 -0
  248. data/spec/integration/application/apply_spec.rb +132 -3
  249. data/spec/integration/application/filebucket_spec.rb +190 -0
  250. data/spec/integration/application/plugin_spec.rb +73 -0
  251. data/spec/integration/configurer_spec.rb +26 -7
  252. data/spec/integration/http/client_spec.rb +154 -0
  253. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  254. data/spec/integration/indirector/report/yaml.rb +83 -0
  255. data/spec/integration/module_tool/forge_spec.rb +51 -0
  256. data/spec/integration/network/http_pool_spec.rb +76 -20
  257. data/spec/integration/node/environment_spec.rb +15 -0
  258. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  259. data/spec/lib/puppet/test_ca.rb +2 -2
  260. data/spec/lib/puppet_spec/https.rb +20 -9
  261. data/spec/lib/puppet_spec/puppetserver.rb +119 -0
  262. data/spec/shared_contexts/https.rb +29 -0
  263. data/spec/spec_helper.rb +6 -2
  264. data/spec/unit/agent_spec.rb +80 -26
  265. data/spec/unit/application/agent_spec.rb +9 -5
  266. data/spec/unit/application/apply_spec.rb +2 -12
  267. data/spec/unit/application/describe_spec.rb +88 -50
  268. data/spec/unit/application/device_spec.rb +2 -2
  269. data/spec/unit/application/filebucket_spec.rb +22 -2
  270. data/spec/unit/application/resource_spec.rb +2 -2
  271. data/spec/unit/concurrent/lock_spec.rb +29 -0
  272. data/spec/unit/configurer/fact_handler_spec.rb +0 -4
  273. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  274. data/spec/unit/configurer_spec.rb +400 -406
  275. data/spec/unit/context/trusted_information_spec.rb +17 -0
  276. data/spec/unit/daemon_spec.rb +5 -64
  277. data/spec/unit/defaults_spec.rb +38 -4
  278. data/spec/unit/environments_spec.rb +65 -28
  279. data/spec/unit/face/facts_spec.rb +24 -20
  280. data/spec/unit/face/module/search_spec.rb +17 -0
  281. data/spec/unit/face/plugin_spec.rb +12 -10
  282. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  283. data/spec/unit/file_system_spec.rb +26 -2
  284. data/spec/unit/forge/errors_spec.rb +1 -1
  285. data/spec/unit/forge/forge_spec.rb +12 -54
  286. data/spec/unit/forge/module_release_spec.rb +19 -6
  287. data/spec/unit/forge/repository_spec.rb +63 -157
  288. data/spec/unit/forge_spec.rb +46 -116
  289. data/spec/unit/functions/find_template_spec.rb +69 -0
  290. data/spec/unit/functions/lookup_spec.rb +13 -0
  291. data/spec/unit/http/client_spec.rb +395 -27
  292. data/spec/unit/http/external_client_spec.rb +201 -0
  293. data/spec/unit/http/resolver_spec.rb +81 -12
  294. data/spec/unit/http/response_spec.rb +69 -0
  295. data/spec/unit/http/service/ca_spec.rb +100 -7
  296. data/spec/unit/http/service/compiler_spec.rb +627 -0
  297. data/spec/unit/http/service/file_server_spec.rb +308 -0
  298. data/spec/unit/http/service/report_spec.rb +118 -0
  299. data/spec/unit/http/service_spec.rb +117 -4
  300. data/spec/unit/http/session_spec.rb +237 -19
  301. data/spec/unit/indirector/catalog/compiler_spec.rb +47 -29
  302. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  303. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  304. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  305. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  306. data/spec/unit/indirector/file_metadata/http_spec.rb +167 -0
  307. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  308. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  309. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  310. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  311. data/spec/unit/indirector/rest_spec.rb +13 -0
  312. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  313. data/spec/unit/network/http/connection_spec.rb +549 -176
  314. data/spec/unit/network/http/nocache_pool_spec.rb +25 -3
  315. data/spec/unit/network/http/pool_spec.rb +89 -11
  316. data/spec/unit/network/http_pool_spec.rb +63 -57
  317. data/spec/unit/network/http_spec.rb +1 -1
  318. data/spec/unit/node/environment_spec.rb +16 -0
  319. data/spec/unit/node/facts_spec.rb +2 -1
  320. data/spec/unit/node_spec.rb +7 -4
  321. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
  322. data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
  323. data/spec/unit/pops/validator/validator_spec.rb +7 -2
  324. data/spec/unit/provider/aix_object_spec.rb +16 -2
  325. data/spec/unit/provider/group/groupadd_spec.rb +181 -56
  326. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  327. data/spec/unit/provider/package/aix_spec.rb +29 -0
  328. data/spec/unit/provider/package/apt_spec.rb +43 -2
  329. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  330. data/spec/unit/provider/package/dnfmodule_spec.rb +76 -15
  331. data/spec/unit/provider/package/dpkg_spec.rb +28 -6
  332. data/spec/unit/provider/package/gem_spec.rb +40 -0
  333. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  334. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  335. data/spec/unit/provider/package/pip_spec.rb +68 -19
  336. data/spec/unit/provider/package/pkg_spec.rb +15 -1
  337. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  338. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  339. data/spec/unit/provider/package/portage_spec.rb +9 -4
  340. data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
  341. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  342. data/spec/unit/provider/package/yum_spec.rb +292 -0
  343. data/spec/unit/provider/package/zypper_spec.rb +84 -0
  344. data/spec/unit/provider/package_targetable_spec.rb +60 -0
  345. data/spec/unit/provider/service/init_spec.rb +1 -0
  346. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  347. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  348. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  349. data/spec/unit/provider/service/systemd_spec.rb +92 -12
  350. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  351. data/spec/unit/provider/user/hpux_spec.rb +2 -2
  352. data/spec/unit/provider/user/useradd_spec.rb +21 -8
  353. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  354. data/spec/unit/puppet_pal_2pec.rb +0 -26
  355. data/spec/unit/puppet_pal_catalog_spec.rb +46 -0
  356. data/spec/unit/puppet_spec.rb +47 -0
  357. data/spec/unit/reports/http_spec.rb +70 -52
  358. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  359. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  360. data/spec/unit/ssl/certificate_spec.rb +7 -0
  361. data/spec/unit/ssl/host_spec.rb +4 -2
  362. data/spec/unit/ssl/oids_spec.rb +1 -0
  363. data/spec/unit/ssl/ssl_provider_spec.rb +71 -0
  364. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  365. data/spec/unit/transaction/persistence_spec.rb +1 -10
  366. data/spec/unit/transaction/report_spec.rb +4 -0
  367. data/spec/unit/transaction_spec.rb +45 -1
  368. data/spec/unit/type/file/content_spec.rb +9 -3
  369. data/spec/unit/type/file/ensure_spec.rb +1 -2
  370. data/spec/unit/type/file/source_spec.rb +86 -35
  371. data/spec/unit/type/package_spec.rb +8 -0
  372. data/spec/unit/type/service_spec.rb +9 -8
  373. data/spec/unit/type/user_spec.rb +1 -2
  374. data/spec/unit/util/at_fork_spec.rb +3 -2
  375. data/spec/unit/util/autoload_spec.rb +2 -1
  376. data/spec/unit/util/log/destinations_spec.rb +1 -29
  377. data/spec/unit/util/log_spec.rb +0 -138
  378. data/spec/unit/util/logging_spec.rb +200 -0
  379. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  380. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  381. data/spec/unit/util/package/version/range_spec.rb +175 -0
  382. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  383. data/spec/unit/util/pidlock_spec.rb +112 -42
  384. data/spec/unit/util/plist_spec.rb +20 -0
  385. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  386. data/spec/unit/util/storage_spec.rb +1 -8
  387. data/spec/unit/util/windows/adsi_spec.rb +55 -4
  388. data/spec/unit/util/windows/sid_spec.rb +2 -2
  389. data/spec/unit/x509/cert_provider_spec.rb +24 -4
  390. data/tasks/generate_cert_fixtures.rake +15 -1
  391. data/tasks/manpages.rake +6 -35
  392. metadata +92 -12
  393. data/COMMITTERS.md +0 -244
  394. data/spec/integration/faces/plugin_spec.rb +0 -61
  395. data/spec/lib/puppet_spec/validators.rb +0 -37
@@ -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,18 +1,194 @@
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
 
4
- def initialize(client, url)
11
+ # @api private
12
+ # @return [Array<Symbol>] available services
13
+ SERVICE_NAMES = [:ca, :fileserver, :puppet, :report].freeze
14
+
15
+ # @api private
16
+ # @return [Array<Symbol>] format types that are unsupported
17
+ EXCLUDED_FORMATS = [:yaml, :b64_zlib_yaml, :dot].freeze
18
+
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)
39
+ case name
40
+ when :ca
41
+ Puppet::HTTP::Service::Ca.new(client, session, server, port)
42
+ when :fileserver
43
+ Puppet::HTTP::Service::FileServer.new(client, session, server, port)
44
+ when :puppet
45
+ ::Puppet::HTTP::Service::Compiler.new(client, session, server, port)
46
+ when :report
47
+ Puppet::HTTP::Service::Report.new(client, session, server, port)
48
+ else
49
+ raise ArgumentError, "Unknown service #{name}"
50
+ end
51
+ end
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
+ #
62
+ def self.valid_name?(name)
63
+ SERVICE_NAMES.include?(name)
64
+ end
65
+
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)
5
76
  @client = client
77
+ @session = session
6
78
  @url = url
7
79
  end
8
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
+ #
9
90
  def with_base_url(path)
10
91
  u = @url.dup
11
- u.path += path
92
+ u.path += Puppet::Util.uri_encode(path)
12
93
  u
13
94
  end
14
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
+ #
15
104
  def connect(ssl_context: nil)
16
- @client.connect(@url, ssl_context: ssl_context)
105
+ @client.connect(@url, options: {ssl_context: ssl_context})
106
+ end
107
+
108
+ protected
109
+
110
+ def add_puppet_headers(headers)
111
+ modified_headers = headers.dup
112
+
113
+ # Add 'X-Puppet-Profiling' to enable performance profiling if turned on
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
128
+ modified_headers
129
+ end
130
+
131
+ def build_url(api, server, port)
132
+ URI::HTTPS.build(host: server,
133
+ port: port,
134
+ path: api
135
+ ).freeze
136
+ end
137
+
138
+ def get_mime_types(model)
139
+ network_formats = model.supported_formats - EXCLUDED_FORMATS
140
+ network_formats.map { |f| model.get_format(f).mime }
141
+ end
142
+
143
+ def formatter_for_response(response)
144
+ header = response['Content-Type']
145
+ raise Puppet::HTTP::ProtocolError.new(_("No content type in http response; cannot parse")) unless header
146
+
147
+ header.gsub!(/\s*;.*$/,'') # strip any charset
148
+
149
+ formatter = Puppet::Network::FormatHandler.mime(header)
150
+ raise Puppet::HTTP::ProtocolError.new("Content-Type is unsupported") if EXCLUDED_FORMATS.include?(formatter.name)
151
+
152
+ formatter
153
+ end
154
+
155
+ def serialize(formatter, object)
156
+ begin
157
+ formatter.render(object)
158
+ rescue => err
159
+ raise Puppet::HTTP::SerializationError.new("Failed to serialize #{object.class} to #{formatter.name}: #{err.message}", err)
160
+ end
161
+ end
162
+
163
+ def serialize_multiple(formatter, object)
164
+ begin
165
+ formatter.render_multiple(object)
166
+ rescue => err
167
+ raise Puppet::HTTP::SerializationError.new("Failed to serialize multiple #{object.class} to #{formatter.name}: #{err.message}", err)
168
+ end
169
+ end
170
+
171
+ def deserialize(response, model)
172
+ formatter = formatter_for_response(response)
173
+ begin
174
+ formatter.intern(model, response.body.to_s)
175
+ rescue => err
176
+ raise Puppet::HTTP::SerializationError.new("Failed to deserialize #{model} from #{formatter.name}: #{err.message}", err)
177
+ end
178
+ end
179
+
180
+ def deserialize_multiple(response, model)
181
+ formatter = formatter_for_response(response)
182
+ begin
183
+ formatter.intern_multiple(model, response.body.to_s)
184
+ rescue => err
185
+ raise Puppet::HTTP::SerializationError.new("Failed to deserialize multiple #{model} from #{formatter.name}: #{err.message}", err)
186
+ end
187
+ end
188
+
189
+ def process_response(response)
190
+ @session.process_response(response)
191
+
192
+ raise Puppet::HTTP::ResponseError.new(response) unless response.success?
17
193
  end
18
194
  end
@@ -1,49 +1,112 @@
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
3
10
 
11
+ # @api private
12
+ # @return [String] default API for the ca service
13
+ API = '/puppet-ca/v1'.freeze
14
+
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)
28
+ url = build_url(API, server || Puppet[:ca_server], port || Puppet[:ca_port])
29
+ super(client, session, url)
30
+ end
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
+ #
4
43
  def get_certificate(name, ssl_context: nil)
5
44
  response = @client.get(
6
45
  with_base_url("/certificate/#{name}"),
7
- headers: HEADERS,
8
- ssl_context: ssl_context
46
+ headers: add_puppet_headers(HEADERS),
47
+ options: {ssl_context: ssl_context}
9
48
  )
10
49
 
11
- return response.body.to_s if response.success?
50
+ process_response(response)
12
51
 
13
- raise Puppet::HTTP::ResponseError.new(response)
52
+ [response, response.body.to_s]
14
53
  end
15
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
+ #
16
68
  def get_certificate_revocation_list(if_modified_since: nil, ssl_context: nil)
17
- request_headers = if if_modified_since
18
- h = HEADERS.dup
19
- h['If-Modified-Since'] = if_modified_since.httpdate
20
- h
21
- else
22
- HEADERS
23
- end
69
+ headers = add_puppet_headers(HEADERS)
70
+ headers['If-Modified-Since'] = if_modified_since.httpdate if if_modified_since
24
71
 
25
72
  response = @client.get(
26
73
  with_base_url("/certificate_revocation_list/ca"),
27
- headers: request_headers,
28
- ssl_context: ssl_context
74
+ headers: headers,
75
+ options: {ssl_context: ssl_context}
29
76
  )
30
77
 
31
- return response.body.to_s if response.success?
78
+ process_response(response)
32
79
 
33
- raise Puppet::HTTP::ResponseError.new(response)
80
+ [response, response.body.to_s]
34
81
  end
35
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
+ #
36
95
  def put_certificate_request(name, csr, ssl_context: nil)
96
+ headers = add_puppet_headers(HEADERS)
97
+ headers['Content-Type'] = 'text/plain'
98
+
37
99
  response = @client.put(
38
100
  with_base_url("/certificate_request/#{name}"),
39
- headers: HEADERS,
40
- content_type: 'text/plain',
41
- body: csr.to_pem,
42
- ssl_context: ssl_context
101
+ csr.to_pem,
102
+ headers: headers,
103
+ options: {
104
+ ssl_context: ssl_context
105
+ }
43
106
  )
44
107
 
45
- return response.body.to_s if response.success?
108
+ process_response(response)
46
109
 
47
- raise Puppet::HTTP::ResponseError.new(response)
110
+ response
48
111
  end
49
112
  end
@@ -0,0 +1,319 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # The Compiler service is used to submit and retrieve data from the
5
+ # puppetserver.
6
+ #
7
+ class Puppet::HTTP::Service::Compiler < Puppet::HTTP::Service
8
+ # @api private
9
+ # @return [String] Default API for the Compiler service
10
+ API = '/puppet/v3'.freeze
11
+
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)
25
+ url = build_url(API, server || Puppet[:server], port || Puppet[:masterport])
26
+ super(client, session, url)
27
+ end
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
+ #
44
+ def get_node(name, environment:, configured_environment: nil, transaction_uuid: nil)
45
+ headers = add_puppet_headers('Accept' => get_mime_types(Puppet::Node).join(', '))
46
+
47
+ response = @client.get(
48
+ with_base_url("/node/#{name}"),
49
+ headers: headers,
50
+ params: {
51
+ environment: environment,
52
+ configured_environment: configured_environment || environment,
53
+ transaction_uuid: transaction_uuid,
54
+ }
55
+ )
56
+
57
+ process_response(response)
58
+
59
+ [response, deserialize(response, Puppet::Node)]
60
+ end
61
+
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])
89
+ if Puppet[:preferred_serialization_format] == "pson"
90
+ formatter = Puppet::Network::FormatHandler.format_for(:pson)
91
+ # must use 'pson' instead of 'text/pson'
92
+ facts_format = 'pson'
93
+ else
94
+ formatter = Puppet::Network::FormatHandler.format_for(:json)
95
+ facts_format = formatter.mime
96
+ end
97
+
98
+ facts_as_string = serialize(formatter, facts)
99
+
100
+ # query parameters are sent in the POST request body
101
+ body = {
102
+ facts_format: facts_format,
103
+ facts: Puppet::Util.uri_query_encode(facts_as_string),
104
+ environment: environment,
105
+ configured_environment: configured_environment || environment,
106
+ transaction_uuid: transaction_uuid,
107
+ job_uuid: job_uuid,
108
+ static_catalog: static_catalog,
109
+ checksum_type: checksum_type.join('.')
110
+ }.map do |key, value|
111
+ "#{key}=#{Puppet::Util.uri_query_encode(value.to_s)}"
112
+ end.join("&")
113
+
114
+ headers = add_puppet_headers(
115
+ 'Accept' => get_mime_types(Puppet::Resource::Catalog).join(', '),
116
+ 'Content-Type' => 'application/x-www-form-urlencoded'
117
+ )
118
+
119
+ response = @client.post(
120
+ with_base_url("/catalog/#{name}"),
121
+ body,
122
+ headers: headers,
123
+ # for legacy reasons we always send environment as a query parameter too
124
+ params: { environment: environment },
125
+ )
126
+
127
+ process_response(response)
128
+
129
+ [response, deserialize(response, Puppet::Resource::Catalog)]
130
+ end
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
+ #
169
+ def put_facts(name, environment:, facts:)
170
+ formatter = Puppet::Network::FormatHandler.format_for(Puppet[:preferred_serialization_format])
171
+
172
+ headers = add_puppet_headers(
173
+ 'Accept' => get_mime_types(Puppet::Node::Facts).join(', '),
174
+ 'Content-Type' => formatter.mime
175
+ )
176
+
177
+ response = @client.put(
178
+ with_base_url("/facts/#{name}"),
179
+ serialize(formatter, facts),
180
+ headers: headers,
181
+ params: { environment: environment },
182
+ )
183
+
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)
316
+
317
+ response
318
+ end
319
+ end