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
@@ -0,0 +1,308 @@
1
+ require 'spec_helper'
2
+ require 'webmock/rspec'
3
+ require 'puppet/http'
4
+
5
+ describe Puppet::HTTP::Service::FileServer do
6
+ include PuppetSpec::Files
7
+
8
+ let(:ssl_context) { Puppet::SSL::SSLContext.new }
9
+ let(:client) { Puppet::HTTP::Client.new(ssl_context: ssl_context) }
10
+ let(:subject) { client.create_session.route_to(:fileserver) }
11
+ let(:environment) { 'testing' }
12
+ let(:report) { Puppet::Transaction::Report.new }
13
+
14
+ before :each do
15
+ Puppet[:server] = 'www.example.com'
16
+ Puppet[:masterport] = 443
17
+ end
18
+
19
+ context 'when making requests' do
20
+ let(:uri) {"https://www.example.com:443/puppet/v3/file_content/:mount/:path?environment=testing"}
21
+
22
+ it 'includes default HTTP headers' do
23
+ stub_request(:get, uri).with do |request|
24
+ expect(request.headers).to include({'X-Puppet-Version' => /./, 'User-Agent' => /./})
25
+ expect(request.headers).to_not include('X-Puppet-Profiling')
26
+ end
27
+
28
+ subject.get_file_content(path: '/:mount/:path', environment: environment) { |data| }
29
+ end
30
+ end
31
+
32
+ context 'when routing to the file service' do
33
+ it 'defaults the server and port based on settings' do
34
+ Puppet[:server] = 'file.example.com'
35
+ Puppet[:masterport] = 8141
36
+
37
+ stub_request(:get, "https://file.example.com:8141/puppet/v3/file_content/:mount/:path?environment=testing")
38
+
39
+ subject.get_file_content(path: '/:mount/:path', environment: environment) { |data| }
40
+ end
41
+ end
42
+
43
+ context 'retrieving file metadata' do
44
+ let(:path) { tmpfile('get_file_metadata') }
45
+ let(:url) { "https://www.example.com/puppet/v3/file_metadata/:mount/#{path}?checksum_type=md5&environment=testing&links=manage&source_permissions=ignore" }
46
+ let(:filemetadata) { Puppet::FileServing::Metadata.new(path) }
47
+ let(:request_path) { "/:mount/#{path}"}
48
+
49
+ it 'includes puppet headers set via the :http_extra_headers and :profile settings' do
50
+ stub_request(:get, url).with(headers: {'Example-Header' => 'real-thing', 'another' => 'thing', 'X-Puppet-Profiling' => 'true'}).
51
+ to_return(status: 200, body: filemetadata.render, headers: { 'Content-Type' => 'application/json' })
52
+
53
+ Puppet[:http_extra_headers] = 'Example-Header:real-thing,another:thing'
54
+ Puppet[:profile] = true
55
+
56
+ subject.get_file_metadata(path: request_path, environment: environment)
57
+ end
58
+
59
+ it 'submits a request for file metadata to the server' do
60
+ stub_request(:get, url).with(
61
+ headers: {'Accept'=>'application/json, application/x-msgpack, text/pson',}
62
+ ).to_return(
63
+ status: 200, body: filemetadata.render, headers: { 'Content-Type' => 'application/json' }
64
+ )
65
+
66
+ _, metadata = subject.get_file_metadata(path: request_path, environment: environment)
67
+ expect(metadata.path).to eq(path)
68
+ end
69
+
70
+ it 'returns the request response' do
71
+ stub_request(:get, url).to_return(
72
+ status: 200, body: filemetadata.render, headers: { 'Content-Type' => 'application/json' }
73
+ )
74
+
75
+ resp, _ = subject.get_file_metadata(path: request_path, environment: environment)
76
+ expect(resp).to be_a(Puppet::HTTP::Response)
77
+ end
78
+
79
+ it 'raises a protocol error if the Content-Type header is missing from the response' do
80
+ stub_request(:get, url).to_return(status: 200, body: '', headers: {})
81
+
82
+ expect {
83
+ subject.get_file_metadata(path: request_path, environment: environment)
84
+ }.to raise_error(Puppet::HTTP::ProtocolError, "No content type in http response; cannot parse")
85
+ end
86
+
87
+ it 'raises an error if the Content-Type is unsupported' do
88
+ stub_request(:get, url).to_return(status: 200, body: '', headers: { 'Content-Type' => 'text/yaml' })
89
+
90
+ expect {
91
+ subject.get_file_metadata(path: request_path, environment: environment)
92
+ }.to raise_error(Puppet::HTTP::ProtocolError, "Content-Type is unsupported")
93
+ end
94
+
95
+ it 'raises response error if unsuccessful' do
96
+ stub_request(:get, url).to_return(status: [400, 'Bad Request'])
97
+
98
+ expect {
99
+ subject.get_file_metadata(path: request_path, environment: environment)
100
+ }.to raise_error do |err|
101
+ expect(err).to be_an_instance_of(Puppet::HTTP::ResponseError)
102
+ expect(err.message).to eq('Bad Request')
103
+ expect(err.response.code).to eq(400)
104
+ end
105
+ end
106
+
107
+ it 'raises a serialization error if serialization fails' do
108
+ stub_request(:get, url).to_return(
109
+ status: 200, body: '', headers: { 'Content-Type' => 'application/json' }
110
+ )
111
+
112
+ expect {
113
+ subject.get_file_metadata(path: request_path, environment: environment)
114
+ }.to raise_error(Puppet::HTTP::SerializationError, /Failed to deserialize Puppet::FileServing::Metadata from json/)
115
+ end
116
+
117
+ it 'raises response error if path is relative' do
118
+ expect {
119
+ subject.get_file_metadata(path: 'relative_path', environment: environment)
120
+ }.to raise_error(ArgumentError, 'Path must start with a slash')
121
+ end
122
+ end
123
+
124
+ context 'retrieving multiple file metadatas' do
125
+ let(:path) { tmpfile('get_file_metadatas') }
126
+ let(:url) { "https://www.example.com/puppet/v3/file_metadatas/:mount/#{path}?checksum_type=md5&links=manage&recurse=false&source_permissions=ignore&environment=testing" }
127
+ let(:filemetadatas) { [Puppet::FileServing::Metadata.new(path)] }
128
+ let(:formatter) { Puppet::Network::FormatHandler.format(:json) }
129
+ let(:request_path) { "/:mount/#{path}"}
130
+
131
+ it 'includes puppet headers set via the :http_extra_headers and :profile settings' do
132
+ stub_request(:get, url).with(headers: {'Example-Header' => 'real-thing', 'another' => 'thing', 'X-Puppet-Profiling' => 'true'}).
133
+ to_return(status: 200, body: formatter.render_multiple(filemetadatas), headers: { 'Content-Type' => 'application/json' })
134
+
135
+ Puppet[:http_extra_headers] = 'Example-Header:real-thing,another:thing'
136
+ Puppet[:profile] = true
137
+
138
+ subject.get_file_metadatas(path: request_path, environment: environment)
139
+ end
140
+
141
+ it 'submits a request for file metadata to the server' do
142
+ stub_request(:get, url).with(
143
+ headers: {'Accept'=>'application/json, application/x-msgpack, text/pson',}
144
+ ).to_return(
145
+ status: 200, body: formatter.render_multiple(filemetadatas), headers: { 'Content-Type' => 'application/json' }
146
+ )
147
+
148
+ _, metadatas = subject.get_file_metadatas(path: request_path, environment: environment)
149
+ expect(metadatas.first.path).to eq(path)
150
+ end
151
+
152
+ it 'returns the request response' do
153
+ stub_request(:get, url).to_return(
154
+ status: 200, body: formatter.render_multiple(filemetadatas), headers: { 'Content-Type' => 'application/json' }
155
+ )
156
+
157
+ resp, _ = subject.get_file_metadatas(path: request_path, environment: environment)
158
+ expect(resp).to be_a(Puppet::HTTP::Response)
159
+ end
160
+
161
+ it 'automatically converts an array of parameters to the stringified query' do
162
+ url = "https://www.example.com/puppet/v3/file_metadatas/:mount/#{path}?checksum_type=md5&environment=testing&ignore=CVS&ignore=.git&ignore=.hg&links=manage&recurse=false&source_permissions=ignore"
163
+ stub_request(:get, url).with(
164
+ headers: {'Accept'=>'application/json, application/x-msgpack, text/pson',}
165
+ ).to_return(
166
+ status: 200, body: formatter.render_multiple(filemetadatas), headers: { 'Content-Type' => 'application/json' }
167
+ )
168
+
169
+ _, metadatas = subject.get_file_metadatas(path: request_path, environment: environment, ignore: ['CVS', '.git', '.hg'])
170
+ expect(metadatas.first.path).to eq(path)
171
+ end
172
+
173
+ it 'raises a protocol error if the Content-Type header is missing from the response' do
174
+ stub_request(:get, url).to_return(status: 200, body: '', headers: {})
175
+
176
+ expect {
177
+ subject.get_file_metadatas(path: request_path, environment: environment)
178
+ }.to raise_error(Puppet::HTTP::ProtocolError, "No content type in http response; cannot parse")
179
+ end
180
+
181
+ it 'raises an error if the Content-Type is unsupported' do
182
+ stub_request(:get, url).to_return(status: 200, body: '', headers: { 'Content-Type' => 'text/yaml' })
183
+
184
+ expect {
185
+ subject.get_file_metadatas(path: request_path, environment: environment)
186
+ }.to raise_error(Puppet::HTTP::ProtocolError, "Content-Type is unsupported")
187
+ end
188
+
189
+ it 'raises response error if unsuccessful' do
190
+ stub_request(:get, url).to_return(status: [400, 'Bad Request'])
191
+
192
+ expect {
193
+ subject.get_file_metadatas(path: request_path, environment: environment)
194
+ }.to raise_error do |err|
195
+ expect(err).to be_an_instance_of(Puppet::HTTP::ResponseError)
196
+ expect(err.message).to eq('Bad Request')
197
+ expect(err.response.code).to eq(400)
198
+ end
199
+ end
200
+
201
+ it 'raises a serialization error if serialization fails' do
202
+ stub_request(:get, url).to_return(
203
+ status: 200, body: '', headers: { 'Content-Type' => 'application/json' }
204
+ )
205
+
206
+ expect {
207
+ subject.get_file_metadatas(path: request_path, environment: environment)
208
+ }.to raise_error(Puppet::HTTP::SerializationError, /Failed to deserialize multiple Puppet::FileServing::Metadata from json/)
209
+ end
210
+
211
+ it 'raises response error if path is relative' do
212
+ expect {
213
+ subject.get_file_metadatas(path: 'relative_path', environment: environment)
214
+ }.to raise_error(ArgumentError, 'Path must start with a slash')
215
+ end
216
+ end
217
+
218
+ context 'getting file content' do
219
+ let(:uri) {"https://www.example.com:443/puppet/v3/file_content/:mount/:path?environment=testing"}
220
+
221
+ it 'includes puppet headers set via the :http_extra_headers and :profile settings' do
222
+ stub_request(:get, uri).with(headers: {'Example-Header' => 'real-thing', 'another' => 'thing', 'X-Puppet-Profiling' => 'true'}).
223
+ to_return(status: 200, body: "and beyond")
224
+
225
+ Puppet[:http_extra_headers] = 'Example-Header:real-thing,another:thing'
226
+ Puppet[:profile] = true
227
+
228
+ expect { |b|
229
+ subject.get_file_content(path: '/:mount/:path', environment: environment, &b)
230
+ }.to yield_with_args("and beyond")
231
+ end
232
+
233
+ it 'yields file content' do
234
+ stub_request(:get, uri).with do |request|
235
+ expect(request.headers).to include({'Accept' => 'application/octet-stream'})
236
+ end.to_return(status: 200, body: "and beyond")
237
+
238
+ expect { |b|
239
+ subject.get_file_content(path: '/:mount/:path', environment: environment, &b)
240
+ }.to yield_with_args("and beyond")
241
+ end
242
+
243
+ it 'returns the request response' do
244
+ stub_request(:get, uri)
245
+
246
+ resp = subject.get_file_content(path: '/:mount/:path', environment: environment) { |b| b }
247
+ expect(resp).to be_a(Puppet::HTTP::Response)
248
+ end
249
+
250
+ it 'raises response error if unsuccessful' do
251
+ stub_request(:get, uri).to_return(status: [400, 'Bad Request'])
252
+
253
+ expect {
254
+ subject.get_file_content(path: '/:mount/:path', environment: environment) { |data| }
255
+ }.to raise_error do |err|
256
+ expect(err).to be_an_instance_of(Puppet::HTTP::ResponseError)
257
+ expect(err.message).to eq('Bad Request')
258
+ expect(err.response.code).to eq(400)
259
+ end
260
+ end
261
+
262
+ it 'raises response error if path is relative' do
263
+ expect {
264
+ subject.get_file_content(path: 'relative_path', environment: environment) { |data| }
265
+ }.to raise_error(ArgumentError, 'Path must start with a slash')
266
+ end
267
+ end
268
+
269
+ context 'getting static file content' do
270
+ let(:code_id) { "0fc72115-adc6-4b1a-aa50-8f31b3ece440" }
271
+ let(:uri) { "https://www.example.com:443/puppet/v3/static_file_content/:mount/:path?environment=testing&code_id=#{code_id}"}
272
+
273
+ it 'yields file content' do
274
+ stub_request(:get, uri).with do |request|
275
+ expect(request.headers).to include({'Accept' => 'application/octet-stream'})
276
+ end.to_return(status: 200, body: "and beyond")
277
+
278
+ expect { |b|
279
+ subject.get_static_file_content(path: '/:mount/:path', environment: environment, code_id: code_id, &b)
280
+ }.to yield_with_args("and beyond")
281
+ end
282
+
283
+ it 'returns the request response' do
284
+ stub_request(:get, uri)
285
+
286
+ resp = subject.get_static_file_content(path: '/:mount/:path', environment: environment, code_id: code_id) { |b| b }
287
+ expect(resp).to be_a(Puppet::HTTP::Response)
288
+ end
289
+
290
+ it 'raises response error if unsuccessful' do
291
+ stub_request(:get, uri).to_return(status: [400, 'Bad Request'])
292
+
293
+ expect {
294
+ subject.get_static_file_content(path: '/:mount/:path', environment: environment, code_id: code_id) { |data| }
295
+ }.to raise_error do |err|
296
+ expect(err).to be_an_instance_of(Puppet::HTTP::ResponseError)
297
+ expect(err.message).to eq('Bad Request')
298
+ expect(err.response.code).to eq(400)
299
+ end
300
+ end
301
+
302
+ it 'raises response error if path is relative' do
303
+ expect {
304
+ subject.get_static_file_content(path: 'relative_path', environment: environment, code_id: code_id) { |data| }
305
+ }.to raise_error(ArgumentError, 'Path must start with a slash')
306
+ end
307
+ end
308
+ end
@@ -6,7 +6,7 @@ describe Puppet::HTTP::Service::Report do
6
6
  let(:ssl_context) { Puppet::SSL::SSLContext.new }
