puppet 6.13.0-x64-mingw32 → 6.18.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 (461) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -7
  3. data/CONTRIBUTING.md +7 -13
  4. data/Gemfile +4 -2
  5. data/Gemfile.lock +36 -32
  6. data/README.md +17 -24
  7. data/ext/windows/service/daemon.rb +3 -3
  8. data/lib/puppet.rb +33 -9
  9. data/lib/puppet/agent.rb +20 -14
  10. data/lib/puppet/application/agent.rb +26 -17
  11. data/lib/puppet/application/apply.rb +18 -20
  12. data/lib/puppet/application/describe.rb +7 -5
  13. data/lib/puppet/application/device.rb +2 -2
  14. data/lib/puppet/application/filebucket.rb +19 -15
  15. data/lib/puppet/application/lookup.rb +16 -4
  16. data/lib/puppet/application/plugin.rb +1 -0
  17. data/lib/puppet/application/ssl.rb +4 -4
  18. data/lib/puppet/configurer.rb +58 -57
  19. data/lib/puppet/configurer/downloader.rb +31 -10
  20. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  21. data/lib/puppet/confine.rb +2 -2
  22. data/lib/puppet/confine/any.rb +1 -1
  23. data/lib/puppet/context/trusted_information.rb +14 -8
  24. data/lib/puppet/daemon.rb +13 -27
  25. data/lib/puppet/defaults.rb +92 -12
  26. data/lib/puppet/environments.rb +4 -5
  27. data/lib/puppet/face/facts.rb +1 -1
  28. data/lib/puppet/face/help.rb +29 -3
  29. data/lib/puppet/face/module/search.rb +5 -0
  30. data/lib/puppet/face/plugin.rb +2 -2
  31. data/lib/puppet/feature/base.rb +1 -1
  32. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  33. data/lib/puppet/file_serving/metadata.rb +4 -1
  34. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  35. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  36. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  37. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  38. data/lib/puppet/file_system/file_impl.rb +17 -13
  39. data/lib/puppet/file_system/uniquefile.rb +12 -16
  40. data/lib/puppet/forge.rb +1 -1
  41. data/lib/puppet/forge/cache.rb +1 -1
  42. data/lib/puppet/forge/repository.rb +4 -7
  43. data/lib/puppet/functions/call.rb +1 -1
  44. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  45. data/lib/puppet/functions/filter.rb +1 -0
  46. data/lib/puppet/functions/lstrip.rb +4 -4
  47. data/lib/puppet/functions/reduce.rb +2 -4
  48. data/lib/puppet/functions/reverse_each.rb +1 -1
  49. data/lib/puppet/functions/rstrip.rb +4 -4
  50. data/lib/puppet/functions/step.rb +1 -1
  51. data/lib/puppet/functions/strip.rb +4 -4
  52. data/lib/puppet/gettext/config.rb +5 -5
  53. data/lib/puppet/gettext/module_translations.rb +4 -4
  54. data/lib/puppet/http.rb +3 -0
  55. data/lib/puppet/http/client.rb +263 -73
  56. data/lib/puppet/http/external_client.rb +90 -0
  57. data/lib/puppet/http/redirector.rb +43 -7
  58. data/lib/puppet/http/resolver.rb +46 -3
  59. data/lib/puppet/http/resolver/server_list.rb +76 -16
  60. data/lib/puppet/http/resolver/settings.rb +23 -3
  61. data/lib/puppet/http/resolver/srv.rb +29 -3
  62. data/lib/puppet/http/response.rb +87 -1
  63. data/lib/puppet/http/retry_after_handler.rb +39 -0
  64. data/lib/puppet/http/service.rb +97 -12
  65. data/lib/puppet/http/service/ca.rb +76 -14
  66. data/lib/puppet/http/service/compiler.rb +249 -16
  67. data/lib/puppet/http/service/file_server.rb +141 -20
  68. data/lib/puppet/http/service/report.rb +47 -17
  69. data/lib/puppet/http/session.rb +96 -7
  70. data/lib/puppet/indirector.rb +1 -1
  71. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  72. data/lib/puppet/indirector/exec.rb +1 -1
  73. data/lib/puppet/indirector/facts/facter.rb +3 -3
  74. data/lib/puppet/indirector/facts/rest.rb +42 -0
  75. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  76. data/lib/puppet/indirector/file_content/http.rb +5 -0
  77. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  78. data/lib/puppet/indirector/file_metadata/http.rb +28 -8
  79. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  80. data/lib/puppet/indirector/hiera.rb +4 -0
  81. data/lib/puppet/indirector/indirection.rb +1 -1
  82. data/lib/puppet/indirector/node/rest.rb +24 -0
  83. data/lib/puppet/indirector/report/processor.rb +2 -2
  84. data/lib/puppet/indirector/report/rest.rb +19 -0
  85. data/lib/puppet/indirector/report/yaml.rb +23 -0
  86. data/lib/puppet/indirector/request.rb +1 -1
  87. data/lib/puppet/indirector/rest.rb +12 -0
  88. data/lib/puppet/indirector/status/rest.rb +18 -0
  89. data/lib/puppet/loaders.rb +6 -0
  90. data/lib/puppet/metatype/manager.rb +80 -80
  91. data/lib/puppet/module.rb +1 -2
  92. data/lib/puppet/network/format_support.rb +2 -2
  93. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  94. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  95. data/lib/puppet/network/http/base_pool.rb +7 -2
  96. data/lib/puppet/network/http/compression.rb +7 -0
  97. data/lib/puppet/network/http/connection.rb +2 -0
  98. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  99. data/lib/puppet/network/http/nocache_pool.rb +1 -0
  100. data/lib/puppet/network/http/pool.rb +8 -5
  101. data/lib/puppet/network/http/route.rb +2 -2
  102. data/lib/puppet/network/http_pool.rb +2 -1
  103. data/lib/puppet/node/environment.rb +22 -5
  104. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  105. data/lib/puppet/pal/pal_impl.rb +30 -31
  106. data/lib/puppet/parameter.rb +1 -1
  107. data/lib/puppet/parser/ast/leaf.rb +5 -5
  108. data/lib/puppet/parser/ast/pops_bridge.rb +0 -4
  109. data/lib/puppet/parser/compiler.rb +43 -33
  110. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  111. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  112. data/lib/puppet/parser/environment_compiler.rb +4 -1
  113. data/lib/puppet/parser/functions.rb +18 -9
  114. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  115. data/lib/puppet/parser/functions/filter.rb +1 -0
  116. data/lib/puppet/parser/resource.rb +3 -2
  117. data/lib/puppet/parser/resource/param.rb +6 -0
  118. data/lib/puppet/parser/type_loader.rb +2 -2
  119. data/lib/puppet/pops/adaptable.rb +7 -13
  120. data/lib/puppet/pops/adapters.rb +8 -4
  121. data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
  122. data/lib/puppet/pops/issues.rb +5 -0
  123. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  124. data/lib/puppet/pops/loaders.rb +24 -15
  125. data/lib/puppet/pops/lookup/context.rb +1 -1
  126. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  127. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  128. data/lib/puppet/pops/types/iterable.rb +34 -8
  129. data/lib/puppet/pops/validation/checker4_0.rb +29 -15
  130. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  131. data/lib/puppet/provider/file/windows.rb +1 -1
  132. data/lib/puppet/provider/group/groupadd.rb +9 -4
  133. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  134. data/lib/puppet/provider/package/aix.rb +17 -2
  135. data/lib/puppet/provider/package/apt.rb +98 -1
  136. data/lib/puppet/provider/package/aptitude.rb +1 -1
  137. data/lib/puppet/provider/package/dnfmodule.rb +61 -14
  138. data/lib/puppet/provider/package/gem.rb +45 -9
  139. data/lib/puppet/provider/package/pacman.rb +2 -5
  140. data/lib/puppet/provider/package/pip.rb +143 -48
  141. data/lib/puppet/provider/package/pip3.rb +0 -2
  142. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  143. data/lib/puppet/provider/package/pkgng.rb +16 -4
  144. data/lib/puppet/provider/package/portage.rb +2 -2
  145. data/lib/puppet/provider/package/puppet_gem.rb +11 -2
  146. data/lib/puppet/provider/package/rpm.rb +6 -213
  147. data/lib/puppet/provider/package/yum.rb +100 -20
  148. data/lib/puppet/provider/package/zypper.rb +62 -1
  149. data/lib/puppet/provider/service/systemd.rb +22 -4
  150. data/lib/puppet/provider/service/windows.rb +23 -7
  151. data/lib/puppet/provider/user/aix.rb +1 -1
  152. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  153. data/lib/puppet/provider/user/useradd.rb +16 -5
  154. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  155. data/lib/puppet/reports/http.rb +15 -9
  156. data/lib/puppet/resource.rb +2 -1
  157. data/lib/puppet/resource/type.rb +8 -0
  158. data/lib/puppet/resource/type_collection.rb +20 -16
  159. data/lib/puppet/runtime.rb +31 -1
  160. data/lib/puppet/settings.rb +3 -1
  161. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  162. data/lib/puppet/ssl.rb +1 -0
  163. data/lib/puppet/ssl/host.rb +4 -4
  164. data/lib/puppet/ssl/oids.rb +1 -0
  165. data/lib/puppet/ssl/ssl_context.rb +2 -2
  166. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  167. data/lib/puppet/ssl/state_machine.rb +81 -35
  168. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  169. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  170. data/lib/puppet/test/test_helper.rb +21 -14
  171. data/lib/puppet/transaction.rb +2 -2
  172. data/lib/puppet/transaction/persistence.rb +1 -1
  173. data/lib/puppet/transaction/report.rb +3 -3
  174. data/lib/puppet/trusted_external.rb +29 -1
  175. data/lib/puppet/type.rb +21 -8
  176. data/lib/puppet/type/file.rb +51 -13
  177. data/lib/puppet/type/file/checksum.rb +4 -4
  178. data/lib/puppet/type/file/source.rb +75 -64
  179. data/lib/puppet/type/notify.rb +2 -2
  180. data/lib/puppet/type/package.rb +41 -3
  181. data/lib/puppet/type/service.rb +59 -8
  182. data/lib/puppet/type/user.rb +19 -29
  183. data/lib/puppet/util.rb +41 -3
  184. data/lib/puppet/util/at_fork.rb +1 -1
  185. data/lib/puppet/util/autoload.rb +13 -25
  186. data/lib/puppet/util/character_encoding.rb +9 -5
  187. data/lib/puppet/util/checksums.rb +19 -4
  188. data/lib/puppet/util/execution.rb +2 -2
  189. data/lib/puppet/util/fileparsing.rb +2 -2
  190. data/lib/puppet/util/instance_loader.rb +14 -10
  191. data/lib/puppet/util/log/destinations.rb +1 -10
  192. data/lib/puppet/util/package/version/debian.rb +175 -0
  193. data/lib/puppet/util/package/version/gem.rb +15 -0
  194. data/lib/puppet/util/package/version/pip.rb +167 -0
  195. data/lib/puppet/util/package/version/range.rb +53 -0
  196. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  197. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  198. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  199. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  200. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  201. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  202. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  203. data/lib/puppet/util/package/version/rpm.rb +73 -0
  204. data/lib/puppet/util/pidlock.rb +13 -7
  205. data/lib/puppet/util/platform.rb +5 -0
  206. data/lib/puppet/util/provider_features.rb +1 -1
  207. data/lib/puppet/util/reference.rb +1 -1
  208. data/lib/puppet/util/rpm_compare.rb +193 -0
  209. data/lib/puppet/util/windows.rb +1 -0
  210. data/lib/puppet/util/windows/adsi.rb +2 -2
  211. data/lib/puppet/util/windows/api_types.rb +60 -33
  212. data/lib/puppet/util/windows/eventlog.rb +1 -6
  213. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  214. data/lib/puppet/util/windows/principal.rb +8 -6
  215. data/lib/puppet/util/windows/process.rb +15 -14
  216. data/lib/puppet/util/windows/registry.rb +11 -11
  217. data/lib/puppet/util/windows/security.rb +5 -4
  218. data/lib/puppet/util/windows/service.rb +43 -26
  219. data/lib/puppet/util/windows/sid.rb +3 -3
  220. data/lib/puppet/util/windows/user.rb +242 -8
  221. data/lib/puppet/version.rb +1 -1
  222. data/locales/puppet.pot +641 -511
  223. data/man/man5/puppet.conf.5 +75 -10
  224. data/man/man8/puppet-agent.8 +7 -7
  225. data/man/man8/puppet-apply.8 +1 -1
  226. data/man/man8/puppet-catalog.8 +1 -1
  227. data/man/man8/puppet-config.8 +1 -1
  228. data/man/man8/puppet-describe.8 +1 -1
  229. data/man/man8/puppet-device.8 +2 -2
  230. data/man/man8/puppet-doc.8 +1 -1
  231. data/man/man8/puppet-epp.8 +1 -1
  232. data/man/man8/puppet-facts.8 +1 -1
  233. data/man/man8/puppet-filebucket.8 +17 -2
  234. data/man/man8/puppet-generate.8 +1 -1
  235. data/man/man8/puppet-help.8 +6 -3
  236. data/man/man8/puppet-key.8 +1 -1
  237. data/man/man8/puppet-lookup.8 +2 -2
  238. data/man/man8/puppet-man.8 +1 -1
  239. data/man/man8/puppet-module.8 +4 -1
  240. data/man/man8/puppet-node.8 +1 -1
  241. data/man/man8/puppet-parser.8 +1 -1
  242. data/man/man8/puppet-plugin.8 +1 -1
  243. data/man/man8/puppet-report.8 +1 -1
  244. data/man/man8/puppet-resource.8 +1 -1
  245. data/man/man8/puppet-script.8 +1 -1
  246. data/man/man8/puppet-ssl.8 +2 -2
  247. data/man/man8/puppet-status.8 +1 -1
  248. data/man/man8/puppet.8 +2 -2
  249. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  250. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  251. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  252. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  253. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  254. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  255. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  256. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  257. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  258. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  259. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  260. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  261. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  262. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -67
  263. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +1 -69
  264. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -69
  265. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -67
  266. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -65
  267. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -67
  268. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +1 -67
  269. data/spec/integration/application/agent_spec.rb +475 -0
  270. data/spec/integration/application/apply_spec.rb +279 -150
  271. data/spec/integration/application/config_spec.rb +74 -0
  272. data/spec/integration/application/doc_spec.rb +16 -6
  273. data/spec/integration/application/filebucket_spec.rb +239 -0
  274. data/spec/integration/application/help_spec.rb +42 -0
  275. data/spec/integration/application/lookup_spec.rb +13 -0
  276. data/spec/integration/application/module_spec.rb +68 -0
  277. data/spec/integration/application/plugin_spec.rb +123 -0
  278. data/spec/integration/data_binding_spec.rb +82 -0
  279. data/spec/integration/defaults_spec.rb +1 -2
  280. data/spec/integration/directory_environments_spec.rb +17 -17
  281. data/spec/integration/http/client_spec.rb +47 -37
  282. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  283. data/spec/integration/indirector/report/yaml.rb +83 -0
  284. data/spec/integration/network/http_pool_spec.rb +93 -20
  285. data/spec/integration/node/environment_spec.rb +15 -0
  286. data/spec/integration/parser/compiler_spec.rb +11 -0
  287. data/spec/integration/type/file_spec.rb +1 -1
  288. data/spec/integration/util/execution_spec.rb +22 -0
  289. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  290. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  291. data/spec/integration/util/windows/process_spec.rb +26 -32
  292. data/spec/integration/util/windows/registry_spec.rb +7 -7
  293. data/spec/integration/util/windows/user_spec.rb +47 -5
  294. data/spec/integration/util_spec.rb +7 -33
  295. data/spec/lib/puppet/test_ca.rb +2 -2
  296. data/spec/lib/puppet_spec/https.rb +16 -7
  297. data/spec/lib/puppet_spec/matchers.rb +0 -80
  298. data/spec/lib/puppet_spec/puppetserver.rb +127 -0
  299. data/spec/shared_contexts/https.rb +29 -0
  300. data/spec/unit/agent_spec.rb +80 -26
  301. data/spec/unit/application/agent_spec.rb +12 -9
  302. data/spec/unit/application/describe_spec.rb +88 -50
  303. data/spec/unit/application/device_spec.rb +2 -2
  304. data/spec/unit/application/face_base_spec.rb +6 -4
  305. data/spec/unit/application/facts_spec.rb +39 -10
  306. data/spec/unit/application/filebucket_spec.rb +22 -2
  307. data/spec/unit/application/man_spec.rb +52 -0
  308. data/spec/unit/application/resource_spec.rb +3 -1
  309. data/spec/unit/application/ssl_spec.rb +15 -2
  310. data/spec/unit/configurer/downloader_spec.rb +10 -0
  311. data/spec/unit/configurer/fact_handler_spec.rb +4 -4
  312. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  313. data/spec/unit/configurer_spec.rb +64 -46
  314. data/spec/unit/confine_spec.rb +2 -1
  315. data/spec/unit/context/trusted_information_spec.rb +25 -2
  316. data/spec/unit/daemon_spec.rb +5 -64
  317. data/spec/unit/defaults_spec.rb +24 -1
  318. data/spec/unit/environments_spec.rb +8 -0
  319. data/spec/unit/face/config_spec.rb +3 -1
  320. data/spec/unit/face/module/search_spec.rb +17 -0
  321. data/spec/unit/face/plugin_spec.rb +12 -10
  322. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  323. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  324. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  325. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  326. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  327. data/spec/unit/file_system/uniquefile_spec.rb +29 -0
  328. data/spec/unit/file_system_spec.rb +10 -0
  329. data/spec/unit/functions/lookup_spec.rb +13 -0
  330. data/spec/unit/http/client_spec.rb +321 -36
  331. data/spec/unit/http/external_client_spec.rb +201 -0
  332. data/spec/unit/http/resolver_spec.rb +34 -3
  333. data/spec/unit/http/response_spec.rb +75 -0
  334. data/spec/unit/http/service/ca_spec.rb +53 -12
  335. data/spec/unit/http/service/compiler_spec.rb +332 -28
  336. data/spec/unit/http/service/file_server_spec.rb +100 -12
  337. data/spec/unit/http/service/report_spec.rb +19 -9
  338. data/spec/unit/http/service_spec.rb +94 -6
  339. data/spec/unit/http/session_spec.rb +159 -8
  340. data/spec/unit/indirector/catalog/compiler_spec.rb +1 -0
  341. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  342. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  343. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  344. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  345. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  346. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  347. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  348. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  349. data/spec/unit/indirector/request_spec.rb +1 -1
  350. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  351. data/spec/unit/indirector/rest_spec.rb +13 -0
  352. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  353. data/spec/unit/interface_spec.rb +3 -3
  354. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  355. data/spec/unit/network/format_support_spec.rb +3 -2
  356. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  357. data/spec/unit/network/http/connection_spec.rb +552 -190
  358. data/spec/unit/network/http/nocache_pool_spec.rb +22 -0
  359. data/spec/unit/network/http/pool_spec.rb +59 -13
  360. data/spec/unit/network/http_pool_spec.rb +63 -57
  361. data/spec/unit/network/http_spec.rb +1 -1
  362. data/spec/unit/node/environment_spec.rb +33 -0
  363. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  364. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  365. data/spec/unit/parser/scope_spec.rb +1 -1
  366. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  367. data/spec/unit/pops/loaders/loaders_spec.rb +71 -1
  368. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  369. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  370. data/spec/unit/provider/group/groupadd_spec.rb +22 -8
  371. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  372. data/spec/unit/provider/package/aix_spec.rb +29 -0
  373. data/spec/unit/provider/package/apt_spec.rb +107 -0
  374. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  375. data/spec/unit/provider/package/dnfmodule_spec.rb +54 -15
  376. data/spec/unit/provider/package/gem_spec.rb +40 -0
  377. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  378. data/spec/unit/provider/package/pip_spec.rb +68 -19
  379. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  380. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  381. data/spec/unit/provider/package/portage_spec.rb +5 -0
  382. data/spec/unit/provider/package/puppet_gem_spec.rb +12 -1
  383. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  384. data/spec/unit/provider/package/yum_spec.rb +243 -1
  385. data/spec/unit/provider/package/zypper_spec.rb +98 -0
  386. data/spec/unit/provider/service/init_spec.rb +42 -0
  387. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  388. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  389. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  390. data/spec/unit/provider/service/systemd_spec.rb +93 -18
  391. data/spec/unit/provider/service/windows_spec.rb +50 -14
  392. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  393. data/spec/unit/provider/user/useradd_spec.rb +30 -16
  394. data/spec/unit/provider/user/windows_adsi_spec.rb +85 -3
  395. data/spec/unit/puppet_pal_2pec.rb +11 -0
  396. data/spec/unit/puppet_pal_catalog_spec.rb +43 -0
  397. data/spec/unit/puppet_spec.rb +33 -0
  398. data/spec/unit/reports/http_spec.rb +70 -52
  399. data/spec/unit/reports/store_spec.rb +17 -13
  400. data/spec/unit/resource_spec.rb +3 -3
  401. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  402. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  403. data/spec/unit/ssl/host_spec.rb +4 -2
  404. data/spec/unit/ssl/oids_spec.rb +1 -0
  405. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  406. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  407. data/spec/unit/test/test_helper_spec.rb +17 -0
  408. data/spec/unit/transaction/persistence_spec.rb +15 -0
  409. data/spec/unit/transaction/report_spec.rb +5 -1
  410. data/spec/unit/transaction_spec.rb +0 -2
  411. data/spec/unit/type/file/ensure_spec.rb +1 -2
  412. data/spec/unit/type/file/source_spec.rb +89 -38
  413. data/spec/unit/type/file_spec.rb +122 -96
  414. data/spec/unit/type/service_spec.rb +218 -8
  415. data/spec/unit/type/user_spec.rb +32 -3
  416. data/spec/unit/type_spec.rb +50 -0
  417. data/spec/unit/util/at_fork_spec.rb +3 -2
  418. data/spec/unit/util/autoload_spec.rb +2 -1
  419. data/spec/unit/util/character_encoding_spec.rb +4 -4
  420. data/spec/unit/util/checksums_spec.rb +16 -0
  421. data/spec/unit/util/command_line_spec.rb +11 -6
  422. data/spec/unit/util/log/destinations_spec.rb +1 -29
  423. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  424. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  425. data/spec/unit/util/package/version/range_spec.rb +175 -0
  426. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  427. data/spec/unit/util/pidlock_spec.rb +102 -54
  428. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  429. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  430. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  431. data/spec/unit/util/windows/service_spec.rb +4 -4
  432. data/spec/unit/util/windows/sid_spec.rb +2 -2
  433. data/spec/unit/util_spec.rb +3 -3
  434. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  435. data/tasks/generate_cert_fixtures.rake +15 -1
  436. data/tasks/manpages.rake +5 -35
  437. metadata +84 -52
  438. data/COMMITTERS.md +0 -244
  439. data/spec/integration/faces/config_spec.rb +0 -91
  440. data/spec/integration/faces/documentation_spec.rb +0 -57
  441. data/spec/integration/faces/plugin_spec.rb +0 -61
  442. data/spec/integration/file_bucket/file_spec.rb +0 -50
  443. data/spec/integration/file_serving/content_spec.rb +0 -7
  444. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  445. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  446. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  447. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  448. data/spec/integration/module_tool/forge_spec.rb +0 -64
  449. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  450. data/spec/integration/provider/service/init_spec.rb +0 -48
  451. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  452. data/spec/integration/provider/service/windows_spec.rb +0 -50
  453. data/spec/integration/reference/providers_spec.rb +0 -21
  454. data/spec/integration/reports_spec.rb +0 -13
  455. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  456. data/spec/integration/ssl/host_spec.rb +0 -72
  457. data/spec/integration/ssl/key_spec.rb +0 -99
  458. data/spec/integration/test/test_helper_spec.rb +0 -31
  459. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  460. data/spec/unit/face/man_spec.rb +0 -25
  461. data/spec/unit/man_spec.rb +0 -31
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
- require 'webmock/rspec'
3
2
  require 'puppet/http'
