puppet 6.14.0-universal-darwin → 6.19.0-universal-darwin

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

Potentially problematic release.


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

Files changed (496) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -7
  3. data/Gemfile +4 -2
  4. data/Gemfile.lock +36 -34
  5. data/README.md +3 -4
  6. data/Rakefile +4 -12
  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/agent/locker.rb +0 -7
  11. data/lib/puppet/application/agent.rb +25 -9
  12. data/lib/puppet/application/apply.rb +18 -20
  13. data/lib/puppet/application/device.rb +1 -1
  14. data/lib/puppet/application/doc.rb +1 -1
  15. data/lib/puppet/application/filebucket.rb +5 -14
  16. data/lib/puppet/application/lookup.rb +16 -4
  17. data/lib/puppet/application/plugin.rb +1 -0
  18. data/lib/puppet/application/ssl.rb +3 -3
  19. data/lib/puppet/configurer.rb +68 -24
  20. data/lib/puppet/configurer/downloader.rb +31 -10
  21. data/lib/puppet/configurer/plugin_handler.rb +1 -1
  22. data/lib/puppet/confine.rb +2 -2
  23. data/lib/puppet/confine/any.rb +1 -1
  24. data/lib/puppet/context/trusted_information.rb +14 -8
  25. data/lib/puppet/daemon.rb +13 -27
  26. data/lib/puppet/defaults.rb +141 -41
  27. data/lib/puppet/environments.rb +55 -15
  28. data/lib/puppet/face/catalog.rb +1 -1
  29. data/lib/puppet/face/config.rb +46 -16
  30. data/lib/puppet/face/facts.rb +1 -1
  31. data/lib/puppet/face/help.rb +29 -3
  32. data/lib/puppet/face/module/search.rb +5 -0
  33. data/lib/puppet/face/node.rb +3 -3
  34. data/lib/puppet/face/node/clean.rb +2 -2
  35. data/lib/puppet/face/plugin.rb +2 -2
  36. data/lib/puppet/face/status.rb +1 -1
  37. data/lib/puppet/feature/base.rb +1 -1
  38. data/lib/puppet/file_bucket/dipper.rb +1 -1
  39. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  40. data/lib/puppet/file_serving/metadata.rb +4 -1
  41. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  42. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  43. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  44. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  45. data/lib/puppet/file_system/file_impl.rb +17 -13
  46. data/lib/puppet/file_system/uniquefile.rb +12 -16
  47. data/lib/puppet/forge.rb +1 -1
  48. data/lib/puppet/forge/cache.rb +1 -1
  49. data/lib/puppet/forge/repository.rb +4 -7
  50. data/lib/puppet/functions/call.rb +1 -1
  51. data/lib/puppet/functions/filter.rb +1 -0
  52. data/lib/puppet/functions/lstrip.rb +4 -4
  53. data/lib/puppet/functions/new.rb +8 -3
  54. data/lib/puppet/functions/reduce.rb +2 -4
  55. data/lib/puppet/functions/reverse_each.rb +1 -1
  56. data/lib/puppet/functions/rstrip.rb +4 -4
  57. data/lib/puppet/functions/step.rb +1 -1
  58. data/lib/puppet/functions/strip.rb +4 -4
  59. data/lib/puppet/gettext/config.rb +5 -5
  60. data/lib/puppet/gettext/module_translations.rb +4 -4
  61. data/lib/puppet/http.rb +3 -0
  62. data/lib/puppet/http/client.rb +215 -60
  63. data/lib/puppet/http/external_client.rb +90 -0
  64. data/lib/puppet/http/redirector.rb +43 -7
  65. data/lib/puppet/http/resolver.rb +43 -3
  66. data/lib/puppet/http/resolver/server_list.rb +66 -24
  67. data/lib/puppet/http/resolver/settings.rb +21 -1
  68. data/lib/puppet/http/resolver/srv.rb +28 -2
  69. data/lib/puppet/http/response.rb +82 -1
  70. data/lib/puppet/http/retry_after_handler.rb +39 -0
  71. data/lib/puppet/http/service.rb +70 -2
  72. data/lib/puppet/http/service/ca.rb +71 -9
  73. data/lib/puppet/http/service/compiler.rb +214 -12
  74. data/lib/puppet/http/service/file_server.rb +106 -5
  75. data/lib/puppet/http/service/puppetserver.rb +39 -0
  76. data/lib/puppet/http/service/report.rb +36 -3
  77. data/lib/puppet/http/session.rb +60 -8
  78. data/lib/puppet/indirector.rb +1 -1
  79. data/lib/puppet/indirector/catalog/compiler.rb +1 -1
  80. data/lib/puppet/indirector/catalog/rest.rb +2 -1
  81. data/lib/puppet/indirector/exec.rb +1 -1
  82. data/lib/puppet/indirector/facts/facter.rb +3 -3
  83. data/lib/puppet/indirector/facts/rest.rb +2 -1
  84. data/lib/puppet/indirector/facts/yaml.rb +1 -1
  85. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  86. data/lib/puppet/indirector/file_content/http.rb +5 -0
  87. data/lib/puppet/indirector/file_content/rest.rb +1 -1
  88. data/lib/puppet/indirector/file_metadata/http.rb +28 -8
  89. data/lib/puppet/indirector/file_metadata/rest.rb +6 -4
  90. data/lib/puppet/indirector/hiera.rb +4 -0
  91. data/lib/puppet/indirector/indirection.rb +1 -1
  92. data/lib/puppet/indirector/json.rb +1 -1
  93. data/lib/puppet/indirector/msgpack.rb +1 -1
  94. data/lib/puppet/indirector/node/rest.rb +2 -1
  95. data/lib/puppet/indirector/report/processor.rb +2 -2
  96. data/lib/puppet/indirector/report/yaml.rb +23 -0
  97. data/lib/puppet/indirector/request.rb +5 -5
  98. data/lib/puppet/indirector/rest.rb +7 -1
  99. data/lib/puppet/indirector/status/rest.rb +2 -1
  100. data/lib/puppet/indirector/yaml.rb +1 -1
  101. data/lib/puppet/metatype/manager.rb +80 -80
  102. data/lib/puppet/module.rb +1 -2
  103. data/lib/puppet/network/format_support.rb +2 -2
  104. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  105. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  106. data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
  107. data/lib/puppet/network/http/base_pool.rb +6 -1
  108. data/lib/puppet/network/http/compression.rb +7 -0
  109. data/lib/puppet/network/http/connection.rb +2 -0
  110. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  111. data/lib/puppet/network/http/nocache_pool.rb +1 -0
  112. data/lib/puppet/network/http/pool.rb +2 -4
  113. data/lib/puppet/network/http/route.rb +2 -2
  114. data/lib/puppet/network/http_pool.rb +2 -1
  115. data/lib/puppet/node/environment.rb +22 -5
  116. data/lib/puppet/node/facts.rb +17 -0
  117. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  118. data/lib/puppet/pal/pal_impl.rb +30 -31
  119. data/lib/puppet/parameter.rb +1 -1
  120. data/lib/puppet/parser/ast/leaf.rb +5 -5
  121. data/lib/puppet/parser/ast/pops_bridge.rb +0 -4
  122. data/lib/puppet/parser/compiler.rb +43 -33
  123. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  124. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  125. data/lib/puppet/parser/environment_compiler.rb +4 -1
  126. data/lib/puppet/parser/functions.rb +18 -9
  127. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  128. data/lib/puppet/parser/functions/filter.rb +1 -0
  129. data/lib/puppet/parser/resource.rb +3 -2
  130. data/lib/puppet/parser/resource/param.rb +6 -0
  131. data/lib/puppet/parser/type_loader.rb +2 -2
  132. data/lib/puppet/pops/adaptable.rb +7 -13
  133. data/lib/puppet/pops/adapters.rb +8 -4
  134. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
  135. data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
  136. data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
  137. data/lib/puppet/pops/issues.rb +5 -0
  138. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  139. data/lib/puppet/pops/loaders.rb +24 -15
  140. data/lib/puppet/pops/lookup/context.rb +1 -1
  141. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  142. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  143. data/lib/puppet/pops/types/iterable.rb +34 -8
  144. data/lib/puppet/pops/types/p_meta_type.rb +1 -1
  145. data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
  146. data/lib/puppet/pops/validation/checker4_0.rb +29 -15
  147. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  148. data/lib/puppet/provider/file/windows.rb +1 -1
  149. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  150. data/lib/puppet/provider/package/aix.rb +17 -2
  151. data/lib/puppet/provider/package/apt.rb +98 -1
  152. data/lib/puppet/provider/package/aptitude.rb +1 -1
  153. data/lib/puppet/provider/package/dnfmodule.rb +61 -14
  154. data/lib/puppet/provider/package/dpkg.rb +1 -1
  155. data/lib/puppet/provider/package/gem.rb +45 -9
  156. data/lib/puppet/provider/package/pacman.rb +2 -5
  157. data/lib/puppet/provider/package/pip.rb +143 -48
  158. data/lib/puppet/provider/package/pip2.rb +17 -0
  159. data/lib/puppet/provider/package/pip3.rb +0 -2
  160. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  161. data/lib/puppet/provider/package/pkgng.rb +16 -4
  162. data/lib/puppet/provider/package/portage.rb +2 -2
  163. data/lib/puppet/provider/package/puppet_gem.rb +11 -2
  164. data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
  165. data/lib/puppet/provider/package/rpm.rb +6 -213
  166. data/lib/puppet/provider/package/yum.rb +101 -20
  167. data/lib/puppet/provider/package/zypper.rb +62 -1
  168. data/lib/puppet/provider/service/systemd.rb +22 -4
  169. data/lib/puppet/provider/service/windows.rb +23 -7
  170. data/lib/puppet/provider/user/aix.rb +1 -1
  171. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  172. data/lib/puppet/provider/user/useradd.rb +16 -5
  173. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  174. data/lib/puppet/reports/http.rb +15 -9
  175. data/lib/puppet/resource.rb +2 -1
  176. data/lib/puppet/resource/type.rb +10 -1
  177. data/lib/puppet/resource/type_collection.rb +20 -16
  178. data/lib/puppet/rest/route.rb +2 -2
  179. data/lib/puppet/runtime.rb +25 -2
  180. data/lib/puppet/settings.rb +20 -6
  181. data/lib/puppet/ssl.rb +1 -0
  182. data/lib/puppet/ssl/host.rb +4 -4
  183. data/lib/puppet/ssl/oids.rb +1 -0
  184. data/lib/puppet/ssl/ssl_context.rb +2 -2
  185. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  186. data/lib/puppet/ssl/state_machine.rb +79 -37
  187. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  188. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  189. data/lib/puppet/test/test_helper.rb +19 -14
  190. data/lib/puppet/transaction.rb +2 -2
  191. data/lib/puppet/transaction/persistence.rb +1 -1
  192. data/lib/puppet/transaction/report.rb +14 -10
  193. data/lib/puppet/trusted_external.rb +29 -1
  194. data/lib/puppet/type.rb +21 -8
  195. data/lib/puppet/type/file.rb +40 -15
  196. data/lib/puppet/type/file/checksum.rb +4 -4
  197. data/lib/puppet/type/file/source.rb +35 -13
  198. data/lib/puppet/type/filebucket.rb +1 -1
  199. data/lib/puppet/type/notify.rb +2 -2
  200. data/lib/puppet/type/package.rb +41 -3
  201. data/lib/puppet/type/service.rb +59 -8
  202. data/lib/puppet/type/user.rb +19 -29
  203. data/lib/puppet/util.rb +41 -3
  204. data/lib/puppet/util/at_fork.rb +1 -1
  205. data/lib/puppet/util/autoload.rb +13 -25
  206. data/lib/puppet/util/character_encoding.rb +9 -5
  207. data/lib/puppet/util/checksums.rb +19 -4
  208. data/lib/puppet/util/connection.rb +8 -8
  209. data/lib/puppet/util/execution.rb +2 -2
  210. data/lib/puppet/util/fileparsing.rb +2 -2
  211. data/lib/puppet/util/instance_loader.rb +14 -10
  212. data/lib/puppet/util/log/destinations.rb +1 -10
  213. data/lib/puppet/util/package/version/debian.rb +175 -0
  214. data/lib/puppet/util/package/version/gem.rb +15 -0
  215. data/lib/puppet/util/package/version/pip.rb +167 -0
  216. data/lib/puppet/util/package/version/range.rb +53 -0
  217. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  218. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  219. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  220. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  221. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  222. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  223. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  224. data/lib/puppet/util/package/version/rpm.rb +73 -0
  225. data/lib/puppet/util/pidlock.rb +13 -7
  226. data/lib/puppet/util/platform.rb +5 -0
  227. data/lib/puppet/util/provider_features.rb +1 -1
  228. data/lib/puppet/util/reference.rb +1 -1
  229. data/lib/puppet/util/rpm_compare.rb +193 -0
  230. data/lib/puppet/util/run_mode.rb +5 -1
  231. data/lib/puppet/util/windows.rb +1 -0
  232. data/lib/puppet/util/windows/adsi.rb +2 -2
  233. data/lib/puppet/util/windows/api_types.rb +60 -33
  234. data/lib/puppet/util/windows/eventlog.rb +1 -6
  235. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  236. data/lib/puppet/util/windows/principal.rb +8 -6
  237. data/lib/puppet/util/windows/process.rb +15 -14
  238. data/lib/puppet/util/windows/registry.rb +11 -11
  239. data/lib/puppet/util/windows/security.rb +5 -4
  240. data/lib/puppet/util/windows/service.rb +43 -26
  241. data/lib/puppet/util/windows/sid.rb +3 -3
  242. data/lib/puppet/util/windows/user.rb +242 -8
  243. data/lib/puppet/version.rb +1 -1
  244. data/locales/puppet.pot +627 -507
  245. data/man/man5/puppet.conf.5 +93 -20
  246. data/man/man8/puppet-agent.8 +7 -4
  247. data/man/man8/puppet-apply.8 +1 -1
  248. data/man/man8/puppet-catalog.8 +1 -1
  249. data/man/man8/puppet-config.8 +6 -6
  250. data/man/man8/puppet-describe.8 +1 -1
  251. data/man/man8/puppet-device.8 +1 -1
  252. data/man/man8/puppet-doc.8 +1 -1
  253. data/man/man8/puppet-epp.8 +1 -1
  254. data/man/man8/puppet-facts.8 +1 -1
  255. data/man/man8/puppet-filebucket.8 +1 -1
  256. data/man/man8/puppet-generate.8 +1 -1
  257. data/man/man8/puppet-help.8 +6 -3
  258. data/man/man8/puppet-key.8 +1 -1
  259. data/man/man8/puppet-lookup.8 +2 -2
  260. data/man/man8/puppet-man.8 +1 -1
  261. data/man/man8/puppet-module.8 +4 -1
  262. data/man/man8/puppet-node.8 +4 -4
  263. data/man/man8/puppet-parser.8 +1 -1
  264. data/man/man8/puppet-plugin.8 +1 -1
  265. data/man/man8/puppet-report.8 +1 -1
  266. data/man/man8/puppet-resource.8 +1 -1
  267. data/man/man8/puppet-script.8 +1 -1
  268. data/man/man8/puppet-ssl.8 +1 -1
  269. data/man/man8/puppet-status.8 +2 -2
  270. data/man/man8/puppet.8 +2 -2
  271. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  272. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  273. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  274. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  275. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  276. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  277. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  278. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  279. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  280. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  281. data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
  282. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  283. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  284. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  285. data/spec/integration/application/agent_spec.rb +479 -0
  286. data/spec/integration/application/apply_spec.rb +279 -150
  287. data/spec/integration/application/config_spec.rb +74 -0
  288. data/spec/integration/application/doc_spec.rb +16 -6
  289. data/spec/integration/application/filebucket_spec.rb +239 -0
  290. data/spec/integration/application/help_spec.rb +42 -0
  291. data/spec/integration/application/lookup_spec.rb +13 -0
  292. data/spec/integration/application/module_spec.rb +68 -0
  293. data/spec/integration/application/plugin_spec.rb +123 -0
  294. data/spec/integration/configurer_spec.rb +14 -0
  295. data/spec/integration/data_binding_spec.rb +82 -0
  296. data/spec/integration/defaults_spec.rb +27 -3
  297. data/spec/integration/directory_environments_spec.rb +17 -17
  298. data/spec/integration/http/client_spec.rb +39 -40
  299. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  300. data/spec/integration/indirector/report/yaml.rb +83 -0
  301. data/spec/integration/network/http_pool_spec.rb +84 -19
  302. data/spec/integration/node/environment_spec.rb +15 -0
  303. data/spec/integration/parser/compiler_spec.rb +11 -0
  304. data/spec/integration/type/file_spec.rb +1 -1
  305. data/spec/integration/util/execution_spec.rb +22 -0
  306. data/spec/integration/util/windows/adsi_spec.rb +8 -3
  307. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  308. data/spec/integration/util/windows/process_spec.rb +26 -32
  309. data/spec/integration/util/windows/registry_spec.rb +7 -7
  310. data/spec/integration/util/windows/user_spec.rb +47 -5
  311. data/spec/integration/util_spec.rb +7 -33
  312. data/spec/lib/puppet/test_ca.rb +2 -2
  313. data/spec/lib/puppet_spec/https.rb +16 -7
  314. data/spec/lib/puppet_spec/matchers.rb +0 -80
  315. data/spec/lib/puppet_spec/puppetserver.rb +127 -0
  316. data/spec/shared_contexts/https.rb +29 -0
  317. data/spec/shared_contexts/types_setup.rb +2 -0
  318. data/spec/unit/agent_spec.rb +80 -26
  319. data/spec/unit/application/agent_spec.rb +12 -9
  320. data/spec/unit/application/device_spec.rb +2 -2
  321. data/spec/unit/application/doc_spec.rb +2 -2
  322. data/spec/unit/application/face_base_spec.rb +6 -4
  323. data/spec/unit/application/facts_spec.rb +41 -10
  324. data/spec/unit/application/filebucket_spec.rb +22 -2
  325. data/spec/unit/application/man_spec.rb +52 -0
  326. data/spec/unit/application/resource_spec.rb +3 -1
  327. data/spec/unit/application/ssl_spec.rb +15 -2
  328. data/spec/unit/application_spec.rb +9 -4
  329. data/spec/unit/configurer/downloader_spec.rb +10 -0
  330. data/spec/unit/configurer/fact_handler_spec.rb +4 -4
  331. data/spec/unit/configurer_spec.rb +87 -38
  332. data/spec/unit/confine_spec.rb +2 -1
  333. data/spec/unit/context/trusted_information_spec.rb +25 -2
  334. data/spec/unit/daemon_spec.rb +5 -64
  335. data/spec/unit/defaults_spec.rb +24 -1
  336. data/spec/unit/environments_spec.rb +107 -32
  337. data/spec/unit/face/config_spec.rb +59 -1
  338. data/spec/unit/face/module/search_spec.rb +17 -0
  339. data/spec/unit/face/node_spec.rb +2 -2
  340. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  341. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  342. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  343. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  344. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  345. data/spec/unit/file_system/uniquefile_spec.rb +29 -0
  346. data/spec/unit/file_system_spec.rb +11 -2
  347. data/spec/unit/http/client_spec.rb +173 -59
  348. data/spec/unit/http/external_client_spec.rb +201 -0
  349. data/spec/unit/http/resolver_spec.rb +44 -5
  350. data/spec/unit/http/response_spec.rb +6 -0
  351. data/spec/unit/http/service/ca_spec.rb +27 -5
  352. data/spec/unit/http/service/compiler_spec.rb +186 -9
  353. data/spec/unit/http/service/file_server_spec.rb +37 -6
  354. data/spec/unit/http/service/puppetserver_spec.rb +82 -0
  355. data/spec/unit/http/service/report_spec.rb +5 -4
  356. data/spec/unit/http/service_spec.rb +3 -4
  357. data/spec/unit/http/session_spec.rb +48 -12
  358. data/spec/unit/indirector/catalog/compiler_spec.rb +1 -0
  359. data/spec/unit/indirector/catalog/json_spec.rb +1 -1
  360. data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
  361. data/spec/unit/indirector/facts/rest_spec.rb +1 -1
  362. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  363. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  364. data/spec/unit/indirector/file_metadata/rest_spec.rb +15 -14
  365. data/spec/unit/indirector/json_spec.rb +8 -8
  366. data/spec/unit/indirector/msgpack_spec.rb +8 -8
  367. data/spec/unit/indirector/node/rest_spec.rb +1 -1
  368. data/spec/unit/indirector/request_spec.rb +5 -5
  369. data/spec/unit/indirector/rest_spec.rb +14 -1
  370. data/spec/unit/indirector/status/rest_spec.rb +1 -1
  371. data/spec/unit/indirector/yaml_spec.rb +7 -7
  372. data/spec/unit/interface_spec.rb +3 -3
  373. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  374. data/spec/unit/network/format_support_spec.rb +3 -2
  375. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  376. data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
  377. data/spec/unit/network/http/connection_spec.rb +552 -190
  378. data/spec/unit/network/http/nocache_pool_spec.rb +22 -0
  379. data/spec/unit/network/http/pool_spec.rb +3 -3
  380. data/spec/unit/network/http_pool_spec.rb +63 -57
  381. data/spec/unit/network/http_spec.rb +1 -1
  382. data/spec/unit/node/environment_spec.rb +33 -0
  383. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  384. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  385. data/spec/unit/parser/scope_spec.rb +1 -1
  386. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  387. data/spec/unit/pops/loaders/loaders_spec.rb +71 -1
  388. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  389. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  390. data/spec/unit/provider/exec_spec.rb +4 -3
  391. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  392. data/spec/unit/provider/package/aix_spec.rb +29 -0
  393. data/spec/unit/provider/package/apt_spec.rb +107 -0
  394. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  395. data/spec/unit/provider/package/dnfmodule_spec.rb +54 -15
  396. data/spec/unit/provider/package/dpkg_spec.rb +22 -7
  397. data/spec/unit/provider/package/gem_spec.rb +40 -0
  398. data/spec/unit/provider/package/openbsd_spec.rb +2 -0
  399. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  400. data/spec/unit/provider/package/pip2_spec.rb +36 -0
  401. data/spec/unit/provider/package/pip_spec.rb +68 -19
  402. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  403. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  404. data/spec/unit/provider/package/portage_spec.rb +5 -0
  405. data/spec/unit/provider/package/puppet_gem_spec.rb +12 -1
  406. data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
  407. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  408. data/spec/unit/provider/package/yum_spec.rb +274 -1
  409. data/spec/unit/provider/package/zypper_spec.rb +98 -0
  410. data/spec/unit/provider/service/base_spec.rb +2 -4
  411. data/spec/unit/provider/service/bsd_spec.rb +5 -1
  412. data/spec/unit/provider/service/daemontools_spec.rb +1 -1
  413. data/spec/unit/provider/service/debian_spec.rb +3 -5
  414. data/spec/unit/provider/service/freebsd_spec.rb +1 -1
  415. data/spec/unit/provider/service/gentoo_spec.rb +4 -5
  416. data/spec/unit/provider/service/init_spec.rb +46 -5
  417. data/spec/unit/provider/service/launchd_spec.rb +5 -6
  418. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  419. data/spec/unit/provider/service/openrc_spec.rb +4 -5
  420. data/spec/unit/provider/service/openwrt_spec.rb +2 -1
  421. data/spec/unit/provider/service/redhat_spec.rb +10 -1
  422. data/spec/unit/provider/service/runit_spec.rb +2 -1
  423. data/spec/unit/provider/service/smf_spec.rb +1 -1
  424. data/spec/unit/provider/service/src_spec.rb +3 -5
  425. data/spec/unit/provider/service/systemd_spec.rb +95 -18
  426. data/spec/unit/provider/service/upstart_spec.rb +4 -5
  427. data/spec/unit/provider/service/windows_spec.rb +50 -14
  428. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  429. data/spec/unit/provider/user/useradd_spec.rb +30 -16
  430. data/spec/unit/provider/user/windows_adsi_spec.rb +85 -3
  431. data/spec/unit/puppet_pal_2pec.rb +11 -0
  432. data/spec/unit/puppet_pal_catalog_spec.rb +43 -0
  433. data/spec/unit/puppet_spec.rb +33 -0
  434. data/spec/unit/reports/http_spec.rb +70 -52
  435. data/spec/unit/reports/store_spec.rb +17 -13
  436. data/spec/unit/resource_spec.rb +3 -3
  437. data/spec/unit/rest/route_spec.rb +4 -4
  438. data/spec/unit/settings_spec.rb +44 -22
  439. data/spec/unit/ssl/host_spec.rb +4 -2
  440. data/spec/unit/ssl/oids_spec.rb +1 -0
  441. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  442. data/spec/unit/ssl/state_machine_spec.rb +90 -14
  443. data/spec/unit/test/test_helper_spec.rb +17 -0
  444. data/spec/unit/transaction/persistence_spec.rb +15 -0
  445. data/spec/unit/transaction/report_spec.rb +7 -1
  446. data/spec/unit/type/file/source_spec.rb +4 -4
  447. data/spec/unit/type/file_spec.rb +122 -96
  448. data/spec/unit/type/filebucket_spec.rb +1 -1
  449. data/spec/unit/type/service_spec.rb +218 -8
  450. data/spec/unit/type/user_spec.rb +32 -3
  451. data/spec/unit/type_spec.rb +50 -0
  452. data/spec/unit/util/at_fork_spec.rb +2 -2
  453. data/spec/unit/util/autoload_spec.rb +2 -1
  454. data/spec/unit/util/character_encoding_spec.rb +4 -4
  455. data/spec/unit/util/checksums_spec.rb +16 -0
  456. data/spec/unit/util/command_line_spec.rb +11 -6
  457. data/spec/unit/util/log/destinations_spec.rb +1 -29
  458. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  459. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  460. data/spec/unit/util/package/version/range_spec.rb +175 -0
  461. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  462. data/spec/unit/util/pidlock_spec.rb +83 -47
  463. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  464. data/spec/unit/util/run_mode_spec.rb +6 -6
  465. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  466. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  467. data/spec/unit/util/windows/service_spec.rb +4 -4
  468. data/spec/unit/util/windows/sid_spec.rb +2 -2
  469. data/spec/unit/util_spec.rb +3 -3
  470. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  471. data/tasks/generate_cert_fixtures.rake +15 -1
  472. data/tasks/manpages.rake +5 -35
  473. metadata +90 -51
  474. data/spec/integration/faces/config_spec.rb +0 -91
  475. data/spec/integration/faces/documentation_spec.rb +0 -57
  476. data/spec/integration/faces/plugin_spec.rb +0 -63
  477. data/spec/integration/file_bucket/file_spec.rb +0 -50
  478. data/spec/integration/file_serving/content_spec.rb +0 -7
  479. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  480. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  481. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  482. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  483. data/spec/integration/module_tool/forge_spec.rb +0 -64
  484. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  485. data/spec/integration/provider/service/init_spec.rb +0 -48
  486. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  487. data/spec/integration/provider/service/windows_spec.rb +0 -50
  488. data/spec/integration/reference/providers_spec.rb +0 -21
  489. data/spec/integration/reports_spec.rb +0 -13
  490. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  491. data/spec/integration/ssl/host_spec.rb +0 -72
  492. data/spec/integration/ssl/key_spec.rb +0 -99
  493. data/spec/integration/test/test_helper_spec.rb +0 -31
  494. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  495. data/spec/unit/face/man_spec.rb +0 -25
  496. data/spec/unit/man_spec.rb +0 -31
