puppet 6.13.0-x64-mingw32 → 6.18.0-x64-mingw32

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

Potentially problematic release.


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

Files changed (461) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -7
  3. data/CONTRIBUTING.md +7 -13
  4. data/Gemfile +4 -2
  5. data/Gemfile.lock +36 -32
  6. data/README.md +17 -24
  7. data/ext/windows/service/daemon.rb +3 -3
  8. data/lib/puppet.rb +33 -9
  9. data/lib/puppet/agent.rb +20 -14
  10. data/lib/puppet/application/agent.rb +26 -17
  11. data/lib/puppet/application/apply.rb +18 -20
  12. data/lib/puppet/application/describe.rb +7 -5
  13. data/lib/puppet/application/device.rb +2 -2
  14. data/lib/puppet/application/filebucket.rb +19 -15
  15. data/lib/puppet/application/lookup.rb +16 -4
  16. data/lib/puppet/application/plugin.rb +1 -0
  17. data/lib/puppet/application/ssl.rb +4 -4
  18. data/lib/puppet/configurer.rb +58 -57
  19. data/lib/puppet/configurer/downloader.rb +31 -10
  20. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  21. data/lib/puppet/confine.rb +2 -2
  22. data/lib/puppet/confine/any.rb +1 -1
  23. data/lib/puppet/context/trusted_information.rb +14 -8
  24. data/lib/puppet/daemon.rb +13 -27
  25. data/lib/puppet/defaults.rb +92 -12
  26. data/lib/puppet/environments.rb +4 -5
  27. data/lib/puppet/face/facts.rb +1 -1
  28. data/lib/puppet/face/help.rb +29 -3
  29. data/lib/puppet/face/module/search.rb +5 -0
  30. data/lib/puppet/face/plugin.rb +2 -2
  31. data/lib/puppet/feature/base.rb +1 -1
  32. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  33. data/lib/puppet/file_serving/metadata.rb +4 -1
  34. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  35. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  36. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  37. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  38. data/lib/puppet/file_system/file_impl.rb +17 -13
  39. data/lib/puppet/file_system/uniquefile.rb +12 -16
  40. data/lib/puppet/forge.rb +1 -1
  41. data/lib/puppet/forge/cache.rb +1 -1
  42. data/lib/puppet/forge/repository.rb +4 -7
  43. data/lib/puppet/functions/call.rb +1 -1
  44. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  45. data/lib/puppet/functions/filter.rb +1 -0
  46. data/lib/puppet/functions/lstrip.rb +4 -4
  47. data/lib/puppet/functions/reduce.rb +2 -4
  48. data/lib/puppet/functions/reverse_each.rb +1 -1
  49. data/lib/puppet/functions/rstrip.rb +4 -4
  50. data/lib/puppet/functions/step.rb +1 -1
  51. data/lib/puppet/functions/strip.rb +4 -4
  52. data/lib/puppet/gettext/config.rb +5 -5
  53. data/lib/puppet/gettext/module_translations.rb +4 -4
  54. data/lib/puppet/http.rb +3 -0
  55. data/lib/puppet/http/client.rb +263 -73
  56. data/lib/puppet/http/external_client.rb +90 -0
  57. data/lib/puppet/http/redirector.rb +43 -7
  58. data/lib/puppet/http/resolver.rb +46 -3
  59. data/lib/puppet/http/resolver/server_list.rb +76 -16
  60. data/lib/puppet/http/resolver/settings.rb +23 -3
  61. data/lib/puppet/http/resolver/srv.rb +29 -3
  62. data/lib/puppet/http/response.rb +87 -1
  63. data/lib/puppet/http/retry_after_handler.rb +39 -0
  64. data/lib/puppet/http/service.rb +97 -12
  65. data/lib/puppet/http/service/ca.rb +76 -14
  66. data/lib/puppet/http/service/compiler.rb +249 -16
  67. data/lib/puppet/http/service/file_server.rb +141 -20
  68. data/lib/puppet/http/service/report.rb +47 -17
  69. data/lib/puppet/http/session.rb +96 -7
  70. data/lib/puppet/indirector.rb +1 -1
  71. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  72. data/lib/puppet/indirector/exec.rb +1 -1
  73. data/lib/puppet/indirector/facts/facter.rb +3 -3
  74. data/lib/puppet/indirector/facts/rest.rb +42 -0
  75. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  76. data/lib/puppet/indirector/file_content/http.rb +5 -0
  77. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  78. data/lib/puppet/indirector/file_metadata/http.rb +28 -8
  79. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  80. data/lib/puppet/indirector/hiera.rb +4 -0
  81. data/lib/puppet/indirector/indirection.rb +1 -1
  82. data/lib/puppet/indirector/node/rest.rb +24 -0
  83. data/lib/puppet/indirector/report/processor.rb +2 -2
  84. data/lib/puppet/indirector/report/rest.rb +19 -0
  85. data/lib/puppet/indirector/report/yaml.rb +23 -0
  86. data/lib/puppet/indirector/request.rb +1 -1
  87. data/lib/puppet/indirector/rest.rb +12 -0
  88. data/lib/puppet/indirector/status/rest.rb +18 -0
  89. data/lib/puppet/loaders.rb +6 -0
  90. data/lib/puppet/metatype/manager.rb +80 -80
  91. data/lib/puppet/module.rb +1 -2
  92. data/lib/puppet/network/format_support.rb +2 -2
  93. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  94. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  95. data/lib/puppet/network/http/base_pool.rb +7 -2
  96. data/lib/puppet/network/http/compression.rb +7 -0
  97. data/lib/puppet/network/http/connection.rb +2 -0
  98. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  99. data/lib/puppet/network/http/nocache_pool.rb +1 -0
  100. data/lib/puppet/network/http/pool.rb +8 -5
  101. data/lib/puppet/network/http/route.rb +2 -2
  102. data/lib/puppet/network/http_pool.rb +2 -1
  103. data/lib/puppet/node/environment.rb +22 -5
  104. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  105. data/lib/puppet/pal/pal_impl.rb +30 -31
  106. data/lib/puppet/parameter.rb +1 -1
  107. data/lib/puppet/parser/ast/leaf.rb +5 -5
  108. data/lib/puppet/parser/ast/pops_bridge.rb +0 -4
  109. data/lib/puppet/parser/compiler.rb +43 -33
  110. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  111. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  112. data/lib/puppet/parser/environment_compiler.rb +4 -1
  113. data/lib/puppet/parser/functions.rb +18 -9
  114. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  115. data/lib/puppet/parser/functions/filter.rb +1 -0
  116. data/lib/puppet/parser/resource.rb +3 -2
  117. data/lib/puppet/parser/resource/param.rb +6 -0
  118. data/lib/puppet/parser/type_loader.rb +2 -2
  119. data/lib/puppet/pops/adaptable.rb +7 -13
  120. data/lib/puppet/pops/adapters.rb +8 -4
  121. data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
  122. data/lib/puppet/pops/issues.rb +5 -0
  123. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  124. data/lib/puppet/pops/loaders.rb +24 -15
  125. data/lib/puppet/pops/lookup/context.rb +1 -1
  126. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  127. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  128. data/lib/puppet/pops/types/iterable.rb +34 -8
  129. data/lib/puppet/pops/validation/checker4_0.rb +29 -15
  130. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  131. data/lib/puppet/provider/file/windows.rb +1 -1
  132. data/lib/puppet/provider/group/groupadd.rb +9 -4
  133. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  134. data/lib/puppet/provider/package/aix.rb +17 -2
  135. data/lib/puppet/provider/package/apt.rb +98 -1
  136. data/lib/puppet/provider/package/aptitude.rb +1 -1
  137. data/lib/puppet/provider/package/dnfmodule.rb +61 -14
  138. data/lib/puppet/provider/package/gem.rb +45 -9
  139. data/lib/puppet/provider/package/pacman.rb +2 -5
  140. data/lib/puppet/provider/package/pip.rb +143 -48
  141. data/lib/puppet/provider/package/pip3.rb +0 -2
  142. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  143. data/lib/puppet/provider/package/pkgng.rb +16 -4
  144. data/lib/puppet/provider/package/portage.rb +2 -2
  145. data/lib/puppet/provider/package/puppet_gem.rb +11 -2
  146. data/lib/puppet/provider/package/rpm.rb +6 -213
  147. data/lib/puppet/provider/package/yum.rb +100 -20
  148. data/lib/puppet/provider/package/zypper.rb +62 -1
  149. data/lib/puppet/provider/service/systemd.rb +22 -4
  150. data/lib/puppet/provider/service/windows.rb +23 -7
  151. data/lib/puppet/provider/user/aix.rb +1 -1
  152. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  153. data/lib/puppet/provider/user/useradd.rb +16 -5
  154. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  155. data/lib/puppet/reports/http.rb +15 -9
  156. data/lib/puppet/resource.rb +2 -1
  157. data/lib/puppet/resource/type.rb +8 -0
  158. data/lib/puppet/resource/type_collection.rb +20 -16
  159. data/lib/puppet/runtime.rb +31 -1
  160. data/lib/puppet/settings.rb +3 -1
  161. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  162. data/lib/puppet/ssl.rb +1 -0
  163. data/lib/puppet/ssl/host.rb +4 -4
  164. data/lib/puppet/ssl/oids.rb +1 -0
  165. data/lib/puppet/ssl/ssl_context.rb +2 -2
  166. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  167. data/lib/puppet/ssl/state_machine.rb +81 -35
  168. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  169. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  170. data/lib/puppet/test/test_helper.rb +21 -14
  171. data/lib/puppet/transaction.rb +2 -2
  172. data/lib/puppet/transaction/persistence.rb +1 -1
  173. data/lib/puppet/transaction/report.rb +3 -3
  174. data/lib/puppet/trusted_external.rb +29 -1
  175. data/lib/puppet/type.rb +21 -8
  176. data/lib/puppet/type/file.rb +51 -13
  177. data/lib/puppet/type/file/checksum.rb +4 -4
  178. data/lib/puppet/type/file/source.rb +75 -64
  179. data/lib/puppet/type/notify.rb +2 -2
  180. data/lib/puppet/type/package.rb +41 -3
  181. data/lib/puppet/type/service.rb +59 -8
  182. data/lib/puppet/type/user.rb +19 -29
  183. data/lib/puppet/util.rb +41 -3
  184. data/lib/puppet/util/at_fork.rb +1 -1
  185. data/lib/puppet/util/autoload.rb +13 -25
  186. data/lib/puppet/util/character_encoding.rb +9 -5
  187. data/lib/puppet/util/checksums.rb +19 -4
  188. data/lib/puppet/util/execution.rb +2 -2
  189. data/lib/puppet/util/fileparsing.rb +2 -2
  190. data/lib/puppet/util/instance_loader.rb +14 -10
  191. data/lib/puppet/util/log/destinations.rb +1 -10
  192. data/lib/puppet/util/package/version/debian.rb +175 -0
  193. data/lib/puppet/util/package/version/gem.rb +15 -0
  194. data/lib/puppet/util/package/version/pip.rb +167 -0
  195. data/lib/puppet/util/package/version/range.rb +53 -0
  196. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  197. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  198. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  199. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  200. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  201. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  202. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  203. data/lib/puppet/util/package/version/rpm.rb +73 -0
  204. data/lib/puppet/util/pidlock.rb +13 -7
  205. data/lib/puppet/util/platform.rb +5 -0
  206. data/lib/puppet/util/provider_features.rb +1 -1
  207. data/lib/puppet/util/reference.rb +1 -1
  208. data/lib/puppet/util/rpm_compare.rb +193 -0
  209. data/lib/puppet/util/windows.rb +1 -0
  210. data/lib/puppet/util/windows/adsi.rb +2 -2
  211. data/lib/puppet/util/windows/api_types.rb +60 -33
  212. data/lib/puppet/util/windows/eventlog.rb +1 -6
  213. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  214. data/lib/puppet/util/windows/principal.rb +8 -6
  215. data/lib/puppet/util/windows/process.rb +15 -14
  216. data/lib/puppet/util/windows/registry.rb +11 -11
  217. data/lib/puppet/util/windows/security.rb +5 -4
  218. data/lib/puppet/util/windows/service.rb +43 -26
  219. data/lib/puppet/util/windows/sid.rb +3 -3
  220. data/lib/puppet/util/windows/user.rb +242 -8
  221. data/lib/puppet/version.rb +1 -1
  222. data/locales/puppet.pot +641 -511
  223. data/man/man5/puppet.conf.5 +75 -10
  224. data/man/man8/puppet-agent.8 +7 -7
  225. data/man/man8/puppet-apply.8 +1 -1
  226. data/man/man8/puppet-catalog.8 +1 -1
  227. data/man/man8/puppet-config.8 +1 -1
  228. data/man/man8/puppet-describe.8 +1 -1
  229. data/man/man8/puppet-device.8 +2 -2
  230. data/man/man8/puppet-doc.8 +1 -1
  231. data/man/man8/puppet-epp.8 +1 -1
  232. data/man/man8/puppet-facts.8 +1 -1
  233. data/man/man8/puppet-filebucket.8 +17 -2
  234. data/man/man8/puppet-generate.8 +1 -1
  235. data/man/man8/puppet-help.8 +6 -3
  236. data/man/man8/puppet-key.8 +1 -1
  237. data/man/man8/puppet-lookup.8 +2 -2
  238. data/man/man8/puppet-man.8 +1 -1
  239. data/man/man8/puppet-module.8 +4 -1
  240. data/man/man8/puppet-node.8 +1 -1
  241. data/man/man8/puppet-parser.8 +1 -1
  242. data/man/man8/puppet-plugin.8 +1 -1
  243. data/man/man8/puppet-report.8 +1 -1
  244. data/man/man8/puppet-resource.8 +1 -1
  245. data/man/man8/puppet-script.8 +1 -1
  246. data/man/man8/puppet-ssl.8 +2 -2
  247. data/man/man8/puppet-status.8 +1 -1
  248. data/man/man8/puppet.8 +2 -2
  249. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  250. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  251. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  252. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  253. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  254. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  255. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  256. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  257. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  258. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  259. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  260. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  261. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  262. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -67
  263. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +1 -69
  264. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -69
  265. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -67
  266. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -65
  267. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -67
  268. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +1 -67
  269. data/spec/integration/application/agent_spec.rb +475 -0
  270. data/spec/integration/application/apply_spec.rb +279 -150
  271. data/spec/integration/application/config_spec.rb +74 -0
  272. data/spec/integration/application/doc_spec.rb +16 -6
  273. data/spec/integration/application/filebucket_spec.rb +239 -0
  274. data/spec/integration/application/help_spec.rb +42 -0
  275. data/spec/integration/application/lookup_spec.rb +13 -0
  276. data/spec/integration/application/module_spec.rb +68 -0
  277. data/spec/integration/application/plugin_spec.rb +123 -0
  278. data/spec/integration/data_binding_spec.rb +82 -0
  279. data/spec/integration/defaults_spec.rb +1 -2
  280. data/spec/integration/directory_environments_spec.rb +17 -17
  281. data/spec/integration/http/client_spec.rb +47 -37
  282. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  283. data/spec/integration/indirector/report/yaml.rb +83 -0
  284. data/spec/integration/network/http_pool_spec.rb +93 -20
  285. data/spec/integration/node/environment_spec.rb +15 -0
  286. data/spec/integration/parser/compiler_spec.rb +11 -0
  287. data/spec/integration/type/file_spec.rb +1 -1
  288. data/spec/integration/util/execution_spec.rb +22 -0
  289. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  290. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  291. data/spec/integration/util/windows/process_spec.rb +26 -32
  292. data/spec/integration/util/windows/registry_spec.rb +7 -7
  293. data/spec/integration/util/windows/user_spec.rb +47 -5
  294. data/spec/integration/util_spec.rb +7 -33
  295. data/spec/lib/puppet/test_ca.rb +2 -2
  296. data/spec/lib/puppet_spec/https.rb +16 -7
  297. data/spec/lib/puppet_spec/matchers.rb +0 -80
  298. data/spec/lib/puppet_spec/puppetserver.rb +127 -0
  299. data/spec/shared_contexts/https.rb +29 -0
  300. data/spec/unit/agent_spec.rb +80 -26
  301. data/spec/unit/application/agent_spec.rb +12 -9
  302. data/spec/unit/application/describe_spec.rb +88 -50
  303. data/spec/unit/application/device_spec.rb +2 -2
  304. data/spec/unit/application/face_base_spec.rb +6 -4
  305. data/spec/unit/application/facts_spec.rb +39 -10
  306. data/spec/unit/application/filebucket_spec.rb +22 -2
  307. data/spec/unit/application/man_spec.rb +52 -0
  308. data/spec/unit/application/resource_spec.rb +3 -1
  309. data/spec/unit/application/ssl_spec.rb +15 -2
  310. data/spec/unit/configurer/downloader_spec.rb +10 -0
  311. data/spec/unit/configurer/fact_handler_spec.rb +4 -4
  312. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  313. data/spec/unit/configurer_spec.rb +64 -46
  314. data/spec/unit/confine_spec.rb +2 -1
  315. data/spec/unit/context/trusted_information_spec.rb +25 -2
  316. data/spec/unit/daemon_spec.rb +5 -64
  317. data/spec/unit/defaults_spec.rb +24 -1
  318. data/spec/unit/environments_spec.rb +8 -0
  319. data/spec/unit/face/config_spec.rb +3 -1
  320. data/spec/unit/face/module/search_spec.rb +17 -0
  321. data/spec/unit/face/plugin_spec.rb +12 -10
  322. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  323. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  324. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  325. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  326. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  327. data/spec/unit/file_system/uniquefile_spec.rb +29 -0
  328. data/spec/unit/file_system_spec.rb +10 -0
  329. data/spec/unit/functions/lookup_spec.rb +13 -0
  330. data/spec/unit/http/client_spec.rb +321 -36
  331. data/spec/unit/http/external_client_spec.rb +201 -0
  332. data/spec/unit/http/resolver_spec.rb +34 -3
  333. data/spec/unit/http/response_spec.rb +75 -0
  334. data/spec/unit/http/service/ca_spec.rb +53 -12
  335. data/spec/unit/http/service/compiler_spec.rb +332 -28
  336. data/spec/unit/http/service/file_server_spec.rb +100 -12
  337. data/spec/unit/http/service/report_spec.rb +19 -9
  338. data/spec/unit/http/service_spec.rb +94 -6
  339. data/spec/unit/http/session_spec.rb +159 -8
  340. data/spec/unit/indirector/catalog/compiler_spec.rb +1 -0
  341. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  342. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  343. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  344. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  345. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  346. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  347. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  348. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  349. data/spec/unit/indirector/request_spec.rb +1 -1
  350. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  351. data/spec/unit/indirector/rest_spec.rb +13 -0
  352. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  353. data/spec/unit/interface_spec.rb +3 -3
  354. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  355. data/spec/unit/network/format_support_spec.rb +3 -2
  356. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  357. data/spec/unit/network/http/connection_spec.rb +552 -190
  358. data/spec/unit/network/http/nocache_pool_spec.rb +22 -0
  359. data/spec/unit/network/http/pool_spec.rb +59 -13
  360. data/spec/unit/network/http_pool_spec.rb +63 -57
  361. data/spec/unit/network/http_spec.rb +1 -1
  362. data/spec/unit/node/environment_spec.rb +33 -0
  363. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  364. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  365. data/spec/unit/parser/scope_spec.rb +1 -1
  366. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  367. data/spec/unit/pops/loaders/loaders_spec.rb +71 -1
  368. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  369. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  370. data/spec/unit/provider/group/groupadd_spec.rb +22 -8
  371. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  372. data/spec/unit/provider/package/aix_spec.rb +29 -0
  373. data/spec/unit/provider/package/apt_spec.rb +107 -0
  374. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  375. data/spec/unit/provider/package/dnfmodule_spec.rb +54 -15
  376. data/spec/unit/provider/package/gem_spec.rb +40 -0
  377. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  378. data/spec/unit/provider/package/pip_spec.rb +68 -19
  379. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  380. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  381. data/spec/unit/provider/package/portage_spec.rb +5 -0
  382. data/spec/unit/provider/package/puppet_gem_spec.rb +12 -1
  383. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  384. data/spec/unit/provider/package/yum_spec.rb +243 -1
  385. data/spec/unit/provider/package/zypper_spec.rb +98 -0
  386. data/spec/unit/provider/service/init_spec.rb +42 -0
  387. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  388. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  389. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  390. data/spec/unit/provider/service/systemd_spec.rb +93 -18
  391. data/spec/unit/provider/service/windows_spec.rb +50 -14
  392. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  393. data/spec/unit/provider/user/useradd_spec.rb +30 -16
  394. data/spec/unit/provider/user/windows_adsi_spec.rb +85 -3
  395. data/spec/unit/puppet_pal_2pec.rb +11 -0
  396. data/spec/unit/puppet_pal_catalog_spec.rb +43 -0
  397. data/spec/unit/puppet_spec.rb +33 -0
  398. data/spec/unit/reports/http_spec.rb +70 -52
  399. data/spec/unit/reports/store_spec.rb +17 -13
  400. data/spec/unit/resource_spec.rb +3 -3
  401. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  402. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  403. data/spec/unit/ssl/host_spec.rb +4 -2
  404. data/spec/unit/ssl/oids_spec.rb +1 -0
  405. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  406. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  407. data/spec/unit/test/test_helper_spec.rb +17 -0
  408. data/spec/unit/transaction/persistence_spec.rb +15 -0
  409. data/spec/unit/transaction/report_spec.rb +5 -1
  410. data/spec/unit/transaction_spec.rb +0 -2
  411. data/spec/unit/type/file/ensure_spec.rb +1 -2
  412. data/spec/unit/type/file/source_spec.rb +89 -38
  413. data/spec/unit/type/file_spec.rb +122 -96
  414. data/spec/unit/type/service_spec.rb +218 -8
  415. data/spec/unit/type/user_spec.rb +32 -3
  416. data/spec/unit/type_spec.rb +50 -0
  417. data/spec/unit/util/at_fork_spec.rb +3 -2
  418. data/spec/unit/util/autoload_spec.rb +2 -1
  419. data/spec/unit/util/character_encoding_spec.rb +4 -4
  420. data/spec/unit/util/checksums_spec.rb +16 -0
  421. data/spec/unit/util/command_line_spec.rb +11 -6
  422. data/spec/unit/util/log/destinations_spec.rb +1 -29
  423. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  424. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  425. data/spec/unit/util/package/version/range_spec.rb +175 -0
  426. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  427. data/spec/unit/util/pidlock_spec.rb +102 -54
  428. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  429. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  430. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  431. data/spec/unit/util/windows/service_spec.rb +4 -4
  432. data/spec/unit/util/windows/sid_spec.rb +2 -2
  433. data/spec/unit/util_spec.rb +3 -3
  434. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  435. data/tasks/generate_cert_fixtures.rake +15 -1
  436. data/tasks/manpages.rake +5 -35
  437. metadata +84 -52
  438. data/COMMITTERS.md +0 -244
  439. data/spec/integration/faces/config_spec.rb +0 -91
  440. data/spec/integration/faces/documentation_spec.rb +0 -57
  441. data/spec/integration/faces/plugin_spec.rb +0 -61
  442. data/spec/integration/file_bucket/file_spec.rb +0 -50
  443. data/spec/integration/file_serving/content_spec.rb +0 -7
  444. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  445. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  446. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  447. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  448. data/spec/integration/module_tool/forge_spec.rb +0 -64
  449. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  450. data/spec/integration/provider/service/init_spec.rb +0 -48
  451. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  452. data/spec/integration/provider/service/windows_spec.rb +0 -50
  453. data/spec/integration/reference/providers_spec.rb +0 -21
  454. data/spec/integration/reports_spec.rb +0 -13
  455. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  456. data/spec/integration/ssl/host_spec.rb +0 -72
  457. data/spec/integration/ssl/key_spec.rb +0 -99
  458. data/spec/integration/test/test_helper_spec.rb +0 -31
  459. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  460. data/spec/unit/face/man_spec.rb +0 -25
  461. data/spec/unit/man_spec.rb +0 -31
