puppet 6.12.0 → 6.17.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 (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
@@ -3,4 +3,38 @@ require 'puppet/indirector/rest'
3
3
 
4
4
  class Puppet::Resource::Catalog::Rest < Puppet::Indirector::REST
5
5
  desc "Find resource catalogs over HTTP via REST."
6
+
7
+ def find(request)
8
+ return super unless use_http_client?
9
+
10
+ checksum_type = if request.options[:checksum_type]
11
+ request.options[:checksum_type].split('.')
12
+ else
13
+ Puppet[:supported_checksum_types]
14
+ end
15
+
16
+ session = Puppet.lookup(:http_session)
17
+ api = session.route_to(:puppet)
18
+ _, catalog = api.post_catalog(
19
+ request.key,
20
+ facts: request.options[:facts_for_catalog],
21
+ environment: request.environment.to_s,
22
+ configured_environment: request.options[:configured_environment],
23
+ transaction_uuid: request.options[:transaction_uuid],
24
+ job_uuid: request.options[:job_id],
25
+ static_catalog: request.options[:static_catalog],
26
+ checksum_type: checksum_type
27
+ )
28
+ catalog
29
+ rescue Puppet::HTTP::ResponseError => e
30
+ if e.response.code == 404
31
+ return nil unless request.options[:fail_on_404]
32
+
33
+ _, body = parse_response(e.response.nethttp)
34
+ msg = _("Find %{uri} resulted in 404 with the message: %{body}") % { uri: elide(e.response.url.path, 100), body: body }
35
+ raise Puppet::Error, msg
36
+ else
37
+ raise convert_to_http_error(e.response.nethttp)
38
+ end
39
+ end
6
40
  end
@@ -4,9 +4,51 @@ require 'puppet/indirector/rest'
4
4
  class Puppet::Node::Facts::Rest < Puppet::Indirector::REST
5
5
  desc "Find and save facts about nodes over HTTP via REST."
6
6
 
7
+ def find(request)
8
+ return super unless use_http_client?
9
+
10
+ session = Puppet.lookup(:http_session)
11
+ api = session.route_to(:puppet)
12
+ _, facts = api.get_facts(
13
+ request.key,
14
+ environment: request.environment.to_s
15
+ )
16
+ facts
17
+ rescue Puppet::HTTP::ResponseError => e
18
+ if e.response.code == 404
19
+ return nil unless request.options[:fail_on_404]
20
+
21
+ _, body = parse_response(e.response.nethttp)
22
+ msg = _("Find %{uri} resulted in 404 with the message: %{body}") % { uri: elide(e.response.url.path, 100), body: body }
23
+ raise Puppet::Error, msg
24
+ else
25
+ raise convert_to_http_error(e.response.nethttp)
26
+ end
27
+ end
28
+
7
29
  def save(request)
8
30
  raise ArgumentError, _("PUT does not accept options") unless request.options.empty?
9
31
 
32
+ return legacy_save(request) unless use_http_client?
33
+
34
+ session = Puppet.lookup(:http_session)
35
+ api = session.route_to(:puppet)
36
+ api.put_facts(
37
+ request.key,
38
+ facts: request.instance,
39
+ environment: request.environment.to_s
40
+ )
41
+
42
+ # preserve existing behavior
43
+ nil
44
+ rescue Puppet::HTTP::ResponseError => e
45
+ # always raise even if fail_on_404 is false
46
+ raise convert_to_http_error(e.response.nethttp)
47
+ end
48
+
49
+ private
50
+
51
+ def legacy_save(request)
10
52
  response = do_request(request) do |req|
11
53
  http_put(req, IndirectedRoutes.request_to_uri(req), req.instance.render, headers.merge({ "Content-Type" => req.instance.mime }))
12
54
  end
@@ -250,7 +250,7 @@ module Puppet::FileBucketFile
250
250
  # @return [void]
251
251
  # @api private
252
252
  def copy_bucket_file_to_contents_file(contents_file, bucket_file)
253
- Puppet::Util.replace_file(contents_file, 0440) do |of|
253
+ Puppet::FileSystem.replace_file(contents_file, 0440) do |of|
254
254
  # PUP-1044 writes all of the contents
255
255
  bucket_file.stream() do |src|
256
256
  FileUtils.copy_stream(src, of)
@@ -4,5 +4,53 @@ require 'puppet/file_bucket/file'
4
4
  module Puppet::FileBucketFile
5
5
  class Rest < Puppet::Indirector::REST
6
6
  desc "This is a REST based mechanism to send/retrieve file to/from the filebucket"
7
+
8
+ def head(request)
9
+ return super unless use_http_client?
10
+
11
+ session = Puppet.lookup(:http_session)
12
+ api = session.route_to(:puppet)
13
+ api.head_filebucket_file(
14
+ request.key,
15
+ environment: request.environment.to_s,
16
+ bucket_path: request.options[:bucket_path],
17
+ )
18
+ rescue Puppet::HTTP::ResponseError => e
19
+ return nil if e.response.code == 404
20
+ raise convert_to_http_error(e.response.nethttp)
21
+ end
22
+
23
+ def find(request)
24
+ return super unless use_http_client?
25
+
26
+ session = Puppet.lookup(:http_session)
27
+ api = session.route_to(:puppet)
28
+ _, filebucket_file = api.get_filebucket_file(
29
+ request.key,
30
+ environment: request.environment.to_s,
31
+ bucket_path: request.options[:bucket_path],
32
+ diff_with: request.options[:diff_with],
33
+ list_all: request.options[:list_all],
34
+ fromdate: request.options[:fromdate],
35
+ todate: request.options[:todate],
36
+ )
37
+ filebucket_file
38
+ rescue Puppet::HTTP::ResponseError => e
39
+ raise convert_to_http_error(e.response.nethttp)
40
+ end
41
+
42
+ def save(request)
43
+ return super unless use_http_client?
44
+
45
+ session = Puppet.lookup(:http_session)
46
+ api = session.route_to(:puppet)
47
+ api.put_filebucket_file(
48
+ request.key,
49
+ body: request.instance.render,
50
+ environment: request.environment.to_s,
51
+ )
52
+ rescue Puppet::HTTP::ResponseError => e
53
+ raise convert_to_http_error(e.response.nethttp)
54
+ end
7
55
  end
8
56
  end
@@ -10,6 +10,11 @@ class Puppet::Indirector::FileContent::Http < Puppet::Indirector::GenericHttp
10
10
 
11
11
  @http_method = :get
12
12
 
13
+ def initialize
14
+ Puppet.deprecation_warning(_("Puppet::Indirector::FileContent::Http is deprecated. Use Puppet::HTTP::Client instead."))
15
+ super
16
+ end
17
+
13
18
  def find(request)
14
19
  response = super
15
20
  model.from_binary(uncompress_body(response))
@@ -6,4 +6,34 @@ class Puppet::Indirector::FileContent::Rest < Puppet::Indirector::REST
6
6
  desc "Retrieve file contents via a REST HTTP interface."
7
7
 
8
8
  use_srv_service(:fileserver)
9
+
10
+ def find(request)
11
+ return super unless use_http_client?
12
+
13
+ content = StringIO.new
14
+ content.binmode
15
+
16
+ url = URI.parse(Puppet::Util.uri_encode(request.uri))
17
+ session = Puppet.lookup(:http_session)
18
+ api = session.route_to(:fileserver, url: url)
19
+
20
+ api.get_file_content(
21
+ path: Puppet::Util.uri_unescape(url.path),
22
+ environment: request.environment.to_s,
23
+ ) do |data|
24
+ content << data
25
+ end
26
+
27
+ Puppet::FileServing::Content.from_binary(content.string)
28
+ rescue Puppet::HTTP::ResponseError => e
29
+ if e.response.code == 404
30
+ return nil unless request.options[:fail_on_404]
31
+
32
+ _, body = parse_response(e.response.nethttp)
33
+ msg = _("Find %{uri} resulted in 404 with the message: %{body}") % { uri: elide(e.response.url.path, 100), body: body }
34
+ raise Puppet::Error, msg
35
+ else
36
+ raise convert_to_http_error(e.response.nethttp)
37
+ end
38
+ end
9
39
  end
@@ -8,20 +8,39 @@ class Puppet::Indirector::FileMetadata::Http < Puppet::Indirector::GenericHttp
8
8
 
9
9
  include Puppet::FileServing::TerminusHelper
10
10
 
11
- @http_method = :head
12
-
13
11
  def find(request)
14
- head = super
12
+ checksum_type = request.options[:checksum_type]
13
+ uri = URI(request.uri)
14
+ client = Puppet.runtime[:http]
15
+ head = client.head(uri, options: {include_system_store: true})
16
+
17
+ return create_httpmetadata(head, checksum_type) if head.success?
15
18
 
16
- if head.is_a?(Net::HTTPSuccess)
17
- metadata = Puppet::FileServing::HttpMetadata.new(head)
18
- metadata.checksum_type = request.options[:checksum_type] if request.options[:checksum_type]
19
- metadata.collect
20
- metadata
19
+ case head.code
20
+ when 403, 405
21
+ # AMZ presigned URL and puppetserver may return 403
22
+ # instead of 405. Fallback to partial get
23
+ get = partial_get(client, uri)
24
+ return create_httpmetadata(get, checksum_type) if get.success?
21
25
  end
26
+
27
+ nil
22
28
  end
23
29
 
24
30
  def search(request)
25
31
  raise Puppet::Error, _("cannot lookup multiple files")
26
32
  end
33
+
34
+ private
35
+
36
+ def partial_get(client, uri)
37
+ client.get(uri, headers: {'Range' => 'bytes=0-0'}, options: {include_system_store: true})
38
+ end
39
+
40
+ def create_httpmetadata(http_request, checksum_type)
41
+ metadata = Puppet::FileServing::HttpMetadata.new(http_request)
42
+ metadata.checksum_type = checksum_type if checksum_type
43
+ metadata.collect
44
+ metadata
45
+ end
27
46
  end
@@ -6,4 +6,56 @@ class Puppet::Indirector::FileMetadata::Rest < Puppet::Indirector::REST
6
6
  desc "Retrieve file metadata via a REST HTTP interface."
7
7
 
8
8
  use_srv_service(:fileserver)
9
+
10
+ def find(request)
11
+ return super unless use_http_client?
12
+
13
+ url = URI.parse(Puppet::Util.uri_encode(request.uri))
14
+ session = Puppet.lookup(:http_session)
15
+ api = session.route_to(:fileserver, url: url)
16
+
17
+ _, file_metadata = api.get_file_metadata(
18
+ path: Puppet::Util.uri_unescape(url.path),
19
+ environment: request.environment.to_s,
20
+ links: request.options[:links],
21
+ checksum_type: request.options[:checksum_type],
22
+ source_permissions: request.options[:source_permissions]
23
+ )
24
+ file_metadata
25
+ rescue Puppet::HTTP::ResponseError => e
26
+ if e.response.code == 404
27
+ return nil unless request.options[:fail_on_404]
28
+
29
+ _, body = parse_response(e.response.nethttp)
30
+ msg = _("Find %{uri} resulted in 404 with the message: %{body}") % { uri: elide(e.response.url.path, 100), body: body }
31
+ raise Puppet::Error, msg
32
+ else
33
+ raise convert_to_http_error(e.response.nethttp)
34
+ end
35
+ end
36
+
37
+ def search(request)
38
+ return super unless use_http_client?
39
+
40
+ url = URI.parse(Puppet::Util.uri_encode(request.uri))
41
+ session = Puppet.lookup(:http_session)
42
+ api = session.route_to(:fileserver, url: url)
43
+
44
+ _, file_metadatas = api.get_file_metadatas(
45
+ path: Puppet::Util.uri_unescape(url.path),
46
+ environment: request.environment.to_s,
47
+ recurse: request.options[:recurse],
48
+ recurselimit: request.options[:recurselimit],
49
+ ignore: request.options[:ignore],
50
+ links: request.options[:links],
51
+ checksum_type: request.options[:checksum_type],
52
+ source_permissions: request.options[:source_permissions],
53
+ )
54
+ file_metadatas
55
+ rescue Puppet::HTTP::ResponseError => e
56
+ # since it's search, return empty array instead of nil
57
+ return [] if e.response.code == 404
58
+
59
+ raise convert_to_http_error(e.response.nethttp)
60
+ end
9
61
  end
@@ -14,7 +14,7 @@ class Puppet::Indirector::JSON < Puppet::Indirector::Terminus
14
14
  filename = path(request.key)
15
15
  FileUtils.mkdir_p(File.dirname(filename))
16
16
 
17
- Puppet::Util.replace_file(filename, 0660) {|f| f.print to_json(request.instance).force_encoding(Encoding::BINARY) }
17
+ Puppet::FileSystem.replace_file(filename, 0660) {|f| f.print to_json(request.instance).force_encoding(Encoding::BINARY) }
18
18
  rescue TypeError => detail
19
19
  Puppet.log_exception(detail, _("Could not save %{json} %{request}: %{detail}") % { json: self.name, request: request.key, detail: detail })
20
20
  end
@@ -21,7 +21,7 @@ class Puppet::Indirector::Msgpack < Puppet::Indirector::Terminus
21
21
  filename = path(request.key)
22
22
  FileUtils.mkdir_p(File.dirname(filename))
23
23
 
24
- Puppet::Util.replace_file(filename, 0660) {|f| f.print to_msgpack(request.instance) }
24
+ Puppet::FileSystem.replace_file(filename, 0660) {|f| f.print to_msgpack(request.instance) }
25
25
  rescue TypeError => detail
26
26
  Puppet.log_exception(detail, _("Could not save %{name} %{request}: %{detail}") % { name: self.name, request: request.key, detail: detail })
27
27
  end
@@ -4,4 +4,28 @@ require 'puppet/indirector/rest'
4
4
  class Puppet::Node::Rest < Puppet::Indirector::REST
5
5
  desc "Get a node via REST. Puppet agent uses this to allow the puppet master
6
6
  to override its environment."
7
+
8
+ def find(request)
9
+ return super unless use_http_client?
10
+
11
+ session = Puppet.lookup(:http_session)
12
+ api = session.route_to(:puppet)
13
+ _, node = api.get_node(
14
+ request.key,
15
+ environment: request.environment.to_s,
16
+ configured_environment: request.options[:configured_environment],
17
+ transaction_uuid: request.options[:transaction_uuid]
18
+ )
19
+ node
20
+ rescue Puppet::HTTP::ResponseError => e
21
+ if e.response.code == 404
22
+ return nil unless request.options[:fail_on_404]
23
+
24
+ _, body = parse_response(e.response.nethttp)
25
+ msg = _("Find %{uri} resulted in 404 with the message: %{body}") % { uri: elide(e.response.url.path, 100), body: body }
26
+ raise Puppet::Error, msg
27
+ else
28
+ raise convert_to_http_error(e.response.nethttp)
29
+ end
30
+ end
7
31
  end
@@ -7,6 +7,25 @@ class Puppet::Transaction::Report::Rest < Puppet::Indirector::REST
7
7
  use_port_setting(:report_port)
8
8
  use_srv_service(:report)
9
9
 
10
+ def save(request)
11
+ return super unless use_http_client?
12
+
13
+ session = Puppet.lookup(:http_session)
14
+ api = session.route_to(:report)
15
+ response = api.put_report(
16
+ request.key,
17
+ request.instance,
18
+ environment: request.environment.to_s
19
+ )
20
+ content_type, body = parse_response(response)
21
+ deserialize_save(content_type, body)
22
+ rescue Puppet::HTTP::ResponseError => e
23
+ return nil if e.response.code == 404
24
+
25
+ raise convert_to_http_error(e.response.nethttp)
26
+ end
27
+
28
+ # This is called by the superclass when not using our httpclient.
10
29
  def handle_response(request, response)
11
30
  if !response.is_a?(Net::HTTPSuccess)
12
31
  server_version = response[Puppet::Network::HTTP::HEADER_PUPPET_VERSION]
@@ -2,10 +2,33 @@ require 'puppet/transaction/report'
2
2
  require 'puppet/indirector/yaml'
3
3
 
4
4
  class Puppet::Transaction::Report::Yaml < Puppet::Indirector::Yaml
5
+ include Puppet::Util::SymbolicFileMode
6
+
5
7
  desc "Store last report as a flat file, serialized using YAML."
6
8
 
7
9
  # Force report to be saved there
8
10
  def path(name,ext='.yaml')
9
11
  Puppet[:lastrunreport]
10
12
  end
13
+
14
+ def save(request)
15
+ filename = path(request.key)
16
+ mode = Puppet.settings.setting(:lastrunreport).mode
17
+
18
+ unless valid_symbolic_mode?(mode)
19
+ raise Puppet::DevError, _("replace_file mode: %{mode} is invalid") % { mode: mode }
20
+ end
21
+
22
+ mode = symbolic_mode_to_int(normalize_symbolic_mode(mode))
23
+
24
+ FileUtils.mkdir_p(File.dirname(filename))
25
+
26
+ begin
27
+ Puppet::FileSystem.replace_file(filename, mode) do |fh|
28
+ fh.print YAML.dump(request.instance)
29
+ end
30
+ rescue TypeError => detail
31
+ Puppet.err _("Could not save %{indirection} %{request}: %{detail}") % { indirection: self.name, request: request.key, detail: detail }
32
+ end
33
+ end
11
34
  end
@@ -290,6 +290,6 @@ class Puppet::Indirector::Request
290
290
  @protocol = uri.scheme
291
291
  end
292
292
 
293
- @key = URI.unescape(uri.path.sub(/^\//, ''))
293
+ @key = Puppet::Util.uri_unescape(uri.path.sub(/^\//, ''))
294
294
  end
295
295
  end
@@ -52,6 +52,13 @@ class Puppet::Indirector::REST < Puppet::Indirector::Terminus
52
52
  Puppet::Util::Connection.determine_port(port_setting, server_setting)
53
53
  end
54
54
 
55
+ # Should we use puppet's http client to make requests. Will return
56
+ # false when running in puppetserver
57
+ def use_http_client?
58
+ Puppet::Network::HttpPool.http_client_class == Puppet::Network::HTTP::Connection ||
59
+ Puppet::Network::HttpPool.http_client_class == Puppet::Network::HTTP::ConnectionAdapter
60
+ end
61
+
55
62
  # Provide appropriate headers.
56
63
  def headers
57
64
  # yaml is not allowed on the network
@@ -105,6 +112,7 @@ class Puppet::Indirector::REST < Puppet::Indirector::Terminus
105
112
  end
106
113
 
107
114
  def find(request)
115
+ Puppet.deprecation_warning(_("Puppet::Indirector::Rest#find is deprecated. Use Puppet::HTTP::Client instead."))
108
116
  uri, body = IndirectedRoutes.request_to_uri_and_body(request)
109
117
  uri_with_query_string = "#{uri}?#{body}"
110
118
 
@@ -143,6 +151,7 @@ class Puppet::Indirector::REST < Puppet::Indirector::Terminus
143
151
  end
144
152
 
145
153
  def head(request)
154
+ Puppet.deprecation_warning(_("Puppet::Indirector::Rest#head is deprecated. Use Puppet::HTTP::Client instead."))
146
155
  response = do_request(request) do |req|
147
156
  http_head(req, IndirectedRoutes.request_to_uri(req), headers)
148
157
  end
@@ -155,6 +164,7 @@ class Puppet::Indirector::REST < Puppet::Indirector::Terminus
155
164
  end
156
165
 
157
166
  def search(request)
167
+ Puppet.deprecation_warning(_("Puppet::Indirector::Rest#search is deprecated. Use Puppet::HTTP::Client instead."))
158
168
  response = do_request(request) do |req|
159
169
  http_get(req, IndirectedRoutes.request_to_uri(req), headers)
160
170
  end
@@ -168,6 +178,7 @@ class Puppet::Indirector::REST < Puppet::Indirector::Terminus
168
178
  end
169
179
 
170
180
  def destroy(request)
181
+ Puppet.deprecation_warning(_("Puppet::Indirector::Rest#destroy is deprecated. Use Puppet::HTTP::Client instead."))
171
182
  raise ArgumentError, _("DELETE does not accept options") unless request.options.empty?
172
183
 
173
184
  response = do_request(request) do |req|
@@ -183,6 +194,7 @@ class Puppet::Indirector::REST < Puppet::Indirector::Terminus
183
194
  end
184
195
 
185
196
  def save(request)
197
+ Puppet.deprecation_warning(_("Puppet::Indirector::Rest#save is deprecated. Use Puppet::HTTP::Client instead."))
186
198
  raise ArgumentError, _("PUT does not accept options") unless request.options.empty?
187
199
 
188
200
  response = do_request(request) do |req|