puppet 6.14.0 → 6.19.0

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

Potentially problematic release.


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

Files changed (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
@@ -0,0 +1,201 @@
1
+ require 'spec_helper'
2
+ require 'puppet/http'
3
+
4
+ # Simple "external" client to make get & post requests. This is used
5
+ # to test the old HTTP API, such as requiring use_ssl and basic_auth
6
+ # to be passed as options.
7
+ class Puppet::HTTP::TestExternal
8
+ def initialize(host, port, options = {})
9
+ @host = host
10
+ @port = port
11
+ @options = options
12
+ @factory = Puppet::Network::HTTP::Factory.new
13
+ end
14
+
15
+ def get(path, headers = {}, options = {})
16
+ request = Net::HTTP::Get.new(path, headers)
17
+ do_request(request, options)
18
+ end
19
+
20
+ def post(path, data, headers = nil, options = {})
21
+ request = Net::HTTP::Post.new(path, headers)
22
+ do_request(request, options)
23
+ end
24
+
25
+ def do_request(request, options)
26
+ if options[:basic_auth]
27
+ request.basic_auth(options[:basic_auth][:user], options[:basic_auth][:password])
28
+ end
29
+
30
+ site = Puppet::Network::HTTP::Site.new(@options[:use_ssl] ? 'https' : 'http', @host, @port)
31
+ http = @factory.create_connection(site)
32
+ http.start
33
+ begin
34
+ http.request(request)
35
+ ensure
36
+ http.finish
37
+ end
38
+ end
39
+ end
40
+
41
+ describe Puppet::HTTP::ExternalClient do
42
+ let(:uri) { URI.parse('https://www.example.com') }
43
+ let(:http_client_class) { Puppet::HTTP::TestExternal }
44
+ let(:client) { described_class.new(http_client_class) }
45
+ let(:credentials) { ['user', 'pass'] }
46
+
47
+ context "for GET requests" do
48
+ it "stringifies keys and encodes values in the query" do
49
+ stub_request(:get, uri).with(query: "foo=bar%3Dbaz")
50
+
51
+ client.get(uri, params: {:foo => "bar=baz"})
52
+ end
53
+
54
+ it "fails if a user passes in an invalid param type" do
55
+ environment = Puppet::Node::Environment.create(:testing, [])
56
+
57
+ expect{client.get(uri, params: {environment: environment})}.to raise_error(Puppet::HTTP::SerializationError, /HTTP REST queries cannot handle values of type/)
58
+ end
59
+
60
+ it "returns the response" do
61
+ stub_request(:get, uri)
62
+
63
+ response = client.get(uri)
64
+ expect(response).to be_an_instance_of(Puppet::HTTP::Response)
65
+ expect(response).to be_success
66
+ expect(response.code).to eq(200)
67
+ end
68
+
69
+ it "returns the entire response body" do
70
+ stub_request(:get, uri).to_return(body: "abc")
71
+
72
+ expect(client.get(uri).body).to eq("abc")
73
+ end
74
+
75
+ it "streams the response body when a block is given" do
76
+ stub_request(:get, uri).to_return(body: "abc")
77
+
78
+ io = StringIO.new
79
+ client.get(uri) do |response|
80
+ response.read_body do |data|
81
+ io.write(data)
82
+ end
83
+ end
84
+
85
+ expect(io.string).to eq("abc")
86
+ end
87
+
88
+ context 'when connecting' do
89
+ it 'accepts an ssl context' do
90
+ stub_request(:get, uri).to_return(body: "abc")
91
+
92
+ other_context = Puppet::SSL::SSLContext.new
93
+
94
+ client.get(uri, options: {ssl_context: other_context})
95
+ end
96
+
97
+ it 'accepts include_system_store' do
98
+ stub_request(:get, uri).to_return(body: "abc")
99
+
100
+ client.get(uri, options: {include_system_store: true})
101
+ end
102
+ end
103
+ end
104
+
105
+ context "for POST requests" do
106
+ it "stringifies keys and encodes values in the query" do
107
+ stub_request(:post, "https://www.example.com").with(query: "foo=bar%3Dbaz")
108
+
109
+ client.post(uri, "", params: {:foo => "bar=baz"}, headers: {'Content-Type' => 'text/plain'})
110
+ end
111
+
112
+ it "returns the response" do
113
+ stub_request(:post, uri)
114
+
115
+ response = client.post(uri, "", headers: {'Content-Type' => 'text/plain'})
116
+ expect(response).to be_an_instance_of(Puppet::HTTP::Response)
117
+ expect(response).to be_success
118
+ expect(response.code).to eq(200)
119
+ end
120
+
121
+ it "sets content-type for the body" do
122
+ stub_request(:post, uri).with(headers: {"Content-Type" => "text/plain"})
123
+
124
+ client.post(uri, "hello", headers: {'Content-Type' => 'text/plain'})
125
+ end
126
+
127
+ it "streams the response body when a block is given" do
128
+ stub_request(:post, uri).to_return(body: "abc")
129
+
130
+ io = StringIO.new
131
+ client.post(uri, "", headers: {'Content-Type' => 'text/plain'}) do |response|
132
+ response.read_body do |data|
133
+ io.write(data)
134
+ end
135
+ end
136
+
137
+ expect(io.string).to eq("abc")
138
+ end
139
+
140
+ it 'raises an ArgumentError if `body` is missing' do
141
+ expect {
142
+ client.post(uri, nil, headers: {'Content-Type' => 'text/plain'})
143
+ }.to raise_error(ArgumentError, /'post' requires a string 'body' argument/)
144
+ end
145
+
146
+ context 'when connecting' do
147
+ it 'accepts an ssl context' do
148
+ stub_request(:post, uri)
149
+
150
+ other_context = Puppet::SSL::SSLContext.new
151
+
152
+ client.post(uri, "", headers: {'Content-Type' => 'text/plain'}, options: {ssl_context: other_context})
153
+ end
154
+
155
+ it 'accepts include_system_store' do
156
+ stub_request(:post, uri)
157
+
158
+ client.post(uri, "", headers: {'Content-Type' => 'text/plain'}, options: {include_system_store: true})
159
+ end
160
+ end
161
+ end
162
+
163
+ context "Basic Auth" do
164
+ it "submits credentials for GET requests" do
165
+ stub_request(:get, uri).with(basic_auth: credentials)
166
+
167
+ client.get(uri, options: {basic_auth: {user: 'user', password: 'pass'}})
168
+ end
169
+
170
+ it "submits credentials for POST requests" do
171
+ stub_request(:post, uri).with(basic_auth: credentials)
172
+
173
+ client.post(uri, "", options: {content_type: 'text/plain', basic_auth: {user: 'user', password: 'pass'}})
174
+ end
175
+
176
+ it "returns response containing access denied" do
177
+ stub_request(:get, uri).with(basic_auth: credentials).to_return(status: [403, "Ye Shall Not Pass"])
178
+
179
+ response = client.get(uri, options: { basic_auth: {user: 'user', password: 'pass'}})
180
+ expect(response.code).to eq(403)
181
+ expect(response.reason).to eq("Ye Shall Not Pass")
182
+ expect(response).to_not be_success
183
+ end
184
+
185
+ it 'includes basic auth if user is nil' do
186
+ stub_request(:get, uri).with do |req|
187
+ expect(req.headers).to include('Authorization')
188
+ end
189
+
190
+ client.get(uri, options: {basic_auth: {user: nil, password: 'pass'}})
191
+ end
192
+
193
+ it 'includes basic auth if password is nil' do
194
+ stub_request(:get, uri).with do |req|
195
+ expect(req.headers).to include('Authorization')
196
+ end
197
+
198
+ client.get(uri, options: {basic_auth: {user: 'user', password: nil}})
199
+ end
200
+ end
201
+ end
@@ -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::Resolver do
@@ -44,9 +43,25 @@ describe Puppet::HTTP::Resolver do
44
43
  expect(service.url.to_s).to eq("https://ca.example.com:8141/puppet-ca/v1")
45
44
  end
46
45
 
47
- it 'logs unsuccessful HTTP 500 responses' do
48
- Puppet[:log_level] = "debug"
46
+ it 'includes extra http headers' do
47
+ Puppet[:http_extra_headers] = 'region:us-west'
48
+
49
+ stub_request(:get, "https://ca.example.com:8141/status/v1/simple/master")
50
+ .with(headers: {'Region' => 'us-west'})
51
+
52
+ subject.resolve(session, :ca)
53
+ end
54
+
55
+ it 'uses the provided ssl context during resolution' do
56
+ stub_request(:get, "https://ca.example.com:8141/status/v1/simple/master").to_return(status: 200)
57
+
58
+ other_ctx = Puppet::SSL::SSLContext.new
59
+ expect(client).to receive(:connect).with(URI("https://ca.example.com:8141/status/v1/simple/master"), options: {ssl_context: other_ctx}).and_call_original
60
+
61
+ subject.resolve(session, :ca, ssl_context: other_ctx)
62
+ end
49
63
 
64
+ it 'logs unsuccessful HTTP 500 responses' do
50
65
  stub_request(:get, "https://ca.example.com:8141/status/v1/simple/master").to_return(status: [500, 'Internal Server Error'])
51
66
  stub_request(:get, "https://apple.example.com:8142/status/v1/simple/master").to_return(status: 200)
52
67
 
@@ -55,11 +70,15 @@ describe Puppet::HTTP::Resolver do
55
70
  expect(@logs.map(&:message)).to include(/Puppet server ca.example.com:8141 is unavailable: 500 Internal Server Error/)
56
71
  end
57
72
 
58
- it 'fails if no servers in server_list are accessible' do
73
+ it 'cancels resolution if no servers in server_list are accessible' do
59
74
  stub_request(:get, "https://ca.example.com:8141/status/v1/simple/master").to_return(status: 503)
60
75
  stub_request(:get, "https://apple.example.com:8142/status/v1/simple/master").to_return(status: 503)
61
76
 
62
- expect { subject.resolve(session, :ca) }.to raise_error(Puppet::Error, /^Could not select a functional puppet master from server_list:/)
77
+ canceled = false
78
+ canceled_handler = lambda { |cancel| canceled = cancel }
79
+
80
+ expect(subject.resolve(session, :ca, canceled_handler: canceled_handler)).to eq(nil)
81
+ expect(canceled).to eq(true)
63
82
  end
64
83
 
65
84
  it 'cycles through server_list until a valid server is found' do
@@ -70,6 +89,26 @@ describe Puppet::HTTP::Resolver do
70
89
  expect(service).to be_an_instance_of(Puppet::HTTP::Service::Ca)
71
90
  expect(service.url.to_s).to eq("https://apple.example.com:8142/puppet-ca/v1")
72
91
  end
92
+
93
+ it 'resolves once per session' do
94
+ failed = stub_request(:get, "https://ca.example.com:8141/status/v1/simple/master").to_return(status: 503)
95
+ passed = stub_request(:get, "https://apple.example.com:8142/status/v1/simple/master").to_return(status: 200)
96
+
97
+ service = subject.resolve(session, :puppet)
98
+ expect(service).to be_a(Puppet::HTTP::Service::Compiler)
99
+ expect(service.url.to_s).to eq("https://apple.example.com:8142/puppet/v3")
100
+
101
+ service = subject.resolve(session, :fileserver)
102
+ expect(service).to be_a(Puppet::HTTP::Service::FileServer)
103
+ expect(service.url.to_s).to eq("https://apple.example.com:8142/puppet/v3")
104
+
105
+ service = subject.resolve(session, :report)
106
+ expect(service).to be_a(Puppet::HTTP::Service::Report)
107
+ expect(service.url.to_s).to eq("https://apple.example.com:8142/puppet/v3")
108
+
109
+ expect(failed).to have_been_requested
110
+ expect(passed).to have_been_requested
111
+ end
73
112
  end
74
113
 
75
114
  context 'when resolving using SRV' do
@@ -66,4 +66,10 @@ describe Puppet::HTTP::Response do
66
66
 
67
67
  expect(client.get(uri)['Content-Encoding']).to eq('gzip')
68
68
  end
69
+
70
+ it "enumerates headers" do
71
+ stub_request(:get, uri).to_return(status: 200, headers: { 'Content-Encoding' => 'gzip' })
72
+
73
+ expect(client.get(uri).each_header.to_a).to eq([['content-encoding', 'gzip']])
74
+ end
69
75
  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::Ca do
@@ -39,11 +38,11 @@ describe Puppet::HTTP::Service::Ca do
39
38
  subject.get_certificate('ca')
40
39
  end
41
40
 
42
- it 'fallbacks to server and masterport' do
41
+ it 'fallbacks to server and serverport' do
43
42
  Puppet[:ca_server] = nil
44
43
  Puppet[:ca_port] = nil
45
44
  Puppet[:server] = 'ca2.example.com'
46
- Puppet[:masterport] = 8142
45
+ Puppet[:serverport] = 8142
47
46
 
48
47
  stub_request(:get, "https://ca2.example.com:8142/puppet-ca/v1/certificate/ca").to_return(body: pem)
49
48
 
@@ -68,7 +67,15 @@ describe Puppet::HTTP::Service::Ca do
68
67
  it 'gets a certificate from the "certificate" endpoint' do
69
68
  stub_request(:get, url).to_return(body: pem)
70
69
 
71
- expect(subject.get_certificate('ca')).to eq(pem)
70
+ _, body = subject.get_certificate('ca')
71
+ expect(body).to eq(pem)
72
+ end
73
+
74
+ it 'returns the request response' do
75
+ stub_request(:get, url).to_return(body: pem)
76
+
77
+ resp, _ = subject.get_certificate('ca')
78
+ expect(resp).to be_a(Puppet::HTTP::Response)
72
79
  end
73
80
 
74
81
  it 'accepts text/plain responses' do
@@ -107,7 +114,15 @@ describe Puppet::HTTP::Service::Ca do
107
114
  it 'gets a CRL from "certificate_revocation_list" endpoint' do
108
115
  stub_request(:get, url).to_return(body: pem)
109
116
 
110
- expect(subject.get_certificate_revocation_list).to eq(pem)
117
+ _, body = subject.get_certificate_revocation_list
118
+ expect(body).to eq(pem)
119
+ end
120
+
121
+ it 'returns the request response' do
122
+ stub_request(:get, url).to_return(body: pem)
123
+
124
+ resp, _ = subject.get_certificate_revocation_list
125
+ expect(resp).to be_a(Puppet::HTTP::Response)
111
126
  end
112
127
 
113
128
  it 'accepts text/plain responses' do
@@ -161,6 +176,13 @@ describe Puppet::HTTP::Service::Ca do
161
176
  subject.put_certificate_request('infinity', request)
162
177
  end
163
178
 
179
+ it 'returns the request response' do
180
+ stub_request(:put, url).with(body: pem, headers: { 'Content-Type' => 'text/plain' })
181
+
182
+ resp = subject.put_certificate_request('infinity', request)
183
+ expect(resp).to be_a(Puppet::HTTP::Response)
184
+ end
185
+
164
186
  it 'raises response error if unsuccessful' do
165
187
  stub_request(:put, url).to_return(status: [400, 'Bad Request'])
166
188
 
@@ -1,6 +1,5 @@
1
1
  # coding: utf-8
2
2
  require 'spec_helper'
3
- require 'webmock/rspec'
4
3
  require 'puppet/http'
5
4
 
6
5
  describe Puppet::HTTP::Service::Compiler do
@@ -17,7 +16,7 @@ describe Puppet::HTTP::Service::Compiler do
17
16
 
18
17
  before :each do
19
18
  Puppet[:server] = 'compiler.example.com'
20
- Puppet[:masterport] = 8140
19
+ Puppet[:serverport] = 8140
21
20
 
22
21
  Puppet::Node::Facts.indirection.terminus_class = :memory
23
22
  end
@@ -38,7 +37,7 @@ describe Puppet::HTTP::Service::Compiler do
38
37
  context 'when routing to the compiler service' do
39
38
  it 'defaults the server and port based on settings' do
40
39
  Puppet[:server] = 'compiler2.example.com'
41
- Puppet[:masterport] = 8141
40
+ Puppet[:serverport] = 8141
42
41
 
43
42
  stub_request(:post, "https://compiler2.example.com:8141/puppet/v3/catalog/ziggy?environment=testing")
44
43
  .to_return(body: formatter.render(catalog), headers: {'Content-Type' => formatter.mime })
@@ -136,11 +135,19 @@ describe Puppet::HTTP::Service::Compiler do
136
135
  stub_request(:post, uri)
137
136
  .to_return(**catalog_response)
138
137
 
139
- cat = subject.post_catalog(certname, environment: 'production', facts: facts)
138
+ _, cat = subject.post_catalog(certname, environment: 'production', facts: facts)
140
139
  expect(cat).to be_a(Puppet::Resource::Catalog)
141
140
  expect(cat.name).to eq(certname)
142
141
  end
143
142
 
143
+ it 'returns the request response' do
144
+ stub_request(:post, uri)
145
+ .to_return(**catalog_response)
146
+
147
+ resp, _ = subject.post_catalog(certname, environment: 'production', facts: facts)
148
+ expect(resp).to be_a(Puppet::HTTP::Response)
149
+ end
150
+
144
151
  it 'raises a response error if unsuccessful' do
145
152
  stub_request(:post, uri)
146
153
  .to_return(status: [500, "Server Error"])
@@ -246,11 +253,19 @@ describe Puppet::HTTP::Service::Compiler do
246
253
  stub_request(:get, uri)
247
254
  .to_return(**node_response)
248
255
 
249
- n = subject.get_node(certname, environment: 'production')
256
+ _, n = subject.get_node(certname, environment: 'production')
250
257
  expect(n).to be_a(Puppet::Node)
251
258
  expect(n.name).to eq(certname)
252
259
  end
253
260
 
261
+ it 'returns the request response' do
262
+ stub_request(:get, uri)
263
+ .to_return(**node_response)
264
+
265
+ resp, _ = subject.get_node(certname, environment: 'production')
266
+ expect(resp).to be_a(Puppet::HTTP::Response)
267
+ end
268
+
254
269
  it 'raises a response error if unsuccessful' do
255
270
  stub_request(:get, uri)
256
271
  .to_return(status: [500, "Server Error"])
@@ -299,11 +314,19 @@ describe Puppet::HTTP::Service::Compiler do
299
314
  stub_request(:get, uri)
300
315
  .to_return(**facts_response)
301
316
 
302
- n = subject.get_facts(certname, environment: 'production')
317
+ _, n = subject.get_facts(certname, environment: 'production')
303
318
  expect(n).to be_a(Puppet::Node::Facts)
304
319
  expect(n.name).to eq(certname)
305
320
  end
306
321
 
322
+ it 'returns the request response' do
323
+ stub_request(:get, uri)
324
+ .to_return(**facts_response)
325
+
326
+ resp, _ = subject.get_facts(certname, environment: 'production')
327
+ expect(resp).to be_a(Puppet::HTTP::Response)
328
+ end
329
+
307
330
  it 'raises a response error if unsuccessful' do
308
331
  stub_request(:get, uri)
309
332
  .to_return(status: [500, "Server Error"])
@@ -365,12 +388,12 @@ describe Puppet::HTTP::Service::Compiler do
365
388
  subject.put_facts(certname, environment: 'outerspace', facts: facts)
366
389
  end
367
390
 
368
- it 'returns true' do
391
+ it 'returns the request response' do
369
392
  # the REST API returns the filename, good grief
370
393
  stub_request(:put, uri)
371
394
  .to_return(status: 200, body: "/opt/puppetlabs/server/data/puppetserver/yaml/facts/#{certname}.yaml")
372
395
 
373
- expect(subject.put_facts(certname, environment: environment, facts: facts)).to eq(true)
396
+ expect(subject.put_facts(certname, environment: environment, facts: facts)).to be_a(Puppet::HTTP::Response)
374
397
  end
375
398
 
376
399
  it 'raises a response error if unsuccessful' do
@@ -410,11 +433,19 @@ describe Puppet::HTTP::Service::Compiler do
410
433
  stub_request(:get, uri)
411
434
  .to_return(**status_response)
412
435
 
413
- s = subject.get_status(certname)
436
+ _, s = subject.get_status(certname)
414
437
  expect(s).to be_a(Puppet::Status)
415
438
  expect(s.status).to eq("is_alive" => true)
416
439
  end
417
440
 
441
+ it 'returns the request response' do
442
+ stub_request(:get, uri)
443
+ .to_return(**status_response)
444
+
445
+ resp, _ = subject.get_status(certname)
446
+ expect(resp).to be_a(Puppet::HTTP::Response)
447
+ end
448
+
418
449
  it 'raises a response error if unsuccessful' do
419
450
  stub_request(:get, uri)
420
451
  .to_return(status: [500, "Server Error"])
@@ -446,4 +477,150 @@ describe Puppet::HTTP::Service::Compiler do
446
477
  }.to raise_error(Puppet::HTTP::SerializationError, /Failed to deserialize Puppet::Status from json/)