4
3
 
5
4
  describe Puppet::HTTP::Service::FileServer do
@@ -27,14 +26,6 @@ describe Puppet::HTTP::Service::FileServer do
27
26
 
28
27
  subject.get_file_content(path: '/:mount/:path', environment: environment) { |data| }
29
28
  end
30
-
31
- it 'includes the X-Puppet-Profiling header when Puppet[:profile] is true' do
32
- stub_request(:get, uri).with(headers: {'X-Puppet-Version' => /./, 'User-Agent' => /./, 'X-Puppet-Profiling' => 'true'})
33
-
34
- Puppet[:profile] = true
35
-
36
- subject.get_file_content(path: '/:mount/:path', environment: environment) { |data| }
37
- end
38
29
  end
39
30
 
40
31
  context 'when routing to the file service' do
@@ -54,6 +45,16 @@ describe Puppet::HTTP::Service::FileServer do
54
45
  let(:filemetadata) { Puppet::FileServing::Metadata.new(path) }
55
46
  let(:request_path) { "/:mount/#{path}"}
56
47
 
48
+ it 'includes puppet headers set via the :http_extra_headers and :profile settings' do
49
+ stub_request(:get, url).with(headers: {'Example-Header' => 'real-thing', 'another' => 'thing', 'X-Puppet-Profiling' => 'true'}).
50
+ to_return(status: 200, body: filemetadata.render, headers: { 'Content-Type' => 'application/json' })
51
+
52
+ Puppet[:http_extra_headers] = 'Example-Header:real-thing,another:thing'
53
+ Puppet[:profile] = true
54
+
55
+ subject.get_file_metadata(path: request_path, environment: environment)
56
+ end
57
+
57
58
  it 'submits a request for file metadata to the server' do