@@ -1,10 +1,13 @@
1
1
  require 'spec_helper'
2
2
  require 'puppet_spec/files'
3
3
  require 'puppet_spec/compiler'
4
+ require 'puppet_spec/https'
4
5
 
5
- describe "apply" do
6
+ describe "apply", unless: Puppet::Util::Platform.jruby? do
6
7
  include PuppetSpec::Files
7
8
 
9
+ let(:apply) { Puppet::Application[:apply] }
10
+
8
11
  before :each do
9
12
  Puppet[:reports] = "none"
10
13
  # Let exceptions be raised instead of exiting
@@ -18,76 +21,51 @@ describe "apply" do
18
21
  resource = Puppet::Resource.new(:file, file_to_create, :parameters => {:content => "my stuff"})
19
22
  catalog.add_resource resource
20
23
 
21
- manifest = file_containing("manifest", catalog.to_json)
22
-
23
- puppet = Puppet::Application[:apply]
24
- puppet.options[:catalog] = manifest
25
-
26
- puppet.apply
24
+ apply.command_line.args = ['--catalog', file_containing("manifest", catalog.to_json)]
25
+ expect {
26
+ apply.run
27
+ }.to output(/ensure: defined content as/).to_stdout
27
28
 
28
29
  expect(Puppet::FileSystem.exist?(file_to_create)).to be_truthy