7
7
  let(:client) { Puppet::HTTP::Client.new(ssl_context: ssl_context) }
8
8
  let(:subject) { client.create_session.route_to(:report) }
9
- let(:environment) { Puppet::Node::Environment.create(:testing, []) }
9
+ let(:environment) { 'testing' }
10
10
  let(:report) { Puppet::Transaction::Report.new }
11
11
 
12
12
  before :each do
@@ -25,14 +25,6 @@ describe Puppet::HTTP::Service::Report do
25
25
 
26
26
  subject.put_report('report', report, environment: environment)
27
27
  end
28
-
29
- it 'includes the X-Puppet-Profiling header when Puppet[:profile] is true' do
30
- stub_request(:put, uri).with(headers: {'X-Puppet-Version' => /./, 'User-Agent' => /./, 'X-Puppet-Profiling' => 'true'})
31
-
32
- Puppet[:profile] = true
33
-
34
- subject.put_report('report', report, environment: environment)
35
- end
36
28
  end
37
29
 
38
30
  context 'when routing to the report service' do
@@ -60,6 +52,15 @@ describe Puppet::HTTP::Service::Report do
60
52
  context 'when submitting a report' do
61
53
  let(:url) { "https://www.example.com/puppet/v3/report/infinity?environment=testing" }