58
59
  stub_request(:get, url).with(
59
60
  headers: {'Accept'=>'application/json, application/x-msgpack, text/pson',}
@@ -61,10 +62,19 @@ describe Puppet::HTTP::Service::FileServer do
61
62
  status: 200, body: filemetadata.render, headers: { 'Content-Type' => 'application/json' }
62
63
  )
63
64
 
64
- metadata = subject.get_file_metadata(path: request_path, environment: environment)
65
+ _, metadata = subject.get_file_metadata(path: request_path, environment: environment)
65
66
  expect(metadata.path).to eq(path)
66
67
  end
67
68
 
69
+ it 'returns the request response' do
70
+ stub_request(:get, url).to_return(
71
+ status: 200, body: filemetadata.render, headers: { 'Content-Type' => 'application/json' }
72
+ )
73
+
74
+ resp, _ = subject.get_file_metadata(path: request_path, environment: environment)
75
+ expect(resp).to be_a(Puppet::HTTP::Response)
76
+ end
77
+
68
78
  it 'raises a protocol error if the Content-Type header is missing from the response' do
69
79
  stub_request(:get, url).to_return(status: 200, body: '', headers: {})
70
80
 
@@ -117,6 +127,16 @@ describe Puppet::HTTP::Service::FileServer do
117
127
  let(:formatter) { Puppet::Network::FormatHandler.format(:json) }