29
30
  expect(File.read(file_to_create)).to eq("my stuff")
30
31
  end
31
32
 
32
- context 'from environment with a pcore defined resource type' do
33
- include PuppetSpec::Compiler
34
-
35
- let!(:envdir) { tmpdir('environments') }
33
+ context 'and pcore types are available' do
34
+ let(:envdir) { my_fixture('environments') }
36
35
  let(:env_name) { 'spec' }
37
- let(:dir_structure) {
38
- {
39
- '.resource_types' => {
40
- 'applytest.pp' => <<-CODE
41
- Puppet::Resource::ResourceType3.new(
42
- 'applytest',
43
- [Puppet::Resource::Param.new(String, 'message')],
44
- [Puppet::Resource::Param.new(String, 'name', true)])
45
- CODE
46
- },
47
- 'modules' => {
48
- 'amod' => {
49
- 'lib' => {
50
- 'puppet' => {
51
- 'type' => { 'applytest.rb' => <<-CODE
52
- Puppet::Type.newtype(:applytest) do
53
- newproperty(:message) do
54
- def sync
55
- Puppet.send(@resource[:loglevel], self.should)
56
- end
57
-
58
- def retrieve
59
- :absent
60
- end
61
36
 
62
- def insync?(is)
63
- false
64
- end
37
+ before(:each) do
38
+ Puppet[:environmentpath] = envdir
39
+ Puppet[:environment] = env_name
40
+ end
65
41
 
66
- defaultto { @resource[:name] }
67
- end
42
+ it 'does not load the pcore type' do
43
+ apply = Puppet::Application[:apply]
44
+ apply.command_line.args = [ '-e', "Applytest { message => 'the default'} applytest { 'applytest was here': }" ]
45
+
46
+ expect {
47
+ apply.run
48
+ }.to exit_with(0)
49
+ .and output(a_string_matching(
50
+ /the Puppet::Type says hello/
51
+ ).and matching(
52
+ /applytest was here/
53
+ )).to_stdout
54
+ end
55
+ end
68
56
 
69
- newparam(:name) do
70
- desc "An arbitrary tag for your own reference; the name of the message."
71
- Puppet.notice('the Puppet::Type says hello')
72
- isnamevar
73
- end
74
- end
75
- CODE
76
- }
77
- }
78
- }
79
- }
80
- }
81
- }
82
- }
57
+ context 'from environment with a pcore defined resource type' do
58
+ include PuppetSpec::Compiler
83
59
 
