puppet 6.12.0-x64-mingw32 → 6.17.0-x64-mingw32

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

Potentially problematic release.


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

Files changed (412) 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 +39 -36
  6. data/README.md +18 -25
  7. data/ext/project_data.yaml +1 -1
  8. data/ext/windows/service/daemon.rb +3 -3
  9. data/lib/puppet.rb +52 -13
  10. data/lib/puppet/agent.rb +20 -14
  11. data/lib/puppet/application/agent.rb +26 -17
  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/plugin.rb +1 -0
  16. data/lib/puppet/application/resource.rb +1 -1
  17. data/lib/puppet/application/ssl.rb +4 -4
  18. data/lib/puppet/configurer.rb +65 -69
  19. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  20. data/lib/puppet/confine.rb +1 -1
  21. data/lib/puppet/context/trusted_information.rb +14 -8
  22. data/lib/puppet/daemon.rb +13 -27
  23. data/lib/puppet/defaults.rb +154 -58
  24. data/lib/puppet/environments.rb +27 -20
  25. data/lib/puppet/face/facts.rb +8 -5
  26. data/lib/puppet/face/help.rb +29 -3
  27. data/lib/puppet/face/module/search.rb +5 -0
  28. data/lib/puppet/face/plugin.rb +2 -2
  29. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  30. data/lib/puppet/file_serving/metadata.rb +4 -1
  31. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  32. data/lib/puppet/file_system/file_impl.rb +14 -10
  33. data/lib/puppet/file_system/memory_file.rb +6 -0
  34. data/lib/puppet/file_system/memory_impl.rb +13 -0
  35. data/lib/puppet/file_system/uniquefile.rb +12 -16
  36. data/lib/puppet/file_system/windows.rb +7 -10
  37. data/lib/puppet/forge.rb +1 -1
  38. data/lib/puppet/forge/cache.rb +1 -1
  39. data/lib/puppet/forge/repository.rb +4 -7
  40. data/lib/puppet/functions/call.rb +1 -1
  41. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  42. data/lib/puppet/functions/filter.rb +1 -0
  43. data/lib/puppet/functions/reduce.rb +2 -4
  44. data/lib/puppet/http.rb +5 -0
  45. data/lib/puppet/http/client.rb +293 -73
  46. data/lib/puppet/http/errors.rb +2 -0
  47. data/lib/puppet/http/external_client.rb +90 -0
  48. data/lib/puppet/http/redirector.rb +43 -7
  49. data/lib/puppet/http/resolver.rb +46 -3
  50. data/lib/puppet/http/resolver/server_list.rb +76 -16
  51. data/lib/puppet/http/resolver/settings.rb +23 -3
  52. data/lib/puppet/http/resolver/srv.rb +29 -3
  53. data/lib/puppet/http/response.rb +87 -1
  54. data/lib/puppet/http/retry_after_handler.rb +39 -0
  55. data/lib/puppet/http/service.rb +151 -7
  56. data/lib/puppet/http/service/ca.rb +76 -14
  57. data/lib/puppet/http/service/compiler.rb +319 -0
  58. data/lib/puppet/http/service/file_server.rb +206 -0
  59. data/lib/puppet/http/service/report.rb +49 -23
  60. data/lib/puppet/http/session.rb +103 -7
  61. data/lib/puppet/indirector.rb +1 -1
  62. data/lib/puppet/indirector/catalog/compiler.rb +10 -0
  63. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  64. data/lib/puppet/indirector/facts/rest.rb +42 -0
  65. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  66. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  67. data/lib/puppet/indirector/file_content/http.rb +5 -0
  68. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  69. data/lib/puppet/indirector/file_metadata/http.rb +27 -8
  70. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  71. data/lib/puppet/indirector/json.rb +1 -1
  72. data/lib/puppet/indirector/msgpack.rb +1 -1
  73. data/lib/puppet/indirector/node/rest.rb +24 -0
  74. data/lib/puppet/indirector/report/rest.rb +19 -0
  75. data/lib/puppet/indirector/report/yaml.rb +23 -0
  76. data/lib/puppet/indirector/request.rb +1 -1
  77. data/lib/puppet/indirector/rest.rb +12 -0
  78. data/lib/puppet/indirector/status/rest.rb +18 -0
  79. data/lib/puppet/loaders.rb +6 -0
  80. data/lib/puppet/metatype/manager.rb +80 -80
  81. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  82. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  83. data/lib/puppet/network/http/base_pool.rb +7 -2
  84. data/lib/puppet/network/http/compression.rb +7 -0
  85. data/lib/puppet/network/http/connection.rb +6 -0
  86. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  87. data/lib/puppet/network/http/nocache_pool.rb +2 -0
  88. data/lib/puppet/network/http/pool.rb +13 -6
  89. data/lib/puppet/network/http_pool.rb +2 -1
  90. data/lib/puppet/node/environment.rb +11 -1
  91. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  92. data/lib/puppet/pal/pal_impl.rb +4 -29
  93. data/lib/puppet/parser/ast/leaf.rb +5 -5
  94. data/lib/puppet/parser/ast/pops_bridge.rb +6 -15
  95. data/lib/puppet/parser/compiler.rb +43 -33
  96. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  97. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  98. data/lib/puppet/parser/environment_compiler.rb +4 -1
  99. data/lib/puppet/parser/functions.rb +18 -13
  100. data/lib/puppet/parser/functions/filter.rb +1 -0
  101. data/lib/puppet/parser/resource.rb +3 -2
  102. data/lib/puppet/parser/resource/param.rb +6 -0
  103. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +6 -6
  105. data/lib/puppet/pops/issues.rb +5 -0
  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/parser/evaluating_parser.rb +5 -7
  109. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  110. data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
  111. data/lib/puppet/pops/types/type_calculator.rb +24 -0
  112. data/lib/puppet/pops/validation/checker4_0.rb +11 -1
  113. data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
  114. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  115. data/lib/puppet/provider/aix_object.rb +4 -2
  116. data/lib/puppet/provider/group/aix.rb +1 -0
  117. data/lib/puppet/provider/group/groupadd.rb +57 -24
  118. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  119. data/lib/puppet/provider/package/aix.rb +17 -2
  120. data/lib/puppet/provider/package/apt.rb +78 -4
  121. data/lib/puppet/provider/package/aptitude.rb +1 -1
  122. data/lib/puppet/provider/package/dnfmodule.rb +69 -15
  123. data/lib/puppet/provider/package/dpkg.rb +14 -7
  124. data/lib/puppet/provider/package/fink.rb +20 -3
  125. data/lib/puppet/provider/package/gem.rb +41 -7
  126. data/lib/puppet/provider/package/openbsd.rb +13 -1
  127. data/lib/puppet/provider/package/pacman.rb +2 -5
  128. data/lib/puppet/provider/package/pip.rb +143 -48
  129. data/lib/puppet/provider/package/pip3.rb +0 -2
  130. data/lib/puppet/provider/package/pkg.rb +18 -5
  131. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  132. data/lib/puppet/provider/package/pkgng.rb +16 -4
  133. data/lib/puppet/provider/package/portage.rb +2 -2
  134. data/lib/puppet/provider/package/puppet_gem.rb +6 -2
  135. data/lib/puppet/provider/package/rpm.rb +6 -213
  136. data/lib/puppet/provider/package/yum.rb +109 -25
  137. data/lib/puppet/provider/package/zypper.rb +59 -1
  138. data/lib/puppet/provider/service/systemd.rb +22 -4
  139. data/lib/puppet/provider/service/windows.rb +23 -7
  140. data/lib/puppet/provider/user/aix.rb +1 -0
  141. data/lib/puppet/provider/user/directoryservice.rb +30 -5
  142. data/lib/puppet/provider/user/useradd.rb +22 -12
  143. data/lib/puppet/reports/http.rb +15 -9
  144. data/lib/puppet/reports/store.rb +1 -1
  145. data/lib/puppet/resource.rb +2 -1
  146. data/lib/puppet/resource/type.rb +8 -0
  147. data/lib/puppet/resource/type_collection.rb +20 -16
  148. data/lib/puppet/runtime.rb +31 -1
  149. data/lib/puppet/settings.rb +4 -0
  150. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  151. data/lib/puppet/ssl.rb +1 -0
  152. data/lib/puppet/ssl/certificate.rb +2 -1
  153. data/lib/puppet/ssl/host.rb +4 -4
  154. data/lib/puppet/ssl/oids.rb +1 -0
  155. data/lib/puppet/ssl/ssl_context.rb +2 -2
  156. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  157. data/lib/puppet/ssl/state_machine.rb +81 -35
  158. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  159. data/lib/puppet/test/test_helper.rb +15 -11
  160. data/lib/puppet/transaction/report.rb +2 -2
  161. data/lib/puppet/transaction/resource_harness.rb +1 -1
  162. data/lib/puppet/trusted_external.rb +29 -1
  163. data/lib/puppet/type.rb +18 -6
  164. data/lib/puppet/type/file.rb +51 -13
  165. data/lib/puppet/type/file/checksum.rb +4 -4
  166. data/lib/puppet/type/file/source.rb +51 -60
  167. data/lib/puppet/type/group.rb +2 -2
  168. data/lib/puppet/type/package.rb +102 -10
  169. data/lib/puppet/type/service.rb +55 -8
  170. data/lib/puppet/type/user.rb +3 -28
  171. data/lib/puppet/util.rb +39 -15
  172. data/lib/puppet/util/at_fork.rb +1 -1
  173. data/lib/puppet/util/autoload.rb +4 -18
  174. data/lib/puppet/util/checksums.rb +19 -4
  175. data/lib/puppet/util/fileparsing.rb +2 -2
  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/package/version/debian.rb +175 -0
  179. data/lib/puppet/util/package/version/gem.rb +15 -0
  180. data/lib/puppet/util/package/version/pip.rb +167 -0
  181. data/lib/puppet/util/package/version/range.rb +53 -0
  182. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  183. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  184. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  185. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  186. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  187. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  188. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  189. data/lib/puppet/util/package/version/rpm.rb +73 -0
  190. data/lib/puppet/util/pidlock.rb +36 -10
  191. data/lib/puppet/util/platform.rb +5 -0
  192. data/lib/puppet/util/plist.rb +6 -0
  193. data/lib/puppet/util/provider_features.rb +1 -1
  194. data/lib/puppet/util/reference.rb +1 -1
  195. data/lib/puppet/util/rpm_compare.rb +193 -0
  196. data/lib/puppet/util/storage.rb +0 -1
  197. data/lib/puppet/util/windows/adsi.rb +2 -2
  198. data/lib/puppet/util/windows/api_types.rb +45 -32
  199. data/lib/puppet/util/windows/eventlog.rb +1 -6
  200. data/lib/puppet/util/windows/principal.rb +8 -6
  201. data/lib/puppet/util/windows/process.rb +15 -14
  202. data/lib/puppet/util/windows/registry.rb +11 -11
  203. data/lib/puppet/util/windows/security.rb +1 -0
  204. data/lib/puppet/util/windows/service.rb +43 -26
  205. data/lib/puppet/util/windows/sid.rb +3 -3
  206. data/lib/puppet/util/windows/user.rb +23 -8
  207. data/lib/puppet/util/yaml.rb +1 -1
  208. data/lib/puppet/version.rb +1 -1
  209. data/locales/puppet.pot +707 -574
  210. data/man/man5/puppet.conf.5 +74 -14
  211. data/man/man8/puppet-agent.8 +7 -7
  212. data/man/man8/puppet-apply.8 +1 -1
  213. data/man/man8/puppet-catalog.8 +1 -1
  214. data/man/man8/puppet-config.8 +1 -1
  215. data/man/man8/puppet-describe.8 +1 -1
  216. data/man/man8/puppet-device.8 +2 -2
  217. data/man/man8/puppet-doc.8 +1 -1
  218. data/man/man8/puppet-epp.8 +1 -1
  219. data/man/man8/puppet-facts.8 +1 -1
  220. data/man/man8/puppet-filebucket.8 +17 -2
  221. data/man/man8/puppet-generate.8 +1 -1
  222. data/man/man8/puppet-help.8 +6 -3
  223. data/man/man8/puppet-key.8 +1 -1
  224. data/man/man8/puppet-lookup.8 +1 -1
  225. data/man/man8/puppet-man.8 +1 -1
  226. data/man/man8/puppet-module.8 +4 -1
  227. data/man/man8/puppet-node.8 +1 -1
  228. data/man/man8/puppet-parser.8 +1 -1
  229. data/man/man8/puppet-plugin.8 +1 -1
  230. data/man/man8/puppet-report.8 +1 -1
  231. data/man/man8/puppet-resource.8 +1 -1
  232. data/man/man8/puppet-script.8 +1 -1
  233. data/man/man8/puppet-ssl.8 +2 -2
  234. data/man/man8/puppet-status.8 +1 -1
  235. data/man/man8/puppet.8 +2 -2
  236. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  237. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  238. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  239. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  240. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  241. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  242. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  243. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  244. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  245. 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
  246. 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
  247. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -106
  248. 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
  249. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -98
  250. 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
  251. 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
  252. data/spec/integration/application/agent_spec.rb +483 -0
  253. data/spec/integration/application/apply_spec.rb +132 -3
  254. data/spec/integration/application/filebucket_spec.rb +190 -0
  255. data/spec/integration/application/plugin_spec.rb +73 -0
  256. data/spec/integration/configurer_spec.rb +26 -7
  257. data/spec/integration/defaults_spec.rb +1 -2
  258. data/spec/integration/http/client_spec.rb +47 -37
  259. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  260. data/spec/integration/indirector/report/yaml.rb +83 -0
  261. data/spec/integration/module_tool/forge_spec.rb +2 -15
  262. data/spec/integration/network/http_pool_spec.rb +93 -20
  263. data/spec/integration/node/environment_spec.rb +15 -0
  264. data/spec/integration/parser/compiler_spec.rb +11 -0
  265. data/spec/integration/type/file_spec.rb +1 -1
  266. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  267. data/spec/integration/util/windows/registry_spec.rb +7 -7
  268. data/spec/integration/util/windows/user_spec.rb +40 -5
  269. data/spec/lib/puppet/test_ca.rb +2 -2
  270. data/spec/lib/puppet_spec/https.rb +16 -7
  271. data/spec/lib/puppet_spec/puppetserver.rb +119 -0
  272. data/spec/shared_contexts/https.rb +29 -0
  273. data/spec/unit/agent_spec.rb +80 -26
  274. data/spec/unit/application/agent_spec.rb +9 -5
  275. data/spec/unit/application/apply_spec.rb +2 -12
  276. data/spec/unit/application/describe_spec.rb +88 -50
  277. data/spec/unit/application/device_spec.rb +2 -2
  278. data/spec/unit/application/filebucket_spec.rb +22 -2
  279. data/spec/unit/application/resource_spec.rb +2 -2
  280. data/spec/unit/configurer/fact_handler_spec.rb +4 -8
  281. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  282. data/spec/unit/configurer_spec.rb +17 -18
  283. data/spec/unit/context/trusted_information_spec.rb +25 -2
  284. data/spec/unit/daemon_spec.rb +5 -64
  285. data/spec/unit/defaults_spec.rb +25 -2
  286. data/spec/unit/environments_spec.rb +65 -28
  287. data/spec/unit/face/facts_spec.rb +24 -20
  288. data/spec/unit/face/module/search_spec.rb +17 -0
  289. data/spec/unit/face/plugin_spec.rb +12 -10
  290. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  291. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  292. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  293. data/spec/unit/file_system_spec.rb +26 -2
  294. data/spec/unit/functions/lookup_spec.rb +13 -0
  295. data/spec/unit/http/client_spec.rb +327 -35
  296. data/spec/unit/http/external_client_spec.rb +201 -0
  297. data/spec/unit/http/resolver_spec.rb +34 -2
  298. data/spec/unit/http/response_spec.rb +75 -0
  299. data/spec/unit/http/service/ca_spec.rb +53 -11
  300. data/spec/unit/http/service/compiler_spec.rb +627 -0
  301. data/spec/unit/http/service/file_server_spec.rb +308 -0
  302. data/spec/unit/http/service/report_spec.rb +27 -9
  303. data/spec/unit/http/service_spec.rb +98 -5
  304. data/spec/unit/http/session_spec.rb +190 -7
  305. data/spec/unit/indirector/catalog/compiler_spec.rb +47 -29
  306. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  307. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  308. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  309. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  310. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  311. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  312. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  313. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  314. data/spec/unit/indirector/request_spec.rb +1 -1
  315. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  316. data/spec/unit/indirector/rest_spec.rb +13 -0
  317. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  318. data/spec/unit/interface_spec.rb +3 -3
  319. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  320. data/spec/unit/network/http/connection_spec.rb +559 -175
  321. data/spec/unit/network/http/nocache_pool_spec.rb +25 -3
  322. data/spec/unit/network/http/pool_spec.rb +89 -11
  323. data/spec/unit/network/http_pool_spec.rb +63 -57
  324. data/spec/unit/network/http_spec.rb +1 -1
  325. data/spec/unit/node/environment_spec.rb +16 -0
  326. data/spec/unit/node/facts_spec.rb +2 -1
  327. data/spec/unit/node_spec.rb +7 -4
  328. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  329. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  330. data/spec/unit/parser/scope_spec.rb +1 -1
  331. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  332. data/spec/unit/pops/loaders/loaders_spec.rb +1 -1
  333. data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
  334. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  335. data/spec/unit/pops/validator/validator_spec.rb +7 -2
  336. data/spec/unit/provider/aix_object_spec.rb +16 -2
  337. data/spec/unit/provider/group/groupadd_spec.rb +181 -56
  338. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  339. data/spec/unit/provider/package/aix_spec.rb +29 -0
  340. data/spec/unit/provider/package/apt_spec.rb +43 -2
  341. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  342. data/spec/unit/provider/package/dnfmodule_spec.rb +76 -15
  343. data/spec/unit/provider/package/dpkg_spec.rb +28 -6
  344. data/spec/unit/provider/package/gem_spec.rb +40 -0
  345. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  346. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  347. data/spec/unit/provider/package/pip_spec.rb +68 -19
  348. data/spec/unit/provider/package/pkg_spec.rb +15 -1
  349. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  350. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  351. data/spec/unit/provider/package/portage_spec.rb +5 -0
  352. data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
  353. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  354. data/spec/unit/provider/package/yum_spec.rb +292 -0
  355. data/spec/unit/provider/package/zypper_spec.rb +84 -0
  356. data/spec/unit/provider/service/init_spec.rb +1 -0
  357. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  358. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  359. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  360. data/spec/unit/provider/service/systemd_spec.rb +92 -12
  361. data/spec/unit/provider/service/windows_spec.rb +22 -14
  362. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  363. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  364. data/spec/unit/provider/user/useradd_spec.rb +43 -24
  365. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  366. data/spec/unit/puppet_pal_2pec.rb +0 -26
  367. data/spec/unit/puppet_pal_catalog_spec.rb +46 -0
  368. data/spec/unit/puppet_spec.rb +47 -0
  369. data/spec/unit/reports/http_spec.rb +70 -52
  370. data/spec/unit/resource_spec.rb +3 -3
  371. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  372. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  373. data/spec/unit/ssl/certificate_spec.rb +7 -0
  374. data/spec/unit/ssl/host_spec.rb +4 -2
  375. data/spec/unit/ssl/oids_spec.rb +1 -0
  376. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  377. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  378. data/spec/unit/test/test_helper_spec.rb +17 -0
  379. data/spec/unit/transaction/persistence_spec.rb +1 -10
  380. data/spec/unit/transaction/report_spec.rb +5 -1
  381. data/spec/unit/transaction_spec.rb +0 -2
  382. data/spec/unit/type/file/ensure_spec.rb +1 -2
  383. data/spec/unit/type/file/source_spec.rb +89 -38
  384. data/spec/unit/type/file_spec.rb +122 -96
  385. data/spec/unit/type/package_spec.rb +8 -0
  386. data/spec/unit/type/service_spec.rb +185 -8
  387. data/spec/unit/type/user_spec.rb +1 -2
  388. data/spec/unit/type_spec.rb +50 -0
  389. data/spec/unit/util/at_fork_spec.rb +3 -2
  390. data/spec/unit/util/autoload_spec.rb +2 -1
  391. data/spec/unit/util/checksums_spec.rb +16 -0
  392. data/spec/unit/util/log/destinations_spec.rb +1 -29
  393. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  394. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  395. data/spec/unit/util/package/version/range_spec.rb +175 -0
  396. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  397. data/spec/unit/util/pidlock_spec.rb +112 -42
  398. data/spec/unit/util/plist_spec.rb +20 -0
  399. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  400. data/spec/unit/util/storage_spec.rb +1 -8
  401. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  402. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  403. data/spec/unit/util/windows/service_spec.rb +4 -4
  404. data/spec/unit/util/windows/sid_spec.rb +2 -2
  405. data/spec/unit/util_spec.rb +3 -3
  406. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  407. data/tasks/generate_cert_fixtures.rake +15 -1
  408. data/tasks/manpages.rake +5 -35
  409. metadata +73 -12
  410. data/COMMITTERS.md +0 -244
  411. data/spec/integration/faces/plugin_spec.rb +0 -61
  412. data/spec/integration/test/test_helper_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,43 +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
 