@@ -3,62 +3,81 @@ require 'spec_helper'
3
3
  require 'puppet/file_serving/terminus_selector'
4
4
 
5
5
  describe Puppet::FileServing::TerminusSelector do
6
- before do
7
- @object = Object.new
8
- @object.extend(Puppet::FileServing::TerminusSelector)
6
+ class TestSelector
7
+ include Puppet::FileServing::TerminusSelector
8
+ end
9
9
 
10
- @request = double('request', :key => "mymod/myfile", :options => {:node => "whatever"}, :server => nil, :protocol => nil)
10
+ def create_request(key)
11
+ Puppet::Indirector::Request.new(:indirection_name, :find, key, nil, {node: 'whatever'})
11
12
  end
12
13
 
14
+ subject { TestSelector.new }
15
+
13
16
  describe "when being used to select termini" do
14
17
  it "should return :file if the request key is fully qualified" do
15
- expect(@request).to receive(:key).and_return(File.expand_path('/foo'))
16
- expect(@object.select(@request)).to eq(:file)
18
+ request = create_request(File.expand_path('/foo'))
19
+
20
+ expect(subject.select(request)).to eq(:file)
21
+ end
22
+
23
+ it "should return :file_server if the request key is relative" do
24
+ request = create_request('modules/my_module/path/to_file')
25
+
26
+ expect(subject.select(request)).to eq(:file_server)
17
27
  end
