puppet 6.15.0-x64-mingw32 → 6.19.1-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 (418) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -7
  3. data/Gemfile +4 -2
  4. data/Gemfile.lock +29 -27
  5. data/README.md +3 -4
  6. data/Rakefile +4 -12
  7. data/lib/puppet.rb +32 -8
  8. data/lib/puppet/agent.rb +18 -4
  9. data/lib/puppet/agent/locker.rb +0 -7
  10. data/lib/puppet/application/agent.rb +23 -8
  11. data/lib/puppet/application/apply.rb +18 -20
  12. data/lib/puppet/application/device.rb +1 -1
  13. data/lib/puppet/application/doc.rb +1 -1
  14. data/lib/puppet/application/lookup.rb +16 -4
  15. data/lib/puppet/application/plugin.rb +1 -0
  16. data/lib/puppet/application/ssl.rb +1 -1
  17. data/lib/puppet/configurer.rb +61 -21
  18. data/lib/puppet/configurer/downloader.rb +31 -10
  19. data/lib/puppet/confine.rb +2 -2
  20. data/lib/puppet/confine/any.rb +1 -1
  21. data/lib/puppet/context/trusted_information.rb +14 -8
  22. data/lib/puppet/daemon.rb +13 -27
  23. data/lib/puppet/defaults.rb +119 -39
  24. data/lib/puppet/environments.rb +51 -10
  25. data/lib/puppet/face/catalog.rb +1 -1
  26. data/lib/puppet/face/config.rb +46 -16
  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/node.rb +3 -3
  31. data/lib/puppet/face/node/clean.rb +2 -2
  32. data/lib/puppet/face/plugin.rb +1 -1
  33. data/lib/puppet/face/status.rb +1 -1
  34. data/lib/puppet/feature/base.rb +1 -1
  35. data/lib/puppet/file_bucket/dipper.rb +1 -1
  36. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  37. data/lib/puppet/file_serving/metadata.rb +4 -1
  38. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  39. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  40. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  41. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  42. data/lib/puppet/file_system/file_impl.rb +4 -4
  43. data/lib/puppet/file_system/uniquefile.rb +12 -16
  44. data/lib/puppet/forge.rb +1 -1
  45. data/lib/puppet/forge/cache.rb +1 -1
  46. data/lib/puppet/forge/repository.rb +4 -7
  47. data/lib/puppet/functions/filter.rb +1 -0
  48. data/lib/puppet/functions/lstrip.rb +4 -4
  49. data/lib/puppet/functions/new.rb +8 -3
  50. data/lib/puppet/functions/reverse_each.rb +1 -1
  51. data/lib/puppet/functions/rstrip.rb +4 -4
  52. data/lib/puppet/functions/step.rb +1 -1
  53. data/lib/puppet/functions/strip.rb +4 -4
  54. data/lib/puppet/gettext/config.rb +5 -5
  55. data/lib/puppet/gettext/module_translations.rb +4 -4
  56. data/lib/puppet/http.rb +1 -0
  57. data/lib/puppet/http/client.rb +28 -12
  58. data/lib/puppet/http/external_client.rb +0 -6
  59. data/lib/puppet/http/redirector.rb +9 -7
  60. data/lib/puppet/http/resolver.rb +5 -8
  61. data/lib/puppet/http/resolver/server_list.rb +18 -36
  62. data/lib/puppet/http/resolver/settings.rb +4 -4
  63. data/lib/puppet/http/resolver/srv.rb +5 -5
  64. data/lib/puppet/http/response.rb +19 -0
  65. data/lib/puppet/http/service.rb +3 -1
  66. data/lib/puppet/http/service/compiler.rb +1 -1
  67. data/lib/puppet/http/service/file_server.rb +1 -1
  68. data/lib/puppet/http/service/puppetserver.rb +39 -0
  69. data/lib/puppet/http/session.rb +5 -4
  70. data/lib/puppet/indirector.rb +1 -1
  71. data/lib/puppet/indirector/catalog/compiler.rb +1 -1
  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/yaml.rb +1 -1
  75. data/lib/puppet/indirector/file_content/http.rb +5 -0
  76. data/lib/puppet/indirector/file_content/rest.rb +1 -1
  77. data/lib/puppet/indirector/file_metadata/http.rb +28 -8
  78. data/lib/puppet/indirector/file_metadata/rest.rb +2 -2
  79. data/lib/puppet/indirector/hiera.rb +4 -0
  80. data/lib/puppet/indirector/indirection.rb +1 -1
  81. data/lib/puppet/indirector/json.rb +1 -1
  82. data/lib/puppet/indirector/msgpack.rb +1 -1
  83. data/lib/puppet/indirector/report/processor.rb +2 -2
  84. data/lib/puppet/indirector/request.rb +5 -5
  85. data/lib/puppet/indirector/rest.rb +7 -1
  86. data/lib/puppet/indirector/yaml.rb +1 -1
  87. data/lib/puppet/module.rb +1 -2
  88. data/lib/puppet/network/format_support.rb +2 -2
  89. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  90. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  91. data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
  92. data/lib/puppet/network/http/compression.rb +7 -0
  93. data/lib/puppet/network/http/connection.rb +2 -0
  94. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  95. data/lib/puppet/network/http/nocache_pool.rb +1 -0
  96. data/lib/puppet/network/http/route.rb +2 -2
  97. data/lib/puppet/network/http_pool.rb +2 -2
  98. data/lib/puppet/node/environment.rb +12 -5
  99. data/lib/puppet/node/facts.rb +17 -0
  100. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  101. data/lib/puppet/pal/pal_impl.rb +31 -4
  102. data/lib/puppet/parameter.rb +1 -1
  103. data/lib/puppet/parser/ast/leaf.rb +5 -5
  104. data/lib/puppet/parser/ast/pops_bridge.rb +0 -4
  105. data/lib/puppet/parser/compiler.rb +29 -26
  106. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  107. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  108. data/lib/puppet/parser/environment_compiler.rb +4 -1
  109. data/lib/puppet/parser/functions.rb +21 -17
  110. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  111. data/lib/puppet/parser/functions/filter.rb +1 -0
  112. data/lib/puppet/parser/resource.rb +3 -2
  113. data/lib/puppet/parser/resource/param.rb +6 -0
  114. data/lib/puppet/parser/type_loader.rb +2 -2
  115. data/lib/puppet/pops/adaptable.rb +7 -13
  116. data/lib/puppet/pops/adapters.rb +8 -4
  117. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
  118. data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
  119. data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
  120. data/lib/puppet/pops/issues.rb +5 -0
  121. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  122. data/lib/puppet/pops/loaders.rb +18 -11
  123. data/lib/puppet/pops/lookup/context.rb +1 -1
  124. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  125. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  126. data/lib/puppet/pops/types/iterable.rb +34 -8
  127. data/lib/puppet/pops/types/p_meta_type.rb +1 -1
  128. data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
  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/package/aix.rb +17 -2
  133. data/lib/puppet/provider/package/apt.rb +38 -1
  134. data/lib/puppet/provider/package/aptitude.rb +1 -1
  135. data/lib/puppet/provider/package/dnfmodule.rb +24 -4
  136. data/lib/puppet/provider/package/dpkg.rb +1 -1
  137. data/lib/puppet/provider/package/gem.rb +4 -2
  138. data/lib/puppet/provider/package/pip.rb +60 -37
  139. data/lib/puppet/provider/package/pip2.rb +17 -0
  140. data/lib/puppet/provider/package/portage.rb +2 -2
  141. data/lib/puppet/provider/package/puppet_gem.rb +5 -0
  142. data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
  143. data/lib/puppet/provider/package/yum.rb +9 -1
  144. data/lib/puppet/provider/package/zypper.rb +62 -1
  145. data/lib/puppet/provider/service/systemd.rb +21 -4
  146. data/lib/puppet/provider/service/windows.rb +23 -7
  147. data/lib/puppet/provider/user/aix.rb +1 -1
  148. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  149. data/lib/puppet/provider/user/useradd.rb +16 -5
  150. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  151. data/lib/puppet/reports/http.rb +7 -3
  152. data/lib/puppet/resource.rb +2 -1
  153. data/lib/puppet/resource/type.rb +10 -1
  154. data/lib/puppet/rest/route.rb +2 -2
  155. data/lib/puppet/runtime.rb +25 -2
  156. data/lib/puppet/settings.rb +43 -6
  157. data/lib/puppet/ssl/ssl_context.rb +2 -2
  158. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  159. data/lib/puppet/ssl/state_machine.rb +33 -8
  160. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  161. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  162. data/lib/puppet/test/test_helper.rb +19 -14
  163. data/lib/puppet/transaction.rb +2 -2
  164. data/lib/puppet/transaction/persistence.rb +1 -1
  165. data/lib/puppet/transaction/report.rb +12 -8
  166. data/lib/puppet/trusted_external.rb +29 -1
  167. data/lib/puppet/type.rb +15 -7
  168. data/lib/puppet/type/file.rb +40 -15
  169. data/lib/puppet/type/file/checksum.rb +4 -4
  170. data/lib/puppet/type/file/source.rb +33 -13
  171. data/lib/puppet/type/filebucket.rb +1 -1
  172. data/lib/puppet/type/notify.rb +2 -2
  173. data/lib/puppet/type/package.rb +16 -1
  174. data/lib/puppet/type/service.rb +59 -8
  175. data/lib/puppet/type/user.rb +19 -10
  176. data/lib/puppet/util.rb +41 -3
  177. data/lib/puppet/util/autoload.rb +10 -25
  178. data/lib/puppet/util/character_encoding.rb +9 -5
  179. data/lib/puppet/util/checksums.rb +19 -4
  180. data/lib/puppet/util/connection.rb +8 -8
  181. data/lib/puppet/util/execution.rb +2 -2
  182. data/lib/puppet/util/fileparsing.rb +2 -2
  183. data/lib/puppet/util/log/destinations.rb +1 -10
  184. data/lib/puppet/util/package/version/range.rb +4 -1
  185. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  186. data/lib/puppet/util/provider_features.rb +1 -1
  187. data/lib/puppet/util/reference.rb +1 -1
  188. data/lib/puppet/util/run_mode.rb +5 -1
  189. data/lib/puppet/util/windows.rb +1 -0
  190. data/lib/puppet/util/windows/api_types.rb +60 -33
  191. data/lib/puppet/util/windows/eventlog.rb +1 -6
  192. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  193. data/lib/puppet/util/windows/principal.rb +8 -6
  194. data/lib/puppet/util/windows/registry.rb +11 -11
  195. data/lib/puppet/util/windows/security.rb +4 -4
  196. data/lib/puppet/util/windows/service.rb +43 -26
  197. data/lib/puppet/util/windows/user.rb +242 -8
  198. data/lib/puppet/version.rb +1 -1
  199. data/locales/puppet.pot +541 -427
  200. data/man/man5/puppet.conf.5 +84 -19
  201. data/man/man8/puppet-agent.8 +7 -4
  202. data/man/man8/puppet-apply.8 +1 -1
  203. data/man/man8/puppet-catalog.8 +1 -1
  204. data/man/man8/puppet-config.8 +6 -6
  205. data/man/man8/puppet-describe.8 +1 -1
  206. data/man/man8/puppet-device.8 +1 -1
  207. data/man/man8/puppet-doc.8 +1 -1
  208. data/man/man8/puppet-epp.8 +1 -1
  209. data/man/man8/puppet-facts.8 +1 -1
  210. data/man/man8/puppet-filebucket.8 +1 -1
  211. data/man/man8/puppet-generate.8 +1 -1
  212. data/man/man8/puppet-help.8 +6 -3
  213. data/man/man8/puppet-key.8 +1 -1
  214. data/man/man8/puppet-lookup.8 +2 -2
  215. data/man/man8/puppet-man.8 +1 -1
  216. data/man/man8/puppet-module.8 +4 -1
  217. data/man/man8/puppet-node.8 +4 -4
  218. data/man/man8/puppet-parser.8 +1 -1
  219. data/man/man8/puppet-plugin.8 +1 -1
  220. data/man/man8/puppet-report.8 +1 -1
  221. data/man/man8/puppet-resource.8 +1 -1
  222. data/man/man8/puppet-script.8 +1 -1
  223. data/man/man8/puppet-ssl.8 +1 -1
  224. data/man/man8/puppet-status.8 +2 -2
  225. data/man/man8/puppet.8 +2 -2
  226. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  227. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  228. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  229. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  230. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-enabled.txt → dnf-module-list.txt} +6 -0
  231. data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
  232. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  233. data/spec/integration/application/agent_spec.rb +202 -52
  234. data/spec/integration/application/apply_spec.rb +149 -149
  235. data/spec/integration/application/config_spec.rb +74 -0
  236. data/spec/integration/application/doc_spec.rb +16 -6
  237. data/spec/integration/application/filebucket_spec.rb +70 -21
  238. data/spec/integration/application/help_spec.rb +42 -0
  239. data/spec/integration/application/lookup_spec.rb +13 -0
  240. data/spec/integration/application/module_spec.rb +68 -0
  241. data/spec/integration/application/plugin_spec.rb +75 -2
  242. data/spec/integration/configurer_spec.rb +14 -0
  243. data/spec/integration/data_binding_spec.rb +82 -0
  244. data/spec/integration/defaults_spec.rb +27 -3
  245. data/spec/integration/directory_environments_spec.rb +17 -17
  246. data/spec/integration/http/client_spec.rb +6 -1
  247. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  248. data/spec/integration/network/http_pool_spec.rb +73 -0
  249. data/spec/integration/node/environment_spec.rb +1 -1
  250. data/spec/integration/parser/compiler_spec.rb +11 -0
  251. data/spec/integration/type/file_spec.rb +1 -1
  252. data/spec/integration/util/execution_spec.rb +22 -0
  253. data/spec/integration/util/windows/adsi_spec.rb +7 -2
  254. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  255. data/spec/integration/util/windows/process_spec.rb +26 -32
  256. data/spec/integration/util/windows/registry_spec.rb +7 -7
  257. data/spec/integration/util/windows/user_spec.rb +47 -5
  258. data/spec/integration/util_spec.rb +7 -33
  259. data/spec/lib/puppet_spec/https.rb +6 -0
  260. data/spec/lib/puppet_spec/matchers.rb +0 -80
  261. data/spec/lib/puppet_spec/puppetserver.rb +8 -0
  262. data/spec/shared_contexts/types_setup.rb +2 -0
  263. data/spec/unit/agent_spec.rb +47 -1
  264. data/spec/unit/application/agent_spec.rb +7 -8
  265. data/spec/unit/application/doc_spec.rb +2 -2
  266. data/spec/unit/application/face_base_spec.rb +6 -4
  267. data/spec/unit/application/facts_spec.rb +41 -10
  268. data/spec/unit/application/man_spec.rb +52 -0
  269. data/spec/unit/application/resource_spec.rb +3 -1
  270. data/spec/unit/application/ssl_spec.rb +15 -2
  271. data/spec/unit/application_spec.rb +9 -4
  272. data/spec/unit/configurer/downloader_spec.rb +10 -0
  273. data/spec/unit/configurer/fact_handler_spec.rb +4 -4
  274. data/spec/unit/configurer_spec.rb +86 -37
  275. data/spec/unit/confine_spec.rb +2 -1
  276. data/spec/unit/context/trusted_information_spec.rb +25 -2
  277. data/spec/unit/daemon_spec.rb +5 -64
  278. data/spec/unit/environments_spec.rb +99 -32
  279. data/spec/unit/face/config_spec.rb +59 -1
  280. data/spec/unit/face/module/search_spec.rb +17 -0
  281. data/spec/unit/face/node_spec.rb +2 -2
  282. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  283. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  284. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  285. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  286. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  287. data/spec/unit/file_system/uniquefile_spec.rb +29 -0
  288. data/spec/unit/file_system_spec.rb +1 -2
  289. data/spec/unit/http/client_spec.rb +74 -19
  290. data/spec/unit/http/external_client_spec.rb +9 -9
  291. data/spec/unit/http/resolver_spec.rb +24 -5
  292. data/spec/unit/http/response_spec.rb +6 -0
  293. data/spec/unit/http/service/ca_spec.rb +2 -3
  294. data/spec/unit/http/service/compiler_spec.rb +2 -3
  295. data/spec/unit/http/service/file_server_spec.rb +2 -3
  296. data/spec/unit/http/service/puppetserver_spec.rb +82 -0
  297. data/spec/unit/http/service/report_spec.rb +2 -3
  298. data/spec/unit/http/service_spec.rb +0 -1
  299. data/spec/unit/http/session_spec.rb +8 -21
  300. data/spec/unit/indirector/catalog/compiler_spec.rb +1 -0
  301. data/spec/unit/indirector/catalog/json_spec.rb +1 -1
  302. data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
  303. data/spec/unit/indirector/facts/rest_spec.rb +1 -1
  304. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  305. data/spec/unit/indirector/file_metadata/rest_spec.rb +15 -14
  306. data/spec/unit/indirector/json_spec.rb +8 -8
  307. data/spec/unit/indirector/msgpack_spec.rb +8 -8
  308. data/spec/unit/indirector/node/rest_spec.rb +1 -1
  309. data/spec/unit/indirector/request_spec.rb +5 -5
  310. data/spec/unit/indirector/rest_spec.rb +14 -1
  311. data/spec/unit/indirector/status/rest_spec.rb +1 -1
  312. data/spec/unit/indirector/yaml_spec.rb +7 -7
  313. data/spec/unit/interface_spec.rb +3 -3
  314. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  315. data/spec/unit/network/format_support_spec.rb +3 -2
  316. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  317. data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
  318. data/spec/unit/network/http/connection_spec.rb +552 -190
  319. data/spec/unit/network/http/nocache_pool_spec.rb +22 -0
  320. data/spec/unit/network/http_pool_spec.rb +63 -57
  321. data/spec/unit/network/http_spec.rb +1 -1
  322. data/spec/unit/node/environment_spec.rb +18 -1
  323. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  324. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  325. data/spec/unit/parser/scope_spec.rb +1 -1
  326. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  327. data/spec/unit/pops/loaders/loaders_spec.rb +71 -1
  328. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  329. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  330. data/spec/unit/provider/exec_spec.rb +4 -3
  331. data/spec/unit/provider/package/aix_spec.rb +29 -0
  332. data/spec/unit/provider/package/apt_spec.rb +77 -0
  333. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  334. data/spec/unit/provider/package/dnfmodule_spec.rb +25 -5
  335. data/spec/unit/provider/package/dpkg_spec.rb +22 -7
  336. data/spec/unit/provider/package/openbsd_spec.rb +2 -0
  337. data/spec/unit/provider/package/pip2_spec.rb +36 -0
  338. data/spec/unit/provider/package/pip_spec.rb +42 -16
  339. data/spec/unit/provider/package/portage_spec.rb +5 -0
  340. data/spec/unit/provider/package/puppet_gem_spec.rb +4 -1
  341. data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
  342. data/spec/unit/provider/package/yum_spec.rb +47 -8
  343. data/spec/unit/provider/package/zypper_spec.rb +98 -0
  344. data/spec/unit/provider/service/base_spec.rb +2 -4
  345. data/spec/unit/provider/service/bsd_spec.rb +5 -1
  346. data/spec/unit/provider/service/daemontools_spec.rb +1 -1
  347. data/spec/unit/provider/service/debian_spec.rb +3 -5
  348. data/spec/unit/provider/service/freebsd_spec.rb +1 -1
  349. data/spec/unit/provider/service/gentoo_spec.rb +4 -5
  350. data/spec/unit/provider/service/init_spec.rb +46 -5
  351. data/spec/unit/provider/service/launchd_spec.rb +5 -6
  352. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  353. data/spec/unit/provider/service/openrc_spec.rb +4 -5
  354. data/spec/unit/provider/service/openwrt_spec.rb +2 -1
  355. data/spec/unit/provider/service/redhat_spec.rb +10 -1
  356. data/spec/unit/provider/service/runit_spec.rb +2 -1
  357. data/spec/unit/provider/service/smf_spec.rb +1 -1
  358. data/spec/unit/provider/service/src_spec.rb +3 -5
  359. data/spec/unit/provider/service/systemd_spec.rb +87 -19
  360. data/spec/unit/provider/service/upstart_spec.rb +4 -5
  361. data/spec/unit/provider/service/windows_spec.rb +50 -14
  362. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  363. data/spec/unit/provider/user/useradd_spec.rb +30 -16
  364. data/spec/unit/provider/user/windows_adsi_spec.rb +82 -0
  365. data/spec/unit/puppet_pal_2pec.rb +40 -0
  366. data/spec/unit/puppet_pal_catalog_spec.rb +43 -0
  367. data/spec/unit/puppet_spec.rb +33 -0
  368. data/spec/unit/reports/http_spec.rb +1 -1
  369. data/spec/unit/reports/store_spec.rb +17 -13
  370. data/spec/unit/resource_spec.rb +3 -3
  371. data/spec/unit/rest/route_spec.rb +4 -4
  372. data/spec/unit/settings_spec.rb +182 -22
  373. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  374. data/spec/unit/ssl/state_machine_spec.rb +52 -8
  375. data/spec/unit/test/test_helper_spec.rb +17 -0
  376. data/spec/unit/transaction/persistence_spec.rb +15 -0
  377. data/spec/unit/transaction/report_spec.rb +3 -1
  378. data/spec/unit/type/file/source_spec.rb +4 -4
  379. data/spec/unit/type/file_spec.rb +122 -96
  380. data/spec/unit/type/filebucket_spec.rb +1 -1
  381. data/spec/unit/type/service_spec.rb +218 -8
  382. data/spec/unit/type/user_spec.rb +32 -3
  383. data/spec/unit/type_spec.rb +50 -0
  384. data/spec/unit/util/autoload_spec.rb +2 -1
  385. data/spec/unit/util/character_encoding_spec.rb +4 -4
  386. data/spec/unit/util/checksums_spec.rb +16 -0
  387. data/spec/unit/util/command_line_spec.rb +11 -6
  388. data/spec/unit/util/log/destinations_spec.rb +1 -29
  389. data/spec/unit/util/package/version/range_spec.rb +22 -1
  390. data/spec/unit/util/run_mode_spec.rb +6 -6
  391. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  392. data/spec/unit/util/windows/service_spec.rb +4 -4
  393. data/spec/unit/util_spec.rb +3 -3
  394. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  395. data/tasks/manpages.rake +5 -35
  396. metadata +43 -49
  397. data/spec/integration/faces/config_spec.rb +0 -91
  398. data/spec/integration/faces/documentation_spec.rb +0 -57
  399. data/spec/integration/file_bucket/file_spec.rb +0 -50
  400. data/spec/integration/file_serving/content_spec.rb +0 -7
  401. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  402. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  403. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  404. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  405. data/spec/integration/module_tool/forge_spec.rb +0 -51
  406. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  407. data/spec/integration/provider/service/init_spec.rb +0 -48
  408. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  409. data/spec/integration/provider/service/windows_spec.rb +0 -50
  410. data/spec/integration/reference/providers_spec.rb +0 -21
  411. data/spec/integration/reports_spec.rb +0 -13
  412. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  413. data/spec/integration/ssl/host_spec.rb +0 -72
  414. data/spec/integration/ssl/key_spec.rb +0 -99
  415. data/spec/integration/test/test_helper_spec.rb +0 -31
  416. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  417. data/spec/unit/face/man_spec.rb +0 -25
  418. data/spec/unit/man_spec.rb +0 -31