60
+ let(:envdir) { my_fixture('environments') }
61
+ let(:env_name) { 'spec' }
84
62
  let(:environments) { Puppet::Environments::Directories.new(envdir, []) }
85
63
  let(:env) { Puppet::Node::Environment.create(:'spec', [File.join(envdir, 'spec', 'modules')]) }
86
64
  let(:node) { Puppet::Node.new('test', :environment => env) }
65
+
87
66
  around(:each) do |example|
88
67
  Puppet::Type.rmtype(:applytest)
89
68
  Puppet[:environment] = env_name
90
- dir_contained_in(envdir, env_name => dir_structure)
91
69
  Puppet.override(:environments => environments, :current_environment => env) do
92
70
  example.run
93
71
  end
@@ -95,12 +73,13 @@ end
95
73
 
96
74
  it 'does not load the pcore type' do
97
75
  catalog = compile_to_catalog('applytest { "applytest was here":}', node)
98
- apply = Puppet::Application[:apply]
99
- apply.options[:catalog] = file_containing('manifest', catalog.to_json)
76
+ apply.command_line.args = ['--catalog', file_containing('manifest', catalog.to_json)]
100
77
 
101
78
  Puppet[:environmentpath] = envdir
102
79
  expect_any_instance_of(Puppet::Pops::Loader::Runtime3TypeLoader).not_to receive(:find)
