puppet 6.13.0-universal-darwin → 6.18.0-universal-darwin

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

Potentially problematic release.


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

Files changed (461) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -7
  3. data/CONTRIBUTING.md +7 -13
  4. data/Gemfile +4 -2
  5. data/Gemfile.lock +36 -32
  6. data/README.md +17 -24
  7. data/ext/windows/service/daemon.rb +3 -3
  8. data/lib/puppet.rb +33 -9
  9. data/lib/puppet/agent.rb +20 -14
  10. data/lib/puppet/application/agent.rb +26 -17
  11. data/lib/puppet/application/apply.rb +18 -20
  12. data/lib/puppet/application/describe.rb +7 -5
  13. data/lib/puppet/application/device.rb +2 -2
  14. data/lib/puppet/application/filebucket.rb +19 -15
  15. data/lib/puppet/application/lookup.rb +16 -4
  16. data/lib/puppet/application/plugin.rb +1 -0
  17. data/lib/puppet/application/ssl.rb +4 -4
  18. data/lib/puppet/configurer.rb +58 -57
  19. data/lib/puppet/configurer/downloader.rb +31 -10
  20. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  21. data/lib/puppet/confine.rb +2 -2
  22. data/lib/puppet/confine/any.rb +1 -1
  23. data/lib/puppet/context/trusted_information.rb +14 -8
  24. data/lib/puppet/daemon.rb +13 -27
  25. data/lib/puppet/defaults.rb +92 -12
  26. data/lib/puppet/environments.rb +4 -5
  27. data/lib/puppet/face/facts.rb +1 -1
  28. data/lib/puppet/face/help.rb +29 -3
  29. data/lib/puppet/face/module/search.rb +5 -0
  30. data/lib/puppet/face/plugin.rb +2 -2
  31. data/lib/puppet/feature/base.rb +1 -1
  32. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  33. data/lib/puppet/file_serving/metadata.rb +4 -1
  34. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  35. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  36. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  37. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  38. data/lib/puppet/file_system/file_impl.rb +17 -13
  39. data/lib/puppet/file_system/uniquefile.rb +12 -16
  40. data/lib/puppet/forge.rb +1 -1
  41. data/lib/puppet/forge/cache.rb +1 -1
  42. data/lib/puppet/forge/repository.rb +4 -7
  43. data/lib/puppet/functions/call.rb +1 -1
  44. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  45. data/lib/puppet/functions/filter.rb +1 -0
  46. data/lib/puppet/functions/lstrip.rb +4 -4
  47. data/lib/puppet/functions/reduce.rb +2 -4
  48. data/lib/puppet/functions/reverse_each.rb +1 -1
  49. data/lib/puppet/functions/rstrip.rb +4 -4
  50. data/lib/puppet/functions/step.rb +1 -1
  51. data/lib/puppet/functions/strip.rb +4 -4
  52. data/lib/puppet/gettext/config.rb +5 -5
  53. data/lib/puppet/gettext/module_translations.rb +4 -4
  54. data/lib/puppet/http.rb +3 -0
  55. data/lib/puppet/http/client.rb +263 -73
  56. data/lib/puppet/http/external_client.rb +90 -0
  57. data/lib/puppet/http/redirector.rb +43 -7
  58. data/lib/puppet/http/resolver.rb +46 -3
  59. data/lib/puppet/http/resolver/server_list.rb +76 -16
  60. data/lib/puppet/http/resolver/settings.rb +23 -3
  61. data/lib/puppet/http/resolver/srv.rb +29 -3
  62. data/lib/puppet/http/response.rb +87 -1
  63. data/lib/puppet/http/retry_after_handler.rb +39 -0
  64. data/lib/puppet/http/service.rb +97 -12
  65. data/lib/puppet/http/service/ca.rb +76 -14
  66. data/lib/puppet/http/service/compiler.rb +249 -16
  67. data/lib/puppet/http/service/file_server.rb +141 -20
  68. data/lib/puppet/http/service/report.rb +47 -17
  69. data/lib/puppet/http/session.rb +96 -7
  70. data/lib/puppet/indirector.rb +1 -1
  71. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  72. data/lib/puppet/indirector/exec.rb +1 -1
  73. data/lib/puppet/indirector/facts/facter.rb +3 -3
  74. data/lib/puppet/indirector/facts/rest.rb +42 -0
  75. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  76. data/lib/puppet/indirector/file_content/http.rb +5 -0
  77. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  78. data/lib/puppet/indirector/file_metadata/http.rb +28 -8
  79. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  80. data/lib/puppet/indirector/hiera.rb +4 -0
  81. data/lib/puppet/indirector/indirection.rb +1 -1
  82. data/lib/puppet/indirector/node/rest.rb +24 -0
  83. data/lib/puppet/indirector/report/processor.rb +2 -2
  84. data/lib/puppet/indirector/report/rest.rb +19 -0
  85. data/lib/puppet/indirector/report/yaml.rb +23 -0
  86. data/lib/puppet/indirector/request.rb +1 -1
  87. data/lib/puppet/indirector/rest.rb +12 -0
  88. data/lib/puppet/indirector/status/rest.rb +18 -0
  89. data/lib/puppet/loaders.rb +6 -0
  90. data/lib/puppet/metatype/manager.rb +80 -80
  91. data/lib/puppet/module.rb +1 -2
  92. data/lib/puppet/network/format_support.rb +2 -2
  93. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  94. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  95. data/lib/puppet/network/http/base_pool.rb +7 -2
  96. data/lib/puppet/network/http/compression.rb +7 -0
  97. data/lib/puppet/network/http/connection.rb +2 -0
  98. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  99. data/lib/puppet/network/http/nocache_pool.rb +1 -0
  100. data/lib/puppet/network/http/pool.rb +8 -5
  101. data/lib/puppet/network/http/route.rb +2 -2
  102. data/lib/puppet/network/http_pool.rb +2 -1
  103. data/lib/puppet/node/environment.rb +22 -5
  104. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  105. data/lib/puppet/pal/pal_impl.rb +30 -31
  106. data/lib/puppet/parameter.rb +1 -1
  107. data/lib/puppet/parser/ast/leaf.rb +5 -5
  108. data/lib/puppet/parser/ast/pops_bridge.rb +0 -4
  109. data/lib/puppet/parser/compiler.rb +43 -33
  110. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  111. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  112. data/lib/puppet/parser/environment_compiler.rb +4 -1
  113. data/lib/puppet/parser/functions.rb +18 -9
  114. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  115. data/lib/puppet/parser/functions/filter.rb +1 -0
  116. data/lib/puppet/parser/resource.rb +3 -2
  117. data/lib/puppet/parser/resource/param.rb +6 -0
  118. data/lib/puppet/parser/type_loader.rb +2 -2
  119. data/lib/puppet/pops/adaptable.rb +7 -13
  120. data/lib/puppet/pops/adapters.rb +8 -4
  121. data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
  122. data/lib/puppet/pops/issues.rb +5 -0
  123. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  124. data/lib/puppet/pops/loaders.rb +24 -15
  125. data/lib/puppet/pops/lookup/context.rb +1 -1
  126. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  127. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  128. data/lib/puppet/pops/types/iterable.rb +34 -8
  129. data/lib/puppet/pops/validation/checker4_0.rb +29 -15
  130. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  131. data/lib/puppet/provider/file/windows.rb +1 -1
  132. data/lib/puppet/provider/group/groupadd.rb +9 -4
  133. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  134. data/lib/puppet/provider/package/aix.rb +17 -2
  135. data/lib/puppet/provider/package/apt.rb +98 -1
  136. data/lib/puppet/provider/package/aptitude.rb +1 -1
  137. data/lib/puppet/provider/package/dnfmodule.rb +61 -14
  138. data/lib/puppet/provider/package/gem.rb +45 -9
  139. data/lib/puppet/provider/package/pacman.rb +2 -5
  140. data/lib/puppet/provider/package/pip.rb +143 -48
  141. data/lib/puppet/provider/package/pip3.rb +0 -2
  142. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  143. data/lib/puppet/provider/package/pkgng.rb +16 -4
  144. data/lib/puppet/provider/package/portage.rb +2 -2
  145. data/lib/puppet/provider/package/puppet_gem.rb +11 -2
  146. data/lib/puppet/provider/package/rpm.rb +6 -213
  147. data/lib/puppet/provider/package/yum.rb +100 -20
  148. data/lib/puppet/provider/package/zypper.rb +62 -1
  149. data/lib/puppet/provider/service/systemd.rb +22 -4
  150. data/lib/puppet/provider/service/windows.rb +23 -7
  151. data/lib/puppet/provider/user/aix.rb +1 -1
  152. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  153. data/lib/puppet/provider/user/useradd.rb +16 -5
  154. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  155. data/lib/puppet/reports/http.rb +15 -9
  156. data/lib/puppet/resource.rb +2 -1
  157. data/lib/puppet/resource/type.rb +8 -0
  158. data/lib/puppet/resource/type_collection.rb +20 -16
  159. data/lib/puppet/runtime.rb +31 -1
  160. data/lib/puppet/settings.rb +3 -1
  161. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  162. data/lib/puppet/ssl.rb +1 -0
  163. data/lib/puppet/ssl/host.rb +4 -4
  164. data/lib/puppet/ssl/oids.rb +1 -0
  165. data/lib/puppet/ssl/ssl_context.rb +2 -2
  166. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  167. data/lib/puppet/ssl/state_machine.rb +81 -35
  168. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  169. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  170. data/lib/puppet/test/test_helper.rb +21 -14
  171. data/lib/puppet/transaction.rb +2 -2
  172. data/lib/puppet/transaction/persistence.rb +1 -1
  173. data/lib/puppet/transaction/report.rb +3 -3
  174. data/lib/puppet/trusted_external.rb +29 -1
  175. data/lib/puppet/type.rb +21 -8
  176. data/lib/puppet/type/file.rb +51 -13
  177. data/lib/puppet/type/file/checksum.rb +4 -4
  178. data/lib/puppet/type/file/source.rb +75 -64
  179. data/lib/puppet/type/notify.rb +2 -2
  180. data/lib/puppet/type/package.rb +41 -3
  181. data/lib/puppet/type/service.rb +59 -8
  182. data/lib/puppet/type/user.rb +19 -29
  183. data/lib/puppet/util.rb +41 -3
  184. data/lib/puppet/util/at_fork.rb +1 -1
  185. data/lib/puppet/util/autoload.rb +13 -25
  186. data/lib/puppet/util/character_encoding.rb +9 -5
  187. data/lib/puppet/util/checksums.rb +19 -4
  188. data/lib/puppet/util/execution.rb +2 -2
  189. data/lib/puppet/util/fileparsing.rb +2 -2
  190. data/lib/puppet/util/instance_loader.rb +14 -10
  191. data/lib/puppet/util/log/destinations.rb +1 -10
  192. data/lib/puppet/util/package/version/debian.rb +175 -0
  193. data/lib/puppet/util/package/version/gem.rb +15 -0
  194. data/lib/puppet/util/package/version/pip.rb +167 -0
  195. data/lib/puppet/util/package/version/range.rb +53 -0
  196. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  197. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  198. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  199. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  200. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  201. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  202. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  203. data/lib/puppet/util/package/version/rpm.rb +73 -0
  204. data/lib/puppet/util/pidlock.rb +13 -7
  205. data/lib/puppet/util/platform.rb +5 -0
  206. data/lib/puppet/util/provider_features.rb +1 -1
  207. data/lib/puppet/util/reference.rb +1 -1
  208. data/lib/puppet/util/rpm_compare.rb +193 -0
  209. data/lib/puppet/util/windows.rb +1 -0
  210. data/lib/puppet/util/windows/adsi.rb +2 -2
  211. data/lib/puppet/util/windows/api_types.rb +60 -33
  212. data/lib/puppet/util/windows/eventlog.rb +1 -6
  213. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  214. data/lib/puppet/util/windows/principal.rb +8 -6
  215. data/lib/puppet/util/windows/process.rb +15 -14
  216. data/lib/puppet/util/windows/registry.rb +11 -11
  217. data/lib/puppet/util/windows/security.rb +5 -4
  218. data/lib/puppet/util/windows/service.rb +43 -26
  219. data/lib/puppet/util/windows/sid.rb +3 -3
  220. data/lib/puppet/util/windows/user.rb +242 -8
  221. data/lib/puppet/version.rb +1 -1
  222. data/locales/puppet.pot +641 -511
  223. data/man/man5/puppet.conf.5 +75 -10
  224. data/man/man8/puppet-agent.8 +7 -7
  225. data/man/man8/puppet-apply.8 +1 -1
  226. data/man/man8/puppet-catalog.8 +1 -1
  227. data/man/man8/puppet-config.8 +1 -1
  228. data/man/man8/puppet-describe.8 +1 -1
  229. data/man/man8/puppet-device.8 +2 -2
  230. data/man/man8/puppet-doc.8 +1 -1
  231. data/man/man8/puppet-epp.8 +1 -1
  232. data/man/man8/puppet-facts.8 +1 -1
  233. data/man/man8/puppet-filebucket.8 +17 -2
  234. data/man/man8/puppet-generate.8 +1 -1
  235. data/man/man8/puppet-help.8 +6 -3
  236. data/man/man8/puppet-key.8 +1 -1
  237. data/man/man8/puppet-lookup.8 +2 -2
  238. data/man/man8/puppet-man.8 +1 -1
  239. data/man/man8/puppet-module.8 +4 -1
  240. data/man/man8/puppet-node.8 +1 -1
  241. data/man/man8/puppet-parser.8 +1 -1
  242. data/man/man8/puppet-plugin.8 +1 -1
  243. data/man/man8/puppet-report.8 +1 -1
  244. data/man/man8/puppet-resource.8 +1 -1
  245. data/man/man8/puppet-script.8 +1 -1
  246. data/man/man8/puppet-ssl.8 +2 -2
  247. data/man/man8/puppet-status.8 +1 -1
  248. data/man/man8/puppet.8 +2 -2
  249. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  250. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  251. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  252. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  253. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  254. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  255. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  256. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  257. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  258. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  259. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  260. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  261. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  262. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -67
  263. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +1 -69
  264. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -69
  265. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -67
  266. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -65
  267. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -67
  268. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +1 -67
  269. data/spec/integration/application/agent_spec.rb +475 -0
  270. data/spec/integration/application/apply_spec.rb +279 -150
  271. data/spec/integration/application/config_spec.rb +74 -0
  272. data/spec/integration/application/doc_spec.rb +16 -6
  273. data/spec/integration/application/filebucket_spec.rb +239 -0
  274. data/spec/integration/application/help_spec.rb +42 -0
  275. data/spec/integration/application/lookup_spec.rb +13 -0
  276. data/spec/integration/application/module_spec.rb +68 -0
  277. data/spec/integration/application/plugin_spec.rb +123 -0
  278. data/spec/integration/data_binding_spec.rb +82 -0
  279. data/spec/integration/defaults_spec.rb +1 -2
  280. data/spec/integration/directory_environments_spec.rb +17 -17
  281. data/spec/integration/http/client_spec.rb +47 -37
  282. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  283. data/spec/integration/indirector/report/yaml.rb +83 -0
  284. data/spec/integration/network/http_pool_spec.rb +93 -20
  285. data/spec/integration/node/environment_spec.rb +15 -0
  286. data/spec/integration/parser/compiler_spec.rb +11 -0
  287. data/spec/integration/type/file_spec.rb +1 -1
  288. data/spec/integration/util/execution_spec.rb +22 -0
  289. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  290. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  291. data/spec/integration/util/windows/process_spec.rb +26 -32
  292. data/spec/integration/util/windows/registry_spec.rb +7 -7
  293. data/spec/integration/util/windows/user_spec.rb +47 -5
  294. data/spec/integration/util_spec.rb +7 -33
  295. data/spec/lib/puppet/test_ca.rb +2 -2
  296. data/spec/lib/puppet_spec/https.rb +16 -7
  297. data/spec/lib/puppet_spec/matchers.rb +0 -80
  298. data/spec/lib/puppet_spec/puppetserver.rb +127 -0
  299. data/spec/shared_contexts/https.rb +29 -0
  300. data/spec/unit/agent_spec.rb +80 -26
  301. data/spec/unit/application/agent_spec.rb +12 -9
  302. data/spec/unit/application/describe_spec.rb +88 -50
  303. data/spec/unit/application/device_spec.rb +2 -2
  304. data/spec/unit/application/face_base_spec.rb +6 -4
  305. data/spec/unit/application/facts_spec.rb +39 -10
  306. data/spec/unit/application/filebucket_spec.rb +22 -2
  307. data/spec/unit/application/man_spec.rb +52 -0
  308. data/spec/unit/application/resource_spec.rb +3 -1
  309. data/spec/unit/application/ssl_spec.rb +15 -2
  310. data/spec/unit/configurer/downloader_spec.rb +10 -0
  311. data/spec/unit/configurer/fact_handler_spec.rb +4 -4
  312. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  313. data/spec/unit/configurer_spec.rb +64 -46
  314. data/spec/unit/confine_spec.rb +2 -1
  315. data/spec/unit/context/trusted_information_spec.rb +25 -2
  316. data/spec/unit/daemon_spec.rb +5 -64
  317. data/spec/unit/defaults_spec.rb +24 -1
  318. data/spec/unit/environments_spec.rb +8 -0
  319. data/spec/unit/face/config_spec.rb +3 -1
  320. data/spec/unit/face/module/search_spec.rb +17 -0
  321. data/spec/unit/face/plugin_spec.rb +12 -10
  322. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  323. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  324. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  325. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  326. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  327. data/spec/unit/file_system/uniquefile_spec.rb +29 -0
  328. data/spec/unit/file_system_spec.rb +10 -0
  329. data/spec/unit/functions/lookup_spec.rb +13 -0
  330. data/spec/unit/http/client_spec.rb +321 -36
  331. data/spec/unit/http/external_client_spec.rb +201 -0
  332. data/spec/unit/http/resolver_spec.rb +34 -3
  333. data/spec/unit/http/response_spec.rb +75 -0
  334. data/spec/unit/http/service/ca_spec.rb +53 -12
  335. data/spec/unit/http/service/compiler_spec.rb +332 -28
  336. data/spec/unit/http/service/file_server_spec.rb +100 -12
  337. data/spec/unit/http/service/report_spec.rb +19 -9
  338. data/spec/unit/http/service_spec.rb +94 -6
  339. data/spec/unit/http/session_spec.rb +159 -8
  340. data/spec/unit/indirector/catalog/compiler_spec.rb +1 -0
  341. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  342. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  343. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  344. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  345. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  346. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  347. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  348. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  349. data/spec/unit/indirector/request_spec.rb +1 -1
  350. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  351. data/spec/unit/indirector/rest_spec.rb +13 -0
  352. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  353. data/spec/unit/interface_spec.rb +3 -3
  354. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  355. data/spec/unit/network/format_support_spec.rb +3 -2
  356. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  357. data/spec/unit/network/http/connection_spec.rb +552 -190
  358. data/spec/unit/network/http/nocache_pool_spec.rb +22 -0
  359. data/spec/unit/network/http/pool_spec.rb +59 -13
  360. data/spec/unit/network/http_pool_spec.rb +63 -57
  361. data/spec/unit/network/http_spec.rb +1 -1
  362. data/spec/unit/node/environment_spec.rb +33 -0
  363. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  364. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  365. data/spec/unit/parser/scope_spec.rb +1 -1
  366. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  367. data/spec/unit/pops/loaders/loaders_spec.rb +71 -1
  368. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  369. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  370. data/spec/unit/provider/group/groupadd_spec.rb +22 -8
  371. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  372. data/spec/unit/provider/package/aix_spec.rb +29 -0
  373. data/spec/unit/provider/package/apt_spec.rb +107 -0
  374. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  375. data/spec/unit/provider/package/dnfmodule_spec.rb +54 -15
  376. data/spec/unit/provider/package/gem_spec.rb +40 -0
  377. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  378. data/spec/unit/provider/package/pip_spec.rb +68 -19
  379. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  380. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  381. data/spec/unit/provider/package/portage_spec.rb +5 -0
  382. data/spec/unit/provider/package/puppet_gem_spec.rb +12 -1
  383. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  384. data/spec/unit/provider/package/yum_spec.rb +243 -1
  385. data/spec/unit/provider/package/zypper_spec.rb +98 -0
  386. data/spec/unit/provider/service/init_spec.rb +42 -0
  387. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  388. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  389. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  390. data/spec/unit/provider/service/systemd_spec.rb +93 -18
  391. data/spec/unit/provider/service/windows_spec.rb +50 -14
  392. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  393. data/spec/unit/provider/user/useradd_spec.rb +30 -16
  394. data/spec/unit/provider/user/windows_adsi_spec.rb +85 -3
  395. data/spec/unit/puppet_pal_2pec.rb +11 -0
  396. data/spec/unit/puppet_pal_catalog_spec.rb +43 -0
  397. data/spec/unit/puppet_spec.rb +33 -0
  398. data/spec/unit/reports/http_spec.rb +70 -52
  399. data/spec/unit/reports/store_spec.rb +17 -13
  400. data/spec/unit/resource_spec.rb +3 -3
  401. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  402. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  403. data/spec/unit/ssl/host_spec.rb +4 -2
  404. data/spec/unit/ssl/oids_spec.rb +1 -0
  405. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  406. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  407. data/spec/unit/test/test_helper_spec.rb +17 -0
  408. data/spec/unit/transaction/persistence_spec.rb +15 -0
  409. data/spec/unit/transaction/report_spec.rb +5 -1
  410. data/spec/unit/transaction_spec.rb +0 -2
  411. data/spec/unit/type/file/ensure_spec.rb +1 -2
  412. data/spec/unit/type/file/source_spec.rb +89 -38
  413. data/spec/unit/type/file_spec.rb +122 -96
  414. data/spec/unit/type/service_spec.rb +218 -8
  415. data/spec/unit/type/user_spec.rb +32 -3
  416. data/spec/unit/type_spec.rb +50 -0
  417. data/spec/unit/util/at_fork_spec.rb +3 -2
  418. data/spec/unit/util/autoload_spec.rb +2 -1
  419. data/spec/unit/util/character_encoding_spec.rb +4 -4
  420. data/spec/unit/util/checksums_spec.rb +16 -0
  421. data/spec/unit/util/command_line_spec.rb +11 -6
  422. data/spec/unit/util/log/destinations_spec.rb +1 -29
  423. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  424. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  425. data/spec/unit/util/package/version/range_spec.rb +175 -0
  426. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  427. data/spec/unit/util/pidlock_spec.rb +102 -54
  428. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  429. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  430. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  431. data/spec/unit/util/windows/service_spec.rb +4 -4
  432. data/spec/unit/util/windows/sid_spec.rb +2 -2
  433. data/spec/unit/util_spec.rb +3 -3
  434. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  435. data/tasks/generate_cert_fixtures.rake +15 -1
  436. data/tasks/manpages.rake +5 -35
  437. metadata +84 -52
  438. data/COMMITTERS.md +0 -244
  439. data/spec/integration/faces/config_spec.rb +0 -91
  440. data/spec/integration/faces/documentation_spec.rb +0 -57
  441. data/spec/integration/faces/plugin_spec.rb +0 -61
  442. data/spec/integration/file_bucket/file_spec.rb +0 -50
  443. data/spec/integration/file_serving/content_spec.rb +0 -7
  444. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  445. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  446. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  447. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  448. data/spec/integration/module_tool/forge_spec.rb +0 -64
  449. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  450. data/spec/integration/provider/service/init_spec.rb +0 -48
  451. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  452. data/spec/integration/provider/service/windows_spec.rb +0 -50
  453. data/spec/integration/reference/providers_spec.rb +0 -21
  454. data/spec/integration/reports_spec.rb +0 -13
  455. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  456. data/spec/integration/ssl/host_spec.rb +0 -72
  457. data/spec/integration/ssl/key_spec.rb +0 -99
  458. data/spec/integration/test/test_helper_spec.rb +0 -31
  459. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  460. data/spec/unit/face/man_spec.rb +0 -25
  461. data/spec/unit/man_spec.rb +0 -31