18
28
 
19
29
  it "should return :file if the URI protocol is set to 'file'" do
20
- expect(@request).to receive(:protocol).and_return("file")
21
- expect(@object.select(@request)).to eq(:file)
30
+ request = create_request(Puppet::Util.path_to_uri(File.expand_path("/foo")).to_s)
31
+
32
+ expect(subject.select(request)).to eq(:file)
22
33
  end
23
34
 
24
35
  it "should return :http if the URI protocol is set to 'http'" do
25
- expect(@request).to receive(:protocol).and_return("http")
26
- expect(@object.select(@request)).to eq :http
36
+ request = create_request("http://www.example.com")
37
+
38
+ expect(subject.select(request)).to eq(:http)
27
39
  end
28
40
 
29
41
  it "should return :http if the URI protocol is set to 'https'" do
30
- expect(@request).to receive(:protocol).and_return("https")
31
- expect(@object.select(@request)).to eq :http
42
+ request = create_request("https://www.example.com")
43
+
44
+ expect(subject.select(request)).to eq(:http)
45
+ end
46
+
47
+ it "should return :http if the path starts with a double slash" do
48
+ request = create_request("https://www.example.com//index.html")
49
+
50
+ expect(subject.select(request)).to eq(:http)
32
51
  end
33
52
 