118
128
  let(:request_path) { "/:mount/#{path}"}
119
129
 
130
+ it 'includes puppet headers set via the :http_extra_headers and :profile settings' do
131
+ stub_request(:get, url).with(headers: {'Example-Header' => 'real-thing', 'another' => 'thing', 'X-Puppet-Profiling' => 'true'}).
132
+ to_return(status: 200, body: formatter.render_multiple(filemetadatas), headers: { 'Content-Type' => 'application/json' })
133
+
134
+ Puppet[:http_extra_headers] = 'Example-Header:real-thing,another:thing'
135
+ Puppet[:profile] = true
136
+
137
+ subject.get_file_metadatas(path: request_path, environment: environment)
138
+ end
139
+
120
140
  it 'submits a request for file metadata to the server' do
121
141
  stub_request(:get, url).with(
122
142
  headers: {'Accept'=>'application/json, application/x-msgpack, text/pson',}
@@ -124,10 +144,19 @@ describe Puppet::HTTP::Service::FileServer do
124
144
  status: 200, body: formatter.render_multiple(filemetadatas), headers: { 'Content-Type' => 'application/json' }
125
145
  )
126
146
 
127
- metadatas = subject.get_file_metadatas(path: request_path, environment: environment)
147
+ _, metadatas = subject.get_file_metadatas(path: request_path, environment: environment)
128
148
  expect(metadatas.first.path).to eq(path)