@@ -1,6 +1,5 @@
1
1
  # coding: utf-8
2
2
  require 'spec_helper'
3
- require 'webmock/rspec'
4
3
  require 'puppet/http'
5
4
 
6
5
  describe Puppet::HTTP::Service::Compiler do
@@ -12,6 +11,7 @@ describe Puppet::HTTP::Service::Compiler do
12
11
  let(:node) { Puppet::Node.new(certname) }
13
12
  let(:facts) { Puppet::Node::Facts.new(certname) }
14
13
  let(:catalog) { Puppet::Resource::Catalog.new(certname) }
14
+ let(:status) { Puppet::Status.new }
15
15
  let(:formatter) { Puppet::Network::FormatHandler.format(:json) }
16
16
 
17
17
  before :each do
@@ -30,16 +30,7 @@ describe Puppet::HTTP::Service::Compiler do
30
30
  expect(request.headers).to_not include('X-Puppet-Profiling')
31
31
  end.to_return(body: formatter.render(catalog), headers: {'Content-Type' => formatter.mime })
32
32
 
33
- subject.get_catalog(certname, environment: environment, facts: facts)
34
- end
35
-
36
- it 'includes the X-Puppet-Profiling header in requests when Puppet[:profile] is true' do
37
- stub_request(:post, uri).with(headers: {'X-Puppet-Version' => /./, 'User-Agent' => /./, 'X-Puppet-Profiling' => 'true'})
38
- .to_return(body: formatter.render(catalog), headers: {'Content-Type' => formatter.mime })
39
-
40
- Puppet[:profile] = true
41
-
42
- subject.get_catalog(certname, environment: environment, facts: facts)
33
+ subject.post_catalog(certname, environment: environment, facts: facts)
43
34
  end