34
53
  it "should fail when a protocol other than :puppet, :http(s) or :file is used" do
35
- allow(@request).to receive(:protocol).and_return("ftp")
36
- expect { @object.select(@request) }.to raise_error(ArgumentError)
54
+ request = create_request("ftp://ftp.example.com")
55
+
56
+ expect {
57
+ subject.select(request)
58
+ }.to raise_error(ArgumentError, /URI protocol 'ftp' is not currently supported for file serving/)
37
59
  end
38
60
 
39
61
  describe "and the protocol is 'puppet'" do
40
- before do
41
- allow(@request).to receive(:protocol).and_return("puppet")
42
- end
43
-
44
62
  it "should choose :rest when a server is specified" do
45
- allow(@request).to receive(:protocol).and_return("puppet")
46
- expect(@request).to receive(:server).and_return("foo")
47
- expect(@object.select(@request)).to eq(:rest)
63
+ request = create_request("puppet://puppetserver.example.com")
64
+
65
+ expect(subject.select(request)).to eq(:rest)
48
66
  end
49
67
 
50
68
  # This is so a given file location works when bootstrapping with no server.
51
69
  it "should choose :rest when default_file_terminus is rest" do
52
- allow(@request).to receive(:protocol).and_return("puppet")
53
70
  Puppet[:server] = 'localhost'