62
54
 
55
+ it 'includes puppet headers set via the :http_extra_headers and :profile settings' do
56
+ stub_request(:put, url).with(headers: {'Example-Header' => 'real-thing', 'another' => 'thing', 'X-Puppet-Profiling' => 'true'})
57
+
58
+ Puppet[:http_extra_headers] = 'Example-Header:real-thing,another:thing'
59
+ Puppet[:profile] = true
60
+
61
+ subject.put_report('infinity', report, environment: environment)
62
+ end
63
+
63
64
  it 'submits a report to the "report" endpoint' do
64
65
  stub_request(:put, url)
65
66
  .with(
@@ -72,6 +73,23 @@ describe Puppet::HTTP::Service::Report do
72
73
  subject.put_report('infinity', report, environment: environment)
73
74
  end
74
75
 
76
+ it 'percent encodes the uri before submitting the report' do
77
+ stub_request(:put, "https://www.example.com/puppet/v3/report/node%20name?environment=testing")
78
+ .to_return(status: 200, body: "", headers: {})
79
+
80
+ subject.put_report('node name', report, environment: environment)
81
+ end
82
+
83
+ it 'returns the response whose body contains the list of report processors' do
84
+ body = "[\"store\":\"http\"]"
85
+ stub_request(:put, url)
86
+ .to_return(status: 200, body: body, headers: {'Content-Type' => 'application/json'})
87
+
88
+ resp = subject.put_report('infinity', report, environment: environment)
89
+ expect(resp.body).to eq(body)
90
+ expect(resp).to be_a(Puppet::HTTP::Response)
91
+ end
92
+
75
93
  it 'raises response error if unsuccessful' do
76
94
  stub_request(:put, url).to_return(status: [400, 'Bad Request'], headers: {'X-Puppet-Version' => '6.1.8' })
77
95
 
@@ -1,38 +1,102 @@
1
1
  require 'spec_helper'
2
2
  require 'webmock/rspec'
3
3
  require 'puppet/http'
4
+ require 'puppet/file_serving'
5
+ require 'puppet/file_serving/content'
6
+ require 'puppet/file_serving/metadata'
4
7
 
5
8
  describe Puppet::HTTP::Service do
6
9
  let(:ssl_context) { Puppet::SSL::SSLContext.new }
7
10
  let(:client) { Puppet::HTTP::Client.new(ssl_context: ssl_context) }
11
+ let(:session) { Puppet::HTTP::Session.new(client, []) }
8
12
  let(:url) { URI.parse('https://www.example.com') }
9
- let(:service) { described_class.new(client, url) }
13
+ let(:service) { described_class.new(client, session, url) }
14
+
15
+ class TestService < Puppet::HTTP::Service
16
+ def get_test(ssl_context)
17
+ @client.get(
18
+ url,
19
+ headers: add_puppet_headers({'Default-Header' => 'default-value'}),
20
+ options: {ssl_context: ssl_context}
21
+ )
22
+ end
23
+
24
+ def mime_types(model)
25
+ get_mime_types(model)
26
+ end
27
+ end
28
+
29
+ context 'when modifying headers for an http request' do
30
+ let(:service) { TestService.new(client, session, url) }
31
+
32
+ it 'adds custom user-specified headers' do
33
+ stub_request(:get, "https://www.example.com/").
34
+ with( headers: { 'Default-Header'=>'default-value', 'Header2'=>'newvalue' })
35
+
36
+ Puppet[:http_extra_headers] = 'header2:newvalue'
37
+
38
+ service.get_test(ssl_context)
39
+ end
40
+
41
+ it 'adds X-Puppet-Profiling header if set' do
42
+ stub_request(:get, "https://www.example.com/").
43
+ with( headers: { 'Default-Header'=>'default-value', 'X-Puppet-Profiling'=>'true' })
44
+
45
+ Puppet[:profile] = true
46
+
47
+ service.get_test(ssl_context)
48
+ end
49
+
50
+ it 'ignores a custom header does not have a value' do
51
+ stub_request(:get, "https://www.example.com/").with do |request|
52
+ expect(request.headers).to include({'Default-Header' => 'default-value'})
53
+ expect(request.headers).to_not include('header-with-no-value')
54
+ end
55
+
56
+ Puppet[:http_extra_headers] = 'header-with-no-value:'
57
+
58
+ service.get_test(ssl_context)
59
+ end
60
+
61
+ it 'ignores a custom header that already exists (case insensitive) in the header hash' do
62
+ stub_request(:get, "https://www.example.com/").
63
+ with( headers: { 'Default-Header'=>'default-value' })
64
+
65
+ Puppet[:http_extra_headers] = 'default-header:wrongvalue'
66
+
67
+ service.get_test(ssl_context)
68
+ end
69
+ end
10
70
 
11
71
  it "returns a URI containing the base URL and path" do
12
72
  expect(service.with_base_url('/puppet/v3')).to eq(URI.parse("https://www.example.com/puppet/v3"))
13
73
  end
14
74
 
15
75
  it "doesn't modify frozen the base URL" do
16
- service = described_class.new(client, url.freeze)
76
+ service = described_class.new(client, session, url.freeze)
17
77
  service.with_base_url('/puppet/v3')
18
78
  end
19
79
 
80
+ it "percent encodes paths before appending them to the path" do
81
+ expect(service.with_base_url('/path/with/a space')).to eq(URI.parse("https://www.example.com/path/with/a%20space"))
82
+ end
83
+
20
84
  it "connects to the base URL with a nil ssl context" do
21
- expect(client).to receive(:connect).with(url, ssl_context: nil)
85
+ expect(client).to receive(:connect).with(url, options: {ssl_context: nil})
22
86
 
23
87
  service.connect
24
88
  end
25
89
 
26
90
  it "accepts an optional ssl_context" do
27
91
  other_ctx = Puppet::SSL::SSLContext.new
28
- expect(client).to receive(:connect).with(url, ssl_context: other_ctx)
92
+ expect(client).to receive(:connect).with(url, options: {ssl_context: other_ctx})
29
93
 
30
94
  service.connect(ssl_context: other_ctx)
31
95
  end
32
96
 
33
97
  it 'raises for unknown service names' do
34
98
  expect {
35
- described_class.create_service(client, :westbound)
99
+ described_class.create_service(client, session, :westbound)
36
100
  }.to raise_error(ArgumentError, "Unknown service westbound")
37
101
  end
38
102
 
@@ -49,4 +113,33 @@ describe Puppet::HTTP::Service do
49
113
  it "returns false for unknown service names" do
50
114
  expect(described_class.valid_name?(:westbound)).to eq(false)
51
115
  end
116
+
117
+ it 'returns different mime types for different models' do
118
+ mimes = if Puppet.features.msgpack?
119
+ %w[application/json application/x-msgpack text/pson]
120
+ else
121
+ %w[application/json text/pson]
122
+ end
123
+
124
+ service = TestService.new(client, session, url)
125
+ [
126
+ Puppet::Node,
127
+ Puppet::Node::Facts,
128
+ Puppet::Transaction::Report,
129
+ Puppet::FileServing::Metadata,
130
+ Puppet::Status
131
+ ].each do |model|
132
+ expect(service.mime_types(model)).to eq(mimes)
133
+ end
134
+
135
+ # These are special
136
+ expect(service.mime_types(Puppet::FileServing::Content)).to eq(%w[application/octet-stream])
137
+
138
+ catalog_mimes = if Puppet.features.msgpack?
139
+ %w[application/vnd.puppet.rich+json application/json application/vnd.puppet.rich+msgpack application/x-msgpack text/pson]
140
+ else
141
+ %w[application/vnd.puppet.rich+json application/json application/vnd.puppet.rich+msgpack text/pson]
142
+ end
143
+ expect(service.mime_types(Puppet::Resource::Catalog)).to eq(catalog_mimes)
144
+ end
52
145
  end