44
35
  end
45
36
 
@@ -51,7 +42,7 @@ describe Puppet::HTTP::Service::Compiler do
51
42
  stub_request(:post, "https://compiler2.example.com:8141/puppet/v3/catalog/ziggy?environment=testing")
52
43
  .to_return(body: formatter.render(catalog), headers: {'Content-Type' => formatter.mime })
53
44
 
54
- subject.get_catalog(certname, environment: environment, facts: facts)
45
+ subject.post_catalog(certname, environment: environment, facts: facts)
55
46
  end
56
47
  end
57
48
 
@@ -59,12 +50,22 @@ describe Puppet::HTTP::Service::Compiler do
59
50
  let(:uri) { %r{/puppet/v3/catalog/ziggy} }
60
51
  let(:catalog_response) { { body: formatter.render(catalog), headers: {'Content-Type' => formatter.mime } } }
61
52
 
53
+ it 'includes puppet headers set via the :http_extra_headers and :profile settings' do
54
+ stub_request(:post, uri).with(headers: {'Example-Header' => 'real-thing', 'another' => 'thing', 'X-Puppet-Profiling' => 'true'}).
55
+ to_return(body: formatter.render(catalog), headers: {'Content-Type' => formatter.mime })
56
+
57
+ Puppet[:http_extra_headers] = 'Example-Header:real-thing,another:thing'
58
+ Puppet[:profile] = true
59
+
60
+ subject.post_catalog(certname, environment: environment, facts: facts)
61
+ end
62
+
62
63
  it 'submits facts as application/json by default' do