54
- expect(@object.select(@request)).to eq(:rest)
71
+ request = create_request("puppet:///plugins")
72
+
73
+ expect(subject.select(request)).to eq(:rest)
55
74
  end
56
75
 
57
76
  it "should choose :file_server when default_file_terminus is file_server and no server is specified on the request" do
58
- expect(@request).to receive(:protocol).and_return("puppet")
59
- expect(@request).to receive(:server).and_return(nil)
60
77
  Puppet[:default_file_terminus] = 'file_server'
61
- expect(@object.select(@request)).to eq(:file_server)
78
+ request = create_request("puppet:///plugins")
79
+
80
+ expect(subject.select(request)).to eq(:file_server)
62
81
  end
63
82
  end
64
83
  end
@@ -1,6 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Puppet::FileSystem::Uniquefile do
4
+ include PuppetSpec::Files
5
+
4
6
  it "makes the name of the file available" do
5
7
  Puppet::FileSystem::Uniquefile.open_tmp('foo') do |file|
6
8
  expect(file.path).to match(/foo/)
@@ -73,6 +75,33 @@ describe Puppet::FileSystem::Uniquefile do
73
75
  Puppet::FileSystem::Uniquefile.open_tmp('foo') { |tmp| }
74
76
  end
75
77
 
78
+ it "reports when a parent directory does not exist" do
79
+ dir = tmpdir('uniquefile')
80
+ lock = File.join(dir, 'path', 'to', 'lock')
81
+
82
+ expect {
83
+ Puppet::FileSystem::Uniquefile.open_tmp(lock) { |tmp| }
84
+ }.to raise_error(Errno::ENOENT, %r{No such file or directory - A directory component in .* does not exist or is a dangling symbolic link})
85
+ end
86
+
87
+ it "should use UTF8 characters in TMP,TEMP,TMPDIR environment variable", :if => Puppet::Util::Platform.windows? do
88
+ rune_utf8 = "\u16A0\u16C7\u16BB\u16EB\u16D2\u16E6\u16A6\u16EB\u16A0\u16B1\u16A9\u16A0\u16A2\u16B1\u16EB\u16A0\u16C1\u16B1\u16AA\u16EB\u16B7\u16D6\u16BB\u16B9\u16E6\u16DA\u16B3\u16A2\u16D7"
89
+ temp_rune_utf8 = File.join(Dir.tmpdir, rune_utf8)
90
+ Puppet::FileSystem.mkpath(temp_rune_utf8)
91
+
92
+ # Set the temporary environment variables to the UTF8 temp path
93
+ Puppet::Util::Windows::Process.set_environment_variable('TMPDIR', temp_rune_utf8)
94
+ Puppet::Util::Windows::Process.set_environment_variable('TMP', temp_rune_utf8)
95
+ Puppet::Util::Windows::Process.set_environment_variable('TEMP', temp_rune_utf8)
96
+
97
+ # Create a unique file
98
+ filename = Puppet::FileSystem::Uniquefile.open_tmp('foo') do |file|
99
+ File.dirname(file.path)
100
+ end
101
+
102
+ expect(filename).to eq(temp_rune_utf8)
103
+ end
104
+
76
105
  context "Ruby 1.9.3 Tempfile tests" do
77
106
  # the remaining tests in this file are ported directly from the ruby 1.9.3 source,
78
107
  # since most of this file was ported from there
@@ -872,8 +872,7 @@ describe "Puppet::FileSystem" do
872
872
 
873
873
  # regardless of slash direction, return value is drive letter
874
874
  expanded = Puppet::FileSystem.expand_path(slash)
875
- expect(expanded).to eq(ENV['SystemDrive'] + File::SEPARATOR)
876
- expect(expanded).to eq(File.expand_path(slash))
875
+ expect(expanded).to match(/^[a-z]:/i)
877
876
  end
878
877
  end
879
878
 
@@ -970,6 +969,16 @@ describe "Puppet::FileSystem" do
970
969
  mode = Puppet::FileSystem.stat(dest).mode
971
970
  expect(mode & 07777).to eq(0400)
972
971
  end