4
- SERVICE_NAMES = [:ca, :report].freeze
11
+ # @api private
12
+ # @return [Array<Symbol>] available services
13
+ SERVICE_NAMES = [:ca, :fileserver, :puppet, :report].freeze
5
14
 
6
- def self.create_service(client, name, server = nil, port = nil)
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)
7
39
  case name
8
40
  when :ca
9
- Puppet::HTTP::Service::Ca.new(client, server, port)
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)
10
46
  when :report
11
- Puppet::HTTP::Service::Report.new(client, server, port)
47
+ Puppet::HTTP::Service::Report.new(client, session, server, port)
12
48
  else
13
49
  raise ArgumentError, "Unknown service #{name}"
14
50
  end
15
51
  end
16
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
+ #
17
62
  def self.valid_name?(name)
18
63
  SERVICE_NAMES.include?(name)
19
64
  end
20
65
 
21
- 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)
22
76
  @client = client
77
+ @session = session
23
78
  @url = url
24
79
  end
25
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
+ #
26
90
  def with_base_url(path)
27
91
  u = @url.dup
28
- u.path += path
92
+ u.path += Puppet::Util.uri_encode(path)
29
93
  u
30
94
  end
31
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
+ #
32
104
  def connect(ssl_context: nil)
33
- @client.connect(@url, ssl_context: ssl_context)
105
+ @client.connect(@url, options: {ssl_context: ssl_context})
34
106
  end
35
107
 
36
108
  protected
37
109
 
38
110
  def add_puppet_headers(headers)
39
111
  modified_headers = headers.dup
112
+
113
+ # Add 'X-Puppet-Profiling' to enable performance profiling if turned on
40
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
41
128
  modified_headers
42
129
  end
43
130
 
@@ -47,4 +134,61 @@ class Puppet::HTTP::Service
47
134
  path: api
48
135
  ).freeze
49
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?
193
+ end
50
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
@@ -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