63
64
  stub_request(:post, uri)
64
65
  .with(body: hash_including("facts_format" => /application\/json/))
65
66
  .to_return(**catalog_response)
66
67
 
67
- subject.get_catalog(certname, environment: environment, facts: facts)
68
+ subject.post_catalog(certname, environment: environment, facts: facts)
68
69
  end
69
70
 
70
71
  it 'submits facts as pson if set as the preferred format' do
@@ -74,7 +75,7 @@ describe Puppet::HTTP::Service::Compiler do
74
75
  .with(body: hash_including("facts_format" => /pson/))
75
76
  .to_return(**catalog_response)
76
77
 
77
- subject.get_catalog(certname, environment: environment, facts: facts)
78
+ subject.post_catalog(certname, environment: environment, facts: facts)
78
79
  end
79
80
 
80
81
  it 'includes environment as a query parameter AND in the POST body' do
@@ -83,7 +84,7 @@ describe Puppet::HTTP::Service::Compiler do
83
84
  body: hash_including("environment" => 'outerspace'))
84
85
  .to_return(**catalog_response)
85
86
 
86
- subject.get_catalog(certname, environment: 'outerspace', facts: facts)
87
+ subject.post_catalog(certname, environment: 'outerspace', facts: facts)
87
88
  end
88
89
 