103
- expect { apply.run }.to have_printed(/the Puppet::Type says hello.*applytest was here/m)
80
+ expect {
81
+ apply.run
82
+ }.to output(/the Puppet::Type says hello.*applytest was here/m).to_stdout
104
83
  end
105
84
 
106
85
  # Test just to verify that the Pcore Resource Type and not the Ruby one is produced when the catalog is produced
@@ -112,7 +91,9 @@ end
112
91
 
113
92
  expect(compiler.loaders.runtime3_type_loader.instance_variable_get(:@resource_3x_loader)).to receive(:set_entry).once.with(tn, rt, instance_of(String))
114
93
  .and_return(Puppet::Pops::Loader::Loader::NamedEntry.new(tn, rt, nil))
115
- expect { compiler.compile }.not_to have_printed(/the Puppet::Type says hello/)
94
+ expect {
95
+ compiler.compile
96
+ }.not_to output(/the Puppet::Type says hello/).to_stdout
116
97
  end
117
98
 
118
99
  it "does not fail when pcore type is loaded twice" do
@@ -225,39 +206,39 @@ end
225
206
  catalog = compile_to_catalog('include mod', node)
226
207
 
227
208
  Puppet[:environment] = env_name
228
- apply = Puppet::Application[:apply]
229
- apply.options[:catalog] = file_containing('manifest', catalog.to_json)
230
- expect { apply.run_command; exit(0) }.to exit_with(0)
231
- expect(@logs.map(&:to_s)).to include('The Street 23')
209
+ apply.command_line.args = ['--catalog', file_containing('manifest', catalog.to_json)]
210
+
211
+ expect {
212
+ apply.run
213
+ }.to output(%r{Notify\[The Street 23\]/message: defined 'message' as 'The Street 23'}).to_stdout
232
214
  end
233
215
  end
234
216
 
235
- it "applies a given file even when a directory environment is specified" do
217
+ it "raises if the environment directory does not exist" do
236
218
  manifest = file_containing("manifest.pp", "notice('it was applied')")
