puppet 6.16.0-x86-mingw32 → 6.20.0-x86-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 (458) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -16
  3. data/Gemfile +6 -2
  4. data/Gemfile.lock +40 -36
  5. data/README.md +3 -4
  6. data/Rakefile +4 -12
  7. data/lib/puppet/agent.rb +2 -2
  8. data/lib/puppet/agent/locker.rb +0 -7
  9. data/lib/puppet/application.rb +10 -6
  10. data/lib/puppet/application/agent.rb +23 -6
  11. data/lib/puppet/application/apply.rb +20 -21
  12. data/lib/puppet/application/device.rb +1 -0
  13. data/lib/puppet/application/doc.rb +1 -1
  14. data/lib/puppet/application/filebucket.rb +2 -2
  15. data/lib/puppet/application/lookup.rb +16 -4
  16. data/lib/puppet/application/script.rb +1 -0
  17. data/lib/puppet/application_support.rb +7 -0
  18. data/lib/puppet/configurer.rb +70 -20
  19. data/lib/puppet/configurer/downloader.rb +31 -10
  20. data/lib/puppet/confine.rb +2 -2
  21. data/lib/puppet/confine/any.rb +1 -1
  22. data/lib/puppet/defaults.rb +113 -46
  23. data/lib/puppet/environments.rb +84 -59
  24. data/lib/puppet/face/catalog.rb +1 -1
  25. data/lib/puppet/face/config.rb +56 -16
  26. data/lib/puppet/face/epp.rb +12 -2
  27. data/lib/puppet/face/facts.rb +60 -0
  28. data/lib/puppet/face/node.rb +3 -3
  29. data/lib/puppet/face/node/clean.rb +2 -2
  30. data/lib/puppet/face/status.rb +1 -1
  31. data/lib/puppet/feature/base.rb +1 -1
  32. data/lib/puppet/ffi/posix.rb +10 -0
  33. data/lib/puppet/ffi/posix/constants.rb +14 -0
  34. data/lib/puppet/ffi/posix/functions.rb +24 -0
  35. data/lib/puppet/file_bucket/dipper.rb +1 -1
  36. data/lib/puppet/file_serving/http_metadata.rb +13 -1
  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 +8 -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 +3 -7
  47. data/lib/puppet/functions/epp.rb +1 -0
  48. data/lib/puppet/functions/inline_epp.rb +1 -0
  49. data/lib/puppet/functions/lstrip.rb +4 -4
  50. data/lib/puppet/functions/new.rb +8 -3
  51. data/lib/puppet/functions/reverse_each.rb +1 -1
  52. data/lib/puppet/functions/rstrip.rb +4 -4
  53. data/lib/puppet/functions/step.rb +1 -1
  54. data/lib/puppet/functions/strip.rb +4 -4
  55. data/lib/puppet/gettext/config.rb +5 -5
  56. data/lib/puppet/gettext/module_translations.rb +4 -4
  57. data/lib/puppet/http.rb +1 -0
  58. data/lib/puppet/http/client.rb +6 -1
  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/fact_search.rb +60 -0
  74. data/lib/puppet/indirector/facts/facter.rb +3 -3
  75. data/lib/puppet/indirector/facts/json.rb +27 -0
  76. data/lib/puppet/indirector/facts/yaml.rb +4 -59
  77. data/lib/puppet/indirector/file_content/rest.rb +1 -1
  78. data/lib/puppet/indirector/file_metadata/http.rb +25 -5
  79. data/lib/puppet/indirector/file_metadata/rest.rb +2 -2
  80. data/lib/puppet/indirector/hiera.rb +4 -0
  81. data/lib/puppet/indirector/indirection.rb +1 -1
  82. data/lib/puppet/indirector/json.rb +5 -1
  83. data/lib/puppet/indirector/msgpack.rb +1 -1
  84. data/lib/puppet/indirector/node/json.rb +8 -0
  85. data/lib/puppet/indirector/report/json.rb +34 -0
  86. data/lib/puppet/indirector/report/processor.rb +2 -2
  87. data/lib/puppet/indirector/request.rb +5 -5
  88. data/lib/puppet/indirector/yaml.rb +1 -1
  89. data/lib/puppet/module.rb +1 -2
  90. data/lib/puppet/module_tool/applications/installer.rb +48 -2
  91. data/lib/puppet/module_tool/errors/shared.rb +17 -2
  92. data/lib/puppet/network/format_support.rb +2 -2
  93. data/lib/puppet/network/formats.rb +2 -1
  94. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  95. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  96. data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
  97. data/lib/puppet/network/http/connection_adapter.rb +6 -4
  98. data/lib/puppet/network/http/route.rb +2 -2
  99. data/lib/puppet/node/environment.rb +12 -5
  100. data/lib/puppet/node/facts.rb +17 -0
  101. data/lib/puppet/pal/pal_impl.rb +90 -13
  102. data/lib/puppet/parameter.rb +1 -1
  103. data/lib/puppet/parser/ast/leaf.rb +7 -6
  104. data/lib/puppet/parser/ast/pops_bridge.rb +0 -4
  105. data/lib/puppet/parser/compiler.rb +1 -1
  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/resource.rb +3 -2
  112. data/lib/puppet/parser/resource/param.rb +6 -0
  113. data/lib/puppet/parser/templatewrapper.rb +1 -1
  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/deferred_resolver.rb +5 -3
  119. data/lib/puppet/pops/evaluator/evaluator_impl.rb +27 -8
  120. data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
  121. data/lib/puppet/pops/issues.rb +5 -0
  122. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  123. data/lib/puppet/pops/loaders.rb +18 -11
  124. data/lib/puppet/pops/lookup/context.rb +1 -1
  125. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  126. data/lib/puppet/pops/model/ast_transformer.rb +1 -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/types/p_meta_type.rb +1 -1
  130. data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
  131. data/lib/puppet/pops/validation/checker4_0.rb +29 -15
  132. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  133. data/lib/puppet/provider/file/windows.rb +1 -1
  134. data/lib/puppet/provider/package/apt.rb +38 -0
  135. data/lib/puppet/provider/package/aptitude.rb +1 -1
  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/pip2.rb +17 -0
  139. data/lib/puppet/provider/package/puppet_gem.rb +5 -0
  140. data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
  141. data/lib/puppet/provider/package/yum.rb +2 -1
  142. data/lib/puppet/provider/package/zypper.rb +3 -0
  143. data/lib/puppet/provider/service/windows.rb +23 -7
  144. data/lib/puppet/provider/user/aix.rb +3 -3
  145. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  146. data/lib/puppet/provider/user/useradd.rb +11 -4
  147. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  148. data/lib/puppet/reference/configuration.rb +6 -5
  149. data/lib/puppet/reports/http.rb +2 -0
  150. data/lib/puppet/resource.rb +2 -1
  151. data/lib/puppet/resource/type.rb +10 -1
  152. data/lib/puppet/rest/route.rb +2 -2
  153. data/lib/puppet/settings.rb +63 -21
  154. data/lib/puppet/settings/alias_setting.rb +37 -0
  155. data/lib/puppet/settings/base_setting.rb +26 -2
  156. data/lib/puppet/ssl/ssl_context.rb +2 -2
  157. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  158. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  159. data/lib/puppet/test/test_helper.rb +18 -13
  160. data/lib/puppet/transaction.rb +2 -2
  161. data/lib/puppet/transaction/persistence.rb +1 -1
  162. data/lib/puppet/transaction/report.rb +12 -8
  163. data/lib/puppet/trusted_external.rb +29 -1
  164. data/lib/puppet/type.rb +15 -7
  165. data/lib/puppet/type/file.rb +40 -15
  166. data/lib/puppet/type/file/checksum.rb +4 -4
  167. data/lib/puppet/type/file/source.rb +32 -12
  168. data/lib/puppet/type/filebucket.rb +1 -1
  169. data/lib/puppet/type/notify.rb +2 -2
  170. data/lib/puppet/type/service.rb +53 -0
  171. data/lib/puppet/type/user.rb +18 -3
  172. data/lib/puppet/util.rb +41 -3
  173. data/lib/puppet/util/autoload.rb +10 -15
  174. data/lib/puppet/util/character_encoding.rb +9 -5
  175. data/lib/puppet/util/checksums.rb +19 -4
  176. data/lib/puppet/util/connection.rb +8 -8
  177. data/lib/puppet/util/execution.rb +2 -2
  178. data/lib/puppet/util/fact_dif.rb +62 -0
  179. data/lib/puppet/util/fileparsing.rb +2 -2
  180. data/lib/puppet/util/posix.rb +54 -5
  181. data/lib/puppet/util/provider_features.rb +1 -1
  182. data/lib/puppet/util/reference.rb +1 -1
  183. data/lib/puppet/util/rubygems.rb +5 -1
  184. data/lib/puppet/util/run_mode.rb +5 -1
  185. data/lib/puppet/util/windows.rb +1 -0
  186. data/lib/puppet/util/windows/api_types.rb +60 -33
  187. data/lib/puppet/util/windows/eventlog.rb +1 -6
  188. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  189. data/lib/puppet/util/windows/principal.rb +8 -6
  190. data/lib/puppet/util/windows/registry.rb +11 -11
  191. data/lib/puppet/util/windows/security.rb +4 -4
  192. data/lib/puppet/util/windows/service.rb +43 -26
  193. data/lib/puppet/util/windows/user.rb +242 -8
  194. data/lib/puppet/version.rb +1 -1
  195. data/locales/puppet.pot +501 -443
  196. data/man/man5/puppet.conf.5 +70 -24
  197. data/man/man8/puppet-agent.8 +8 -5
  198. data/man/man8/puppet-apply.8 +2 -2
  199. data/man/man8/puppet-catalog.8 +1 -1
  200. data/man/man8/puppet-config.8 +6 -6
  201. data/man/man8/puppet-describe.8 +1 -1
  202. data/man/man8/puppet-device.8 +2 -2
  203. data/man/man8/puppet-doc.8 +1 -1
  204. data/man/man8/puppet-epp.8 +1 -1
  205. data/man/man8/puppet-facts.8 +32 -1
  206. data/man/man8/puppet-filebucket.8 +3 -3
  207. data/man/man8/puppet-generate.8 +1 -1
  208. data/man/man8/puppet-help.8 +1 -1
  209. data/man/man8/puppet-key.8 +1 -1
  210. data/man/man8/puppet-lookup.8 +2 -2
  211. data/man/man8/puppet-man.8 +1 -1
  212. data/man/man8/puppet-module.8 +1 -1
  213. data/man/man8/puppet-node.8 +7 -4
  214. data/man/man8/puppet-parser.8 +1 -1
  215. data/man/man8/puppet-plugin.8 +1 -1
  216. data/man/man8/puppet-report.8 +4 -1
  217. data/man/man8/puppet-resource.8 +1 -1
  218. data/man/man8/puppet-script.8 +2 -2
  219. data/man/man8/puppet-ssl.8 +1 -1
  220. data/man/man8/puppet-status.8 +2 -2
  221. data/man/man8/puppet.8 +2 -2
  222. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +91 -0
  223. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  224. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  225. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  226. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  227. data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
  228. data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
  229. data/spec/integration/application/agent_spec.rb +263 -54
  230. data/spec/integration/application/apply_spec.rb +168 -149
  231. data/spec/integration/application/doc_spec.rb +16 -6
  232. data/spec/integration/application/filebucket_spec.rb +70 -21
  233. data/spec/integration/application/help_spec.rb +42 -0
  234. data/spec/integration/application/lookup_spec.rb +13 -0
  235. data/spec/integration/application/module_spec.rb +68 -0
  236. data/spec/integration/application/plugin_spec.rb +53 -3
  237. data/spec/integration/configurer_spec.rb +14 -0
  238. data/spec/integration/data_binding_spec.rb +82 -0
  239. data/spec/integration/defaults_spec.rb +20 -3
  240. data/spec/integration/directory_environments_spec.rb +17 -17
  241. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  242. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  243. data/spec/integration/network/http_pool_spec.rb +26 -9
  244. data/spec/integration/node/environment_spec.rb +1 -1
  245. data/spec/integration/parser/compiler_spec.rb +11 -0
  246. data/spec/integration/resource/type_collection_spec.rb +2 -6
  247. data/spec/integration/transaction_spec.rb +4 -9
  248. data/spec/integration/type/file_spec.rb +1 -1
  249. data/spec/integration/util/execution_spec.rb +22 -0
  250. data/spec/integration/util/windows/adsi_spec.rb +5 -3
  251. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  252. data/spec/integration/util/windows/process_spec.rb +26 -32
  253. data/spec/integration/util/windows/registry_spec.rb +7 -17
  254. data/spec/integration/util/windows/user_spec.rb +47 -5
  255. data/spec/integration/util_spec.rb +7 -33
  256. data/spec/lib/puppet_spec/matchers.rb +0 -80
  257. data/spec/lib/puppet_spec/puppetserver.rb +8 -0
  258. data/spec/lib/puppet_spec/settings.rb +6 -1
  259. data/spec/shared_contexts/types_setup.rb +2 -0
  260. data/spec/spec_helper.rb +1 -4
  261. data/spec/unit/agent_spec.rb +8 -6
  262. data/spec/unit/application/agent_spec.rb +3 -5
  263. data/spec/unit/application/config_spec.rb +224 -4
  264. data/spec/unit/application/doc_spec.rb +2 -2
  265. data/spec/unit/application/face_base_spec.rb +6 -4
  266. data/spec/unit/application/facts_spec.rb +41 -10
  267. data/spec/unit/application/filebucket_spec.rb +0 -2
  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 +60 -13
  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/feature_spec.rb +1 -1
  276. data/spec/unit/confine_spec.rb +10 -3
  277. data/spec/unit/context/trusted_information_spec.rb +10 -4
  278. data/spec/unit/defaults_spec.rb +20 -1
  279. data/spec/unit/environments_spec.rb +176 -32
  280. data/spec/unit/face/config_spec.rb +65 -12
  281. data/spec/unit/face/node_spec.rb +2 -13
  282. data/spec/unit/file_serving/configuration/parser_spec.rb +0 -1
  283. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  284. data/spec/unit/file_serving/metadata_spec.rb +3 -3
  285. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  286. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  287. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  288. data/spec/unit/file_serving/terminus_helper_spec.rb +11 -4
  289. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  290. data/spec/unit/file_system/uniquefile_spec.rb +18 -0
  291. data/spec/unit/file_system_spec.rb +1 -2
  292. data/spec/unit/forge/module_release_spec.rb +2 -7
  293. data/spec/unit/functions/inline_epp_spec.rb +26 -1
  294. data/spec/unit/http/client_spec.rb +64 -9
  295. data/spec/unit/http/resolver_spec.rb +24 -5
  296. data/spec/unit/http/response_spec.rb +6 -0
  297. data/spec/unit/http/service/ca_spec.rb +2 -3
  298. data/spec/unit/http/service/compiler_spec.rb +51 -3
  299. data/spec/unit/http/service/file_server_spec.rb +2 -3
  300. data/spec/unit/http/service/puppetserver_spec.rb +82 -0
  301. data/spec/unit/http/service/report_spec.rb +2 -3
  302. data/spec/unit/http/service_spec.rb +1 -2
  303. data/spec/unit/http/session_spec.rb +8 -21
  304. data/spec/unit/indirector/catalog/json_spec.rb +1 -1
  305. data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
  306. data/spec/unit/indirector/face_spec.rb +0 -1
  307. data/spec/unit/indirector/facts/facter_spec.rb +0 -1
  308. data/spec/unit/indirector/facts/json_spec.rb +255 -0
  309. data/spec/unit/indirector/facts/rest_spec.rb +1 -1
  310. data/spec/unit/indirector/file_bucket_file/selector_spec.rb +26 -8
  311. data/spec/unit/indirector/file_metadata/http_spec.rb +27 -0
  312. data/spec/unit/indirector/indirection_spec.rb +8 -12
  313. data/spec/unit/indirector/json_spec.rb +8 -8
  314. data/spec/unit/indirector/key/file_spec.rb +0 -1
  315. data/spec/unit/indirector/msgpack_spec.rb +8 -8
  316. data/spec/unit/indirector/node/json_spec.rb +33 -0
  317. data/spec/unit/indirector/node/rest_spec.rb +1 -1
  318. data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
  319. data/spec/unit/indirector/report/yaml_spec.rb +72 -8
  320. data/spec/unit/indirector/request_spec.rb +5 -5
  321. data/spec/unit/indirector/rest_spec.rb +1 -1
  322. data/spec/unit/indirector/status/rest_spec.rb +1 -1
  323. data/spec/unit/indirector/yaml_spec.rb +7 -7
  324. data/spec/unit/indirector_spec.rb +2 -2
  325. data/spec/unit/interface_spec.rb +3 -3
  326. data/spec/unit/module_tool/applications/installer_spec.rb +66 -0
  327. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  328. data/spec/unit/network/authconfig_spec.rb +0 -3
  329. data/spec/unit/network/format_support_spec.rb +3 -2
  330. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -10
  331. data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
  332. data/spec/unit/network/http/connection_spec.rb +42 -32
  333. data/spec/unit/network/http/handler_spec.rb +0 -5
  334. data/spec/unit/node/environment_spec.rb +18 -1
  335. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  336. data/spec/unit/parser/compiler_spec.rb +3 -19
  337. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  338. data/spec/unit/parser/resource_spec.rb +14 -8
  339. data/spec/unit/parser/scope_spec.rb +1 -1
  340. data/spec/unit/parser/templatewrapper_spec.rb +4 -3
  341. data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +20 -0
  342. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  343. data/spec/unit/pops/loaders/loaders_spec.rb +71 -1
  344. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  345. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  346. data/spec/unit/property_spec.rb +1 -0
  347. data/spec/unit/provider/exec_spec.rb +4 -3
  348. data/spec/unit/provider/nameservice_spec.rb +66 -65
  349. data/spec/unit/provider/package/apt_spec.rb +76 -3
  350. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  351. data/spec/unit/provider/package/base_spec.rb +6 -5
  352. data/spec/unit/provider/package/dpkg_spec.rb +22 -7
  353. data/spec/unit/provider/package/openbsd_spec.rb +2 -0
  354. data/spec/unit/provider/package/pacman_spec.rb +18 -12
  355. data/spec/unit/provider/package/pip2_spec.rb +36 -0
  356. data/spec/unit/provider/package/pip_spec.rb +6 -11
  357. data/spec/unit/provider/package/pkgdmg_spec.rb +0 -4
  358. data/spec/unit/provider/package/puppet_gem_spec.rb +4 -1
  359. data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
  360. data/spec/unit/provider/package/yum_spec.rb +31 -0
  361. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  362. data/spec/unit/provider/service/base_spec.rb +2 -4
  363. data/spec/unit/provider/service/bsd_spec.rb +5 -1
  364. data/spec/unit/provider/service/daemontools_spec.rb +1 -1
  365. data/spec/unit/provider/service/debian_spec.rb +3 -5
  366. data/spec/unit/provider/service/freebsd_spec.rb +1 -1
  367. data/spec/unit/provider/service/gentoo_spec.rb +4 -5
  368. data/spec/unit/provider/service/init_spec.rb +45 -5
  369. data/spec/unit/provider/service/launchd_spec.rb +5 -6
  370. data/spec/unit/provider/service/openrc_spec.rb +4 -5
  371. data/spec/unit/provider/service/openwrt_spec.rb +1 -1
  372. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  373. data/spec/unit/provider/service/runit_spec.rb +2 -1
  374. data/spec/unit/provider/service/smf_spec.rb +1 -1
  375. data/spec/unit/provider/service/src_spec.rb +3 -5
  376. data/spec/unit/provider/service/systemd_spec.rb +3 -6
  377. data/spec/unit/provider/service/upstart_spec.rb +4 -5
  378. data/spec/unit/provider/service/windows_spec.rb +50 -14
  379. data/spec/unit/provider/user/aix_spec.rb +5 -0
  380. data/spec/unit/provider/user/hpux_spec.rb +1 -1
  381. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  382. data/spec/unit/provider/user/pw_spec.rb +2 -0
  383. data/spec/unit/provider/user/useradd_spec.rb +23 -16
  384. data/spec/unit/provider/user/windows_adsi_spec.rb +82 -0
  385. data/spec/unit/provider_spec.rb +8 -10
  386. data/spec/unit/puppet_pal_2pec.rb +40 -0
  387. data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
  388. data/spec/unit/reports/store_spec.rb +17 -13
  389. data/spec/unit/resource/capability_finder_spec.rb +6 -1
  390. data/spec/unit/resource/type_spec.rb +1 -1
  391. data/spec/unit/resource_spec.rb +14 -13
  392. data/spec/unit/rest/route_spec.rb +4 -4
  393. data/spec/unit/settings_spec.rb +576 -239
  394. data/spec/unit/ssl/base_spec.rb +0 -1
  395. data/spec/unit/ssl/host_spec.rb +0 -5
  396. data/spec/unit/ssl/ssl_provider_spec.rb +82 -50
  397. data/spec/unit/test/test_helper_spec.rb +17 -0
  398. data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -7
  399. data/spec/unit/transaction/event_manager_spec.rb +14 -11
  400. data/spec/unit/transaction/persistence_spec.rb +15 -0
  401. data/spec/unit/transaction/report_spec.rb +3 -1
  402. data/spec/unit/transaction_spec.rb +13 -4
  403. data/spec/unit/type/file/content_spec.rb +0 -1
  404. data/spec/unit/type/file/selinux_spec.rb +0 -2
  405. data/spec/unit/type/file/source_spec.rb +4 -4
  406. data/spec/unit/type/file_spec.rb +122 -102
  407. data/spec/unit/type/filebucket_spec.rb +1 -1
  408. data/spec/unit/type/group_spec.rb +13 -6
  409. data/spec/unit/type/resources_spec.rb +7 -7
  410. data/spec/unit/type/service_spec.rb +210 -1
  411. data/spec/unit/type/tidy_spec.rb +0 -1
  412. data/spec/unit/type/user_spec.rb +31 -2
  413. data/spec/unit/type_spec.rb +52 -2
  414. data/spec/unit/util/at_fork_spec.rb +2 -2
  415. data/spec/unit/util/autoload_spec.rb +5 -1
  416. data/spec/unit/util/backups_spec.rb +1 -2
  417. data/spec/unit/util/character_encoding_spec.rb +4 -4
  418. data/spec/unit/util/checksums_spec.rb +16 -0
  419. data/spec/unit/util/command_line_spec.rb +11 -6
  420. data/spec/unit/util/execution_spec.rb +15 -11
  421. data/spec/unit/util/inifile_spec.rb +6 -14
  422. data/spec/unit/util/log_spec.rb +8 -7
  423. data/spec/unit/util/logging_spec.rb +3 -3
  424. data/spec/unit/util/posix_spec.rb +363 -15
  425. data/spec/unit/util/rubygems_spec.rb +2 -2
  426. data/spec/unit/util/run_mode_spec.rb +6 -6
  427. data/spec/unit/util/selinux_spec.rb +76 -52
  428. data/spec/unit/util/storage_spec.rb +3 -1
  429. data/spec/unit/util/suidmanager_spec.rb +44 -41
  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_spec.rb +16 -9
  433. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  434. metadata +52 -53
  435. data/spec/integration/faces/config_spec.rb +0 -91
  436. data/spec/integration/faces/documentation_spec.rb +0 -57
  437. data/spec/integration/file_bucket/file_spec.rb +0 -50
  438. data/spec/integration/file_serving/content_spec.rb +0 -7
  439. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  440. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  441. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  442. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  443. data/spec/integration/module_tool/forge_spec.rb +0 -51
  444. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  445. data/spec/integration/provider/service/init_spec.rb +0 -48
  446. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  447. data/spec/integration/provider/service/windows_spec.rb +0 -50
  448. data/spec/integration/reference/providers_spec.rb +0 -21
  449. data/spec/integration/reports_spec.rb +0 -13
  450. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  451. data/spec/integration/ssl/host_spec.rb +0 -72
  452. data/spec/integration/ssl/key_spec.rb +0 -99
  453. data/spec/integration/test/test_helper_spec.rb +0 -31
  454. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  455. data/spec/unit/face/catalog_spec.rb +0 -6
  456. data/spec/unit/face/man_spec.rb +0 -25
  457. data/spec/unit/face/module_spec.rb +0 -3
  458. data/spec/unit/man_spec.rb +0 -31