89
90
  it 'includes configured_environment' do
@@ -91,7 +92,7 @@ describe Puppet::HTTP::Service::Compiler do
91
92
  .with(body: hash_including("configured_environment" => 'agent_specified'))
92
93
  .to_return(**catalog_response)
93
94
 
94
- subject.get_catalog(certname, environment: 'production', facts: facts, configured_environment: 'agent_specified')
95
+ subject.post_catalog(certname, environment: 'production', facts: facts, configured_environment: 'agent_specified')
95
96
  end
96
97
 
97
98
  it 'includes transaction_uuid' do
@@ -101,7 +102,7 @@ describe Puppet::HTTP::Service::Compiler do
101
102
  .with(body: hash_including("transaction_uuid" => uuid))
102
103
  .to_return(**catalog_response)
103
104
 
104
- subject.get_catalog(certname, environment: 'production', facts: facts, transaction_uuid: uuid)
105
+ subject.post_catalog(certname, environment: 'production', facts: facts, transaction_uuid: uuid)
105
106
  end
106
107
 
107
108
  it 'includes job_uuid' do
@@ -111,7 +112,7 @@ describe Puppet::HTTP::Service::Compiler do
111
112
  .with(body: hash_including("job_uuid" => uuid))
112
113
  .to_return(**catalog_response)
113
114
 
114
- subject.get_catalog(certname, environment: 'production', facts: facts, job_uuid: uuid)
115
+ subject.post_catalog(certname, environment: 'production', facts: facts, job_uuid: uuid)
115
116
  end
116
117
 
117
118
  it 'includes static_catalog' do
@@ -119,7 +120,7 @@ describe Puppet::HTTP::Service::Compiler do
119
120
  .with(body: hash_including("static_catalog" => "false"))
120
121
  .to_return(**catalog_response)
121
122
 
122
- subject.get_catalog(certname, environment: 'production', facts: facts, static_catalog: false)
123
+ subject.post_catalog(certname, environment: 'production', facts: facts, static_catalog: false)
123
124
  end
124
125
 