129
149
  end
130
150
 
151
+ it 'returns the request response' do
152
+ stub_request(:get, url).to_return(
153
+ status: 200, body: formatter.render_multiple(filemetadatas), headers: { 'Content-Type' => 'application/json' }
154
+ )
155
+
156
+ resp, _ = subject.get_file_metadatas(path: request_path, environment: environment)
157
+ expect(resp).to be_a(Puppet::HTTP::Response)
158
+ end
159
+
131
160
  it 'automatically converts an array of parameters to the stringified query' do
132
161
  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"
133
162
  stub_request(:get, url).with(
@@ -136,7 +165,7 @@ describe Puppet::HTTP::Service::FileServer do
136
165
  status: 200, body: formatter.render_multiple(filemetadatas), headers: { 'Content-Type' => 'application/json' }
137
166
  )
138
167
 
139
- metadatas = subject.get_file_metadatas(path: request_path, environment: environment, ignore: ['CVS', '.git', '.hg'])
168
+ _, metadatas = subject.get_file_metadatas(path: request_path, environment: environment, ignore: ['CVS', '.git', '.hg'])
140
169
  expect(metadatas.first.path).to eq(path)
141
170
  end
142
171
 
@@ -188,6 +217,18 @@ describe Puppet::HTTP::Service::FileServer do
188
217
  context 'getting file content' do
189
218
  let(:uri) {"https://www.example.com:443/puppet/v3/file_content/:mount/:path?environment=testing"}
190
219
 
220
+ it 'includes puppet headers set via the :http_extra_headers and :profile settings' do
221
+ stub_request(:get, uri).with(headers: {'Example-Header' => 'real-thing', 'another' => 'thing', 'X-Puppet-Profiling' => 'true'}).
222
+ to_return(status: 200, body: "and beyond")
223
+
224
+ Puppet[:http_extra_headers] = 'Example-Header:real-thing,another:thing'
225
+ Puppet[:profile] = true
226
+
227
+ expect { |b|
228
+ subject.get_file_content(path: '/:mount/:path', environment: environment, &b)
229
+ }.to yield_with_args("and beyond")
230
+ end
231
+
191
232
  it 'yields file content' do
192
233
  stub_request(:get, uri).with do |request|
193
234
  expect(request.headers).to include({'Accept' => 'application/octet-stream'})
@@ -198,6 +239,13 @@ describe Puppet::HTTP::Service::FileServer do
198
239
  }.to yield_with_args("and beyond")
199
240
  end
200
241
 
242
+ it 'returns the request response' do
243
+ stub_request(:get, uri)
244
+
245
+ resp = subject.get_file_content(path: '/:mount/:path', environment: environment) { |b| b }
246
+ expect(resp).to be_a(Puppet::HTTP::Response)
247
+ end
248
+
201
249
  it 'raises response error if unsuccessful' do
202
250
  stub_request(:get, uri).to_return(status: [400, 'Bad Request'])
203
251
 
@@ -216,4 +264,44 @@ describe Puppet::HTTP::Service::FileServer do
216
264
  }.to raise_error(ArgumentError, 'Path must start with a slash')
