puppet 6.11.1-universal-darwin → 6.16.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 (395) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +3 -8
  3. data/CONTRIBUTING.md +7 -13
  4. data/Gemfile +1 -0
  5. data/Gemfile.lock +39 -36
  6. data/README.md +17 -24
  7. data/ext/build_defaults.yaml +1 -0
  8. data/ext/project_data.yaml +1 -1
  9. data/ext/windows/service/daemon.rb +25 -20
  10. data/lib/puppet.rb +52 -13
  11. data/lib/puppet/agent.rb +20 -14
  12. data/lib/puppet/application/agent.rb +12 -14
  13. data/lib/puppet/application/describe.rb +7 -5
  14. data/lib/puppet/application/device.rb +2 -2
  15. data/lib/puppet/application/filebucket.rb +19 -15
  16. data/lib/puppet/application/plugin.rb +1 -0
  17. data/lib/puppet/application/resource.rb +1 -1
  18. data/lib/puppet/application/ssl.rb +4 -4
  19. data/lib/puppet/concurrent.rb +2 -0
  20. data/lib/puppet/concurrent/lock.rb +16 -0
  21. data/lib/puppet/concurrent/synchronized.rb +15 -0
  22. data/lib/puppet/concurrent/thread_local_singleton.rb +14 -0
  23. data/lib/puppet/configurer.rb +85 -83
  24. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  25. data/lib/puppet/context/trusted_information.rb +14 -8
  26. data/lib/puppet/daemon.rb +13 -27
  27. data/lib/puppet/defaults.rb +158 -40
  28. data/lib/puppet/environments.rb +30 -20
  29. data/lib/puppet/error.rb +9 -1
  30. data/lib/puppet/face/facts.rb +8 -5
  31. data/lib/puppet/face/help.rb +29 -3
  32. data/lib/puppet/face/module/search.rb +5 -0
  33. data/lib/puppet/face/plugin.rb +2 -2
  34. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  35. data/lib/puppet/file_system/file_impl.rb +13 -9
  36. data/lib/puppet/file_system/memory_file.rb +6 -0
  37. data/lib/puppet/file_system/memory_impl.rb +13 -0
  38. data/lib/puppet/file_system/uniquefile.rb +4 -0
  39. data/lib/puppet/file_system/windows.rb +7 -10
  40. data/lib/puppet/forge.rb +3 -3
  41. data/lib/puppet/forge/errors.rb +2 -2
  42. data/lib/puppet/forge/repository.rb +31 -86
  43. data/lib/puppet/functions/call.rb +1 -1
  44. data/lib/puppet/functions/camelcase.rb +2 -2
  45. data/lib/puppet/functions/epp.rb +4 -4
  46. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  47. data/lib/puppet/functions/filter.rb +1 -0
  48. data/lib/puppet/functions/find_file.rb +9 -9
  49. data/lib/puppet/functions/find_template.rb +63 -0
  50. data/lib/puppet/functions/inline_epp.rb +5 -5
  51. data/lib/puppet/functions/reduce.rb +2 -4
  52. data/lib/puppet/http.rb +7 -0
  53. data/lib/puppet/http/client.rb +341 -54
  54. data/lib/puppet/http/errors.rb +2 -0
  55. data/lib/puppet/http/external_client.rb +90 -0
  56. data/lib/puppet/http/redirector.rb +34 -0
  57. data/lib/puppet/http/resolver.rb +57 -1
  58. data/lib/puppet/http/resolver/server_list.rb +98 -0
  59. data/lib/puppet/http/resolver/settings.rb +23 -2
  60. data/lib/puppet/http/resolver/srv.rb +36 -4
  61. data/lib/puppet/http/response.rb +68 -1
  62. data/lib/puppet/http/retry_after_handler.rb +39 -0
  63. data/lib/puppet/http/service.rb +179 -3
  64. data/lib/puppet/http/service/ca.rb +84 -21
  65. data/lib/puppet/http/service/compiler.rb +319 -0
  66. data/lib/puppet/http/service/file_server.rb +206 -0
  67. data/lib/puppet/http/service/report.rb +66 -0
  68. data/lib/puppet/http/session.rb +106 -31
  69. data/lib/puppet/indirector/catalog/compiler.rb +10 -0
  70. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  71. data/lib/puppet/indirector/facts/rest.rb +42 -0
  72. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  73. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  74. data/lib/puppet/indirector/file_content/http.rb +5 -0
  75. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  76. data/lib/puppet/indirector/file_metadata/http.rb +4 -4
  77. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  78. data/lib/puppet/indirector/json.rb +1 -1
  79. data/lib/puppet/indirector/msgpack.rb +1 -1
  80. data/lib/puppet/indirector/node/rest.rb +24 -0
  81. data/lib/puppet/indirector/report/rest.rb +19 -0
  82. data/lib/puppet/indirector/report/yaml.rb +23 -0
  83. data/lib/puppet/indirector/rest.rb +12 -0
  84. data/lib/puppet/indirector/status/rest.rb +18 -0
  85. data/lib/puppet/loaders.rb +6 -0
  86. data/lib/puppet/metatype/manager.rb +80 -80
  87. data/lib/puppet/network/http/base_pool.rb +19 -1
  88. data/lib/puppet/network/http/compression.rb +7 -0
  89. data/lib/puppet/network/http/connection.rb +6 -0
  90. data/lib/puppet/network/http/connection_adapter.rb +182 -0
  91. data/lib/puppet/network/http/nocache_pool.rb +2 -0
  92. data/lib/puppet/network/http/pool.rb +13 -6
  93. data/lib/puppet/network/http_pool.rb +2 -1
  94. data/lib/puppet/node/environment.rb +24 -8
  95. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  96. data/lib/puppet/pal/pal_impl.rb +9 -29
  97. data/lib/puppet/parser/ast/pops_bridge.rb +6 -11
  98. data/lib/puppet/parser/compiler.rb +42 -32
  99. data/lib/puppet/parser/functions.rb +18 -13
  100. data/lib/puppet/parser/functions/epp.rb +3 -3
  101. data/lib/puppet/parser/functions/filter.rb +1 -0
  102. data/lib/puppet/parser/functions/inline_epp.rb +5 -5
  103. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
  105. data/lib/puppet/pops/evaluator/runtime3_support.rb +1 -1
  106. data/lib/puppet/pops/loader/puppet_plan_instantiator.rb +12 -3
  107. data/lib/puppet/pops/loaders.rb +7 -5
  108. data/lib/puppet/pops/lookup/invocation.rb +10 -3
  109. data/lib/puppet/pops/model/pn_transformer.rb +5 -9
  110. data/lib/puppet/pops/parser/evaluating_parser.rb +8 -11
  111. data/lib/puppet/pops/serialization/json_path.rb +3 -3
  112. data/lib/puppet/pops/time/timespan.rb +3 -5
  113. data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
  114. data/lib/puppet/pops/types/string_converter.rb +6 -9
  115. data/lib/puppet/pops/types/type_calculator.rb +30 -10
  116. data/lib/puppet/pops/types/type_formatter.rb +9 -11
  117. data/lib/puppet/pops/types/type_parser.rb +3 -3
  118. data/lib/puppet/pops/validation/checker4_0.rb +1 -1
  119. data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
  120. data/lib/puppet/provider/aix_object.rb +4 -2
  121. data/lib/puppet/provider/group/aix.rb +1 -0
  122. data/lib/puppet/provider/group/groupadd.rb +57 -24
  123. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  124. data/lib/puppet/provider/package/aix.rb +17 -2
  125. data/lib/puppet/provider/package/apt.rb +78 -4
  126. data/lib/puppet/provider/package/dnfmodule.rb +69 -15
  127. data/lib/puppet/provider/package/dpkg.rb +14 -7
  128. data/lib/puppet/provider/package/fink.rb +20 -3
  129. data/lib/puppet/provider/package/gem.rb +41 -7
  130. data/lib/puppet/provider/package/openbsd.rb +13 -1
  131. data/lib/puppet/provider/package/pacman.rb +2 -5
  132. data/lib/puppet/provider/package/pip.rb +143 -48
  133. data/lib/puppet/provider/package/pip3.rb +0 -2
  134. data/lib/puppet/provider/package/pkg.rb +18 -5
  135. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  136. data/lib/puppet/provider/package/pkgng.rb +16 -4
  137. data/lib/puppet/provider/package/portage.rb +5 -5
  138. data/lib/puppet/provider/package/puppet_gem.rb +6 -2
  139. data/lib/puppet/provider/package/rpm.rb +6 -213
  140. data/lib/puppet/provider/package/yum.rb +108 -24
  141. data/lib/puppet/provider/package/zypper.rb +59 -1
  142. data/lib/puppet/provider/package_targetable.rb +5 -4
  143. data/lib/puppet/provider/service/systemd.rb +23 -5
  144. data/lib/puppet/provider/user/aix.rb +1 -0
  145. data/lib/puppet/provider/user/directoryservice.rb +30 -5
  146. data/lib/puppet/provider/user/hpux.rb +1 -1
  147. data/lib/puppet/provider/user/useradd.rb +11 -8
  148. data/lib/puppet/reports/http.rb +13 -9
  149. data/lib/puppet/reports/store.rb +1 -1
  150. data/lib/puppet/resource/type_collection.rb +20 -16
  151. data/lib/puppet/runtime.rb +32 -1
  152. data/lib/puppet/settings.rb +4 -0
  153. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  154. data/lib/puppet/ssl.rb +1 -0
  155. data/lib/puppet/ssl/certificate.rb +2 -1
  156. data/lib/puppet/ssl/host.rb +4 -4
  157. data/lib/puppet/ssl/oids.rb +1 -0
  158. data/lib/puppet/ssl/ssl_provider.rb +20 -0
  159. data/lib/puppet/ssl/state_machine.rb +81 -35
  160. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  161. data/lib/puppet/test/test_helper.rb +7 -1
  162. data/lib/puppet/transaction.rb +33 -11
  163. data/lib/puppet/transaction/report.rb +2 -2
  164. data/lib/puppet/transaction/resource_harness.rb +1 -1
  165. data/lib/puppet/type.rb +7 -2
  166. data/lib/puppet/type/file.rb +13 -0
  167. data/lib/puppet/type/file/data_sync.rb +5 -1
  168. data/lib/puppet/type/file/source.rb +49 -58
  169. data/lib/puppet/type/group.rb +5 -4
  170. data/lib/puppet/type/package.rb +102 -10
  171. data/lib/puppet/type/service.rb +6 -8
  172. data/lib/puppet/type/user.rb +6 -30
  173. data/lib/puppet/util.rb +34 -11
  174. data/lib/puppet/util/at_fork.rb +1 -1
  175. data/lib/puppet/util/autoload.rb +4 -18
  176. data/lib/puppet/util/instance_loader.rb +14 -10
  177. data/lib/puppet/util/log/destinations.rb +2 -11
  178. data/lib/puppet/util/logging.rb +30 -18
  179. data/lib/puppet/util/package/version/debian.rb +175 -0
  180. data/lib/puppet/util/package/version/gem.rb +15 -0
  181. data/lib/puppet/util/package/version/pip.rb +167 -0
  182. data/lib/puppet/util/package/version/range.rb +53 -0
  183. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  184. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  185. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  186. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  187. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  188. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  189. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  190. data/lib/puppet/util/package/version/rpm.rb +73 -0
  191. data/lib/puppet/util/pidlock.rb +36 -10
  192. data/lib/puppet/util/platform.rb +5 -0
  193. data/lib/puppet/util/plist.rb +6 -0
  194. data/lib/puppet/util/rpm_compare.rb +193 -0
  195. data/lib/puppet/util/storage.rb +0 -1
  196. data/lib/puppet/util/windows/adsi.rb +50 -20
  197. data/lib/puppet/util/windows/process.rb +15 -14
  198. data/lib/puppet/util/windows/security.rb +1 -0
  199. data/lib/puppet/util/windows/sid.rb +3 -3
  200. data/lib/puppet/util/yaml.rb +1 -1
  201. data/lib/puppet/version.rb +1 -1
  202. data/lib/puppet/x509/cert_provider.rb +9 -5
  203. data/locales/puppet.pot +640 -521
  204. data/man/man5/puppet.conf.5 +88 -9
  205. data/man/man8/puppet-agent.8 +6 -6
  206. data/man/man8/puppet-apply.8 +1 -1
  207. data/man/man8/puppet-catalog.8 +1 -1
  208. data/man/man8/puppet-config.8 +1 -1
  209. data/man/man8/puppet-describe.8 +1 -1
  210. data/man/man8/puppet-device.8 +2 -2
  211. data/man/man8/puppet-doc.8 +1 -1
  212. data/man/man8/puppet-epp.8 +1 -1
  213. data/man/man8/puppet-facts.8 +1 -1
  214. data/man/man8/puppet-filebucket.8 +17 -2
  215. data/man/man8/puppet-generate.8 +1 -1
  216. data/man/man8/puppet-help.8 +6 -3
  217. data/man/man8/puppet-key.8 +1 -1
  218. data/man/man8/puppet-lookup.8 +1 -1
  219. data/man/man8/puppet-man.8 +1 -1
  220. data/man/man8/puppet-module.8 +4 -1
  221. data/man/man8/puppet-node.8 +1 -1
  222. data/man/man8/puppet-parser.8 +1 -1
  223. data/man/man8/puppet-plugin.8 +1 -1
  224. data/man/man8/puppet-report.8 +1 -1
  225. data/man/man8/puppet-resource.8 +1 -1
  226. data/man/man8/puppet-script.8 +1 -1
  227. data/man/man8/puppet-ssl.8 +2 -2
  228. data/man/man8/puppet-status.8 +1 -1
  229. data/man/man8/puppet.8 +2 -2
  230. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  231. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  232. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  233. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  234. data/spec/fixtures/unit/forge/bacula.json +76 -0
  235. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  236. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  237. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  238. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  239. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  240. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -102
  241. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +1 -106
  242. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -106
  243. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -102
  244. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -98
  245. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -102
  246. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +1 -102
  247. data/spec/integration/application/agent_spec.rb +394 -0
  248. data/spec/integration/application/apply_spec.rb +132 -3
  249. data/spec/integration/application/filebucket_spec.rb +190 -0
  250. data/spec/integration/application/plugin_spec.rb +73 -0
  251. data/spec/integration/configurer_spec.rb +26 -7
  252. data/spec/integration/http/client_spec.rb +154 -0
  253. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  254. data/spec/integration/indirector/report/yaml.rb +83 -0
  255. data/spec/integration/module_tool/forge_spec.rb +51 -0
  256. data/spec/integration/network/http_pool_spec.rb +76 -20
  257. data/spec/integration/node/environment_spec.rb +15 -0
  258. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  259. data/spec/lib/puppet/test_ca.rb +2 -2
  260. data/spec/lib/puppet_spec/https.rb +20 -9
  261. data/spec/lib/puppet_spec/puppetserver.rb +119 -0
  262. data/spec/shared_contexts/https.rb +29 -0
  263. data/spec/spec_helper.rb +6 -2
  264. data/spec/unit/agent_spec.rb +80 -26
  265. data/spec/unit/application/agent_spec.rb +9 -5
  266. data/spec/unit/application/apply_spec.rb +2 -12
  267. data/spec/unit/application/describe_spec.rb +88 -50
  268. data/spec/unit/application/device_spec.rb +2 -2
  269. data/spec/unit/application/filebucket_spec.rb +22 -2
  270. data/spec/unit/application/resource_spec.rb +2 -2
  271. data/spec/unit/concurrent/lock_spec.rb +29 -0
  272. data/spec/unit/configurer/fact_handler_spec.rb +0 -4
  273. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  274. data/spec/unit/configurer_spec.rb +400 -406
  275. data/spec/unit/context/trusted_information_spec.rb +17 -0
  276. data/spec/unit/daemon_spec.rb +5 -64
  277. data/spec/unit/defaults_spec.rb +38 -4
  278. data/spec/unit/environments_spec.rb +65 -28
  279. data/spec/unit/face/facts_spec.rb +24 -20
  280. data/spec/unit/face/module/search_spec.rb +17 -0
  281. data/spec/unit/face/plugin_spec.rb +12 -10
  282. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  283. data/spec/unit/file_system_spec.rb +26 -2
  284. data/spec/unit/forge/errors_spec.rb +1 -1
  285. data/spec/unit/forge/forge_spec.rb +12 -54
  286. data/spec/unit/forge/module_release_spec.rb +19 -6
  287. data/spec/unit/forge/repository_spec.rb +63 -157
  288. data/spec/unit/forge_spec.rb +46 -116
  289. data/spec/unit/functions/find_template_spec.rb +69 -0
  290. data/spec/unit/functions/lookup_spec.rb +13 -0
  291. data/spec/unit/http/client_spec.rb +395 -27
  292. data/spec/unit/http/external_client_spec.rb +201 -0
  293. data/spec/unit/http/resolver_spec.rb +81 -12
  294. data/spec/unit/http/response_spec.rb +69 -0
  295. data/spec/unit/http/service/ca_spec.rb +100 -7
  296. data/spec/unit/http/service/compiler_spec.rb +627 -0
  297. data/spec/unit/http/service/file_server_spec.rb +308 -0
  298. data/spec/unit/http/service/report_spec.rb +118 -0
  299. data/spec/unit/http/service_spec.rb +117 -4
  300. data/spec/unit/http/session_spec.rb +237 -19
  301. data/spec/unit/indirector/catalog/compiler_spec.rb +47 -29
  302. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  303. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  304. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  305. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  306. data/spec/unit/indirector/file_metadata/http_spec.rb +167 -0
  307. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  308. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  309. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  310. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  311. data/spec/unit/indirector/rest_spec.rb +13 -0
  312. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  313. data/spec/unit/network/http/connection_spec.rb +549 -176
  314. data/spec/unit/network/http/nocache_pool_spec.rb +25 -3
  315. data/spec/unit/network/http/pool_spec.rb +89 -11
  316. data/spec/unit/network/http_pool_spec.rb +63 -57
  317. data/spec/unit/network/http_spec.rb +1 -1
  318. data/spec/unit/node/environment_spec.rb +16 -0
  319. data/spec/unit/node/facts_spec.rb +2 -1
  320. data/spec/unit/node_spec.rb +7 -4
  321. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
  322. data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
  323. data/spec/unit/pops/validator/validator_spec.rb +7 -2
  324. data/spec/unit/provider/aix_object_spec.rb +16 -2
  325. data/spec/unit/provider/group/groupadd_spec.rb +181 -56
  326. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  327. data/spec/unit/provider/package/aix_spec.rb +29 -0
  328. data/spec/unit/provider/package/apt_spec.rb +43 -2
  329. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  330. data/spec/unit/provider/package/dnfmodule_spec.rb +76 -15
  331. data/spec/unit/provider/package/dpkg_spec.rb +28 -6
  332. data/spec/unit/provider/package/gem_spec.rb +40 -0
  333. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  334. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  335. data/spec/unit/provider/package/pip_spec.rb +68 -19
  336. data/spec/unit/provider/package/pkg_spec.rb +15 -1
  337. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  338. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  339. data/spec/unit/provider/package/portage_spec.rb +9 -4
  340. data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
  341. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  342. data/spec/unit/provider/package/yum_spec.rb +292 -0
  343. data/spec/unit/provider/package/zypper_spec.rb +84 -0
  344. data/spec/unit/provider/package_targetable_spec.rb +60 -0
  345. data/spec/unit/provider/service/init_spec.rb +1 -0
  346. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  347. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  348. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  349. data/spec/unit/provider/service/systemd_spec.rb +92 -12
  350. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  351. data/spec/unit/provider/user/hpux_spec.rb +2 -2
  352. data/spec/unit/provider/user/useradd_spec.rb +21 -8
  353. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  354. data/spec/unit/puppet_pal_2pec.rb +0 -26
  355. data/spec/unit/puppet_pal_catalog_spec.rb +46 -0
  356. data/spec/unit/puppet_spec.rb +47 -0
  357. data/spec/unit/reports/http_spec.rb +70 -52
  358. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  359. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  360. data/spec/unit/ssl/certificate_spec.rb +7 -0
  361. data/spec/unit/ssl/host_spec.rb +4 -2
  362. data/spec/unit/ssl/oids_spec.rb +1 -0
  363. data/spec/unit/ssl/ssl_provider_spec.rb +71 -0
  364. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  365. data/spec/unit/transaction/persistence_spec.rb +1 -10
  366. data/spec/unit/transaction/report_spec.rb +4 -0
  367. data/spec/unit/transaction_spec.rb +45 -1
  368. data/spec/unit/type/file/content_spec.rb +9 -3
  369. data/spec/unit/type/file/ensure_spec.rb +1 -2
  370. data/spec/unit/type/file/source_spec.rb +86 -35
  371. data/spec/unit/type/package_spec.rb +8 -0
  372. data/spec/unit/type/service_spec.rb +9 -8
  373. data/spec/unit/type/user_spec.rb +1 -2
  374. data/spec/unit/util/at_fork_spec.rb +3 -2
  375. data/spec/unit/util/autoload_spec.rb +2 -1
  376. data/spec/unit/util/log/destinations_spec.rb +1 -29
  377. data/spec/unit/util/log_spec.rb +0 -138
  378. data/spec/unit/util/logging_spec.rb +200 -0
  379. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  380. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  381. data/spec/unit/util/package/version/range_spec.rb +175 -0
  382. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  383. data/spec/unit/util/pidlock_spec.rb +112 -42
  384. data/spec/unit/util/plist_spec.rb +20 -0
  385. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  386. data/spec/unit/util/storage_spec.rb +1 -8
  387. data/spec/unit/util/windows/adsi_spec.rb +55 -4
  388. data/spec/unit/util/windows/sid_spec.rb +2 -2
  389. data/spec/unit/x509/cert_provider_spec.rb +24 -4
  390. data/tasks/generate_cert_fixtures.rake +15 -1
  391. data/tasks/manpages.rake +6 -35
  392. metadata +92 -12
  393. data/COMMITTERS.md +0 -244
  394. data/spec/integration/faces/plugin_spec.rb +0 -61
  395. data/spec/lib/puppet_spec/validators.rb +0 -37