125
126
  it 'includes dot-separated list of checksum_types' do
@@ -127,24 +128,32 @@ describe Puppet::HTTP::Service::Compiler do
127
128
  .with(body: hash_including("checksum_type" => "sha256.sha384"))
128
129
  .to_return(**catalog_response)
129
130
 
130
- subject.get_catalog(certname, environment: 'production', facts: facts, checksum_type: %w[sha256 sha384])
131
+ subject.post_catalog(certname, environment: 'production', facts: facts, checksum_type: %w[sha256 sha384])
131
132
  end
132
133
 
133
134
  it 'returns a deserialized catalog' do
134
135
  stub_request(:post, uri)
135
136
  .to_return(**catalog_response)
136
137
 
137
- cat = subject.get_catalog(certname, environment: 'production', facts: facts)
138
+ _, cat = subject.post_catalog(certname, environment: 'production', facts: facts)
138
139
  expect(cat).to be_a(Puppet::Resource::Catalog)
139
140
  expect(cat.name).to eq(certname)
140
141
  end
141
142
 
143
+ it 'returns the request response' do
144
+ stub_request(:post, uri)
145
+ .to_return(**catalog_response)
146
+
147
+ resp, _ = subject.post_catalog(certname, environment: 'production', facts: facts)
148
+ expect(resp).to be_a(Puppet::HTTP::Response)
149
+ end
150
+
142
151
  it 'raises a response error if unsuccessful' do
143
152
  stub_request(:post, uri)
144
153
  .to_return(status: [500, "Server Error"])
145
154
 
146
155
  expect {
147
- subject.get_catalog(certname, environment: 'production', facts: facts)
156
+ subject.post_catalog(certname, environment: 'production', facts: facts)
148
157
  }.to raise_error do |err|
149
158
  expect(err).to be_an_instance_of(Puppet::HTTP::ResponseError)
150
159
  expect(err.message).to eq('Server Error')
@@ -157,7 +166,7 @@ describe Puppet::HTTP::Service::Compiler do
157
166
  .to_return(body: "content-type is missing")
158
167
 
159
168
  expect {
160
- subject.get_catalog(certname, environment: 'production', facts: facts)
169
+ subject.post_catalog(certname, environment: 'production', facts: facts)
161
170
  }.to raise_error(Puppet::HTTP::ProtocolError, /No content type in http response; cannot parse/)
162
171
  end
163
172
 
@@ -166,7 +175,7 @@ describe Puppet::HTTP::Service::Compiler do
166
175
  .to_return(body: "this isn't valid JSON", headers: {'Content-Type' => 'application/json'})
167
176
 
168
177
  expect {
169
- subject.get_catalog(certname, environment: 'production', facts: facts)
178
+ subject.post_catalog(certname, environment: 'production', facts: facts)
170
179
  }.to raise_error(Puppet::HTTP::SerializationError, /Failed to deserialize Puppet::Resource::Catalog from json/)
171
180
  end
172
181
 