219
+ apply.command_line.args = [manifest]
237
220
 
238
221
  special = Puppet::Node::Environment.create(:special, [])
239
222
  Puppet.override(:current_environment => special) do
240
223
  Puppet[:environment] = 'special'
241
- puppet = Puppet::Application[:apply]
242
- allow(puppet).to receive(:command_line).and_return(double('command_line', :args => [manifest]))
243
- expect { puppet.run_command }.to exit_with(0)
224
+ expect {
225
+ apply.run
226
+ }.to raise_error(Puppet::Environments::EnvironmentNotFound,
227
+ /Could not find a directory environment named 'special' anywhere in the path/)
244
228
  end
245
-
246
- expect(@logs.map(&:to_s)).to include('it was applied')
247
229
  end
248
230
 
249
231
  it "adds environment to the $server_facts variable" do
250
232
  manifest = file_containing("manifest.pp", "notice(\"$server_facts\")")
233
+ apply.command_line.args = [manifest]
251
234
 
252
- puppet = Puppet::Application[:apply]
253
- allow(puppet).to receive(:command_line).and_return(double('command_line', :args => [manifest]))
254
-
255
- expect { puppet.run_command }.to exit_with(0)
256
-
257
- expect(@logs.map(&:to_s)).to include(/{environment =>.*/)
235
+ expect {
236
+ apply.run
237
+ }.to exit_with(0)
238
+ .and output(/{environment => production}/).to_stdout
258
239
  end
259
240
 
260
- it "applies a given file even when an ENC is configured", :unless => Puppet::Util::Platform.windows? || RUBY_PLATFORM == 'java' do
241
+ it "applies a given file even when an ENC is configured", :unless => Puppet::Util::Platform.windows? || Puppet::Util::Platform.jruby? do
261
242
  manifest = file_containing("manifest.pp", "notice('specific manifest applied')")
262
243
  enc = script_containing('enc_script',
263
244
  :windows => '@echo classes: []' + "\n" + '@echo environment: special',
@@ -270,48 +251,36 @@ end
270
251
  Puppet[:environment] = 'special'
271
252
  Puppet[:node_terminus] = 'exec'
272
253
  Puppet[:external_nodes] = enc
273
- puppet = Puppet::Application[:apply]
274
- allow(puppet).to receive(:command_line).and_return(double('command_line', :args => [manifest]))
275
- expect { puppet.run_command }.to exit_with(0)
254
+ apply.command_line.args = [manifest]
255
+ expect {
256
+ apply.run
257
+ }.to exit_with(0)
258
+ .and output(/Notice: Scope\(Class\[main\]\): specific manifest applied/).to_stdout
276
259
  end
277
-
278
- expect(@logs.map(&:to_s)).to include('specific manifest applied')
279
260
  end
280
261
 
281
262
  context "handles errors" do
282
263
  it "logs compile errors once" do
283
- Puppet.initialize_settings([])
284
- apply = Puppet::Application.find(:apply).new(double('command_line', :subcommand_name => :apply, :args => []))
285
- apply.options[:code] = '08'
286
-
287
- msg = 'valid octal'
288
- callback = Proc.new do |actual|
289
- expect(actual.scan(Regexp.new(msg))).to eq([msg])
290
- end
291
-
292
- expect do
264
+ apply.command_line.args = ['-e', '08']
265
+ expect {
293
266
  apply.run
294
- end.to have_printed(callback).and_exit_with(1)
267
+ }.to exit_with(1)
268
+ .and output(/Not a valid octal number/).to_stderr
295
269
  end
296
270
 
297
271
  it "logs compile post processing errors once" do
298
- Puppet.initialize_settings([])
299
- apply = Puppet::Application.find(:apply).new(double('command_line', :subcommand_name => :apply, :args => []))
300
272
  path = File.expand_path('/tmp/content_file_test.Q634Dlmtime')
301
- apply.options[:code] = "file { '#{path}':
273
+ apply.command_line.args = ['-e', "file { '#{path}':
302
274
  content => 'This is the test file content',
303
275
  ensure => present,
304
276
  checksum => mtime
305
- }"
306
-
307
- msg = 'You cannot specify content when using checksum'
308
- callback = Proc.new do |actual|
309
- expect(actual.scan(Regexp.new(msg))).to eq([msg])
310
- end
277
+ }"]
311
278
 
312
- expect do
279
+ expect {
313
280
  apply.run
314
- end.to have_printed(callback).and_exit_with(1)
281
+ }.to exit_with(1)
282
+ .and output(/Compiled catalog/).to_stdout
283
+ .and output(/You cannot specify content when using checksum/).to_stderr
315
284
  end
316
285
  end
317
286
 
@@ -336,51 +305,42 @@ end
336
305
  Puppet[:environmentpath] = envdir
337
306
  end
338
307
 
339
- def init_cli_args_and_apply_app(args, execute)
340
- Puppet.initialize_settings(args)
341
- puppet = Puppet::Application.find(:apply).new(double('command_line', :subcommand_name => :apply, :args => args))
342
- puppet.options[:code] = execute
343
- return puppet
344
- end
308
+ context "given a modulepath" do
309
+ let(:args) { ['-e', execute] }
345
310
 
346
- context "given the --modulepath option" do
347
- let(:args) { ['-e', execute, '--modulepath', modulepath] }
311
+ before :each do
312
+ Puppet[:modulepath] = modulepath
348
313
 
349
- it "looks in --modulepath even when the default directory environment exists" do
350
- apply = init_cli_args_and_apply_app(args, execute)
314
+ apply.command_line.args = args
315
+ end
351
316
 
352
- expect do
353
- expect { apply.run }.to exit_with(0)
354
- end.to have_printed('amod class included')
317
+ it "looks in modulepath even when the default directory environment exists" do
318
+ expect {
319
+ apply.run
320
+ }.to exit_with(0)
321
+ .and output(/amod class included/).to_stdout
355
322
  end
356
323
 
357
- it "looks in --modulepath even when given a specific directory --environment" do
358
- args << '--environment' << 'production'
359
- apply = init_cli_args_and_apply_app(args, execute)
324
+ it "looks in modulepath even when given a specific directory --environment" do
325
+ apply.command_line.args = args << '--environment' << 'production'
360
326
 
361
- expect do
362
- expect { apply.run }.to exit_with(0)
363
- end.to have_printed('amod class included')
327
+ expect {
328
+ apply.run
329
+ }.to exit_with(0)
330
+ .and output(/amod class included/).to_stdout
364
331
  end
365
332
 
366
- it "looks in --modulepath when given multiple paths in --modulepath" do
367
- args = ['-e', execute, '--modulepath', [tmpdir('notmodulepath'), modulepath].join(File::PATH_SEPARATOR)]
368
- apply = init_cli_args_and_apply_app(args, execute)
333
+ it "looks in modulepath when given multiple paths in modulepath" do
334
+ Puppet[:modulepath] = [tmpdir('notmodulepath'), modulepath].join(File::PATH_SEPARATOR)
369
335
 
370
- expect do
371
- expect { apply.run }.to exit_with(0)
372
- end.to have_printed('amod class included')
336
+ expect {
337
+ apply.run
338
+ }.to exit_with(0)
339
+ .and output(/amod class included/).to_stdout
373
340
  end
374
341
  end
375
342
 
376
- # When executing an ENC script, output cannot be captured using
377
- # expect { }.to have_printed(...)
378
- # External node script execution will fail, likely due to the tampering
379
- # with the basic file descriptors.
380
- # Workaround: Define a log destination and merely inspect logs.
381
- context "with an ENC", :unless => RUBY_PLATFORM == 'java' do
382
- let(:logdest) { tmpfile('logdest') }
383
- let(:args) { ['-e', execute, '--logdest', logdest ] }
343
+ context "with an ENC" do
384
344
  let(:enc) do
385
345
  script_containing('enc_script',
386
346
  :windows => '@echo environment: spec',
@@ -393,17 +353,23 @@ end
393
353
  end
394
354
 
395
355
  it "should use the environment that the ENC mandates" do
396
- apply = init_cli_args_and_apply_app(args, execute)
397
- expect { apply.run }.to exit_with(0)
398
- expect(@logs.map(&:to_s)).to include('amod class included')
356
+ apply.command_line.args = ['-e', execute]
357
+
358
+ expect {
359
+ apply.run
360
+ }.to exit_with(0)
361
+ .and output(a_string_matching(/amod class included/)
362
+ .and matching(/Compiled catalog for .* in environment spec/)).to_stdout
399
363
  end
400
364
 
401
365
  it "should prefer the ENC environment over the configured one and emit a warning" do
402
- apply = init_cli_args_and_apply_app(args + [ '--environment', 'production' ], execute)
403
- expect { apply.run }.to exit_with(0)
404
- logs = @logs.map(&:to_s)
405
- expect(logs).to include('amod class included')
406
- expect(logs).to include(match(/doesn't match server specified environment/))
366
+ apply.command_line.args = ['-e', execute, '--environment', 'production']
367
+
368
+ expect {
369
+ apply.run
370
+ }.to exit_with(0)
371
+ .and output(a_string_matching('amod class included')
372
+ .and matching(/doesn't match server specified environment/)).to_stdout
407
373
  end
408
374
  end
409
375
  end
@@ -474,8 +440,7 @@ class amod::bad_type {
474
440
  context 'and the file is not serialized with rich_data' do
475
441
  it 'will notify a string that is the result of Regexp#inspect (from Runtime3xConverter)' do
476
442
  catalog = compile_to_catalog(execute, node)
477
- apply = Puppet::Application[:apply]
478
- apply.options[:catalog] = file_containing('manifest', catalog.to_json)
443
+ apply.command_line.args = ['--catalog', file_containing('manifest', catalog.to_json)]
479
444
  expect(apply).to receive(:apply_catalog) do |cat|
480
445
  expect(cat.resource(:notify, 'rx')['message']).to be_a(String)
481
446
  expect(cat.resource(:notify, 'bin')['message']).to be_a(String)
@@ -490,8 +455,7 @@ class amod::bad_type {
490
455
 
491
456
  it 'will notify a string that is the result of to_s on uknown data types' do
492
457
  json = compile_to_catalog('include amod::bad_type', node).to_json
493
- apply = Puppet::Application[:apply]
494
- apply.options[:catalog] = file_containing('manifest', json)
458
+ apply.command_line.args = ['--catalog', file_containing('manifest', json)]
495
459
  expect(apply).to receive(:apply_catalog) do |catalog|
496
460
  expect(catalog.resource(:notify, 'bogus')['message']).to be_a(String)
497
461
  end
@@ -513,11 +477,10 @@ class amod::bad_type {
513
477
  context 'and the file is serialized with rich_data' do
514
478
  it 'will notify a regexp using Regexp#to_s' do
515
479
  catalog = compile_to_catalog(execute, node)
516
- apply = Puppet::Application[:apply]
517
480
  serialized_catalog = Puppet.override(rich_data: true) do
518
481
  catalog.to_json
519
482
  end
520
- apply.options[:catalog] = file_containing('manifest', serialized_catalog)
483
+ apply.command_line.args = ['--catalog', file_containing('manifest', serialized_catalog)]
521
484
  expect(apply).to receive(:apply_catalog) do |cat|
522
485
  expect(cat.resource(:notify, 'rx')['message']).to be_a(Regexp)
523
486
  # The resource return in this expect is a String, but since it was a Binary type that
@@ -534,4 +497,170 @@ class amod::bad_type {
534
497
  end
535
498
  end
536
499
  end
500
+
501
+ context 'puppet file sources' do
502
+ let(:env_name) { 'dev' }
503
+ let(:env_dir) { File.join(Puppet[:environmentpath], env_name) }
504
+ let(:env) { Puppet::Node::Environment.create(env_name.to_sym, [File.join(env_dir, 'modules')]) }
505
+ let(:node) { Puppet::Node.new(Puppet[:certname], environment: environment) }
506
+
507
+ before :each do
508
+ Puppet[:environment] = env_name
509
+ Puppet::FileSystem.mkpath(env_dir)
510
+ end
511
+
512
+ it "recursively copies a directory from a module" do
513
+ dir = File.join(env.full_modulepath, 'amod', 'files', 'dir1', 'dir2')
514
+ Puppet::FileSystem.mkpath(dir)
515
+ File.write(File.join(dir, 'file'), 'content from the module')
516
+
517
+ base_dir = tmpdir('apply_spec_base')
518
+ manifest = file_containing("manifest.pp", <<-MANIFEST)
519
+ file { "#{base_dir}/dir1":
520
+ ensure => file,
521
+ source => "puppet:///modules/amod/dir1",
522
+ recurse => true,
523
+ }
524
+ MANIFEST
525
+
526
+ expect {
527
+ apply.command_line.args << manifest
528
+ apply.run
529
+ }.to exit_with(0)
530
+ .and output(a_string_matching(
531
+ /dir1\]\/ensure: created/
532
+ ).and matching(
533
+ /dir1\/dir2\]\/ensure: created/
534
+ ).and matching(
535
+ /dir1\/dir2\/file\]\/ensure: defined content as '{md5}51f37efb13c3a1e486106f90db6490a5'/
536
+ )).to_stdout
537
+
538
+ dest_file = File.join(base_dir, 'dir1', 'dir2', 'file')
539
+ expect(File.read(dest_file)).to eq("content from the module")
540
+ end
541
+ end
542
+
543
+ context 'http file sources' do
544
+ include_context 'https client'
545
+
546
+ it "requires the caller to URL encode special characters in the request path and query" do
547
+ Puppet[:server] = '127.0.0.1'
548
+ request = nil
549
+
550
+ response_proc = -> (req, res) {
551
+ request = req
552
+
553
+ res['Content-Type'] = 'text/plain'
554
+ res.body = "from the server"
555
+ }
556
+
557
+ https = PuppetSpec::HTTPSServer.new
558
+ https.start_server(response_proc: response_proc) do |https_port|
559
+ dest = tmpfile('http_file_source')
560
+
561
+ # spaces in path are encoded as %20 and '[' in query is encoded as %5B,
562
+ # but ':', '=', '-' are not encoded
563
+ manifest = file_containing("manifest.pp", <<~MANIFEST)
564
+ file { "#{dest}":
565
+ ensure => file,
566
+ source => "https://#{Puppet[:server]}:#{https_port}/path%20to%20file?x=b%5Bc&sv=2019-02-02&st=2020-07-28T20:18:53Z&se=2020-07-28T21:03:00Z&sr=b&sp=r&sig=JaZhcqxT4akJcOwUdUGrQB2m1geUoh89iL8WMag8a8c=",
567
+ }
568
+ MANIFEST
569
+
570
+ expect {
571
+ apply.command_line.args << manifest
572
+ apply.run
573
+ }.to exit_with(0)
574
+ .and output(%r{Main/File\[#{dest}\]/ensure: defined content as}).to_stdout
575
+
576
+ expect(request.path).to eq('/path to file')
577
+ expect(request.query).to include('x' => 'b[c')
578
+ expect(request.query).to include('sig' => 'JaZhcqxT4akJcOwUdUGrQB2m1geUoh89iL8WMag8a8c=')
579
+ end
580
+ end
581
+ end
582
+
583
+ context 'http report processor' do
584
+ include_context 'https client'
585
+
586
+ before :each do
587
+ Puppet[:reports] = 'http'
588
+ end
589
+
590
+ let(:unknown_server) do
591
+ unknown_ca_cert = cert_fixture('unknown-ca.pem')
592
+ PuppetSpec::HTTPSServer.new(
593
+ ca_cert: unknown_ca_cert,
594
+ server_cert: cert_fixture('unknown-127.0.0.1.pem'),
595
+ server_key: key_fixture('unknown-127.0.0.1-key.pem')
596
+ )
597
+ end
598
+
599
+ it 'submits a report via reporturl' do
600
+ report = nil
601
+
602
+ response_proc = -> (req, res) {
603
+ report = Puppet::Transaction::Report.convert_from(:yaml, req.body)
604
+ }
605
+
606
+ https = PuppetSpec::HTTPSServer.new
607
+ https.start_server(response_proc: response_proc) do |https_port|
608
+ Puppet[:reporturl] = "https://127.0.0.1:#{https_port}/reports/upload"
609
+
610
+ expect {
611
+ apply.command_line.args = ['-e', 'notify { "hi": }']
612
+ apply.run
613
+ }.to exit_with(0)
614
+ .and output(/Applied catalog/).to_stdout
615
+
616
+ expect(report).to be_a(Puppet::Transaction::Report)
617
+ expect(report.resource_statuses['Notify[hi]']).to be_a(Puppet::Resource::Status)
618
+ end
619
+ end
620
+
621
+ it 'rejects an HTTPS report server whose root cert is not the puppet CA' do
622
+ unknown_server.start_server do |https_port|
623
+ Puppet[:reporturl] = "https://127.0.0.1:#{https_port}/reports/upload"
624
+
625
+ # processing the report happens after the transaction is finished,
626
+ # so we expect exit code 0, with a later failure on stderr
627
+ expect {
628
+ apply.command_line.args = ['-e', 'notify { "hi": }']
629
+ apply.run
630
+ }.to exit_with(0)
631
+ .and output(/Applied catalog/).to_stdout
632
+ .and output(/Report processor failed: certificate verify failed \[self signed certificate in certificate chain for CN=Unknown CA\]/).to_stderr
633
+ end
634
+ end
635
+
636
+ it 'accepts an HTTPS report servers whose cert is in the system CA store' do
637
+ Puppet[:report_include_system_store] = true
638
+ report = nil
639
+
640
+ response_proc = -> (req, res) {
641
+ report = Puppet::Transaction::Report.convert_from(:yaml, req.body)
642
+ }
643
+
644
+ # create a temp cacert bundle
645
+ ssl_file = tmpfile('systemstore')
646
+ File.write(ssl_file, unknown_server.ca_cert.to_pem)
647
+
648
+ unknown_server.start_server(response_proc: response_proc) do |https_port|
649
+ Puppet[:reporturl] = "https://127.0.0.1:#{https_port}/reports/upload"
650
+
651
+ # override path to system cacert bundle, this must be done before
652
+ # the SSLContext is created and the call to X509::Store.set_default_paths
653
+ Puppet::Util.withenv("SSL_CERT_FILE" => ssl_file) do
654
+ expect {
655
+ apply.command_line.args = ['-e', 'notify { "hi": }']
656
+ apply.run
657
+ }.to exit_with(0)
658
+ .and output(/Applied catalog/).to_stdout
659
+ end
660
+
661
+ expect(report).to be_a(Puppet::Transaction::Report)
662
+ expect(report.resource_statuses['Notify[hi]']).to be_a(Puppet::Resource::Status)
663
+ end
664
+ end
665
+ end
537
666
  end