447
478
  end
448
479
  end
480
+
481
+ context 'filebucket' do
482
+ let(:filebucket_file) { Puppet::FileBucket::File.new('file to store') }
483
+ let(:formatter) { Puppet::Network::FormatHandler.format(:binary) }
484
+ let(:path) { "md5/4aabe1257043bd03ce4c3319c155bc55" }
485
+ let(:uri) { %r{/puppet/v3/file_bucket_file/#{path}} }
486
+
487
+ context 'when getting a file' do
488
+ let(:status_response) { { body: formatter.render(filebucket_file), headers: {'Content-Type' => 'application/octet-stream' }}}
489
+
490
+ it 'includes default HTTP headers' do
491
+ stub_request(:get, uri).with do |request|
492
+ expect(request.headers).to include({
493
+ 'X-Puppet-Version' => /./,
494
+ 'User-Agent' => /./,
495
+ 'Accept' => 'application/octet-stream'
496
+ })
497
+ expect(request.headers).to_not include('X-Puppet-Profiling')
498
+ end.to_return(**status_response)
499
+
500
+ subject.get_filebucket_file(path, environment: 'production')
501
+ end
502
+
503
+ it 'always the environment as a parameter' do
504
+ stub_request(:get, uri).with(query: hash_including('environment' => 'production')).to_return(**status_response)
505
+
506
+ subject.get_filebucket_file(path, environment: 'production')
507
+ end
508
+
509
+ {bucket_path: 'path', diff_with: '4aabe1257043bd0', list_all: 'true', fromdate: '20200404', todate: '20200404'}.each do |param, val|
510
+ it "includes #{param} as a parameter in the request if #{param} is set" do
511
+ stub_request(:get, uri).with(query: hash_including(param => val)).to_return(**status_response)
512
+
513
+ options = { param => val }
514
+ subject.get_filebucket_file(path, environment: 'production', **options)
515
+ end
516
+ end
517
+
518
+ it "doesn't include :diff_with as a query param if :bucket_path is nil" do
519
+ stub_request(:get, uri).with do |request|
520
+ expect(request.uri.query).not_to match(/diff_with/)
521
+ end.to_return(**status_response)
522
+
523
+ subject.get_filebucket_file(path, environment: 'production', diff_with: nil)
524
+ end
525
+
526
+ it 'returns a deserialized response' do
527
+ stub_request(:get, uri)
528
+ .to_return(**status_response)
529
+
530
+ _, s = subject.get_filebucket_file(path, environment: 'production')
531
+ expect(s).to be_a(Puppet::FileBucket::File)
532
+ expect(s.contents).to eq('file to store')
533
+ end
534
+
535
+ it 'returns the request response' do
536
+ stub_request(:get, uri)
537
+ .to_return(**status_response)
538
+
539
+ resp, _ = subject.get_filebucket_file(path, environment: 'production')
540
+ expect(resp).to be_a(Puppet::HTTP::Response)
541
+ end
542
+ end
543
+
544
+ context 'when putting a file' do
545
+ let(:status_response) { { status: 200, body: '' } }
546
+
547
+ it 'includes default HTTP headers' do
548
+ stub_request(:put, uri).with do |request|
549
+ expect(request.headers).to include({
550
+ 'X-Puppet-Version' => /./,
551
+ 'User-Agent' => /./,
552
+ 'Accept' => 'application/octet-stream',
553
+ 'Content-Type' => 'application/octet-stream'
554
+ })
555
+ expect(request.headers).to_not include('X-Puppet-Profiling')
556
+ end.to_return(**status_response)
557
+
558
+ subject.put_filebucket_file(path, body: filebucket_file.contents, environment: 'production')
559
+ end
560
+
561
+ it 'always the environment as a parameter' do
562
+ stub_request(:put, uri).with(query: hash_including('environment' => 'production')).to_return(**status_response)
563
+
564
+ subject.put_filebucket_file(path, body: filebucket_file.contents, environment: 'production')
565
+ end
566
+
567
+ it 'sends the file contents as the request body' do
568
+ stub_request(:put, uri).with(body: filebucket_file.contents).to_return(**status_response)
569
+
570
+ subject.put_filebucket_file(path, body: filebucket_file.contents, environment: 'production')
571
+ end
572
+
573
+ it 'returns the request response' do
574
+ stub_request(:put, uri)
575
+ .to_return(**status_response)
576
+
577
+ s = subject.put_filebucket_file(path, body: filebucket_file.contents, environment: 'production')
578
+ expect(s).to be_a(Puppet::HTTP::Response)
579
+ end
580
+ end
581
+
582
+ context 'when heading a file' do
583
+ let(:status_response) {{ status: 200 }}
584
+
585
+ it 'includes default HTTP headers' do
586
+ stub_request(:head, uri).with do |request|
587
+ expect(request.headers).to include({
588
+ 'X-Puppet-Version' => /./,
589
+ 'User-Agent' => /./,
590
+ 'Accept' => 'application/octet-stream',
591
+ })
592
+ expect(request.headers).to_not include('X-Puppet-Profiling')
593
+ end.to_return(**status_response)
594
+
595
+ subject.head_filebucket_file(path, environment: 'production')
596
+ end
597
+
598
+ it 'always the environment as a parameter' do
599
+ stub_request(:head, uri).with(query: hash_including('environment' => 'production')).to_return(**status_response)
600
+
601
+ subject.head_filebucket_file(path, environment: 'production')
602
+ end
603
+
604
+ it "includes :bucket_path as a parameter in the request if :bucket_path is set" do
605
+ stub_request(:head, uri).with(query: hash_including(:bucket_path => 'some/path')).to_return(**status_response)
606
+
607
+ subject.head_filebucket_file(path, environment: 'production', bucket_path: 'some/path')
608
+ end
609
+
610
+ it "doesn't include :bucket_path as a query param if :bucket_path is nil" do
611
+ stub_request(:head, uri).with do |request|
612
+ expect(request.uri.query).not_to match(/bucket_path/)
613
+ end.to_return(**status_response)
614
+
615
+ subject.head_filebucket_file(path, environment: 'production', bucket_path: nil)
616
+ end
617
+
618
+ it "returns the request response" do
619
+ stub_request(:head, uri).with(query: hash_including(:bucket_path => 'some/path')).to_return(**status_response)
620
+
621
+ resp = subject.head_filebucket_file(path, environment: 'production', bucket_path: 'some/path')
622
+ expect(resp).to be_a(Puppet::HTTP::Response)
623
+ end
624
+ end
625
+ end
449
626
  end