972
+
973
+ it 'preserves file ownership' do
974
+ allow(Puppet::FileSystem).to receive(:lstat)
975
+ .with(Puppet::FileSystem.pathname(dest))
976
+ .and_return(double(uid: 1, gid: 2))
977
+
978
+ expect(FileUtils).to receive(:chown).with(1, 2, /#{dest}/)
979
+
980
+ Puppet::FileSystem.replace_file(dest, 0644) { |f| f.write(content) }
981
+ end
973
982
  end
974
983
 
975
984
  context 'on windows', if: Puppet::Util::Platform.windows? do
@@ -1,13 +1,11 @@
1
1
  require 'spec_helper'
2
- require 'webmock/rspec'
3
2
  require 'puppet/http'
4
3
 
5
4
  describe Puppet::HTTP::Client do
6
5
  let(:uri) { URI.parse('https://www.example.com') }
7
- let(:pool) { Puppet::Network::HTTP::Pool.new }
8
6
  let(:puppet_context) { Puppet::SSL::SSLContext.new }
9
7
  let(:system_context) { Puppet::SSL::SSLContext.new }
10
- let(:client) { described_class.new(pool: pool, ssl_context: puppet_context, system_ssl_context: system_context) }
8
+ let(:client) { described_class.new(ssl_context: puppet_context, system_ssl_context: system_context) }
11
9
  let(:credentials) { ['user', 'pass'] }
12
10
 
13
11
  it 'creates unique sessions' do
@@ -50,7 +48,7 @@ describe Puppet::HTTP::Client do
50
48
  end
51
49
 
52
50
  it 'connects using the default ssl context' do
53
- expect(pool).to receive(:with_connection) do |_, verifier|
51
+ expect(client.pool).to receive(:with_connection) do |_, verifier|
54
52
  expect(verifier.ssl_context).to equal(puppet_context)
55
53
  end
56
54
 
@@ -60,24 +58,32 @@ describe Puppet::HTTP::Client do
60
58
  it 'connects using a specified ssl context' do
61
59
  other_context = Puppet::SSL::SSLContext.new
62
60
 
63
- expect(pool).to receive(:with_connection) do |_, verifier|
61
+ expect(client.pool).to receive(:with_connection) do |_, verifier|
64
62
  expect(verifier.ssl_context).to equal(other_context)
65
63
  end
66
64
 
67
- client.connect(uri, ssl_context: other_context)
65
+ client.connect(uri, options: {ssl_context: other_context})
68
66
  end
69
67
 
70
68
  it 'connects using the system store' do
71
- expect(pool).to receive(:with_connection) do |_, verifier|
69
+ expect(client.pool).to receive(:with_connection) do |_, verifier|
72
70
  expect(verifier.ssl_context).to equal(system_context)
73
71
  end
74
72
 
75
- client.connect(uri, include_system_store: true)
73
+ client.connect(uri, options: {include_system_store: true})
74
+ end
75
+
76
+ it 'does not create a verifier for HTTP connections' do
77
+ expect(client.pool).to receive(:with_connection) do |_, verifier|
78
+ expect(verifier).to be_nil
79
+ end
80
+
81
+ client.connect(URI.parse('http://www.example.com'))
76
82
  end
77
83
 
78
84
  it 'raises an HTTPError if both are specified' do
79
85
  expect {
80
- client.connect(uri, ssl_context: puppet_context, include_system_store: true)
86
+ client.connect(uri, options: {ssl_context: puppet_context, include_system_store: true})
81
87
  }.to raise_error(Puppet::HTTP::HTTPError, /The ssl_context and include_system_store parameters are mutually exclusive/)
82
88
  end
83
89
  end
@@ -110,10 +116,8 @@ describe Puppet::HTTP::Client do
110
116
 
111
117
  context "when closing" do
112
118
  it "closes all connections in the pool" do
113
- pool = double('pool')
114
- expect(pool).to receive(:close)
119
+ expect(client.pool).to receive(:close)
115
120
 
116
- client = described_class.new(pool: pool)
117
121
  client.close
118
122
  end
119
123
  end
@@ -180,18 +184,18 @@ describe Puppet::HTTP::Client do
180
184
 
181
185
  other_context = Puppet::SSL::SSLContext.new
182
186
 
183
- client.get(uri, ssl_context: other_context)
187
+ client.get(uri, options: {ssl_context: other_context})
184
188
  end
185
189
 
186
190
  it 'uses the system store' do
187
191
  stub_request(:get, uri).to_return(body: "abc")
188
192
 
189
- client.get(uri, include_system_store: true)
193
+ client.get(uri, options: {include_system_store: true})
190
194
  end
191
195
 
192
196
  it 'raises an HTTPError if both are specified' do
193
197
  expect {
194
- client.get(uri, ssl_context: puppet_context, include_system_store: true)
198
+ client.get(uri, options: {ssl_context: puppet_context, include_system_store: true})
195
199
  }.to raise_error(Puppet::HTTP::HTTPError, /The ssl_context and include_system_store parameters are mutually exclusive/)
196
200
  end
197
201
  end
@@ -237,18 +241,18 @@ describe Puppet::HTTP::Client do
237
241
 
238
242
  other_context = Puppet::SSL::SSLContext.new
239
243
 
240
- client.head(uri, ssl_context: other_context)
244
+ client.head(uri, options: {ssl_context: other_context})
241
245
  end
242
246
 
243
247
  it 'uses the system store' do
244
248
  stub_request(:head, uri)
245
249
 
246
- client.head(uri, include_system_store: true)
250
+ client.head(uri, options: {include_system_store: true})
247
251
  end
248
252
 
249
253
  it 'raises an HTTPError if both are specified' do
250
254
  expect {
251
- client.head(uri, ssl_context: puppet_context, include_system_store: true)
255
+ client.head(uri, options: {ssl_context: puppet_context, include_system_store: true})
252
256
  }.to raise_error(Puppet::HTTP::HTTPError, /The ssl_context and include_system_store parameters are mutually exclusive/)
253
257
  end
254
258
  end
@@ -261,25 +265,25 @@ describe Puppet::HTTP::Client do
261
265
  expect(request.headers).to_not include('X-Puppet-Profiling')
262
266
  end
263
267
 
264
- client.put(uri, content_type: 'text/plain', body: "")
268
+ client.put(uri, "", headers: {'Content-Type' => 'text/plain'})
265
269
  end
266
270
 
267
271
  it "stringifies keys and encodes values in the query" do
268
272
  stub_request(:put, "https://www.example.com").with(query: "foo=bar%3Dbaz")
269
273
 
270
- client.put(uri, params: {:foo => "bar=baz"}, content_type: 'text/plain', body: "")
274
+ client.put(uri, "", params: {:foo => "bar=baz"}, headers: {'Content-Type' => 'text/plain'})
271
275
  end
272
276
 
273
277
  it "includes custom headers" do
274
278
  stub_request(:put, "https://www.example.com").with(headers: { 'X-Foo' => 'Bar' })
275
279
 
276
- client.put(uri, headers: {'X-Foo' => 'Bar'}, content_type: 'text/plain', body: "")
280
+ client.put(uri, "", headers: {'X-Foo' => 'Bar', 'Content-Type' => 'text/plain'})
277
281
  end
278
282
 
279
283
  it "returns the response" do
280
284
  stub_request(:put, uri)
281
285
 
282
- response = client.put(uri, content_type: 'text/plain', body: "")
286
+ response = client.put(uri, "", headers: {'Content-Type' => 'text/plain'})
283
287
  expect(response).to be_an_instance_of(Puppet::HTTP::Response)
284
288
  expect(response).to be_success
285
289
  expect(response.code).to eq(200)
@@ -288,27 +292,39 @@ describe Puppet::HTTP::Client do
288
292
  it "sets content-length and content-type for the body" do
289
293
  stub_request(:put, uri).with(headers: {"Content-Length" => "5", "Content-Type" => "text/plain"})
290
294
 
291
- client.put(uri, content_type: 'text/plain', body: "hello")
295
+ client.put(uri, "hello", headers: {'Content-Type' => 'text/plain'})
292
296
  end
293
297
 
298
+ it 'raises an ArgumentError if `body` is missing' do
299
+ expect {
300
+ client.put(uri, nil, headers: {'Content-Type' => 'text/plain'})
301
+ }.to raise_error(ArgumentError, /'put' requires a string 'body' argument/)
302
+ end
303
+
304
+ it 'raises an ArgumentError if `content_type` is missing from the headers hash' do
305
+ expect {
306
+ client.put(uri, '')
307
+ }.to raise_error(ArgumentError, /'put' requires a 'content-type' header/)
308
+ end
309
+
294
310
  context 'when connecting' do
295
311
  it 'uses a specified ssl context' do
296
312
  stub_request(:put, uri)
297
313
 
298
314
  other_context = Puppet::SSL::SSLContext.new
299
315
 
300
- client.put(uri, content_type: 'text/plain', body: "", ssl_context: other_context)
316
+ client.put(uri, "", headers: {'Content-Type' => 'text/plain'}, options: {ssl_context: other_context})
301
317
  end
302
318
 
303
319
  it 'uses the system store' do
304
320
  stub_request(:put, uri)
305
321
 
306
- client.put(uri, content_type: 'text/plain', body: "", include_system_store: true)
322
+ client.put(uri, "", headers: {'Content-Type' => 'text/plain'}, options: {include_system_store: true})
307
323
  end
308
324
 
309
325
  it 'raises an HTTPError if both are specified' do
310
326
  expect {
311
- client.put(uri, content_type: 'text/plain', body: "", ssl_context: puppet_context, include_system_store: true)
327
+ client.put(uri, "", headers: {'Content-Type' => 'text/plain'}, options: {ssl_context: puppet_context, include_system_store: true})
312
328
  }.to raise_error(Puppet::HTTP::HTTPError, /The ssl_context and include_system_store parameters are mutually exclusive/)
313
329
  end
314
330
  end
@@ -318,25 +334,25 @@ describe Puppet::HTTP::Client do
318
334
  it "includes default HTTP headers" do
319
335
  stub_request(:post, uri).with(headers: {'X-Puppet-Version' => /./, 'User-Agent' => /./})
320
336
 
321
- client.post(uri, content_type: 'text/plain', body: "")
337
+ client.post(uri, "", headers: {'Content-Type' => 'text/plain'})
322
338
  end
323
339
 
324
340
  it "stringifies keys and encodes values in the query" do
325
341
  stub_request(:post, "https://www.example.com").with(query: "foo=bar%3Dbaz")
326
342
 
327
- client.post(uri, params: {:foo => "bar=baz"}, content_type: 'text/plain', body: "")
343
+ client.post(uri, "", params: {:foo => "bar=baz"}, headers: {'Content-Type' => 'text/plain'})
328
344
  end
329
345
 
330
346
  it "includes custom headers" do
331
347
  stub_request(:post, "https://www.example.com").with(headers: { 'X-Foo' => 'Bar' })
332
348
 
333
- client.post(uri, headers: {'X-Foo' => 'Bar'}, content_type: 'text/plain', body: "")
349
+ client.post(uri, "", headers: {'X-Foo' => 'Bar', 'Content-Type' => 'text/plain'})
334
350
  end
335
351
 
336
352
  it "returns the response" do
337
353
  stub_request(:post, uri)
338
354
 
339
- response = client.post(uri, content_type: 'text/plain', body: "")
355
+ response = client.post(uri, "", headers: {'Content-Type' => 'text/plain'})
340
356
  expect(response).to be_an_instance_of(Puppet::HTTP::Response)
341
357
  expect(response).to be_success
342
358
  expect(response.code).to eq(200)
@@ -345,14 +361,14 @@ describe Puppet::HTTP::Client do
345
361
  it "sets content-length and content-type for the body" do
346
362
  stub_request(:post, uri).with(headers: {"Content-Length" => "5", "Content-Type" => "text/plain"})
347
363
 
348
- client.post(uri, content_type: 'text/plain', body: "hello")
364
+ client.post(uri, "hello", headers: {'Content-Type' => 'text/plain'})
349
365
  end
350
366
 
351
367
  it "streams the response body when a block is given" do
352
368
  stub_request(:post, uri).to_return(body: "abc")
353
369
 
354
370
  io = StringIO.new
355
- client.post(uri, content_type: 'text/plain', body: "") do |response|
371
+ client.post(uri, "", headers: {'Content-Type' => 'text/plain'}) do |response|
356
372
  response.read_body do |data|
357
373
  io.write(data)
358
374
  end
@@ -361,24 +377,36 @@ describe Puppet::HTTP::Client do
361
377
  expect(io.string).to eq("abc")
362
378
  end
363
379
 
380
+ it 'raises an ArgumentError if `body` is missing' do
381
+ expect {
382
+ client.post(uri, nil, headers: {'Content-Type' => 'text/plain'})
383
+ }.to raise_error(ArgumentError, /'post' requires a string 'body' argument/)
384
+ end
385
+
386
+ it 'raises an ArgumentError if `content_type` is missing from the headers hash' do
387
+ expect {
388
+ client.post(uri, "")
389
+ }.to raise_error(ArgumentError, /'post' requires a 'content-type' header/)
390
+ end
391
+
364
392
  context 'when connecting' do
365
393
  it 'uses a specified ssl context' do
366
394
  stub_request(:post, uri)
367
395
 
368
396
  other_context = Puppet::SSL::SSLContext.new
369
397
 
370
- client.post(uri, content_type: 'text/plain', body: "", ssl_context: other_context)
398
+ client.post(uri, "", headers: {'Content-Type' => 'text/plain'}, options: {body: "", ssl_context: other_context})
371
399
  end
372
400
 
373
401
  it 'uses the system store' do
374
402
  stub_request(:post, uri)
375
403
 
376
- client.post(uri, content_type: 'text/plain', body: "", include_system_store: true)
404
+ client.post(uri, "", headers: {'Content-Type' => 'text/plain'}, options: {include_system_store: true})
377
405
  end
378
406
 
379
407
  it 'raises an HTTPError if both are specified' do
380
408
  expect {
381
- client.post(uri, content_type: 'text/plain', body: "", ssl_context: puppet_context, include_system_store: true)
409
+ client.post(uri, "", headers: {'Content-Type' => 'text/plain'}, options: {ssl_context: puppet_context, include_system_store: true})
382
410
  }.to raise_error(Puppet::HTTP::HTTPError, /The ssl_context and include_system_store parameters are mutually exclusive/)
383
411
  end
384
412
  end
@@ -424,18 +452,18 @@ describe Puppet::HTTP::Client do
424
452
 
425
453
  other_context = Puppet::SSL::SSLContext.new
426
454
 
427
- client.delete(uri, ssl_context: other_context)
455
+ client.delete(uri, options: {ssl_context: other_context})
428
456
  end
429
457
 
430
458
  it 'uses the system store' do
431
459
  stub_request(:delete, uri)
432
460
 
433
- client.delete(uri, include_system_store: true)
461
+ client.delete(uri, options: {include_system_store: true})
434
462
  end
435
463
 
436
464
  it 'raises an HTTPError if both are specified' do
437
465
  expect {
438
- client.delete(uri, ssl_context: puppet_context, include_system_store: true)
466
+ client.delete(uri, options: {ssl_context: puppet_context, include_system_store: true})
439
467
  }.to raise_error(Puppet::HTTP::HTTPError, /The ssl_context and include_system_store parameters are mutually exclusive/)
440
468
  end
441
469
  end
@@ -445,38 +473,52 @@ describe Puppet::HTTP::Client do
445
473
  it "submits credentials for GET requests" do
446
474
  stub_request(:get, uri).with(basic_auth: credentials)
447
475
 
448
- client.get(uri, user: 'user', password: 'pass')
476
+ client.get(uri, options: {basic_auth: {user: 'user', password: 'pass'}})
449
477
  end
450
478
 
451
479
  it "submits credentials for PUT requests" do
452
480
  stub_request(:put, uri).with(basic_auth: credentials)
453
481
 
454
- client.put(uri, content_type: 'text/plain', body: "hello", user: 'user', password: 'pass')
482
+ client.put(uri, "hello", headers: {'Content-Type' => 'text/plain'}, options: {basic_auth: {user: 'user', password: 'pass'}})
455
483
  end
456
484
 
457
485
  it "returns response containing access denied" do
458
486
  stub_request(:get, uri).with(basic_auth: credentials).to_return(status: [403, "Ye Shall Not Pass"])
459
487
 
460
- response = client.get(uri, user: 'user', password: 'pass')
488
+ response = client.get(uri, options: {basic_auth: {user: 'user', password: 'pass'}})
461
489
  expect(response.code).to eq(403)
462
490
  expect(response.reason).to eq("Ye Shall Not Pass")
463
491
  expect(response).to_not be_success
464
492
  end
465
493
 
466
- it 'omits basic auth if user is nil' do
494
+ it 'includes basic auth if user is nil' do
467
495
  stub_request(:get, uri).with do |req|
468
- expect(req.headers).to_not include('Authorization')
496
+ expect(req.headers).to include('Authorization')
469
497
  end
470
498
 
471
- client.get(uri, user: nil, password: 'pass')
499
+ client.get(uri, options: {basic_auth: {user: nil, password: 'pass'}})
472
500
  end
473
501
 
474
- it 'omits basic auth if password is nil' do
502
+ it 'includes basic auth if password is nil' do
475
503
  stub_request(:get, uri).with do |req|
476
- expect(req.headers).to_not include('Authorization')
504
+ expect(req.headers).to include('Authorization')
477
505
  end
478
506
 
479
- client.get(uri, user: 'user', password: nil)
507
+ client.get(uri, options: {basic_auth: {user: 'user', password: nil}})
508
+ end
509
+
510
+ it 'observes userinfo in the URL' do
511
+ stub_request(:get, uri).with(basic_auth: credentials)
512
+
513
+ client.get(URI("https://user:pass@www.example.com"))
514
+ end
515
+
516
+ it 'prefers explicit basic_auth credentials' do
517
+ uri = URI("https://ignored_user:ignored_pass@www.example.com")
518
+
519
+ stub_request(:get, "https://www.example.com").with(basic_auth: credentials)
520
+
521
+ client.get(uri, options: {basic_auth: {user: 'user', password: 'pass'}})
480
522
  end
481
523
  end
482
524
 
@@ -502,14 +544,45 @@ describe Puppet::HTTP::Client do
502
544
  stub_request(:put, start_url).to_return(redirect_to(url: bar_url))
503
545
  stub_request(:put, bar_url).to_return(status: 200)
504
546
 
505
- response = client.put(start_url, body: "", content_type: 'text/plain')
547
+ response = client.put(start_url, "", headers: {'Content-Type' => 'text/plain'})
548
+ expect(response).to be_success
549
+ end
550
+
551
+ it "updates the Host header from the Location host and port" do
552
+ stub_request(:get, start_url).with(headers: { 'Host' => 'www.example.com:8140' })
553
+ .to_return(redirect_to(url: other_host))
554
+ stub_request(:get, other_host).with(headers: { 'Host' => 'other.example.com:8140' })
555
+ .to_return(status: 200)
556
+
557
+ response = client.get(start_url)
558
+ expect(response).to be_success
559
+ end
560
+
561
+ it "omits the default HTTPS port from the Host header" do
562
+ stub_request(:get, start_url).with(headers: { 'Host' => 'www.example.com:8140' })
563
+ .to_return(redirect_to(url: "https://other.example.com/qux"))
564
+ stub_request(:get, "https://other.example.com/qux").with(headers: { 'Host' => 'other.example.com' })
565
+ .to_return(status: 200)
566
+
567
+ response = client.get(start_url)
568
+ expect(response).to be_success
569
+ end
570
+
571
+ it "omits the default HTTP port from the Host header" do
572
+ stub_request(:get, start_url).with(headers: { 'Host' => 'www.example.com:8140' })
573
+ .to_return(redirect_to(url: "http://other.example.com/qux"))
574
+ stub_request(:get, "http://other.example.com/qux").with(headers: { 'Host' => 'other.example.com' })
575
+ .to_return(status: 200)
576
+
577
+ response = client.get(start_url)
506
578
  expect(response).to be_success
507
579
  end
508
580
 
509
- it "preserves query parameters" do
510
- query = { 'debug' => true }
511
- stub_request(:get, start_url).with(query: query).to_return(redirect_to(url: bar_url))
512
- stub_request(:get, bar_url).with(query: query).to_return(status: 200)
581
+ it "applies query parameters from the location header" do
582
+ query = { 'redirected' => false }
583
+
584
+ stub_request(:get, start_url).with(query: query).to_return(redirect_to(url: "#{bar_url}?redirected=true"))
585
+ stub_request(:get, bar_url).with(query: {'redirected' => 'true'}).to_return(status: 200)
513
586
 
514
587
  response = client.get(start_url, params: query)
515
588
  expect(response).to be_success
@@ -528,7 +601,7 @@ describe Puppet::HTTP::Client do
528
601
  stub_request(:get, start_url).with(basic_auth: credentials).to_return(redirect_to(url: bar_url))
529
602
  stub_request(:get, bar_url).with(basic_auth: credentials).to_return(status: 200)
530
603
 
531
- client.get(start_url, user: 'user', password: 'pass')
604
+ client.get(start_url, options: {basic_auth: {user: 'user', password: 'pass'}})
532
605
  end
533
606
 
534
607
  it "redirects given a relative location" do
@@ -540,22 +613,33 @@ describe Puppet::HTTP::Client do
540
613
  expect(response).to be_success
541
614
  end
542
615
 
543
- it "preserves query parameters given a relative location" do
616
+ it "applies query parameters from the location header" do
544
617
  relative_url = "/people.html"
545
- query = { 'debug' => true }
546
- stub_request(:get, start_url).with(query: query).to_return(redirect_to(url: relative_url))
547
- stub_request(:get, "https://www.example.com:8140/people.html").with(query: query).to_return(status: 200)
618
+ query = { 'redirected' => false }
619
+ stub_request(:get, start_url).with(query: query).to_return(redirect_to(url: "#{relative_url}?redirected=true"))
620
+ stub_request(:get, "https://www.example.com:8140/people.html").with(query: {'redirected' => 'true'}).to_return(status: 200)
548
621
 
549
622
  response = client.get(start_url, params: query)
550
623
  expect(response).to be_success
551
624
  end
552
625
 
626
+ it "removes dot segments from a relative location" do
627
+ # from https://tools.ietf.org/html/rfc3986#section-5.4.2
628
+ base_url = URI("http://a/b/c/d;p?q")
629
+ relative_url = "../../../../g"
630
+ stub_request(:get, base_url).to_return(redirect_to(url: relative_url))
631
+ stub_request(:get, "http://a/g").to_return(status: 200)
632
+
633
+ response = client.get(base_url)
634
+ expect(response).to be_success
635
+ end
636
+
553
637
  it "preserves request body for each request" do
554
638
  data = 'some data'
555
639
  stub_request(:put, start_url).with(body: data).to_return(redirect_to(url: bar_url))
556
640
  stub_request(:put, bar_url).with(body: data).to_return(status: 200)
557
641
 
558
- response = client.put(start_url, body: data, content_type: 'text/plain')
642
+ response = client.put(start_url, data, headers: {'Content-Type' => 'text/plain'})
559
643
  expect(response).to be_success
560
644
  end
561
645
 
@@ -698,7 +782,7 @@ describe Puppet::HTTP::Client do
698
782
  allow(http2).to receive(:started?).and_return(true)
699
783
 
700
784
 
701
- pool = Puppet::Network::HTTP::Pool.new()
785
+ pool = Puppet::Network::HTTP::Pool.new(15)
702
786
  client = Puppet::HTTP::Client.new(pool: pool)
703
787
 
704
788
  # The "with_connection" method is required to yield started connections
@@ -746,4 +830,34 @@ describe Puppet::HTTP::Client do
746
830
  client.get(uri)
747
831
  end
748
832
  end
833
+
834
+ context "persistent connections" do
835
+ before :each do
836
+ stub_request(:get, uri)
837
+ end
838
+
839
+ it 'defaults keepalive to http_keepalive_timeout' do
840
+ expect(client.pool.keepalive_timeout).to eq(Puppet[:http_keepalive_timeout])
841
+ end
842
+
843
+ it 'reuses a cached connection' do
844
+ allow(Puppet).to receive(:debug)
845
+ expect(Puppet).to receive(:debug).with(/^Creating new connection/)
846
+ expect(Puppet).to receive(:debug).with(/^Using cached connection/)
847
+
848
+ client.get(uri)
849
+ client.get(uri)
850
+ end
851
+
852
+ it 'can be disabled' do
853
+ Puppet[:http_keepalive_timeout] = 0
854
+
855
+ allow(Puppet).to receive(:debug)
856
+ expect(Puppet).to receive(:debug).with(/^Creating new connection/).twice
857
+ expect(Puppet).to receive(:debug).with(/^Using cached connection/).never
858
+
859
+ client.get(uri)
860
+ client.get(uri)
861
+ end
862
+ end
749
863
  end