puppet 6.11.1-x64-mingw32 → 6.16.0-x64-mingw32

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

Potentially problematic release.


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

Files changed (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,201 @@
1
+ require 'spec_helper'
2
+ require 'puppet/http'
3
+
4
+ # Simple "external" client to make get & post requests. This is used
5
+ # to test the old HTTP API, such as requiring use_ssl and basic_auth
6
+ # to be passed as options.
7
+ class Puppet::HTTP::TestExternal
8
+ def initialize(host, port, options = {})
9
+ @host = host
10
+ @port = port
11
+ @options = options
12
+ @factory = Puppet::Network::HTTP::Factory.new
13
+ end
14
+
15
+ def get(path, headers = {}, options = {})
16
+ request = Net::HTTP::Get.new(path, headers)
17
+ do_request(request, options)
18
+ end
19
+
20
+ def post(path, data, headers = nil, options = {})
21
+ request = Net::HTTP::Post.new(path, headers)
22
+ do_request(request, options)
23
+ end
24
+
25
+ def do_request(request, options)
26
+ if options[:basic_auth]
27
+ request.basic_auth(options[:basic_auth][:user], options[:basic_auth][:password])
28
+ end
29
+
30
+ site = Puppet::Network::HTTP::Site.new(@options[:use_ssl] ? 'https' : 'http', @host, @port)
31
+ http = @factory.create_connection(site)
32
+ http.start
33
+ begin
34
+ http.request(request)
35
+ ensure
36
+ http.finish
37
+ end
38
+ end
39
+ end
40
+
41
+ describe Puppet::HTTP::ExternalClient do
42
+ let(:uri) { URI.parse('https://www.example.com') }
43
+ let(:http_client_class) { Puppet::HTTP::TestExternal }
44
+ let(:client) { described_class.new(http_client_class) }
45
+ let(:credentials) { ['user', 'pass'] }
46
+
47
+ context "for GET requests" do
48
+ it "stringifies keys and encodes values in the query" do
49
+ stub_request(:get, uri).with(query: "foo=bar%3Dbaz")
50
+
51
+ client.get(uri, params: {:foo => "bar=baz"})
52
+ end
53
+
54
+ it "fails if a user passes in an invalid param type" do
55
+ environment = Puppet::Node::Environment.create(:testing, [])
56
+
57
+ expect{client.get(uri, params: {environment: environment})}.to raise_error(Puppet::HTTP::SerializationError, /HTTP REST queries cannot handle values of type/)
58
+ end
59
+
60
+ it "returns the response" do
61
+ stub_request(:get, uri)
62
+
63
+ response = client.get(uri)
64
+ expect(response).to be_an_instance_of(Puppet::HTTP::Response)
65
+ expect(response).to be_success
66
+ expect(response.code).to eq(200)
67
+ end
68
+
69
+ it "returns the entire response body" do
70
+ stub_request(:get, uri).to_return(body: "abc")
71
+
72
+ expect(client.get(uri).body).to eq("abc")
73
+ end
74
+
75
+ it "streams the response body when a block is given" do
76
+ stub_request(:get, uri).to_return(body: "abc")
77
+
78
+ io = StringIO.new
79
+ client.get(uri) do |response|
80
+ response.read_body do |data|
81
+ io.write(data)
82
+ end
83
+ end
84
+
85
+ expect(io.string).to eq("abc")
86
+ end
87
+
88
+ context 'when connecting' do
89
+ it 'accepts an ssl context' do
90
+ stub_request(:get, uri).to_return(body: "abc")
91
+
92
+ other_context = Puppet::SSL::SSLContext.new
93
+
94
+ client.get(uri, options: {ssl_context: other_context})
95
+ end
96
+
97
+ it 'accepts include_system_store' do
98
+ stub_request(:get, uri).to_return(body: "abc")
99
+
100
+ client.get(uri, options: {include_system_store: true})
101
+ end
102
+ end
103
+ end
104
+
105
+ context "for POST requests" do
106
+ it "stringifies keys and encodes values in the query" do
107
+ stub_request(:post, "https://www.example.com").with(query: "foo=bar%3Dbaz")
108
+
109
+ client.post(uri, "", params: {:foo => "bar=baz"}, headers: {'Content-Type' => 'text/plain'})
110
+ end
111
+
112
+ it "returns the response" do
113
+ stub_request(:post, uri)
114
+
115
+ response = client.post(uri, "", headers: {'Content-Type' => 'text/plain'})
116
+ expect(response).to be_an_instance_of(Puppet::HTTP::Response)
117
+ expect(response).to be_success
118
+ expect(response.code).to eq(200)
119
+ end
120
+
121
+ it "sets content-type for the body" do
122
+ stub_request(:post, uri).with(headers: {"Content-Type" => "text/plain"})
123
+
124
+ client.post(uri, "hello", headers: {'Content-Type' => 'text/plain'})
125
+ end
126
+
127
+ it "streams the response body when a block is given" do
128
+ stub_request(:post, uri).to_return(body: "abc")
129
+
130
+ io = StringIO.new
131
+ client.post(uri, "", headers: {'Content-Type' => 'text/plain'}) do |response|
132
+ response.read_body do |data|
133
+ io.write(data)
134
+ end
135
+ end
136
+
137
+ expect(io.string).to eq("abc")
138
+ end
139
+
140
+ it 'raises an ArgumentError if `body` is missing' do
141
+ expect {
142
+ client.post(uri, nil, headers: {'Content-Type' => 'text/plain'})
143
+ }.to raise_error(ArgumentError, /'post' requires a string 'body' argument/)
144
+ end
145
+
146
+ context 'when connecting' do
147
+ it 'accepts an ssl context' do
148
+ stub_request(:post, uri)
149
+
150
+ other_context = Puppet::SSL::SSLContext.new
151
+
152
+ client.post(uri, "", headers: {'Content-Type' => 'text/plain'}, options: {ssl_context: other_context})
153
+ end
154
+
155
+ it 'accepts include_system_store' do
156
+ stub_request(:post, uri)
157
+
158
+ client.post(uri, "", headers: {'Content-Type' => 'text/plain'}, options: {include_system_store: true})
159
+ end
160
+ end
161
+ end
162
+
163
+ context "Basic Auth" do
164
+ it "submits credentials for GET requests" do
165
+ stub_request(:get, uri).with(basic_auth: credentials)
166
+
167
+ client.get(uri, options: {basic_auth: {user: 'user', password: 'pass'}})
168
+ end
169
+
170
+ it "submits credentials for POST requests" do
171
+ stub_request(:post, uri).with(basic_auth: credentials)
172
+
173
+ client.post(uri, "", options: {content_type: 'text/plain', basic_auth: {user: 'user', password: 'pass'}})
174
+ end
175
+
176
+ it "returns response containing access denied" do
177
+ stub_request(:get, uri).with(basic_auth: credentials).to_return(status: [403, "Ye Shall Not Pass"])
178
+
179
+ response = client.get(uri, options: { basic_auth: {user: 'user', password: 'pass'}})
180
+ expect(response.code).to eq(403)
181
+ expect(response.reason).to eq("Ye Shall Not Pass")
182
+ expect(response).to_not be_success
183
+ end
184
+
185
+ it 'includes basic auth if user is nil' do
186
+ stub_request(:get, uri).with do |req|
187
+ expect(req.headers).to include('Authorization')
188
+ end
189
+
190
+ client.get(uri, options: {basic_auth: {user: nil, password: 'pass'}})
191
+ end
192
+
193
+ it 'includes basic auth if password is nil' do
194
+ stub_request(:get, uri).with do |req|
195
+ expect(req.headers).to include('Authorization')
196
+ end
197
+
198
+ client.get(uri, options: {basic_auth: {user: 'user', password: nil}})
199
+ end
200
+ end
201
+ end
@@ -9,22 +9,92 @@ describe Puppet::HTTP::Resolver do
9
9
  let(:uri) { URI.parse('https://www.example.com') }
10
10
 
11
11
  context 'when resolving using settings' do
12
- let(:subject) { Puppet::HTTP::Resolver::Settings.new }
12
+ let(:subject) { Puppet::HTTP::Resolver::Settings.new(client) }
13
13
 
14
- it 'yields a service based on the current ca_server and ca_port settings' do
14
+ it 'returns a service based on the current ca_server and ca_port settings' do
15
15
  Puppet[:ca_server] = 'ca.example.com'
16
16
  Puppet[:ca_port] = 8141
17
17
 
18
- subject.resolve(session, :ca) do |service|
19
- expect(service).to be_an_instance_of(Puppet::HTTP::Service::Ca)
20
- expect(service.url.to_s).to eq("https://ca.example.com:8141/puppet-ca/v1")
21
- end
18
+ service = subject.resolve(session, :ca)
19
+ expect(service).to be_an_instance_of(Puppet::HTTP::Service::Ca)
20
+ expect(service.url.to_s).to eq("https://ca.example.com:8141/puppet-ca/v1")
21
+ end
22
+ end
23
+
24
+ context 'when resolving using server_list' do
25
+ let(:subject) { Puppet::HTTP::Resolver::ServerList.new(client, server_list_setting: Puppet.settings.setting(:server_list), default_port: 8142, services: Puppet::HTTP::Service::SERVICE_NAMES) }
26
+
27
+ before :each do
28
+ Puppet[:server_list] = 'ca.example.com:8141,apple.example.com'
29
+ end
30
+
31
+ it 'returns a service based on the current server_list setting' do
32
+ stub_request(:get, "https://ca.example.com:8141/status/v1/simple/master").to_return(status: 200)
33
+
34
+ service = subject.resolve(session, :ca)
35
+ expect(service).to be_an_instance_of(Puppet::HTTP::Service::Ca)
36
+ expect(service.url.to_s).to eq("https://ca.example.com:8141/puppet-ca/v1")
37
+ end
38
+
39
+ it 'returns a service based on the current server_list setting if the server returns any success codes' do
40
+ stub_request(:get, "https://ca.example.com:8141/status/v1/simple/master").to_return(status: 202)
41
+
42
+ service = subject.resolve(session, :ca)
43
+ expect(service).to be_an_instance_of(Puppet::HTTP::Service::Ca)
44
+ expect(service.url.to_s).to eq("https://ca.example.com:8141/puppet-ca/v1")
45
+ end
46
+
47
+ it 'logs unsuccessful HTTP 500 responses' do
48
+ Puppet[:log_level] = "debug"
49
+
50
+ stub_request(:get, "https://ca.example.com:8141/status/v1/simple/master").to_return(status: [500, 'Internal Server Error'])
51
+ stub_request(:get, "https://apple.example.com:8142/status/v1/simple/master").to_return(status: 200)
52
+
53
+ subject.resolve(session, :ca)
54
+
55
+ expect(@logs.map(&:message)).to include(/Puppet server ca.example.com:8141 is unavailable: 500 Internal Server Error/)
56
+ end
57
+
58
+ it 'fails if no servers in server_list are accessible' do
59
+ stub_request(:get, "https://ca.example.com:8141/status/v1/simple/master").to_return(status: 503)
60
+ stub_request(:get, "https://apple.example.com:8142/status/v1/simple/master").to_return(status: 503)
61
+
62
+ expect { subject.resolve(session, :ca) }.to raise_error(Puppet::Error, /^Could not select a functional puppet master from server_list:/)
63
+ end
64
+
65
+ it 'cycles through server_list until a valid server is found' do
66
+ stub_request(:get, "https://ca.example.com:8141/status/v1/simple/master").to_return(status: 503)
67
+ stub_request(:get, "https://apple.example.com:8142/status/v1/simple/master").to_return(status: 200)
68
+
69
+ service = subject.resolve(session, :ca)
70
+ expect(service).to be_an_instance_of(Puppet::HTTP::Service::Ca)
71
+ expect(service.url.to_s).to eq("https://apple.example.com:8142/puppet-ca/v1")
72
+ end
73
+
74
+ it 'resolves once per session' do
75
+ failed = stub_request(:get, "https://ca.example.com:8141/status/v1/simple/master").to_return(status: 503)
76
+ passed = stub_request(:get, "https://apple.example.com:8142/status/v1/simple/master").to_return(status: 200)
77
+
78
+ service = subject.resolve(session, :puppet)
79
+ expect(service).to be_a(Puppet::HTTP::Service::Compiler)
80
+ expect(service.url.to_s).to eq("https://apple.example.com:8142/puppet/v3")
81
+
82
+ service = subject.resolve(session, :fileserver)
83
+ expect(service).to be_a(Puppet::HTTP::Service::FileServer)
84
+ expect(service.url.to_s).to eq("https://apple.example.com:8142/puppet/v3")
85
+
86
+ service = subject.resolve(session, :report)
87
+ expect(service).to be_a(Puppet::HTTP::Service::Report)
88
+ expect(service.url.to_s).to eq("https://apple.example.com:8142/puppet/v3")
89
+
90
+ expect(failed).to have_been_requested
91
+ expect(passed).to have_been_requested
22
92
  end
23
93
  end
24
94
 
25
95
  context 'when resolving using SRV' do
26
96
  let(:dns) { double('dns') }
27
- let(:subject) { Puppet::HTTP::Resolver::SRV.new(domain: 'example.com', dns: dns) }
97
+ let(:subject) { Puppet::HTTP::Resolver::SRV.new(client, domain: 'example.com', dns: dns) }
28
98
 
29
99
  def stub_srv(host, port)
30
100
  srv = Resolv::DNS::Resource::IN::SRV.new(0, 0, port, host)
@@ -33,13 +103,12 @@ describe Puppet::HTTP::Resolver do
33
103
  allow(dns).to receive(:getresources).with("_x-puppet-ca._tcp.example.com", Resolv::DNS::Resource::IN::SRV).and_return([srv])
34
104
  end
35
105
 
36
- it 'yields a service based on an SRV record' do
106
+ it 'returns a service based on an SRV record' do
37
107
  stub_srv('ca1.example.com', 8142)
38
108
 
39
- subject.resolve(session, :ca) do |service|
40
- expect(service).to be_an_instance_of(Puppet::HTTP::Service::Ca)
41
- expect(service.url.to_s).to eq("https://ca1.example.com:8142/puppet-ca/v1")
42
- end
109
+ service = subject.resolve(session, :ca)
110
+ expect(service).to be_an_instance_of(Puppet::HTTP::Service::Ca)
111
+ expect(service.url.to_s).to eq("https://ca1.example.com:8142/puppet-ca/v1")
43
112
  end
44
113
  end
45
114
  end
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+ require 'puppet/http'
3
+
4
+ describe Puppet::HTTP::Response do
5
+ let(:uri) { URI.parse('https://www.example.com') }
6
+ let(:client) { Puppet::HTTP::Client.new }
7
+
8
+ it "returns the request URL" do
9
+ stub_request(:get, uri)
10
+
11
+ response = client.get(uri)
12
+ expect(response.url).to eq(uri)
13
+ end
14
+
15
+ it "returns the HTTP code" do
16
+ stub_request(:get, uri)
17
+
18
+ response = client.get(uri)
19
+ expect(response.code).to eq(200)
20
+ end
21
+
22
+ it "returns the HTTP reason string" do
23
+ stub_request(:get, uri).to_return(status: [418, "I'm a teapot"])
24
+
25
+ response = client.get(uri)
26
+ expect(response.reason).to eq("I'm a teapot")
27
+ end
28
+
29
+ it "returns the response body" do
30
+ stub_request(:get, uri).to_return(status: 200, body: "I'm the body")
31
+
32
+ response = client.get(uri)
33
+ expect(response.body).to eq("I'm the body")
34
+ end
35
+
36
+ it "streams the response body" do
37
+ stub_request(:get, uri).to_return(status: 200, body: "I'm the streaming body")
38
+
39
+ content = StringIO.new
40
+ client.get(uri) do |response|
41
+ response.read_body do |data|
42
+ content << data
43
+ end
44
+ end
45
+ expect(content.string).to eq("I'm the streaming body")
46
+ end
47
+
48
+ it "raises if a block isn't given when streaming" do
49
+ stub_request(:get, uri).to_return(status: 200, body: "")
50
+
51
+ expect {
52
+ client.get(uri) do |response|
53
+ response.read_body
54
+ end
55
+ }.to raise_error(Puppet::HTTP::HTTPError, %r{Request to https://www.example.com failed after .* seconds: A block is required})
56
+ end
57
+
58
+ it "returns success for all 2xx codes" do
59
+ stub_request(:get, uri).to_return(status: 202)
60
+
61
+ expect(client.get(uri)).to be_success
62
+ end
63
+
64
+ it "returns a header value" do
65
+ stub_request(:get, uri).to_return(status: 200, headers: { 'Content-Encoding' => 'gzip' })
66
+
67
+ expect(client.get(uri)['Content-Encoding']).to eq('gzip')
68
+ end
69
+ end
@@ -5,18 +5,78 @@ require 'puppet/http'
5
5
  describe Puppet::HTTP::Service::Ca do
6
6
  let(:ssl_context) { Puppet::SSL::SSLContext.new }
7
7
  let(:client) { Puppet::HTTP::Client.new(ssl_context: ssl_context) }
8
- let(:base_url) { URI.parse('https://www.example.com') }
9
- let(:subject) { described_class.new(client, base_url) }
8
+ let(:session) { Puppet::HTTP::Session.new(client, []) }
9
+ let(:subject) { client.create_session.route_to(:ca) }
10
+
11
+ before :each do
12
+ Puppet[:ca_server] = 'www.example.com'
13
+ Puppet[:ca_port] = 443
14
+ end
15
+
16
+ context 'when making requests' do
17
+ let(:uri) {"https://www.example.com:443/puppet-ca/v1/certificate/ca"}
18
+
19
+ it 'includes default HTTP headers' do
20
+ stub_request(:get, uri).with do |request|
21
+ expect(request.headers).to include({'X-Puppet-Version' => /./, 'User-Agent' => /./})
22
+ expect(request.headers).to_not include('X-Puppet-Profiling')
23
+ end
24
+
25
+ subject.get_certificate('ca')
26
+ end
27
+ end
28
+
29
+ context 'when routing to the CA service' do
30
+ let(:cert) { cert_fixture('ca.pem') }
31
+ let(:pem) { cert.to_pem }
32
+
33
+ it 'defaults the server and port based on settings' do
34
+ Puppet[:ca_server] = 'ca.example.com'
35
+ Puppet[:ca_port] = 8141
36
+
37
+ stub_request(:get, "https://ca.example.com:8141/puppet-ca/v1/certificate/ca").to_return(body: pem)
38
+
39
+ subject.get_certificate('ca')
40
+ end
41
+
42
+ it 'fallbacks to server and masterport' do
43
+ Puppet[:ca_server] = nil
44
+ Puppet[:ca_port] = nil
45
+ Puppet[:server] = 'ca2.example.com'
46
+ Puppet[:masterport] = 8142
47
+
48
+ stub_request(:get, "https://ca2.example.com:8142/puppet-ca/v1/certificate/ca").to_return(body: pem)
49
+
50
+ subject.get_certificate('ca')
51
+ end
52
+ end
10
53
 
11
54
  context 'when getting certificates' do
12
55
  let(:cert) { cert_fixture('ca.pem') }
13
56
  let(:pem) { cert.to_pem }
14
- let(:url) { "https://www.example.com/certificate/ca" }
57
+ let(:url) { "https://www.example.com/puppet-ca/v1/certificate/ca" }
58
+
59
+ it 'includes headers set via the :http_extra_headers and :profile settings' do
60
+ stub_request(:get, url).with(headers: {'Example-Header' => 'real-thing', 'another' => 'thing', 'X-Puppet-Profiling' => 'true'})
61
+
62
+ Puppet[:http_extra_headers] = 'Example-Header:real-thing,another:thing'
63
+ Puppet[:profile] = true
64
+
65
+ subject.get_certificate('ca')
66
+ end
15
67
 
16
68
  it 'gets a certificate from the "certificate" endpoint' do
17
69
  stub_request(:get, url).to_return(body: pem)
18
70
 
19
- expect(subject.get_certificate('ca')).to eq(pem)
71
+ _, body = subject.get_certificate('ca')
72
+ expect(body).to eq(pem)
73
+ end
74
+
75
+ it 'returns the request response' do
76
+ stub_request(:get, url).to_return(body: pem)
77
+
78
+ resp, _ = subject.get_certificate('ca')
79
+ expect(resp).to be_a(Puppet::HTTP::Response)
20
80
  end
21
81
 
22
82
  it 'accepts text/plain responses' do
@@ -41,12 +101,29 @@ describe Puppet::HTTP::Service::Ca do
41
101
  context 'when getting CRLs' do
42
102
  let(:crl) { crl_fixture('crl.pem') }
43
103
  let(:pem) { crl.to_pem }
44
- let(:url) { "https://www.example.com/certificate_revocation_list/ca" }
104
+ let(:url) { "https://www.example.com/puppet-ca/v1/certificate_revocation_list/ca" }
105
+
106
+ it 'includes headers set via the :http_extra_headers and :profile settings' do
107
+ stub_request(:get, url).with(headers: {'Example-Header' => 'real-thing', 'another' => 'thing', 'X-Puppet-Profiling' => 'true'})
108
+
109
+ Puppet[:http_extra_headers] = 'Example-Header:real-thing,another:thing'
110
+ Puppet[:profile] = true
111
+
112
+ subject.get_certificate_revocation_list
113
+ end
45
114
 
46
115
  it 'gets a CRL from "certificate_revocation_list" endpoint' do
47
116
  stub_request(:get, url).to_return(body: pem)
48
117
 
49
- expect(subject.get_certificate_revocation_list).to eq(pem)
118
+ _, body = subject.get_certificate_revocation_list
119
+ expect(body).to eq(pem)
120
+ end
121
+
122
+ it 'returns the request response' do
123
+ stub_request(:get, url).to_return(body: pem)
124
+
125
+ resp, _ = subject.get_certificate_revocation_list
126
+ expect(resp).to be_a(Puppet::HTTP::Response)
50
127
  end
51
128
 
52
129
  it 'accepts text/plain responses' do
@@ -83,7 +160,16 @@ describe Puppet::HTTP::Service::Ca do
83
160
  context 'when submitting a CSR' do
84
161
  let(:request) { request_fixture('request.pem') }
85
162
  let(:pem) { request.to_pem }
86
- let(:url) { "https://www.example.com/certificate_request/infinity" }
163
+ let(:url) { "https://www.example.com/puppet-ca/v1/certificate_request/infinity" }
164
+
165
+ it 'includes headers set via the :http_extra_headers and :profile settings' do
166
+ stub_request(:put, url).with(headers: {'Example-Header' => 'real-thing', 'another' => 'thing', 'X-Puppet-Profiling' => 'true'})
167
+
168
+ Puppet[:http_extra_headers] = 'Example-Header:real-thing,another:thing'
169
+ Puppet[:profile] = true
170
+
171
+ subject.put_certificate_request('infinity', request)
172
+ end
87
173
 
88
174
  it 'submits a CSR to the "certificate_request" endpoint' do
89
175
  stub_request(:put, url).with(body: pem, headers: { 'Content-Type' => 'text/plain' })
@@ -91,6 +177,13 @@ describe Puppet::HTTP::Service::Ca do
91
177
  subject.put_certificate_request('infinity', request)
92
178
  end
93
179
 
180
+ it 'returns the request response' do
181
+ stub_request(:put, url).with(body: pem, headers: { 'Content-Type' => 'text/plain' })
182
+
183
+ resp = subject.put_certificate_request('infinity', request)
184
+ expect(resp).to be_a(Puppet::HTTP::Response)
185
+ end
186
+
94
187
  it 'raises response error if unsuccessful' do
95
188
  stub_request(:put, url).to_return(status: [400, 'Bad Request'])
96
189