217
265
  end
218
266
  end
267
+
268
+ context 'getting static file content' do
269
+ let(:code_id) { "0fc72115-adc6-4b1a-aa50-8f31b3ece440" }
270
+ let(:uri) { "https://www.example.com:443/puppet/v3/static_file_content/:mount/:path?environment=testing&code_id=#{code_id}"}
271
+
272
+ it 'yields file content' do
273
+ stub_request(:get, uri).with do |request|
274
+ expect(request.headers).to include({'Accept' => 'application/octet-stream'})
275
+ end.to_return(status: 200, body: "and beyond")
276
+
277
+ expect { |b|
278
+ subject.get_static_file_content(path: '/:mount/:path', environment: environment, code_id: code_id, &b)
279
+ }.to yield_with_args("and beyond")
280
+ end
281
+
282
+ it 'returns the request response' do
283
+ stub_request(:get, uri)
284
+
285
+ resp = subject.get_static_file_content(path: '/:mount/:path', environment: environment, code_id: code_id) { |b| b }
286
+ expect(resp).to be_a(Puppet::HTTP::Response)
287
+ end
288
+
289
+ it 'raises response error if unsuccessful' do
290
+ stub_request(:get, uri).to_return(status: [400, 'Bad Request'])
291
+
292
+ expect {
293
+ subject.get_static_file_content(path: '/:mount/:path', environment: environment, code_id: code_id) { |data| }
294
+ }.to raise_error do |err|
295
+ expect(err).to be_an_instance_of(Puppet::HTTP::ResponseError)
296
+ expect(err.message).to eq('Bad Request')
297
+ expect(err.response.code).to eq(400)
298
+ end
299
+ end
300
+
301
+ it 'raises response error if path is relative' do
302
+ expect {
303
+ subject.get_static_file_content(path: 'relative_path', environment: environment, code_id: code_id) { |data| }
304
+ }.to raise_error(ArgumentError, 'Path must start with a slash')
305
+ end
306
+ end
219
307
  end
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
- require 'webmock/rspec'
3
2
  require 'puppet/http'
4
3
 
5
4
  describe Puppet::HTTP::Service::Report do
@@ -25,14 +24,6 @@ describe Puppet::HTTP::Service::Report do
25
24
 
26
25
  subject.put_report('report', report, environment: environment)
27
26
  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
27
  end
37
28
 
38
29
  context 'when routing to the report service' do
@@ -60,6 +51,15 @@ describe Puppet::HTTP::Service::Report do
60
51
  context 'when submitting a report' do
61
52
  let(:url) { "https://www.example.com/puppet/v3/report/infinity?environment=testing" }
62
53
 
54
+ it 'includes puppet headers set via the :http_extra_headers and :profile settings' do
55
+ stub_request(:put, url).with(headers: {'Example-Header' => 'real-thing', 'another' => 'thing', 'X-Puppet-Profiling' => 'true'})
56
+
57
+ Puppet[:http_extra_headers] = 'Example-Header:real-thing,another:thing'
58
+ Puppet[:profile] = true
59
+
60
+ subject.put_report('infinity', report, environment: environment)
61
+ end
62
+
63
63
  it 'submits a report to the "report" endpoint' do
64
64
  stub_request(:put, url)