@@ -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
@@ -0,0 +1,118 @@
1
+ require 'spec_helper'
2
+ require 'webmock/rspec'
3
+ require 'puppet/http'
4
+
5
+ describe Puppet::HTTP::Service::Report do
6
+ let(:ssl_context) { Puppet::SSL::SSLContext.new }
7
+ let(:client) { Puppet::HTTP::Client.new(ssl_context: ssl_context) }
8
+ let(:subject) { client.create_session.route_to(:report) }
9
+ let(:environment) { 'testing' }
10
+ let(:report) { Puppet::Transaction::Report.new }
11
+
12
+ before :each do
13
+ Puppet[:report_server] = 'www.example.com'
14
+ Puppet[:report_port] = 443
15
+ end
16
+
17
+ context 'when making requests' do
18
+ let(:uri) {"https://www.example.com:443/puppet/v3/report/report?environment=testing"}
19
+
20
+ it 'includes default HTTP headers' do
21
+ stub_request(:put, uri).with do |request|
22
+ expect(request.headers).to include({'X-Puppet-Version' => /./, 'User-Agent' => /./})
23
+ expect(request.headers).to_not include('X-Puppet-Profiling')
24
+ end
25
+
26
+ subject.put_report('report', report, environment: environment)
27
+ end
28
+ end
29
+
30
+ context 'when routing to the report service' do
31
+ it 'defaults the server and port based on settings' do
32
+ Puppet[:report_server] = 'report.example.com'
33
+ Puppet[:report_port] = 8141
34
+
35
+ stub_request(:put, "https://report.example.com:8141/puppet/v3/report/report?environment=testing")
36
+
37
+ subject.put_report('report', report, environment: environment)
38
+ end
39
+
40
+ it 'fallbacks to server and masterport' do
41
+ Puppet[:report_server] = nil
42
+ Puppet[:report_port] = nil
43
+ Puppet[:server] = 'report2.example.com'
44
+ Puppet[:masterport] = 8142
45
+
46
+ stub_request(:put, "https://report2.example.com:8142/puppet/v3/report/report?environment=testing")
47
+
48
+ subject.put_report('report', report, environment: environment)
49
+ end
50
+ end
51
+
52
+ context 'when submitting a report' do
53
+ let(:url) { "https://www.example.com/puppet/v3/report/infinity?environment=testing" }
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
+
64
+ it 'submits a report to the "report" endpoint' do
65
+ stub_request(:put, url)
66
+ .with(
67
+ headers: {
68
+ 'Accept'=>'application/json, application/x-msgpack, text/pson',
69
+ 'Content-Type'=>'application/json',
70
+ }).
71
+ to_return(status: 200, body: "", headers: {})
72
+
73
+ subject.put_report('infinity', report, environment: environment)
74
+ end
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
+
93
+ it 'raises response error if unsuccessful' do
94
+ stub_request(:put, url).to_return(status: [400, 'Bad Request'], headers: {'X-Puppet-Version' => '6.1.8' })
95
+
96
+ expect {
97
+ subject.put_report('infinity', report, environment: environment)
98
+ }.to raise_error do |err|
99
+ expect(err).to be_an_instance_of(Puppet::HTTP::ResponseError)
100
+ expect(err.message).to eq('Bad Request')
101
+ expect(err.response.code).to eq(400)
102
+ end
103
+ end
104
+
105
+ it 'raises an error if unsuccessful, the server version is < 5, and the current serialization format is not pson' do
106
+ Puppet[:preferred_serialization_format] = 'json'
107
+
108
+ stub_request(:put, url).to_return(status: [400, 'Bad Request'], headers: {'X-Puppet-Version' => '4.2.3' })
109
+
110
+ expect {
111
+ subject.put_report('infinity', report, environment: environment)
112
+ }.to raise_error do |err|
113
+ expect(err).to be_an_instance_of(Puppet::HTTP::ProtocolError)
114
+ expect(err.message).to eq('To submit reports to a server running puppetserver 4.2.3, set preferred_serialization_format to pson')
115
+ end
116
+ end
117
+ end
118
+ end
@@ -1,32 +1,145 @@
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
96
+
97
+ it 'raises for unknown service names' do
98
+ expect {
99
+ described_class.create_service(client, session, :westbound)
100
+ }.to raise_error(ArgumentError, "Unknown service westbound")
101
+ end
102
+
103
+ [:ca].each do |name|
104
+ it "returns true for #{name}" do
105
+ expect(described_class.valid_name?(name)).to eq(true)
106
+ end
107
+ end
108
+
109
+ it "returns false when the service name is a string" do
110
+ expect(described_class.valid_name?("ca")).to eq(false)
111
+ end
112
+
113
+ it "returns false for unknown service names" do
114
+ expect(described_class.valid_name?(:westbound)).to eq(false)
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
32
145
  end