@@ -0,0 +1,74 @@
1
+ # coding: utf-8
2
+ require 'spec_helper'
3
+ require 'puppet/application/config'
4
+
5
+ #describe "puppet config" do
6
+ describe Puppet::Face[:config, '0.0.1'] do
7
+ include PuppetSpec::Files
8
+
9
+ # different UTF-8 widths
10
+ # 1-byte A
11
+ # 2-byte ۿ - http://www.fileformat.info/info/unicode/char/06ff/index.htm - 0xDB 0xBF / 219 191
12
+ # 3-byte ᚠ - http://www.fileformat.info/info/unicode/char/16A0/index.htm - 0xE1 0x9A 0xA0 / 225 154 160
13
+ # 4-byte 𠜎 - http://www.fileformat.info/info/unicode/char/2070E/index.htm - 0xF0 0xA0 0x9C 0x8E / 240 160 156 142
14
+ MIXED_UTF8 = "A\u06FF\u16A0\u{2070E}" # Aۿᚠ𠜎
15
+
16
+ let(:tmp_config) { tmpfile('puppet.conf') }
17
+ let(:config) { Puppet::Application[:config] }
18
+
19
+ def read_utf8(path)
20
+ File.read(tmp_config, :encoding => 'UTF-8')
21
+ end
22
+
23
+ def write_utf8(path, content)
24
+ File.write(tmp_config, content, 0, :encoding => 'UTF-8')
25
+ end
26
+
27
+ it "reads a UTF-8 value" do
28
+ write_utf8(tmp_config, <<~EOF)
29
+ [main]
30
+ tags=#{MIXED_UTF8}
31
+ EOF
32
+
33
+ Puppet.initialize_settings(['--config', tmp_config])
34
+ config.command_line.args = ['print', 'tags' ]
35
+
36
+ expect {
37
+ config.run
38
+ }.to exit_with(0)
39
+ .and output("#{MIXED_UTF8}\n").to_stdout
40
+ end
41
+
42
+ it "sets a UTF-8 value" do
43
+ Puppet.initialize_settings(['--config', tmp_config])
44
+ config.command_line.args = ['set', 'tags', MIXED_UTF8 ]
45
+
46
+ expect {
47
+ config.run
48
+ }.to exit_with(0)
49
+
50
+ expect(read_utf8(tmp_config)).to eq(<<~EOF)
51
+ [main]
52
+ tags = #{MIXED_UTF8}
53
+ EOF
54
+ end
55
+
56
+ it "deletes a key" do
57
+ write_utf8(tmp_config, <<~EOF)
58
+ [main]
59
+ tags=#{MIXED_UTF8}
60
+ EOF
61
+
62
+ Puppet.initialize_settings(['--config', tmp_config])
63
+ config.command_line.args = ['delete', 'tags']
64
+
65
+ expect {
66
+ config.run
67
+ }.to exit_with(0)
68
+ .and output(/Deleted setting from 'main': 'tags=#{MIXED_UTF8}'/).to_stdout
69
+
70
+ expect(read_utf8(tmp_config)).to eq(<<~EOF)
71
+ [main]
72
+ EOF
73
+ end
74
+ end
@@ -1,14 +1,24 @@
1
1
  require 'spec_helper'