65
65
  .with(
@@ -79,6 +79,16 @@ describe Puppet::HTTP::Service::Report do
79
79
  subject.put_report('node name', report, environment: environment)
80
80
  end
81
81
 
82
+ it 'returns the response whose body contains the list of report processors' do
83
+ body = "[\"store\":\"http\"]"
84
+ stub_request(:put, url)
85
+ .to_return(status: 200, body: body, headers: {'Content-Type' => 'application/json'})
86
+
87
+ resp = subject.put_report('infinity', report, environment: environment)
88
+ expect(resp.body).to eq(body)
89
+ expect(resp).to be_a(Puppet::HTTP::Response)
90
+ end
91
+
82
92
  it 'raises response error if unsuccessful' do
83
93
  stub_request(:put, url).to_return(status: [400, 'Bad Request'], headers: {'X-Puppet-Version' => '6.1.8' })
84
94
 
@@ -1,19 +1,78 @@
1
1
  require 'spec_helper'
2
- require 'webmock/rspec'
3
2
  require 'puppet/http'
3
+ require 'puppet/file_serving'
4
+ require 'puppet/file_serving/content'
5
+ require 'puppet/file_serving/metadata'
4
6
 
5
7
  describe Puppet::HTTP::Service do
6
8
  let(:ssl_context) { Puppet::SSL::SSLContext.new }
7
9
  let(:client) { Puppet::HTTP::Client.new(ssl_context: ssl_context) }
10
+ let(:session) { Puppet::HTTP::Session.new(client, []) }
8
11
  let(:url) { URI.parse('https://www.example.com') }
9
- let(:service) { described_class.new(client, url) }
12
+ let(:service) { described_class.new(client, session, url) }
13
+
14
+ class TestService < Puppet::HTTP::Service
15
+ def get_test(ssl_context)
16
+ @client.get(
17
+ url,
18
+ headers: add_puppet_headers({'Default-Header' => 'default-value'}),
19
+ options: {ssl_context: ssl_context}
20
+ )
21
+ end
22
+
23
+ def mime_types(model)
24
+ get_mime_types(model)
25
+ end
26
+ end
27
+
28
+ context 'when modifying headers for an http request' do
29
+ let(:service) { TestService.new(client, session, url) }
30
+
31
+ it 'adds custom user-specified headers' do
32
+ stub_request(:get, "https://www.example.com/").
33
+ with( headers: { 'Default-Header'=>'default-value', 'Header2'=>'newvalue' })
34
+
35
+ Puppet[:http_extra_headers] = 'header2:newvalue'
36
+
37
+ service.get_test(ssl_context)
38
+ end
39
+
40
+ it 'adds X-Puppet-Profiling header if set' do
41
+ stub_request(:get, "https://www.example.com/").
42
+ with( headers: { 'Default-Header'=>'default-value', 'X-Puppet-Profiling'=>'true' })
43
+
44
+ Puppet[:profile] = true
45
+
46
+ service.get_test(ssl_context)
47
+ end
48
+
49
+ it 'ignores a custom header does not have a value' do
50
+ stub_request(:get, "https://www.example.com/").with do |request|
51
+ expect(request.headers).to include({'Default-Header' => 'default-value'})
52
+ expect(request.headers).to_not include('header-with-no-value')
53
+ end
54
+
55
+ Puppet[:http_extra_headers] = 'header-with-no-value:'
56
+
57
+ service.get_test(ssl_context)
58
+ end
59
+
60
+ it 'ignores a custom header that already exists (case insensitive) in the header hash' do
61
+ stub_request(:get, "https://www.example.com/").
62
+ with( headers: { 'Default-Header'=>'default-value' })
63
+
64
+ Puppet[:http_extra_headers] = 'default-header:wrongvalue'
65
+
66
+ service.get_test(ssl_context)
67
+ end
68
+ end
10
69
 
11
70
  it "returns a URI containing the base URL and path" do
12
71
  expect(service.with_base_url('/puppet/v3')).to eq(URI.parse("https://www.example.com/puppet/v3"))
13
72
  end
14
73
 
15
74
  it "doesn't modify frozen the base URL" do
16
- service = described_class.new(client, url.freeze)
75
+ service = described_class.new(client, session, url.freeze)
17
76
  service.with_base_url('/puppet/v3')
18
77
  end
19
78
 
@@ -22,21 +81,21 @@ describe Puppet::HTTP::Service do
22
81
  end
23
82
 
24
83
  it "connects to the base URL with a nil ssl context" do
25
- expect(client).to receive(:connect).with(url, ssl_context: nil)
84
+ expect(client).to receive(:connect).with(url, options: {ssl_context: nil})
26
85
 
27
86
  service.connect
28
87
  end
29
88
 
30
89
  it "accepts an optional ssl_context" do
31
90
  other_ctx = Puppet::SSL::SSLContext.new
32
- expect(client).to receive(:connect).with(url, ssl_context: other_ctx)
91
+ expect(client).to receive(:connect).with(url, options: {ssl_context: other_ctx})
33
92
 
34
93
  service.connect(ssl_context: other_ctx)
35
94
  end
36
95
 
37
96
  it 'raises for unknown service names' do
38
97
  expect {
39
- described_class.create_service(client, :westbound)
98
+ described_class.create_service(client, session, :westbound)
40
99
  }.to raise_error(ArgumentError, "Unknown service westbound")
41
100
  end
42
101
 
@@ -53,4 +112,33 @@ describe Puppet::HTTP::Service do
53
112
  it "returns false for unknown service names" do
54
113
  expect(described_class.valid_name?(:westbound)).to eq(false)
55
114
  end
115
+
116
+ it 'returns different mime types for different models' do
117
+ mimes = if Puppet.features.msgpack?
118
+ %w[application/json application/x-msgpack text/pson]
119
+ else
120
+ %w[application/json text/pson]
121
+ end
122
+
123
+ service = TestService.new(client, session, url)
124
+ [
125
+ Puppet::Node,
126
+ Puppet::Node::Facts,
127
+ Puppet::Transaction::Report,
128
+ Puppet::FileServing::Metadata,
129
+ Puppet::Status
130
+ ].each do |model|
131
+ expect(service.mime_types(model)).to eq(mimes)
132
+ end
133
+
134
+ # These are special
135
+ expect(service.mime_types(Puppet::FileServing::Content)).to eq(%w[application/octet-stream])
136
+
137
+ catalog_mimes = if Puppet.features.msgpack?
138
+ %w[application/vnd.puppet.rich+json application/json application/vnd.puppet.rich+msgpack application/x-msgpack text/pson]
139
+ else
140
+ %w[application/vnd.puppet.rich+json application/json application/vnd.puppet.rich+msgpack text/pson]
141
+ end
142
+ expect(service.mime_types(Puppet::Resource::Catalog)).to eq(catalog_mimes)
143
+ end
56
144
  end
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
- require 'webmock/rspec'
3
2
  require 'puppet/http'
4
3
 
5
4
  describe Puppet::HTTP::Session do
@@ -10,10 +9,14 @@ describe Puppet::HTTP::Session do
10
9
  double('good', url: uri, connect: nil)
11
10
  }
12
11
  let(:bad_service) {
12
+ create_bad_service
13
+ }
14
+
15
+ def create_bad_service(failure_message = 'whoops')
13
16
  service = double('bad', url: uri)
14
- allow(service).to receive(:connect).and_raise(Puppet::HTTP::ConnectionError, 'whoops')
17
+ allow(service).to receive(:connect).and_raise(Puppet::HTTP::ConnectionError, failure_message)
15
18
  service
16
- }
19
+ end
17
20
 
18
21
  class DummyResolver < Puppet::HTTP::Resolver
19
22
  attr_reader :count
@@ -23,21 +26,19 @@ describe Puppet::HTTP::Session do
23
26
  @count = 0
24
27
  end
25
28
 
26
- def resolve(session, name, ssl_context: nil)
29
+ def resolve(session, name, ssl_context: nil, error_handler: nil)
27
30
  @count += 1
28
- return @service if check_connection?(session, @service, ssl_context: ssl_context)
31
+ return @service if check_connection?(session, @service, ssl_context: ssl_context, error_handler: error_handler)
29
32
  end
30
33
  end
31
34
 
32
35
  context 'when routing' do
33
36
  it 'returns the first resolved service' do
34
- Puppet[:log_level] = :debug
35
37
  resolvers = [DummyResolver.new(bad_service), DummyResolver.new(good_service)]
36
38
  session = described_class.new(client, resolvers)
37
39
  resolved = session.route_to(:ca)
38
40
 
39
41
  expect(resolved).to eq(good_service)
40
- expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Connection to #{uri} failed, trying next route: whoops"))
41
42
  end
42
43
 
43
44
  it 'only resolves once per session' do
@@ -58,6 +59,29 @@ describe Puppet::HTTP::Session do
58
59
  }.to raise_error(Puppet::HTTP::RouteError, 'No more routes to ca')
59
60
  end
60
61
 
62
+ it 'logs all routing failures as errors when there are no more routes' do
63
+ resolvers = [DummyResolver.new(create_bad_service('whoops1')), DummyResolver.new(create_bad_service('whoops2'))]
64
+ session = described_class.new(client, resolvers)
65
+
66
+ expect {
67
+ session.route_to(:ca)
68
+ }.to raise_error(Puppet::HTTP::RouteError, 'No more routes to ca')
69
+
70
+ expect(@logs).to include(an_object_having_attributes(level: :err, message: "whoops1"),
71
+ an_object_having_attributes(level: :err, message: "whoops2"))
72
+ end
73
+
74
+ it 'logs routing failures as debug until routing succeeds' do
75
+ Puppet[:log_level] = 'debug'
76
+
77
+ resolvers = [DummyResolver.new(bad_service), DummyResolver.new(good_service)]
78
+ session = described_class.new(client, resolvers)
79
+ session.route_to(:ca)
80
+
81
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Connection to #{uri} failed, trying next route: whoops"))
82
+ expect(@logs).to_not include(an_object_having_attributes(level: :err))
83
+ end
84
+
61
85
  it 'accepts an ssl context to use when connecting' do