@@ -194,7 +203,7 @@ describe Puppet::HTTP::Service::Compiler do
194
203
  .with(body: hash_including("facts" => /#{test_fact[:encoded]}/))
195
204
  .to_return(**catalog_response)
196
205
 
197
- subject.get_catalog(certname, environment: environment, facts: facts)
206
+ subject.post_catalog(certname, environment: environment, facts: facts)
198
207
  end
199
208
  end
200
209
  end
@@ -204,6 +213,16 @@ describe Puppet::HTTP::Service::Compiler do
204
213
  let(:uri) { %r{/puppet/v3/node/ziggy} }
205
214
  let(:node_response) { { body: formatter.render(node), headers: {'Content-Type' => formatter.mime } } }
206
215
 
216
+ it 'includes custom headers set via the :http_extra_headers and :profile settings' do
217
+ stub_request(:get, uri).with(headers: {'Example-Header' => 'real-thing', 'another' => 'thing', 'X-Puppet-Profiling' => 'true'}).
218
+ to_return(**node_response)
219
+
220
+ Puppet[:http_extra_headers] = 'Example-Header:real-thing,another:thing'
221
+ Puppet[:profile] = true
222
+
223
+ subject.get_node(certname, environment: 'production')
224
+ end
225
+
207
226
  it 'includes environment' do
208
227
  stub_request(:get, uri)
209
228
  .with(query: hash_including("environment" => "outerspace"))
@@ -234,11 +253,19 @@ describe Puppet::HTTP::Service::Compiler do
234
253
  stub_request(:get, uri)
235
254
  .to_return(**node_response)
236
255
 
237
- n = subject.get_node(certname, environment: 'production')
256
+ _, n = subject.get_node(certname, environment: 'production')
238
257
  expect(n).to be_a(Puppet::Node)
239
258
  expect(n.name).to eq(certname)
240
259
  end
241
260
 
261
+ it 'returns the request response' do
262
+ stub_request(:get, uri)
263
+ .to_return(**node_response)
264
+
265
+ resp, _ = subject.get_node(certname, environment: 'production')
266
+ expect(resp).to be_a(Puppet::HTTP::Response)
267
+ end
268
+
242
269
  it 'raises a response error if unsuccessful' do
243
270
  stub_request(:get, uri)
244
271
  .to_return(status: [500, "Server Error"])
@@ -271,9 +298,79 @@ describe Puppet::HTTP::Service::Compiler do
271
298
  end
272
299
  end
273
300
 
301
+ context 'when getting facts' do
302
+ let(:uri) { %r{/puppet/v3/facts/ziggy} }
303
+ let(:facts_response) { { body: formatter.render(facts), headers: {'Content-Type' => formatter.mime } } }
304
+
305
+ it 'includes environment' do
306
+ stub_request(:get, uri)
307
+ .with(query: hash_including("environment" => "outerspace"))
308
+ .to_return(**facts_response)
309
+
310
+ subject.get_facts(certname, environment: 'outerspace')
311
+ end
312
+
313
+ it 'returns a deserialized facts object' do
314
+ stub_request(:get, uri)
315
+ .to_return(**facts_response)
316
+
317
+ _, n = subject.get_facts(certname, environment: 'production')
318
+ expect(n).to be_a(Puppet::Node::Facts)
319
+ expect(n.name).to eq(certname)
320
+ end
321
+
322
+ it 'returns the request response' do
323
+ stub_request(:get, uri)
324
+ .to_return(**facts_response)
325
+
326
+ resp, _ = subject.get_facts(certname, environment: 'production')
327
+ expect(resp).to be_a(Puppet::HTTP::Response)
328
+ end
329
+
330
+ it 'raises a response error if unsuccessful' do
331
+ stub_request(:get, uri)
332
+ .to_return(status: [500, "Server Error"])
333
+
334
+ expect {
335
+ subject.get_facts(certname, environment: 'production')
336
+ }.to raise_error do |err|
337
+ expect(err).to be_an_instance_of(Puppet::HTTP::ResponseError)
338
+ expect(err.message).to eq('Server Error')
339
+ expect(err.response.code).to eq(500)
340
+ end
341
+ end
342
+
343
+ it 'raises a protocol error if the content-type header is missing' do
344
+ stub_request(:get, uri)
345
+ .to_return(body: "content-type is missing")
346
+
347
+ expect {
348
+ subject.get_facts(certname, environment: 'production')
349
+ }.to raise_error(Puppet::HTTP::ProtocolError, /No content type in http response; cannot parse/)
350
+ end
351
+
352
+ it 'raises a serialization error if the content is invalid' do
353
+ stub_request(:get, uri)
354
+ .to_return(body: "this isn't valid JSON", headers: {'Content-Type' => 'application/json'})
355
+
356
+ expect {
357
+ subject.get_facts(certname, environment: 'production')
358
+ }.to raise_error(Puppet::HTTP::SerializationError, /Failed to deserialize Puppet::Node::Facts from json/)
359
+ end
360
+ end
361
+
274
362
  context 'when putting facts' do
275
363
  let(:uri) { %r{/puppet/v3/facts/ziggy} }
276
364
 
365
+ it 'includes custom headers set the :http_extra_headers and :profile settings' do
366
+ stub_request(:put, uri).with(headers: {'Example-Header' => 'real-thing', 'another' => 'thing', 'X-Puppet-Profiling' => 'true'})
367
+
368
+ Puppet[:http_extra_headers] = 'Example-Header:real-thing,another:thing'
369
+ Puppet[:profile] = true
370
+
371
+ subject.put_facts(certname, environment: environment, facts: facts)
372
+ end
373
+
277
374
  it 'serializes facts in the body' do
278
375
  facts = Puppet::Node::Facts.new(certname, { 'domain' => 'zork'})
279
376
  Puppet::Node::Facts.indirection.save(facts)
@@ -291,12 +388,12 @@ describe Puppet::HTTP::Service::Compiler do
291
388
  subject.put_facts(certname, environment: 'outerspace', facts: facts)
292
389
  end
293
390
 
294
- it 'returns true' do
391
+ it 'returns the request response' do
295
392
  # the REST API returns the filename, good grief
296
393
  stub_request(:put, uri)
297
394
  .to_return(status: 200, body: "/opt/puppetlabs/server/data/puppetserver/yaml/facts/#{certname}.yaml")
298
395
 
299
- expect(subject.put_facts(certname, environment: environment, facts: facts)).to eq(true)
396
+ expect(subject.put_facts(certname, environment: environment, facts: facts)).to be_a(Puppet::HTTP::Response)
300
397
  end
301
398
 
302
399
  it 'raises a response error if unsuccessful' do
@@ -319,4 +416,211 @@ describe Puppet::HTTP::Service::Compiler do
319
416
  }.to raise_error(Puppet::HTTP::SerializationError, /Failed to serialize Puppet::Node::Facts to json: "\\xE2" from ASCII-8BIT to UTF-8/)
320
417
  end
321
418
  end
419
+
420
+ context 'when getting status' do
421
+ let(:uri) { %r{/puppet/v3/status/ziggy} }
422
+ let(:status_response) { { body: formatter.render(status), headers: {'Content-Type' => formatter.mime } } }
423
+
424
+ it 'always sends production' do
425
+ stub_request(:get, uri)
426
+ .with(query: hash_including("environment" => "production"))
427
+ .to_return(**status_response)
428
+
429
+ subject.get_status(certname)
430
+ end
431
+
432
+ it 'returns a deserialized status' do
433
+ stub_request(:get, uri)
434
+ .to_return(**status_response)
435
+
436
+ _, s = subject.get_status(certname)
437
+ expect(s).to be_a(Puppet::Status)
438
+ expect(s.status).to eq("is_alive" => true)
439
+ end
440
+
441
+ it 'returns the request response' do
442
+ stub_request(:get, uri)
443
+ .to_return(**status_response)
444
+
445
+ resp, _ = subject.get_status(certname)
446
+ expect(resp).to be_a(Puppet::HTTP::Response)
447
+ end
448
+
449
+ it 'raises a response error if unsuccessful' do
450
+ stub_request(:get, uri)
451
+ .to_return(status: [500, "Server Error"])
452
+
453
+ expect {
454
+ subject.get_status(certname)
455
+ }.to raise_error do |err|
456
+ expect(err).to be_an_instance_of(Puppet::HTTP::ResponseError)
457
+ expect(err.message).to eq('Server Error')
458
+ expect(err.response.code).to eq(500)
459
+ end
460
+ end
461
+
462
+ it 'raises a protocol error if the content-type header is missing' do
463
+ stub_request(:get, uri)
464
+ .to_return(body: "content-type is missing")
465
+
466
+ expect {
467
+ subject.get_status(certname)
468
+ }.to raise_error(Puppet::HTTP::ProtocolError, /No content type in http response; cannot parse/)
469
+ end
470
+
471
+ it 'raises a serialization error if the content is invalid' do
472
+ stub_request(:get, uri)
473
+ .to_return(body: "this isn't valid JSON", headers: {'Content-Type' => 'application/json'})
474
+
475
+ expect {
476
+ subject.get_status(certname)
477
+ }.to raise_error(Puppet::HTTP::SerializationError, /Failed to deserialize Puppet::Status from json/)
478
+ end
479
+ end
480
+
481
+ context 'filebucket' do
482
+ let(:filebucket_file) { Puppet::FileBucket::File.new('file to store') }
483
+ let(:formatter) { Puppet::Network::FormatHandler.format(:binary) }
484
+ let(:path) { "md5/4aabe1257043bd03ce4c3319c155bc55" }
485
+ let(:uri) { %r{/puppet/v3/file_bucket_file/#{path}} }
486
+
487
+ context 'when getting a file' do
488
+ let(:status_response) { { body: formatter.render(filebucket_file), headers: {'Content-Type' => 'application/octet-stream' }}}
489
+
490
+ it 'includes default HTTP headers' do
491
+ stub_request(:get, uri).with do |request|
492
+ expect(request.headers).to include({
493
+ 'X-Puppet-Version' => /./,
494
+ 'User-Agent' => /./,
495
+ 'Accept' => 'application/octet-stream'
496
+ })
497
+ expect(request.headers).to_not include('X-Puppet-Profiling')
498
+ end.to_return(**status_response)
499
+
500
+ subject.get_filebucket_file(path, environment: 'production')
501
+ end
502
+
503
+ it 'always the environment as a parameter' do
504
+ stub_request(:get, uri).with(query: hash_including('environment' => 'production')).to_return(**status_response)
505
+
506
+ subject.get_filebucket_file(path, environment: 'production')
507
+ end
508
+
509
+ {bucket_path: 'path', diff_with: '4aabe1257043bd0', list_all: 'true', fromdate: '20200404', todate: '20200404'}.each do |param, val|
510
+ it "includes #{param} as a parameter in the request if #{param} is set" do
511
+ stub_request(:get, uri).with(query: hash_including(param => val)).to_return(**status_response)
512
+
513
+ options = { param => val }
514
+ subject.get_filebucket_file(path, environment: 'production', **options)
515
+ end
516
+ end
517
+
518
+ it "doesn't include :diff_with as a query param if :bucket_path is nil" do
519
+ stub_request(:get, uri).with do |request|
520
+ expect(request.uri.query).not_to match(/diff_with/)
521
+ end.to_return(**status_response)
522
+
523
+ subject.get_filebucket_file(path, environment: 'production', diff_with: nil)
524
+ end
525
+
526
+ it 'returns a deserialized response' do
527
+ stub_request(:get, uri)
528
+ .to_return(**status_response)
529
+
530
+ _, s = subject.get_filebucket_file(path, environment: 'production')
531
+ expect(s).to be_a(Puppet::FileBucket::File)
532
+ expect(s.contents).to eq('file to store')
533
+ end
534
+
535
+ it 'returns the request response' do
536
+ stub_request(:get, uri)
537
+ .to_return(**status_response)
538
+
539
+ resp, _ = subject.get_filebucket_file(path, environment: 'production')
540
+ expect(resp).to be_a(Puppet::HTTP::Response)
541
+ end
542
+ end
543
+
544
+ context 'when putting a file' do
545
+ let(:status_response) { { status: 200, body: '' } }
546
+
547
+ it 'includes default HTTP headers' do
548
+ stub_request(:put, uri).with do |request|
549
+ expect(request.headers).to include({
550
+ 'X-Puppet-Version' => /./,
551
+ 'User-Agent' => /./,
552
+ 'Accept' => 'application/octet-stream',
553
+ 'Content-Type' => 'application/octet-stream'
554
+ })
555
+ expect(request.headers).to_not include('X-Puppet-Profiling')
556
+ end.to_return(**status_response)
557
+
558
+ subject.put_filebucket_file(path, body: filebucket_file.contents, environment: 'production')
559
+ end
560
+
561
+ it 'always the environment as a parameter' do
562
+ stub_request(:put, uri).with(query: hash_including('environment' => 'production')).to_return(**status_response)
563
+
564
+ subject.put_filebucket_file(path, body: filebucket_file.contents, environment: 'production')
565
+ end
566
+
567
+ it 'sends the file contents as the request body' do
568
+ stub_request(:put, uri).with(body: filebucket_file.contents).to_return(**status_response)
569
+
570
+ subject.put_filebucket_file(path, body: filebucket_file.contents, environment: 'production')
571
+ end
572
+
573
+ it 'returns the request response' do
574
+ stub_request(:put, uri)
575
+ .to_return(**status_response)
576
+
577
+ s = subject.put_filebucket_file(path, body: filebucket_file.contents, environment: 'production')
578
+ expect(s).to be_a(Puppet::HTTP::Response)
579
+ end
580
+ end
581
+
582
+ context 'when heading a file' do
583
+ let(:status_response) {{ status: 200 }}
584
+
585
+ it 'includes default HTTP headers' do
586
+ stub_request(:head, uri).with do |request|
587
+ expect(request.headers).to include({
588
+ 'X-Puppet-Version' => /./,
589
+ 'User-Agent' => /./,
590
+ 'Accept' => 'application/octet-stream',
591
+ })
592
+ expect(request.headers).to_not include('X-Puppet-Profiling')
593
+ end.to_return(**status_response)
594
+
595
+ subject.head_filebucket_file(path, environment: 'production')
596
+ end
597
+
598
+ it 'always the environment as a parameter' do
599
+ stub_request(:head, uri).with(query: hash_including('environment' => 'production')).to_return(**status_response)
600
+
601
+ subject.head_filebucket_file(path, environment: 'production')
602
+ end
603
+
604
+ it "includes :bucket_path as a parameter in the request if :bucket_path is set" do
605
+ stub_request(:head, uri).with(query: hash_including(:bucket_path => 'some/path')).to_return(**status_response)
606
+
607
+ subject.head_filebucket_file(path, environment: 'production', bucket_path: 'some/path')
608
+ end
609
+
610
+ it "doesn't include :bucket_path as a query param if :bucket_path is nil" do
611
+ stub_request(:head, uri).with do |request|
612
+ expect(request.uri.query).not_to match(/bucket_path/)
613
+ end.to_return(**status_response)
614
+
615
+ subject.head_filebucket_file(path, environment: 'production', bucket_path: nil)
616
+ end
617
+
618
+ it "returns the request response" do
619
+ stub_request(:head, uri).with(query: hash_including(:bucket_path => 'some/path')).to_return(**status_response)
620
+
621
+ resp = subject.head_filebucket_file(path, environment: 'production', bucket_path: 'some/path')
622
+ expect(resp).to be_a(Puppet::HTTP::Response)
623
+ end
624
+ end
625
+ end
322
626
  end