2
- require 'puppet_spec/files'
3
2
  require 'puppet/application/doc'
4
3
 
5
4
  describe Puppet::Application::Doc do
6
5
  include PuppetSpec::Files
7
6
 
8
- it "should respect the -o option" do
9
- puppetdoc = Puppet::Application[:doc]
10
- allow(puppetdoc.command_line).to receive(:args).and_return(['foo', '-o', 'bar'])
11
- puppetdoc.parse_options
12
- expect(puppetdoc.options[:outputdir]).to eq('bar')
7
+ let(:app) { Puppet::Application[:doc] }
8
+
9
+ it 'lists references' do
10
+ app.command_line.args = ['-l']
11
+ expect {
12
+ app.run
13
+ }.to exit_with(0)
14
+ .and output(/configuration - A reference for all settings/).to_stdout
15
+ end
16
+
17
+ it 'generates markdown' do
18
+ app.command_line.args = ['-r', 'report']
19
+ expect {
20
+ app.run
21
+ }.to exit_with(0)
22
+ .and output(/# Report Reference/).to_stdout
13
23
  end
14
24
  end
@@ -10,20 +10,34 @@ describe "puppet filebucket", unless: Puppet::Util::Platform.jruby? do
10
10
  let(:server) { PuppetSpec::Puppetserver.new }
11
11
  let(:filebucket) { Puppet::Application[:filebucket] }
12
12
  let(:backup_file) { tmpfile('backup_file') }
13
+ let(:text) { 'some random text' }
14
+ let(:md5) { Digest::MD5.file(backup_file).to_s }
13
15
 
14
16
  before :each do
15
17
  Puppet[:log_level] = 'debug'
18
+ File.binwrite(backup_file, text)
16
19
  end
17
20
 
18
- it "backs up files to the filebucket server" do
19
- File.binwrite(backup_file, 'some random text')
20
- md5 = Digest::MD5.file(backup_file).to_s
21
+ it "backs up to and restores from the local filebucket" do
22
+ filebucket.command_line.args = ['backup', backup_file, '--local']
23
+ expect {
24
+ filebucket.run
25
+ }.to output(/: #{md5}/).to_stdout
21
26
 
27
+ dest = tmpfile('file_bucket_restore')
28
+ filebucket.command_line.args = ['restore', dest, md5, '--local']
29
+ expect {
30
+ filebucket.run
31
+ }.to output(/FileBucket read #{md5}/).to_stdout
32
+
33
+ expect(FileUtils.compare_file(backup_file, dest)).to eq(true)
34
+ end
35
+
36
+ it "backs up text files to the filebucket server" do
22
37
  server.start_server do |port|
23
- Puppet[:masterport] = port
38
+ Puppet[:serverport] = port
24
39
  expect {
25
- filebucket.command_line.args << 'backup'
26
- filebucket.command_line.args << backup_file
40
+ filebucket.command_line.args = ['backup', backup_file]
27
41
  filebucket.run
28
42
  }.to output(a_string_matching(
29
43
  %r{Debug: HTTP HEAD https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file\/md5\/#{md5}\/#{File.realpath(backup_file)}\?environment\=production returned 404 Not Found}
@@ -32,22 +46,58 @@ describe "puppet filebucket", unless: Puppet::Util::Platform.jruby? do
32
46
  ).and matching(
33
47
  %r{#{backup_file}: #{md5}}
34
48
  )).to_stdout
49
+
50
+ expect(File.binread(File.join(server.upload_directory, 'filebucket'))).to eq(text)
51
+ end
52
+ end
53
+
54
+ it "backs up binary files to the filebucket server" do
55
+ binary = "\xD1\xF2\r\n\x81NuSc\x00".force_encoding(Encoding::ASCII_8BIT)
56
+ File.binwrite(backup_file, binary)
57
+
58
+ server.start_server do |port|
59
+ Puppet[:serverport] = port
60
+ expect {
61
+ filebucket.command_line.args = ['backup', backup_file]
62
+ filebucket.run
63
+ }.to output(a_string_matching(
64
+ %r{Debug: HTTP HEAD https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file/md5/b10778ecd8b08dff525e367cf15b2622/}
65
+ ).and matching(
66
+ %r{Debug: HTTP PUT https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file/md5/b10778ecd8b08dff525e367cf15b2622/}
67
+ )).to_stdout
68
+
69
+ expect(File.binread(File.join(server.upload_directory, 'filebucket'))).to eq(binary)
70
+ end
71
+ end
72
+
73
+ it "backs up utf-8 encoded files to the filebucket server" do
74
+ utf8 = "\u2603".force_encoding(Encoding::UTF_8)
75
+ File.binwrite(backup_file, utf8)
76
+
77
+ server.start_server do |port|
78
+ Puppet[:serverport] = port
79
+ expect {
80
+ filebucket.command_line.args = ['backup', backup_file]
81
+ filebucket.run
82
+ }.to output(a_string_matching(
83
+ %r{Debug: HTTP HEAD https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file/md5/48856faf4534a876adeadc72aec53cb2/}
84
+ ).and matching(
85
+ %r{Debug: HTTP PUT https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file/md5/48856faf4534a876adeadc72aec53cb2/}
86
+ )).to_stdout
87
+
88
+ expect(File.read(File.join(server.upload_directory, 'filebucket'), encoding: 'utf-8')).to eq(utf8)
35
89
  end
36
90
  end
37
91
 
38
92
  it "doesn't attempt to back up file that already exists on the filebucket server" do
39
93
  file_exists_handler = -> (req, res) {
40
- res.status = 200
94
+ res.status = 200
41
95
  }
42
96
 
43
- File.binwrite(backup_file, 'some random text')
44
- md5 = Digest::MD5.file(backup_file).to_s
45
-
46
97
  server.start_server(mounts: {filebucket: file_exists_handler}) do |port|
47
- Puppet[:masterport] = port
98
+ Puppet[:serverport] = port
48
99
  expect {
49
- filebucket.command_line.args << 'backup'
50
- filebucket.command_line.args << backup_file
100
+ filebucket.command_line.args = ['backup', backup_file]
51
101
  filebucket.run
52
102
  }.to output(a_string_matching(
53
103
  %r{Debug: HTTP HEAD https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file\/md5\/#{md5}\/#{File.realpath(backup_file)}\?environment\=production returned 200 OK}
@@ -64,10 +114,9 @@ describe "puppet filebucket", unless: Puppet::Util::Platform.jruby? do
64
114
  }
65
115
 
66
116
  server.start_server(mounts: {filebucket: get_handler}) do |port|
67
- Puppet[:masterport] = port
117
+ Puppet[:serverport] = port
68
118
  expect {
69
- filebucket.command_line.args << 'get'
70
- filebucket.command_line.args << 'fac251367c9e083c6b1f0f3181'
119
+ filebucket.command_line.args = ['get', 'fac251367c9e083c6b1f0f3181']
71
120
  filebucket.run
72
121
  }.to output(a_string_matching(
73
122
  %r{Debug: HTTP GET https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file\/md5\/fac251367c9e083c6b1f0f3181\?environment\=production returned 200 OK}
@@ -88,9 +137,9 @@ describe "puppet filebucket", unless: Puppet::Util::Platform.jruby? do
88
137
  }
89
138
 
90
139
  server.start_server(mounts: {filebucket: get_handler}) do |port|
91
- Puppet[:masterport] = port
140
+ Puppet[:serverport] = port
92
141
  expect {
93
- filebucket.command_line.args += ['diff', 'fac251367c9e083c6b1f0f3181', backup_file, '--remote']
142
+ filebucket.command_line.args = ['diff', 'fac251367c9e083c6b1f0f3181', backup_file, '--remote']
94
143
  filebucket.run
95
144
  }.to output(a_string_matching(
96
145
  /[-<] ?foo/
@@ -116,9 +165,9 @@ describe "puppet filebucket", unless: Puppet::Util::Platform.jruby? do
116
165
  }
117
166
 
118
167
  server.start_server(mounts: {filebucket: get_handler}) do |port|
119
- Puppet[:masterport] = port
168
+ Puppet[:serverport] = port
120
169
  expect {
121
- filebucket.command_line.args += ['diff', 'd3b07384d113edec49eaa6238ad5ff00', "99b999207e287afffc86c053e5693247", '--remote']
170
+ filebucket.command_line.args = ['diff', 'd3b07384d113edec49eaa6238ad5ff00', "99b999207e287afffc86c053e5693247", '--remote']
122
171
  filebucket.run
123
172
  }.to output(a_string_matching(
124
173
  /[-<] ?foo/
@@ -187,4 +236,4 @@ describe "puppet filebucket", unless: Puppet::Util::Platform.jruby? do
187
236
  end
188
237
  end
189
238
  end
190
- end
239
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+ require 'puppet/application/help'
3
+
4
+ describe "puppet help" do
5
+ let(:app) { Puppet::Application[:help] }
6
+
7
+ it "generates global help" do
8
+ expect {
9
+ app.run
10
+ }.to exit_with(0)
11
+ .and output(Regexp.new(Regexp.escape(<<~END), Regexp::MULTILINE)).to_stdout
12
+
13
+ Usage: puppet <subcommand> [options] <action> [options]
14
+
15
+ Available subcommands:
16
+ END
17
+ end
18
+
19
+ Puppet::Face.faces.sort.each do |face_name|
20
+ context "for #{face_name}" do
21
+ it "generates help" do
22
+ app.command_line.args = ['help', face_name]
23
+
24
+ expect {
25
+ app.run
26
+ }.to exit_with(0)
27
+ .and output(/USAGE: puppet #{face_name} <action>/).to_stdout
28
+ end
29
+
30
+ Puppet::Face[face_name, :current].actions.sort.each do |action_name|
31
+ it "for action #{action_name}" do
32
+ app.command_line.args = ['help', face_name, action_name]
33
+
34
+ expect {
35
+ app.run
36
+ }.to exit_with(0)
37
+ .and output(/USAGE: puppet #{face_name}/).to_stdout
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -90,6 +90,19 @@ describe 'lookup' do
90
90
  expect(lookup('a')).to eql('value a')
91
91
  end
92
92
 
93
+ it 'loads external facts when running without --node' do
94
+ expect(Puppet::Util).not_to receive(:skip_external_facts)
95
+ expect(Facter).not_to receive(:load_external)
96
+ lookup('a')
97
+ end
98
+
99
+ it 'skip loading of external facts when run with --node' do
100
+ app.options[:node] = "random_node"
101
+ expect(Facter).to receive(:load_external).once.with(false)
102
+ expect(Facter).to receive(:load_external).once.with(true)
103
+ lookup('a')
104
+ end
105
+
93
106
  context 'uses node_terminus' do
94
107
  require 'puppet/indirector/node/exec'
95
108
  require 'puppet/indirector/node/plain'
@@ -0,0 +1,68 @@
1
+ # coding: utf-8
2
+ require 'spec_helper'
3
+ require 'puppet/forge'
4
+ require 'puppet_spec/https'
5
+
6
+ describe 'puppet module', unless: Puppet::Util::Platform.jruby? do
7
+ include PuppetSpec::Files
8
+ include_context "https client"
9
+
10
+ let(:app) { Puppet::Application[:module] }
11
+ let(:wrong_hostname) { 'localhost' }
12
+ let(:server) { PuppetSpec::HTTPSServer.new }
13
+ let(:ssl_provider) { Puppet::SSL::SSLProvider.new }
14
+
15
+ let(:release_response) { File.read(fixtures('unit/forge/bacula-releases.json')) }
16
+ let(:release_tarball) { File.binread(fixtures('unit/forge/bacula.tar.gz')) }
17
+ let(:target_dir) { tmpdir('bacula') }
18
+
19
+ before :each do
20
+ SemanticPuppet::Dependency.clear_sources
21
+ end
22
+
23
+ it 'installs a module' do
24
+ # create a temp cacert bundle
25
+ ssl_file = tmpfile('systemstore')
26
+ File.write(ssl_file, server.ca_cert)
27
+
28
+ response_proc = -> (req, res) {
29
+ if req.path == '/v3/releases'
30
+ res['Content-Type'] = 'application/json'
31
+ res.body = release_response
32
+ else
33
+ res['Content-Type'] = 'application/octet-stream'
34
+ res.body = release_tarball
35
+ end
36
+ res.status = 200
37
+ }
38
+
39
+ # override path to system cacert bundle, this must be done before
40
+ # the SSLContext is created and the call to X509::Store.set_default_paths
41
+ Puppet::Util.withenv("SSL_CERT_FILE" => ssl_file) do
42
+ server.start_server(response_proc: response_proc) do |port|
43
+ Puppet[:module_repository] = "https://127.0.0.1:#{port}"
44
+
45
+ # On Windows, CP437 encoded output can't be matched against UTF-8 regexp,
46
+ # so encode the regexp to the external encoding and match against that.
47
+ app.command_line.args = ['install', 'puppetlabs-bacula', '--target-dir', target_dir]
48
+ expect {
49
+ app.run
50
+ }.to exit_with(0)
51
+ .and output(Regexp.new("└── puppetlabs-bacula".encode(Encoding.default_external))).to_stdout
52
+ end
53
+ end
54
+ end
55
+
56
+ it 'returns a valid exception when there is an SSL verification problem' do
57
+ server.start_server do |port|
58
+ Puppet[:module_repository] = "https://#{wrong_hostname}:#{port}"
59
+
60
+ expect {
61
+ app.command_line.args = ['install', 'puppetlabs-bacula', '--target-dir', target_dir]
62
+ app.run
63
+ }.to exit_with(1)
64
+ .and output(%r{Notice: Downloading from https://#{wrong_hostname}:#{port}}).to_stdout
65
+ .and output(%r{Unable to verify the SSL certificate}).to_stderr
66
+ end
67
+ end
68
+ end
@@ -17,7 +17,7 @@ describe "puppet plugin" do
17
17
  }
18
18
 
19
19
  server.start_server(mounts: {file_metadatas: current_version_handler}) do |port|
20
- Puppet[:masterport] = port
20
+ Puppet[:serverport] = port
21
21
  expect {
22
22
  plugin.command_line.args << 'download'
23
23
  plugin.run
@@ -36,7 +36,7 @@ describe "puppet plugin" do
36
36
  }
37
37
 
38
38
  server.start_server(mounts: {file_metadatas: no_locales_handler}) do |port|
39
- Puppet[:masterport] = port
39
+ Puppet[:serverport] = port
40
40
  expect {
41
41
  plugin.command_line.args << 'download'
42
42
  plugin.run
@@ -47,4 +47,77 @@ describe "puppet plugin" do
47
47
  end
48
48
  end
49
49
 
50
+ it "downloads from an environment that doesn't exist locally" do
51
+ requested_environment = nil
52
+
53
+ current_version_handler = -> (req, res) {
54
+ res['X-Puppet-Version'] = Puppet.version
55
+ res['Content-Type'] = 'application/json'
56
+ res.body = response_body
57
+ requested_environment = req.query['environment']
58
+ }
59
+
60
+ server.start_server(mounts: {file_metadatas: current_version_handler}) do |port|
61
+ Puppet[:environment] = 'doesnotexistontheagent'
62
+ Puppet[:serverport] = port
63
+ expect {
64
+ plugin.command_line.args << 'download'
65
+ plugin.run
66
+ }.to exit_with(0)
67
+ .and output(matching("Downloaded these plugins")).to_stdout
68
+
69
+ expect(requested_environment).to eq('doesnotexistontheagent')
70
+ end
71
+ end
72
+
73
+ context "pluginsync for external facts uses source permissions to preserve fact executable-ness" do
74
+ before :all do
75
+ WebMock.enable!
76
+ end
77
+
78
+ after :all do
79
+ WebMock.disable!
80
+ end
81
+
82
+ before :each do
83
+ metadata = "[{\"path\":\"/etc/puppetlabs/code\",\"relative_path\":\".\",\"links\":\"follow\",\"owner\":0,\"group\":0,\"mode\":420,\"checksum\":{\"type\":\"ctime\",\"value\":\"{ctime}2020-07-10 14:00:00 -0700\"},\"type\":\"directory\",\"destination\":null}]"
84
+ stub_request(:get, %r{/puppet/v3/file_metadatas/(plugins|locales)}).to_return(status: 200, body: metadata, headers: {'Content-Type' => 'application/json'})
85
+
86
+ # response retains owner/group/mode due to source_permissions => use
87
+ facts_metadata = "[{\"path\":\"/etc/puppetlabs/code\",\"relative_path\":\".\",\"links\":\"follow\",\"owner\":500,\"group\":500,\"mode\":493,\"checksum\":{\"type\":\"ctime\",\"value\":\"{ctime}2020-07-10 14:00:00 -0700\"},\"type\":\"directory\",\"destination\":null}]"
88
+ stub_request(:get, %r{/puppet/v3/file_metadatas/pluginfacts}).to_return(status: 200, body: facts_metadata, headers: {'Content-Type' => 'application/json'})
89
+ end
90
+
91
+ it "processes a download request resulting in no changes" do
92
+ # Create these so there are no changes
93
+ Puppet::FileSystem.mkpath(Puppet[:plugindest])
94
+ Puppet::FileSystem.mkpath(Puppet[:localedest])
95
+
96
+ # /opt/puppetlabs/puppet/cache/facts.d will be created based on our umask.
97
+ # If the mode on disk is not 0755, then the mode from the metadata response
98
+ # (493 => 0755) will be applied, resulting in "plugins were downloaded"
99
+ # message. Enforce a umask so the results are consistent.
100
+ Puppet::FileSystem.mkpath(Puppet[:pluginfactdest])
101
+ Puppet::FileSystem.chmod(0755, Puppet[:pluginfactdest])
102
+
103
+ app = Puppet::Application[:plugin]
104
+ app.command_line.args << 'download'
105
+ expect {
106
+ app.run
107
+ }.to exit_with(0)
108
+ .and output(/No plugins downloaded/).to_stdout
109
+ end
110
+
111
+ it "updates the facts.d mode", unless: Puppet::Util::Platform.windows? do
112
+ Puppet::FileSystem.mkpath(Puppet[:pluginfactdest])
113
+ Puppet::FileSystem.chmod(0775, Puppet[:pluginfactdest])
114
+
115
+ app = Puppet::Application[:plugin]
116
+ app.command_line.args << 'download'
117
+ expect {
118
+ app.run
119
+ }.to exit_with(0)
120
+ .and output(/Downloaded these plugins: .*facts\.d/).to_stdout
121
+ end
122
+ end
50
123
  end