@@ -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
@@ -59,7 +59,7 @@ describe "puppet plugin" do
59
59
 
60
60
  server.start_server(mounts: {file_metadatas: current_version_handler}) do |port|
61
61
  Puppet[:environment] = 'doesnotexistontheagent'
62
- Puppet[:masterport] = port
62
+ Puppet[:serverport] = port
63
63
  expect {
64
64
  plugin.command_line.args << 'download'
65
65
  plugin.run
@@ -70,4 +70,54 @@ describe "puppet plugin" do
70
70
  end
71
71
  end
72
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
73
123
  end
@@ -60,6 +60,20 @@ describe Puppet::Configurer do
60
60
  expect(summary["time"]["last_run"]).to be_between(t1, t2)
61
61
  end
62
62
 
63
+ it "applies a cached catalog if pluginsync fails when usecacheonfailure is true" do
64
+ Puppet[:ignore_plugin_errors] = false
65
+
66
+ Puppet[:use_cached_catalog] = false
67
+ Puppet[:usecacheonfailure] = true
68
+
69
+ report = Puppet::Transaction::Report.new
70
+ expect_any_instance_of(Puppet::Configurer::Downloader).to receive(:evaluate).and_raise(Puppet::Error, 'Failed to retrieve: some file')
71
+ expect(Puppet::Resource::Catalog.indirection).to receive(:find).and_return(@catalog)
72
+
73
+ @configurer.run(pluginsync: true, report: report)
74
+ expect(report.cached_catalog_status).to eq('on_failure')
75
+ end
76
+
63
77
  describe 'resubmitting facts' do
64
78
  context 'when resubmit_facts is set to false' do
65
79
  it 'should not send data' do
@@ -2,6 +2,7 @@ require 'spec_helper'
2
2
  require 'puppet/indirector/hiera'
3
3
 
4
4
  require 'puppet_spec/compiler'
5
+ require 'puppet/indirector/data_binding/hiera'
5
6
 
6
7
  describe "Data binding" do
7
8
  include PuppetSpec::Files
@@ -140,6 +141,71 @@ describe "Data binding" do
140
141
  end
141
142
  end
142
143
 
144
+ context "with plan_hierarchy key" do
145
+ context "using Hiera 5" do
146
+ let(:hiera_config) { <<~CONF }
147
+ ---
148
+ version: 5
149
+ plan_hierarchy:
150
+ - path: global
151
+ name: Common
152
+ CONF
153
+
154
+ it "ignores plan_hierarchy outside of a Bolt plan" do
155
+ configure_hiera_for_plan_hierarchy(data, hiera_config)
156
+
157
+ create_manifest_in_module("testing", "binding.pp",
158
+ <<-MANIFEST)
159
+ class testing::binding($value) {}
160
+ MANIFEST
161
+
162
+ expect { compile_to_catalog("include testing::binding") }
163
+ .to raise_error(/Class\[Testing::Binding\]: expects a value for parameter 'value'/)
164
+ end
165
+ end
166
+
167
+ context "with invalid data" do
168
+ let(:hiera_config) { <<~CONF }
169
+ ---
170
+ version: 5
171
+ plan_hierarchy:
172
+ - pop: the question
173
+ CONF
174
+
175
+ it "raises a validation error" do
176
+ configure_hiera_for_plan_hierarchy(data, hiera_config)
177
+
178
+ create_manifest_in_module("testing", "binding.pp",
179
+ <<-MANIFEST)
180
+ class testing::binding($value) {}
181
+ MANIFEST
182
+
183
+ expect { compile_to_catalog("include testing::binding") }
184
+ .to raise_error(/entry 'plan_hierarchy' index 0 unrecognized key 'pop'/)
185
+ end
186
+ end
187
+
188
+ context "with Hiera 3" do
189
+ let(:hiera_config) { <<~CONF }
190
+ ---
191
+ plan_hierarchy: ['global']
192
+ CONF
193
+
194
+ it "errors with plan_hierarchy key" do
195
+ configure_hiera_for_plan_hierarchy(data, hiera_config)
196
+
197
+ create_manifest_in_module("testing", "binding.pp",
198
+ <<-MANIFEST)
199
+ class testing::binding($value) {}
200
+ MANIFEST
201
+
202
+ expect { compile_to_catalog("include testing::binding") }
203
+ .to raise_error(/unrecognized key 'plan_hierarchy'/)
204
+
205
+ end
206
+ end
207
+ end
208
+
143
209
 
144
210
  def configure_hiera_for_one_tier(data)
145
211
  hiera_config_file = tmpfile("hiera.yaml")
@@ -163,6 +229,22 @@ describe "Data binding" do
163
229
  Puppet[:hiera_config] = hiera_config_file
164
230
  end
165
231
 
232
+ def configure_hiera_for_plan_hierarchy(data, config)
233
+ hiera_config_file = tmpfile("hiera.yaml")
234
+
235
+ File.open(hiera_config_file, 'w:UTF-8') do |f|
236
+ f.write(config)
237
+ end
238
+
239
+ data.each do | file, contents |
240
+ File.open(File.join(dir, "#{file}.yaml"), 'w:UTF-8') do |f|
241
+ f.write(YAML.dump(contents))
242
+ end
243
+ end
244
+
245
+ Puppet[:hiera_config] = hiera_config_file
246
+ end
247
+
166
248
  def configure_hiera_for_two_tier(data)
167
249
  hiera_config_file = tmpfile("hiera.yaml")
168
250