62
86
  alt_context = Puppet::SSL::SSLContext.new
63
87
  expect(good_service).to receive(:connect).with(ssl_context: alt_context)
@@ -155,7 +179,6 @@ describe Puppet::HTTP::Session do
155
179
  }.to raise_error(Puppet::Error, "Could not select a functional puppet master from server_list: 'foo.example.com,bar.example.com'")
156
180
  end
157
181
 
158
-
159
182
  it "raises when there are no more routes" do
160
183
  allow_any_instance_of(Net::HTTP).to receive(:start).and_raise(Errno::EHOSTUNREACH)
161
184
  session = client.create_session
@@ -164,5 +187,133 @@ describe Puppet::HTTP::Session do
164
187
  session.route_to(:ca)
165
188
  }.to raise_error(Puppet::HTTP::RouteError, 'No more routes to ca')
166
189
  end
190
+
191
+ Puppet::HTTP::Service::SERVICE_NAMES.each do |name|
192
+ it "resolves #{name} using server_list" do
193
+ Puppet[:server_list] = 'apple.example.com'
194
+ req = stub_request(:get, "https://apple.example.com:8140/status/v1/simple/master").to_return(status: 200)
195
+
196
+ session.route_to(name)
197
+
198
+ expect(req).to have_been_requested
199
+ end
200
+ end
201
+
202
+ it 'does not use server_list to resolve the ca service when ca_server is explicitly set' do
203
+ Puppet[:ca_server] = 'banana.example.com'
204
+
205
+ expect(session.route_to(:ca).url.to_s).to eq("https://banana.example.com:8140/puppet-ca/v1")
206
+ end
207
+
208
+ it 'does not use server_list to resolve the report service when the report_server is explicitly set' do
209
+ Puppet[:report_server] = 'cherry.example.com'
210
+
211
+ expect(session.route_to(:report).url.to_s).to eq("https://cherry.example.com:8140/puppet/v3")
212
+ end
213
+
214
+ it 'resolves once for all services in a session' do
215
+ Puppet[:server_list] = 'apple.example.com'
216
+ req = stub_request(:get, "https://apple.example.com:8140/status/v1/simple/master").to_return(status: 200)
217
+
218
+ Puppet::HTTP::Service::SERVICE_NAMES.each do |name|
219
+ session.route_to(name)
220
+ end
221
+
222
+ expect(req).to have_been_requested
223
+ end
224
+
225
+ it 'resolves server_list for each new session' do
226
+ Puppet[:server_list] = 'apple.example.com'
227
+ req = stub_request(:get, "https://apple.example.com:8140/status/v1/simple/master").to_return(status: 200)
228
+
229
+ client.create_session.route_to(:puppet)
230
+ client.create_session.route_to(:puppet)
231
+
232
+ expect(req).to have_been_requested.twice
233
+ end
234
+ end
235
+
236
+ context 'when retrieving capabilities' do
237
+ let(:session) do
238
+ resolver = DummyResolver.new(good_service)
239
+ described_class.new(client, [resolver])
240
+ end
241
+
242
+ it 'raises for unknown service names' do
243
+ expect {
244
+ session = described_class.new(client, [])
245
+ session.supports?(:westbound, 'a capability')
246
+ }.to raise_error(ArgumentError, "Unknown service westbound")
247
+ end
248
+
249
+ context 'locales' do
250
+ it 'does not support locales if the cached service has not been resolved' do
251
+ session = described_class.new(client, [])
252
+
253
+ expect(session).to_not be_supports(:puppet, 'locales')
254
+ end
255
+
256
+ it "supports locales if the cached service's version is 5.3.4 or greater" do
257
+ response = Puppet::HTTP::Response.new({'X-Puppet-Version' => '5.3.4'}, uri)
258
+
259
+ session.route_to(:puppet)
260
+ session.process_response(response)
261
+
262
+ expect(session).to be_supports(:puppet, 'locales')
263
+ end
264
+
265
+ it "does not support locales if the cached service's version is 5.3.3" do
266
+ response = Puppet::HTTP::Response.new({'X-Puppet-Version' => '5.3.3'}, uri)
267
+
268
+ session.route_to(:puppet)
269
+ session.process_response(response)
270
+
271
+ expect(session).to_not be_supports(:puppet, 'locales')
272
+ end
273
+
274
+ it "does not support locales if the cached service's version is missing" do
275
+ response = Puppet::HTTP::Response.new({}, uri)
276
+
277
+ session.route_to(:puppet)
278
+ session.process_response(response)
279
+
280
+ expect(session).to_not be_supports(:puppet, 'locales')
281
+ end
282
+ end
283
+
284
+ context 'json' do
285
+ it 'does not support json if the cached service has not been resolved' do
286
+ session = described_class.new(client, [])
287
+
288
+ expect(session).to_not be_supports(:puppet, 'json')
289
+ end
290
+
291
+ it "supports json if the cached service's version is 5 or greater" do
292
+ response = Puppet::HTTP::Response.new({'X-Puppet-Version' => '5.5.12'}, uri)
293
+
294
+ session.route_to(:puppet)
295
+ session.process_response(response)
296
+
297
+ expect(session).to be_supports(:puppet, 'json')
298
+ end
299
+
300
+ it "does not support json if the cached service's version is less than 5.0" do
301
+ response = Puppet::HTTP::Response.new({'X-Puppet-Version' => '4.10.1'}, uri)
302
+
303
+ session.route_to(:puppet)
304
+ session.process_response(response)
305
+
306
+ expect(session).to_not be_supports(:puppet, 'json')
307
+ end
308
+
309
+ it "supports json if the cached service's version is missing" do
310
+ response = Puppet::HTTP::Response.new({}, uri)
311
+
312
+ session.route_to(:puppet)
313
+ session.process_response(response)
314
+
315
+ expect(session).to be_supports(:puppet, 'json')
316
+ end
317
+ end
167
318
  end
168
319
  end