puppet 4.0.0 → 4.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1667) hide show
  1. checksums.yaml +4 -4
  2. data/COMMITTERS.md +2 -2
  3. data/CONTRIBUTING.md +34 -10
  4. data/Gemfile +26 -9
  5. data/LICENSE +3 -3
  6. data/MAINTAINERS +71 -0
  7. data/README.md +9 -11
  8. data/Rakefile +35 -0
  9. data/conf/auth.conf +2 -2
  10. data/conf/puppet.conf +1 -1
  11. data/ext/README.environment +1 -1
  12. data/ext/build_defaults.yaml +10 -37
  13. data/ext/debian/README.source +1 -1
  14. data/ext/debian/control +3 -5
  15. data/ext/debian/copyright +4 -4
  16. data/ext/debian/puppet.default +0 -5
  17. data/ext/debian/puppet.init +1 -16
  18. data/ext/debian/puppet.logrotate +14 -5
  19. data/ext/debian/puppetmaster.README.debian +11 -9
  20. data/ext/emacs/puppet-mode.el +1 -1
  21. data/ext/envpuppet +2 -2
  22. data/ext/ips/puppetagent.xml +1 -1
  23. data/ext/ips/puppetmaster.xml +1 -1
  24. data/ext/osx/puppet.plist +30 -0
  25. data/ext/project_data.yaml +31 -15
  26. data/ext/puppet-test +3 -3
  27. data/ext/rack/example-passenger-vhost.conf +1 -1
  28. data/ext/redhat/client.init +67 -17
  29. data/ext/redhat/client.sysconfig +1 -10
  30. data/ext/redhat/logrotate +15 -3
  31. data/ext/redhat/puppet.spec.erb +6 -11
  32. data/ext/redhat/server.init +1 -1
  33. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  34. data/ext/solaris/pkginfo +1 -1
  35. data/ext/solaris/smf/puppet +44 -0
  36. data/ext/solaris/smf/puppet.xml +44 -0
  37. data/ext/suse/client.init +30 -33
  38. data/ext/suse/puppet.spec +2 -2
  39. data/ext/suse/server.init +2 -2
  40. data/ext/systemd/puppet.service +13 -1
  41. data/ext/upload_facts.rb +1 -1
  42. data/ext/windows/puppet_interactive.bat +6 -0
  43. data/ext/windows/puppet_shell.bat +9 -0
  44. data/ext/windows/run_puppet_interactive.bat +9 -0
  45. data/ext/windows/service/daemon.rb +2 -1
  46. data/ext/yaml_nodes.rb +1 -1
  47. data/install.rb +98 -65
  48. data/lib/hiera/puppet_function.rb +28 -18
  49. data/lib/hiera/scope.rb +12 -14
  50. data/lib/hiera_puppet.rb +6 -14
  51. data/lib/puppet/agent/locker.rb +11 -2
  52. data/lib/puppet/agent.rb +12 -27
  53. data/lib/puppet/application/agent.rb +40 -19
  54. data/lib/puppet/application/apply.rb +69 -16
  55. data/lib/puppet/application/ca.rb +1 -0
  56. data/lib/puppet/application/cert.rb +52 -3
  57. data/lib/puppet/application/device.rb +10 -5
  58. data/lib/puppet/application/face_base.rb +4 -0
  59. data/lib/puppet/application/filebucket.rb +79 -5
  60. data/lib/puppet/application/generate.rb +5 -0
  61. data/lib/puppet/application/inspect.rb +5 -2
  62. data/lib/puppet/application/lookup.rb +344 -0
  63. data/lib/puppet/application/master.rb +22 -7
  64. data/lib/puppet/application/resource.rb +2 -6
  65. data/lib/puppet/application.rb +20 -4
  66. data/lib/puppet/application_support.rb +1 -1
  67. data/lib/puppet/compilable_resource_type.rb +15 -0
  68. data/lib/puppet/configurer/plugin_handler.rb +7 -5
  69. data/lib/puppet/configurer.rb +184 -42
  70. data/lib/puppet/context/trusted_information.rb +21 -1
  71. data/lib/puppet/context.rb +16 -1
  72. data/lib/puppet/daemon.rb +17 -13
  73. data/lib/puppet/data_binding.rb +4 -2
  74. data/lib/puppet/data_providers/data_adapter.rb +14 -68
  75. data/lib/puppet/data_providers/data_function_support.rb +13 -26
  76. data/lib/puppet/data_providers/function_env_data_provider.rb +7 -9
  77. data/lib/puppet/data_providers/function_module_data_provider.rb +7 -22
  78. data/lib/puppet/data_providers/hiera_config.rb +151 -0
  79. data/lib/puppet/data_providers/hiera_env_data_provider.rb +25 -0
  80. data/lib/puppet/data_providers/hiera_interpolate.rb +21 -0
  81. data/lib/puppet/data_providers/hiera_module_data_provider.rb +30 -0
  82. data/lib/puppet/data_providers/hiera_support.rb +42 -0
  83. data/lib/puppet/data_providers/json_data_provider_factory.rb +38 -0
  84. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +40 -0
  85. data/lib/puppet/data_providers.rb +17 -14
  86. data/lib/puppet/defaults.rb +291 -59
  87. data/lib/puppet/environments.rb +105 -10
  88. data/lib/puppet/error.rb +31 -1
  89. data/lib/puppet/etc.rb +125 -0
  90. data/lib/puppet/external/dot.rb +1 -1
  91. data/lib/puppet/face/ca.rb +6 -1
  92. data/lib/puppet/face/catalog.rb +1 -1
  93. data/lib/puppet/face/certificate.rb +7 -1
  94. data/lib/puppet/face/certificate_request.rb +2 -0
  95. data/lib/puppet/face/certificate_revocation_list.rb +2 -0
  96. data/lib/puppet/face/config.rb +2 -2
  97. data/lib/puppet/face/epp.rb +63 -17
  98. data/lib/puppet/face/file.rb +3 -0
  99. data/lib/puppet/face/generate.rb +64 -0
  100. data/lib/puppet/face/help/face.erb +3 -0
  101. data/lib/puppet/face/help/man.erb +1 -1
  102. data/lib/puppet/face/help.rb +35 -27
  103. data/lib/puppet/face/key.rb +1 -0
  104. data/lib/puppet/face/man.rb +5 -3
  105. data/lib/puppet/face/module/changes.rb +2 -1
  106. data/lib/puppet/face/module/generate.rb +1 -1
  107. data/lib/puppet/face/module/install.rb +6 -6
  108. data/lib/puppet/face/parser.rb +12 -9
  109. data/lib/puppet/face/plugin.rb +7 -14
  110. data/lib/puppet/face/status.rb +4 -1
  111. data/lib/puppet/feature/base.rb +9 -2
  112. data/lib/puppet/feature/cfacter.rb +1 -0
  113. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  114. data/lib/puppet/feature/external_facts.rb +1 -1
  115. data/lib/puppet/feature/hiera_eyaml.rb +3 -0
  116. data/lib/puppet/feature/hocon.rb +3 -0
  117. data/lib/puppet/feature/telnet.rb +9 -0
  118. data/lib/puppet/file_bucket/dipper.rb +58 -2
  119. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  120. data/lib/puppet/file_serving/metadata.rb +30 -9
  121. data/lib/puppet/file_serving/terminus_helper.rb +7 -8
  122. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  123. data/lib/puppet/file_system/file_impl.rb +11 -2
  124. data/lib/puppet/file_system/memory_impl.rb +9 -1
  125. data/lib/puppet/file_system/path_pattern.rb +1 -0
  126. data/lib/puppet/file_system/uniquefile.rb +3 -3
  127. data/lib/puppet/file_system/windows.rb +36 -13
  128. data/lib/puppet/file_system.rb +46 -5
  129. data/lib/puppet/forge/repository.rb +3 -35
  130. data/lib/puppet/forge.rb +7 -7
  131. data/lib/puppet/functions/alert.rb +14 -0
  132. data/lib/puppet/functions/assert_type.rb +53 -19
  133. data/lib/puppet/functions/binary_file.rb +19 -0
  134. data/lib/puppet/functions/break.rb +22 -0
  135. data/lib/puppet/functions/contain.rb +33 -0
  136. data/lib/puppet/functions/crit.rb +14 -0
  137. data/lib/puppet/functions/debug.rb +14 -0
  138. data/lib/puppet/functions/defined.rb +160 -0
  139. data/lib/puppet/functions/dig.rb +23 -0
  140. data/lib/puppet/functions/each.rb +89 -39
  141. data/lib/puppet/functions/emerg.rb +14 -0
  142. data/lib/puppet/functions/epp.rb +29 -37
  143. data/lib/puppet/functions/err.rb +14 -0
  144. data/lib/puppet/functions/eyaml_lookup_key.rb +90 -0
  145. data/lib/puppet/functions/filter.rb +64 -38
  146. data/lib/puppet/functions/find_file.rb +31 -0
  147. data/lib/puppet/functions/hiera.rb +76 -3
  148. data/lib/puppet/functions/hiera_array.rb +66 -4
  149. data/lib/puppet/functions/hiera_hash.rb +74 -2
  150. data/lib/puppet/functions/hiera_include.rb +78 -5
  151. data/lib/puppet/functions/hocon_data.rb +35 -0
  152. data/lib/puppet/functions/include.rb +21 -0
  153. data/lib/puppet/functions/info.rb +14 -0
  154. data/lib/puppet/functions/inline_epp.rb +44 -71
  155. data/lib/puppet/functions/json_data.rb +29 -0
  156. data/lib/puppet/functions/lest.rb +17 -0
  157. data/lib/puppet/functions/lookup.rb +172 -184
  158. data/lib/puppet/functions/map.rb +60 -33
  159. data/lib/puppet/functions/match.rb +30 -12
  160. data/lib/puppet/functions/new.rb +31 -0
  161. data/lib/puppet/functions/next.rb +23 -0
  162. data/lib/puppet/functions/notice.rb +14 -0
  163. data/lib/puppet/functions/reduce.rb +99 -70
  164. data/lib/puppet/functions/regsubst.rb +23 -26
  165. data/lib/puppet/functions/require.rb +37 -0
  166. data/lib/puppet/functions/return.rb +22 -0
  167. data/lib/puppet/functions/reverse_each.rb +25 -0
  168. data/lib/puppet/functions/scanf.rb +15 -18
  169. data/lib/puppet/functions/slice.rb +22 -36
  170. data/lib/puppet/functions/split.rb +3 -3
  171. data/lib/puppet/functions/step.rb +26 -0
  172. data/lib/puppet/functions/strftime.rb +35 -0
  173. data/lib/puppet/functions/then.rb +14 -0
  174. data/lib/puppet/functions/type.rb +31 -0
  175. data/lib/puppet/functions/unwrap.rb +40 -0
  176. data/lib/puppet/functions/versioncmp.rb +36 -0
  177. data/lib/puppet/functions/warning.rb +14 -0
  178. data/lib/puppet/functions/with.rb +15 -7
  179. data/lib/puppet/functions/yaml_data.rb +38 -0
  180. data/lib/puppet/functions.rb +213 -35
  181. data/lib/puppet/generate/models/type/property.rb +70 -0
  182. data/lib/puppet/generate/models/type/type.rb +61 -0
  183. data/lib/puppet/generate/templates/type/pcore.erb +42 -0
  184. data/lib/puppet/generate/type.rb +239 -0
  185. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  186. data/lib/puppet/graph/simple_graph.rb +6 -8
  187. data/lib/puppet/indirector/catalog/compiler.rb +196 -9
  188. data/lib/puppet/indirector/catalog/static_compiler.rb +50 -31
  189. data/lib/puppet/indirector/data_binding/none.rb +4 -1
  190. data/lib/puppet/indirector/face.rb +6 -1
  191. data/lib/puppet/indirector/facts/facter.rb +9 -1
  192. data/lib/puppet/indirector/file_bucket_file/file.rb +137 -25
  193. data/lib/puppet/indirector/file_content/http.rb +15 -0
  194. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  195. data/lib/puppet/indirector/generic_http.rb +16 -0
  196. data/lib/puppet/indirector/hiera.rb +7 -1
  197. data/lib/puppet/indirector/indirection.rb +12 -3
  198. data/lib/puppet/indirector/json.rb +3 -3
  199. data/lib/puppet/indirector/key/ca.rb +2 -2
  200. data/lib/puppet/indirector/key/file.rb +2 -1
  201. data/lib/puppet/indirector/msgpack.rb +2 -2
  202. data/lib/puppet/indirector/node/exec.rb +1 -1
  203. data/lib/puppet/indirector/node/ldap.rb +1 -1
  204. data/lib/puppet/indirector/request.rb +36 -12
  205. data/lib/puppet/indirector/resource_type/parser.rb +10 -3
  206. data/lib/puppet/indirector/rest.rb +80 -5
  207. data/lib/puppet/indirector/ssl_file.rb +24 -3
  208. data/lib/puppet/indirector/terminus.rb +4 -4
  209. data/lib/puppet/info_service/class_information_service.rb +111 -0
  210. data/lib/puppet/info_service.rb +7 -0
  211. data/lib/puppet/interface/documentation.rb +1 -1
  212. data/lib/puppet/interface/face_collection.rb +1 -1
  213. data/lib/puppet/interface.rb +14 -2
  214. data/lib/puppet/loaders.rb +6 -0
  215. data/lib/puppet/metatype/manager.rb +25 -8
  216. data/lib/puppet/module.rb +65 -31
  217. data/lib/puppet/module_tool/applications/application.rb +1 -1
  218. data/lib/puppet/module_tool/applications/builder.rb +5 -4
  219. data/lib/puppet/module_tool/applications/installer.rb +14 -14
  220. data/lib/puppet/module_tool/applications/unpacker.rb +1 -1
  221. data/lib/puppet/module_tool/applications/upgrader.rb +13 -13
  222. data/lib/puppet/module_tool/checksums.rb +1 -1
  223. data/lib/puppet/module_tool/errors/installer.rb +2 -2
  224. data/lib/puppet/module_tool/installed_modules.rb +7 -7
  225. data/lib/puppet/module_tool/local_tarball.rb +3 -3
  226. data/lib/puppet/module_tool/metadata.rb +34 -11
  227. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +14 -3
  228. data/lib/puppet/module_tool/skeleton/templates/generator/README.md.erb +42 -38
  229. data/lib/puppet/module_tool/skeleton/templates/generator/Rakefile +19 -4
  230. data/lib/puppet/module_tool/skeleton/templates/generator/{tests → examples}/init.pp.erb +2 -2
  231. data/lib/puppet/module_tool/skeleton/templates/generator/manifests/init.pp.erb +25 -18
  232. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -2
  233. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  234. data/lib/puppet/module_tool.rb +5 -5
  235. data/lib/puppet/network/auth_config_parser.rb +1 -1
  236. data/lib/puppet/network/authconfig.rb +21 -1
  237. data/lib/puppet/network/authorization.rb +8 -1
  238. data/lib/puppet/network/http/api/indirected_routes.rb +23 -34
  239. data/lib/puppet/network/http/api/master/v3/environment.rb +63 -0
  240. data/lib/puppet/network/http/api/master/v3.rb +7 -1
  241. data/lib/puppet/network/http/compression.rb +2 -1
  242. data/lib/puppet/network/http/connection.rb +2 -0
  243. data/lib/puppet/network/http/error.rb +1 -1
  244. data/lib/puppet/network/http/factory.rb +8 -4
  245. data/lib/puppet/network/http/handler.rb +3 -2
  246. data/lib/puppet/network/http/pool.rb +9 -0
  247. data/lib/puppet/network/http/rack/rest.rb +25 -2
  248. data/lib/puppet/network/http/webrick.rb +2 -1
  249. data/lib/puppet/network/rights.rb +1 -11
  250. data/lib/puppet/node/environment.rb +53 -14
  251. data/lib/puppet/node/facts.rb +1 -1
  252. data/lib/puppet/node.rb +39 -8
  253. data/lib/puppet/parameter/boolean.rb +1 -1
  254. data/lib/puppet/parameter/value.rb +1 -1
  255. data/lib/puppet/parameter.rb +23 -3
  256. data/lib/puppet/parser/ast/pops_bridge.rb +101 -27
  257. data/lib/puppet/parser/ast/resource.rb +5 -0
  258. data/lib/puppet/parser/ast/resource_instance.rb +5 -1
  259. data/lib/puppet/parser/ast/resourceparam.rb +5 -0
  260. data/lib/puppet/parser/ast.rb +5 -0
  261. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +64 -0
  262. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +60 -0
  263. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +20 -0
  264. data/lib/puppet/parser/compiler/catalog_validator.rb +33 -0
  265. data/lib/puppet/parser/compiler.rb +334 -42
  266. data/lib/puppet/parser/e4_parser_adapter.rb +13 -12
  267. data/lib/puppet/parser/environment_compiler.rb +201 -0
  268. data/lib/puppet/parser/functions/assert_type.rb +47 -17
  269. data/lib/puppet/parser/functions/binary_file.rb +24 -0
  270. data/lib/puppet/parser/functions/break.rb +39 -0
  271. data/lib/puppet/parser/functions/contain.rb +7 -15
  272. data/lib/puppet/parser/functions/create_resources.rb +39 -23
  273. data/lib/puppet/parser/functions/defined.rb +106 -69
  274. data/lib/puppet/parser/functions/dig.rb +29 -0
  275. data/lib/puppet/parser/functions/each.rb +86 -28
  276. data/lib/puppet/parser/functions/epp.rb +30 -38
  277. data/lib/puppet/parser/functions/file.rb +3 -1
  278. data/lib/puppet/parser/functions/filter.rb +60 -24
  279. data/lib/puppet/parser/functions/find_file.rb +28 -0
  280. data/lib/puppet/parser/functions/fqdn_rand.rb +3 -3
  281. data/lib/puppet/parser/functions/hiera.rb +98 -28
  282. data/lib/puppet/parser/functions/hiera_array.rb +86 -29
  283. data/lib/puppet/parser/functions/hiera_hash.rb +96 -31
  284. data/lib/puppet/parser/functions/hiera_include.rb +96 -41
  285. data/lib/puppet/parser/functions/include.rb +4 -8
  286. data/lib/puppet/parser/functions/inline_epp.rb +36 -61
  287. data/lib/puppet/parser/functions/inline_template.rb +2 -2
  288. data/lib/puppet/parser/functions/lest.rb +49 -0
  289. data/lib/puppet/parser/functions/lookup.rb +129 -151
  290. data/lib/puppet/parser/functions/map.rb +56 -21
  291. data/lib/puppet/parser/functions/match.rb +29 -13
  292. data/lib/puppet/parser/functions/new.rb +926 -0
  293. data/lib/puppet/parser/functions/next.rb +38 -0
  294. data/lib/puppet/parser/functions/reduce.rb +98 -61
  295. data/lib/puppet/parser/functions/regsubst.rb +4 -2
  296. data/lib/puppet/parser/functions/require.rb +4 -27
  297. data/lib/puppet/parser/functions/return.rb +71 -0
  298. data/lib/puppet/parser/functions/reverse_each.rb +83 -0
  299. data/lib/puppet/parser/functions/scanf.rb +25 -31
  300. data/lib/puppet/parser/functions/slice.rb +18 -25
  301. data/lib/puppet/parser/functions/split.rb +2 -2
  302. data/lib/puppet/parser/functions/step.rb +84 -0
  303. data/lib/puppet/parser/functions/strftime.rb +185 -0
  304. data/lib/puppet/parser/functions/then.rb +73 -0
  305. data/lib/puppet/parser/functions/type.rb +53 -0
  306. data/lib/puppet/parser/functions/with.rb +17 -9
  307. data/lib/puppet/parser/functions.rb +34 -16
  308. data/lib/puppet/parser/resource.rb +149 -35
  309. data/lib/puppet/parser/scope.rb +354 -89
  310. data/lib/puppet/parser/templatewrapper.rb +2 -1
  311. data/lib/puppet/parser/type_loader.rb +1 -1
  312. data/lib/puppet/parser.rb +3 -1
  313. data/lib/puppet/plugins/configuration.rb +11 -2
  314. data/lib/puppet/plugins/data_providers/data_provider.rb +406 -0
  315. data/lib/puppet/plugins/data_providers/registry.rb +51 -0
  316. data/lib/puppet/plugins/data_providers.rb +15 -60
  317. data/lib/puppet/pops/adaptable.rb +4 -4
  318. data/lib/puppet/pops/adapters.rb +114 -31
  319. data/lib/puppet/pops/binder/binder.rb +21 -17
  320. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  321. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  322. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  323. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  324. data/lib/puppet/pops/binder/bindings_label_provider.rb +3 -1
  325. data/lib/puppet/pops/binder/bindings_loader.rb +6 -2
  326. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  327. data/lib/puppet/pops/binder/bindings_model_meta.rb +2 -2
  328. data/lib/puppet/pops/binder/config/binder_config.rb +1 -1
  329. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  330. data/lib/puppet/pops/binder/injector.rb +55 -50
  331. data/lib/puppet/pops/binder/key_factory.rb +10 -12
  332. data/lib/puppet/pops/binder/producers.rb +70 -65
  333. data/lib/puppet/pops/binder/scheme_handler/confdir_scheme.rb +1 -1
  334. data/lib/puppet/pops/binder/scheme_handler/module_scheme.rb +68 -9
  335. data/lib/puppet/pops/evaluator/access_operator.rb +261 -142
  336. data/lib/puppet/pops/evaluator/callable_signature.rb +7 -0
  337. data/lib/puppet/pops/evaluator/closure.rb +251 -109
  338. data/lib/puppet/pops/evaluator/collector_transformer.rb +45 -26
  339. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -1
  340. data/lib/puppet/pops/evaluator/collectors/catalog_collector.rb +4 -0
  341. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +5 -2
  342. data/lib/puppet/pops/evaluator/compare_operator.rb +110 -10
  343. data/lib/puppet/pops/evaluator/epp_evaluator.rb +16 -10
  344. data/lib/puppet/pops/evaluator/evaluator_impl.rb +239 -117
  345. data/lib/puppet/pops/evaluator/external_syntax_support.rb +1 -1
  346. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +84 -0
  347. data/lib/puppet/pops/evaluator/literal_evaluator.rb +87 -0
  348. data/lib/puppet/pops/evaluator/relationship_operator.rb +18 -11
  349. data/lib/puppet/pops/evaluator/runtime3_converter.rb +60 -51
  350. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +119 -0
  351. data/lib/puppet/pops/evaluator/runtime3_support.rb +119 -82
  352. data/lib/puppet/pops/functions/dispatch.rb +33 -8
  353. data/lib/puppet/pops/functions/dispatcher.rb +17 -16
  354. data/lib/puppet/pops/functions/function.rb +30 -4
  355. data/lib/puppet/pops/issue_reporter.rb +49 -21
  356. data/lib/puppet/pops/issues.rb +292 -18
  357. data/lib/puppet/pops/label_provider.rb +18 -4
  358. data/lib/puppet/pops/loader/base_loader.rb +74 -20
  359. data/lib/puppet/pops/loader/dependency_loader.rb +27 -2
  360. data/lib/puppet/pops/loader/loader.rb +53 -48
  361. data/lib/puppet/pops/loader/loader_paths.rb +113 -6
  362. data/lib/puppet/pops/loader/module_loaders.rb +72 -28
  363. data/lib/puppet/pops/loader/null_loader.rb +17 -1
  364. data/lib/puppet/pops/loader/predefined_loader.rb +29 -0
  365. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +84 -0
  366. data/lib/puppet/pops/loader/puppet_resource_type_impl_instantiator.rb +80 -0
  367. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -4
  368. data/lib/puppet/pops/loader/runtime3_type_loader.rb +96 -0
  369. data/lib/puppet/pops/loader/static_loader.rb +139 -38
  370. data/lib/puppet/pops/loader/type_definition_instantiator.rb +93 -0
  371. data/lib/puppet/pops/loader/typed_name.rb +48 -0
  372. data/lib/puppet/pops/loaders.rb +209 -29
  373. data/lib/puppet/pops/lookup/configured_data_provider.rb +93 -0
  374. data/lib/puppet/pops/lookup/context.rb +200 -0
  375. data/lib/puppet/pops/lookup/data_adapter.rb +27 -0
  376. data/lib/puppet/pops/lookup/data_dig_function_provider.rb +145 -0
  377. data/lib/puppet/pops/lookup/data_hash_function_provider.rb +126 -0
  378. data/lib/puppet/pops/lookup/data_provider.rb +107 -0
  379. data/lib/puppet/pops/lookup/environment_data_provider.rb +35 -0
  380. data/lib/puppet/pops/lookup/explainer.rb +594 -0
  381. data/lib/puppet/pops/lookup/function_provider.rb +110 -0
  382. data/lib/puppet/pops/lookup/global_data_provider.rb +78 -0
  383. data/lib/puppet/pops/lookup/hiera_config.rb +782 -0
  384. data/lib/puppet/pops/lookup/interpolation.rb +153 -0
  385. data/lib/puppet/pops/lookup/invocation.rb +251 -0
  386. data/lib/puppet/pops/lookup/location_resolver.rb +99 -0
  387. data/lib/puppet/pops/lookup/lookup_adapter.rb +510 -0
  388. data/lib/puppet/pops/lookup/lookup_key.rb +99 -0
  389. data/lib/puppet/pops/lookup/lookup_key_function_provider.rb +92 -0
  390. data/lib/puppet/pops/lookup/module_data_provider.rb +81 -0
  391. data/lib/puppet/pops/lookup/sub_lookup.rb +90 -0
  392. data/lib/puppet/pops/lookup.rb +47 -49
  393. data/lib/puppet/pops/merge_strategy.rb +183 -47
  394. data/lib/puppet/pops/migration/migration_checker.rb +58 -0
  395. data/lib/puppet/pops/model/ast_transformer.rb +8 -1
  396. data/lib/puppet/pops/model/factory.rb +257 -161
  397. data/lib/puppet/pops/model/model.rb +25 -8
  398. data/lib/puppet/pops/model/model_label_provider.rb +30 -6
  399. data/lib/puppet/pops/model/model_meta.rb +50 -3
  400. data/lib/puppet/pops/model/model_tree_dumper.rb +44 -0
  401. data/lib/puppet/pops/parser/code_merger.rb +13 -1
  402. data/lib/puppet/pops/parser/egrammar.ra +155 -38
  403. data/lib/puppet/pops/parser/eparser.rb +1894 -1314
  404. data/lib/puppet/pops/parser/epp_support.rb +27 -12
  405. data/lib/puppet/pops/parser/evaluating_parser.rb +27 -13
  406. data/lib/puppet/pops/parser/heredoc_support.rb +20 -16
  407. data/lib/puppet/pops/parser/interpolation_support.rb +14 -1
  408. data/lib/puppet/pops/parser/lexer2.rb +466 -380
  409. data/lib/puppet/pops/parser/lexer_support.rb +132 -25
  410. data/lib/puppet/pops/parser/locator.rb +63 -9
  411. data/lib/puppet/pops/parser/parser_support.rb +49 -40
  412. data/lib/puppet/pops/parser/slurp_support.rb +37 -12
  413. data/lib/puppet/pops/patterns.rb +16 -1
  414. data/lib/puppet/pops/pcore.rb +96 -0
  415. data/lib/puppet/pops/puppet_stack.rb +43 -0
  416. data/lib/puppet/pops/resource/param.rb +55 -0
  417. data/lib/puppet/pops/resource/resource_type_impl.rb +314 -0
  418. data/lib/puppet/pops/resource/resource_type_set.pcore +22 -0
  419. data/lib/puppet/pops/serialization/abstract_reader.rb +176 -0
  420. data/lib/puppet/pops/serialization/abstract_writer.rb +207 -0
  421. data/lib/puppet/pops/serialization/deserializer.rb +77 -0
  422. data/lib/puppet/pops/serialization/extension.rb +157 -0
  423. data/lib/puppet/pops/serialization/instance_reader.rb +19 -0
  424. data/lib/puppet/pops/serialization/instance_writer.rb +14 -0
  425. data/lib/puppet/pops/serialization/json.rb +297 -0
  426. data/lib/puppet/pops/serialization/object.rb +71 -0
  427. data/lib/puppet/pops/serialization/rgen.rb +152 -0
  428. data/lib/puppet/pops/serialization/serializer.rb +118 -0
  429. data/lib/puppet/pops/serialization/time_factory.rb +67 -0
  430. data/lib/puppet/pops/serialization.rb +17 -0
  431. data/lib/puppet/pops/time/timespan.rb +718 -0
  432. data/lib/puppet/pops/time/timestamp.rb +148 -0
  433. data/lib/puppet/pops/types/annotatable.rb +36 -0
  434. data/lib/puppet/pops/types/class_loader.rb +25 -23
  435. data/lib/puppet/pops/types/enumeration.rb +9 -27
  436. data/lib/puppet/pops/types/implementation_registry.rb +141 -0
  437. data/lib/puppet/pops/types/iterable.rb +308 -0
  438. data/lib/puppet/pops/types/p_binary_type.rb +220 -0
  439. data/lib/puppet/pops/types/p_meta_type.rb +83 -0
  440. data/lib/puppet/pops/types/p_object_type.rb +886 -0
  441. data/lib/puppet/pops/types/p_runtime_type.rb +115 -0
  442. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +187 -0
  443. data/lib/puppet/pops/types/p_sem_ver_type.rb +141 -0
  444. data/lib/puppet/pops/types/p_sensitive_type.rb +73 -0
  445. data/lib/puppet/pops/types/p_timespan_type.rb +141 -0
  446. data/lib/puppet/pops/types/p_timestamp_type.rb +69 -0
  447. data/lib/puppet/pops/types/p_type_set_type.rb +352 -0
  448. data/lib/puppet/pops/types/puppet_object.rb +16 -0
  449. data/lib/puppet/pops/types/recursion_guard.rb +136 -0
  450. data/lib/puppet/pops/types/ruby_generator.rb +275 -0
  451. data/lib/puppet/pops/types/string_converter.rb +1033 -0
  452. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  453. data/lib/puppet/pops/types/type_asserter.rb +21 -19
  454. data/lib/puppet/pops/types/type_assertion_error.rb +1 -0
  455. data/lib/puppet/pops/types/type_calculator.rb +244 -1186
  456. data/lib/puppet/pops/types/type_conversion_error.rb +15 -0
  457. data/lib/puppet/pops/types/type_factory.rb +270 -164
  458. data/lib/puppet/pops/types/type_formatter.rb +686 -0
  459. data/lib/puppet/pops/types/type_mismatch_describer.rb +1105 -0
  460. data/lib/puppet/pops/types/type_parser.rb +372 -280
  461. data/lib/puppet/pops/types/type_set_reference.rb +59 -0
  462. data/lib/puppet/pops/types/types.rb +3293 -295
  463. data/lib/puppet/pops/utils.rb +11 -10
  464. data/lib/puppet/pops/validation/checker4_0.rb +289 -75
  465. data/lib/puppet/pops/validation/validator_factory_4_0.rb +13 -5
  466. data/lib/puppet/pops/validation.rb +56 -18
  467. data/lib/puppet/pops/visitor.rb +9 -6
  468. data/lib/puppet/pops.rb +44 -25
  469. data/lib/puppet/property/ensure.rb +1 -1
  470. data/lib/puppet/property.rb +67 -7
  471. data/lib/puppet/provider/aixobject.rb +4 -4
  472. data/lib/puppet/provider/augeas/augeas.rb +57 -2
  473. data/lib/puppet/provider/cron/crontab.rb +1 -1
  474. data/lib/puppet/provider/exec/windows.rb +1 -1
  475. data/lib/puppet/provider/exec.rb +10 -3
  476. data/lib/puppet/provider/group/aix.rb +4 -4
  477. data/lib/puppet/provider/group/directoryservice.rb +10 -0
  478. data/lib/puppet/provider/group/pw.rb +1 -0
  479. data/lib/puppet/provider/group/windows_adsi.rb +23 -7
  480. data/lib/puppet/provider/macauthorization/macauthorization.rb +11 -10
  481. data/lib/puppet/provider/mailalias/aliases.rb +1 -1
  482. data/lib/puppet/provider/mcx/mcxcontent.rb +5 -4
  483. data/lib/puppet/provider/mount/parsed.rb +159 -2
  484. data/lib/puppet/provider/nameservice/directoryservice.rb +55 -62
  485. data/lib/puppet/provider/nameservice.rb +23 -8
  486. data/lib/puppet/provider/package/appdmg.rb +7 -6
  487. data/lib/puppet/provider/package/apple.rb +1 -1
  488. data/lib/puppet/provider/package/apt.rb +1 -1
  489. data/lib/puppet/provider/package/dnf.rb +46 -0
  490. data/lib/puppet/provider/package/gem.rb +29 -3
  491. data/lib/puppet/provider/package/nim.rb +2 -2
  492. data/lib/puppet/provider/package/openbsd.rb +7 -7
  493. data/lib/puppet/provider/package/pacman.rb +11 -10
  494. data/lib/puppet/provider/package/pip.rb +83 -22
  495. data/lib/puppet/provider/package/pip3.rb +20 -0
  496. data/lib/puppet/provider/package/pkg.rb +12 -8
  497. data/lib/puppet/provider/package/pkgdmg.rb +11 -8
  498. data/lib/puppet/provider/package/pkgin.rb +4 -4
  499. data/lib/puppet/provider/package/pkgng.rb +143 -0
  500. data/lib/puppet/provider/package/pkgutil.rb +1 -1
  501. data/lib/puppet/provider/package/portage.rb +48 -8
  502. data/lib/puppet/provider/package/ports.rb +0 -3
  503. data/lib/puppet/provider/package/puppet_gem.rb +0 -0
  504. data/lib/puppet/provider/package/rpm.rb +123 -17
  505. data/lib/puppet/provider/package/sun.rb +1 -1
  506. data/lib/puppet/provider/package/tdnf.rb +28 -0
  507. data/lib/puppet/provider/package/windows/exe_package.rb +10 -9
  508. data/lib/puppet/provider/package/windows/msi_package.rb +4 -4
  509. data/lib/puppet/provider/package/windows/package.rb +9 -1
  510. data/lib/puppet/provider/package/windows.rb +1 -1
  511. data/lib/puppet/provider/package/yum.rb +62 -83
  512. data/lib/puppet/provider/package/zypper.rb +69 -15
  513. data/lib/puppet/provider/package.rb +6 -2
  514. data/lib/puppet/provider/parsedfile.rb +2 -2
  515. data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +39 -7
  516. data/lib/puppet/provider/selmodule/semodule.rb +20 -16
  517. data/lib/puppet/provider/service/base.rb +4 -3
  518. data/lib/puppet/provider/service/bsd.rb +9 -9
  519. data/lib/puppet/provider/service/daemontools.rb +5 -5
  520. data/lib/puppet/provider/service/debian.rb +14 -5
  521. data/lib/puppet/provider/service/freebsd.rb +1 -1
  522. data/lib/puppet/provider/service/init.rb +27 -3
  523. data/lib/puppet/provider/service/launchd.rb +57 -19
  524. data/lib/puppet/provider/service/rcng.rb +51 -0
  525. data/lib/puppet/provider/service/redhat.rb +2 -1
  526. data/lib/puppet/provider/service/runit.rb +4 -4
  527. data/lib/puppet/provider/service/smf.rb +59 -8
  528. data/lib/puppet/provider/service/src.rb +66 -39
  529. data/lib/puppet/provider/service/systemd.rb +141 -22
  530. data/lib/puppet/provider/service/upstart.rb +1 -1
  531. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +1 -1
  532. data/lib/puppet/provider/sshkey/parsed.rb +20 -10
  533. data/lib/puppet/provider/user/aix.rb +11 -5
  534. data/lib/puppet/provider/user/directoryservice.rb +43 -66
  535. data/lib/puppet/provider/user/hpux.rb +1 -1
  536. data/lib/puppet/provider/user/openbsd.rb +1 -0
  537. data/lib/puppet/provider/user/pw.rb +1 -0
  538. data/lib/puppet/provider/user/user_role_add.rb +19 -2
  539. data/lib/puppet/provider/user/windows_adsi.rb +51 -2
  540. data/lib/puppet/provider/yumrepo/inifile.rb +9 -6
  541. data/lib/puppet/provider/zfs/zfs.rb +2 -2
  542. data/lib/puppet/provider/zone/solaris.rb +6 -3
  543. data/lib/puppet/provider/zpool/zpool.rb +2 -2
  544. data/lib/puppet/provider.rb +9 -7
  545. data/lib/puppet/reference/configuration.rb +13 -5
  546. data/lib/puppet/reference/indirection.rb +2 -2
  547. data/lib/puppet/reference/providers.rb +2 -3
  548. data/lib/puppet/reference/report.rb +9 -12
  549. data/lib/puppet/reference/type.rb +1 -1
  550. data/lib/puppet/reports.rb +5 -1
  551. data/lib/puppet/resource/capability_finder.rb +128 -0
  552. data/lib/puppet/resource/catalog.rb +167 -40
  553. data/lib/puppet/resource/status.rb +30 -5
  554. data/lib/puppet/resource/type.rb +247 -50
  555. data/lib/puppet/resource/type_collection.rb +83 -10
  556. data/lib/puppet/resource.rb +212 -146
  557. data/lib/puppet/settings/base_setting.rb +9 -3
  558. data/lib/puppet/settings/config_file.rb +3 -2
  559. data/lib/puppet/settings/directory_setting.rb +6 -0
  560. data/lib/puppet/settings/environment_conf.rb +26 -6
  561. data/lib/puppet/settings/file_or_directory_setting.rb +6 -0
  562. data/lib/puppet/settings/file_setting.rb +20 -9
  563. data/lib/puppet/settings/ini_file.rb +2 -2
  564. data/lib/puppet/settings/server_list_setting.rb +20 -0
  565. data/lib/puppet/settings/symbolic_enum_setting.rb +17 -0
  566. data/lib/puppet/settings.rb +117 -45
  567. data/lib/puppet/ssl/base.rb +14 -1
  568. data/lib/puppet/ssl/certificate.rb +1 -1
  569. data/lib/puppet/ssl/certificate_authority/interface.rb +166 -26
  570. data/lib/puppet/ssl/certificate_authority.rb +49 -13
  571. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  572. data/lib/puppet/ssl/certificate_request.rb +5 -5
  573. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  574. data/lib/puppet/ssl/configuration.rb +4 -1
  575. data/lib/puppet/ssl/host.rb +26 -4
  576. data/lib/puppet/ssl/inventory.rb +10 -3
  577. data/lib/puppet/ssl/key.rb +7 -3
  578. data/lib/puppet/ssl/oids.rb +43 -3
  579. data/lib/puppet/ssl/validator/default_validator.rb +3 -3
  580. data/lib/puppet/syntax_checkers/base64.rb +41 -0
  581. data/lib/puppet/syntax_checkers/json.rb +0 -2
  582. data/lib/puppet/test/test_helper.rb +21 -7
  583. data/lib/puppet/transaction/additional_resource_generator.rb +101 -8
  584. data/lib/puppet/transaction/event.rb +29 -2
  585. data/lib/puppet/transaction/event_manager.rb +1 -1
  586. data/lib/puppet/transaction/persistence.rb +84 -0
  587. data/lib/puppet/transaction/report.rb +86 -4
  588. data/lib/puppet/transaction/resource_harness.rb +95 -35
  589. data/lib/puppet/transaction.rb +64 -36
  590. data/lib/puppet/type/augeas.rb +13 -4
  591. data/lib/puppet/type/component.rb +11 -0
  592. data/lib/puppet/type/cron.rb +13 -13
  593. data/lib/puppet/type/exec.rb +43 -19
  594. data/lib/puppet/type/file/checksum.rb +1 -0
  595. data/lib/puppet/type/file/checksum_value.rb +53 -0
  596. data/lib/puppet/type/file/content.rb +36 -121
  597. data/lib/puppet/type/file/data_sync.rb +92 -0
  598. data/lib/puppet/type/file/ensure.rb +22 -19
  599. data/lib/puppet/type/file/selcontext.rb +1 -1
  600. data/lib/puppet/type/file/source.rb +121 -34
  601. data/lib/puppet/type/file/target.rb +2 -2
  602. data/lib/puppet/type/file.rb +146 -46
  603. data/lib/puppet/type/filebucket.rb +1 -1
  604. data/lib/puppet/type/group.rb +26 -8
  605. data/lib/puppet/type/host.rb +1 -1
  606. data/lib/puppet/type/interface.rb +8 -3
  607. data/lib/puppet/type/macauthorization.rb +1 -1
  608. data/lib/puppet/type/mount.rb +25 -2
  609. data/lib/puppet/type/notify.rb +1 -1
  610. data/lib/puppet/type/package.rb +32 -12
  611. data/lib/puppet/type/resources.rb +1 -1
  612. data/lib/puppet/type/schedule.rb +5 -5
  613. data/lib/puppet/type/scheduled_task.rb +14 -1
  614. data/lib/puppet/type/service.rb +24 -0
  615. data/lib/puppet/type/ssh_authorized_key.rb +17 -11
  616. data/lib/puppet/type/sshkey.rb +5 -3
  617. data/lib/puppet/type/stage.rb +1 -1
  618. data/lib/puppet/type/tidy.rb +10 -5
  619. data/lib/puppet/type/user.rb +83 -26
  620. data/lib/puppet/type/yumrepo.rb +28 -8
  621. data/lib/puppet/type/zone.rb +6 -6
  622. data/lib/puppet/type.rb +175 -41
  623. data/lib/puppet/util/autoload.rb +16 -11
  624. data/lib/puppet/util/character_encoding.rb +95 -0
  625. data/lib/puppet/util/checksums.rb +74 -31
  626. data/lib/puppet/util/classgen.rb +1 -1
  627. data/lib/puppet/util/command_line/trollop.rb +1 -1
  628. data/lib/puppet/util/command_line.rb +10 -2
  629. data/lib/puppet/util/execution.rb +35 -16
  630. data/lib/puppet/util/feature.rb +1 -1
  631. data/lib/puppet/util/filetype.rb +11 -5
  632. data/lib/puppet/util/http_proxy.rb +132 -0
  633. data/lib/puppet/util/inifile.rb +1 -1
  634. data/lib/puppet/util/instance_loader.rb +1 -1
  635. data/lib/puppet/util/log/destinations.rb +23 -2
  636. data/lib/puppet/util/log.rb +78 -9
  637. data/lib/puppet/util/logging.rb +82 -3
  638. data/lib/puppet/util/monkey_patches.rb +20 -7
  639. data/lib/puppet/util/multi_match.rb +51 -0
  640. data/lib/puppet/util/network_device/cisco/device.rb +24 -6
  641. data/lib/puppet/util/network_device/cisco/interface.rb +21 -9
  642. data/lib/puppet/util/network_device/config.rb +1 -1
  643. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  644. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  645. data/lib/puppet/util/plist.rb +151 -0
  646. data/lib/puppet/util/profiler/aggregate.rb +1 -1
  647. data/lib/puppet/util/profiler/around_profiler.rb +1 -1
  648. data/lib/puppet/util/profiler.rb +1 -1
  649. data/lib/puppet/util/psych_support.rb +1 -1
  650. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +2 -2
  651. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +2 -1
  652. data/lib/puppet/util/rdoc.rb +2 -2
  653. data/lib/puppet/util/reference.rb +4 -2
  654. data/lib/puppet/util/resource_template.rb +1 -1
  655. data/lib/puppet/util/rubygems.rb +1 -1
  656. data/lib/puppet/util/run_mode.rb +3 -16
  657. data/lib/puppet/util/skip_tags.rb +9 -0
  658. data/lib/puppet/util/splayer.rb +18 -0
  659. data/lib/puppet/util/tagging.rb +8 -2
  660. data/lib/puppet/util/watcher/periodic_watcher.rb +2 -2
  661. data/lib/puppet/util/windows/access_control_entry.rb +2 -2
  662. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  663. data/lib/puppet/util/windows/adsi.rb +212 -75
  664. data/lib/puppet/util/windows/api_types.rb +24 -18
  665. data/lib/puppet/util/windows/com.rb +3 -3
  666. data/lib/puppet/util/windows/error.rb +1 -1
  667. data/lib/puppet/util/windows/file.rb +112 -19
  668. data/lib/puppet/util/windows/principal.rb +190 -0
  669. data/lib/puppet/util/windows/process.rb +88 -11
  670. data/lib/puppet/util/windows/registry.rb +22 -16
  671. data/lib/puppet/util/windows/root_certs.rb +5 -5
  672. data/lib/puppet/util/windows/security.rb +38 -37
  673. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  674. data/lib/puppet/util/windows/sid.rb +84 -15
  675. data/lib/puppet/util/windows/taskscheduler.rb +99 -43
  676. data/lib/puppet/util/windows/user.rb +32 -14
  677. data/lib/puppet/util/windows.rb +5 -0
  678. data/lib/puppet/util/yaml.rb +15 -3
  679. data/lib/puppet/util.rb +125 -23
  680. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  681. data/lib/puppet/vendor/deep_merge/test/test_deep_merge.rb +1 -1
  682. data/lib/puppet/vendor/load_semantic_puppet.rb +1 -0
  683. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  684. data/lib/puppet/vendor/pathspec/README.md +1 -1
  685. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +2 -1
  686. data/lib/puppet/vendor/require_vendored.rb +0 -1
  687. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  688. data/lib/puppet/vendor/rgen_patch.rb +1 -1
  689. data/lib/puppet/vendor/semantic/lib/semantic.rb +4 -6
  690. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph.rb +2 -2
  691. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph_node.rb +2 -2
  692. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/module_release.rb +17 -5
  693. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/source.rb +2 -2
  694. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/unsatisfiable_graph.rb +2 -2
  695. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency.rb +7 -7
  696. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/gem_version.rb +3 -0
  697. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/locales/config.yaml +21 -0
  698. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version.rb +48 -21
  699. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version_range.rb +15 -17
  700. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet.rb +17 -0
  701. data/lib/puppet/version.rb +7 -3
  702. data/lib/puppet.rb +86 -2
  703. data/lib/puppet_x.rb +7 -1
  704. data/lib/semver.rb +36 -13
  705. data/locales/config.yaml +29 -0
  706. data/locales/puppet.pot +93 -0
  707. data/man/man5/puppet.conf.5 +61 -19
  708. data/man/man8/extlookup2hiera.8 +2 -2
  709. data/man/man8/puppet-agent.8 +6 -3
  710. data/man/man8/puppet-apply.8 +6 -3
  711. data/man/man8/puppet-ca.8 +3 -3
  712. data/man/man8/puppet-catalog.8 +3 -3
  713. data/man/man8/puppet-cert.8 +3 -3
  714. data/man/man8/puppet-certificate.8 +3 -3
  715. data/man/man8/puppet-certificate_request.8 +3 -3
  716. data/man/man8/puppet-certificate_revocation_list.8 +3 -3
  717. data/man/man8/puppet-config.8 +4 -4
  718. data/man/man8/puppet-describe.8 +2 -2
  719. data/man/man8/puppet-device.8 +7 -4
  720. data/man/man8/puppet-doc.8 +2 -2
  721. data/man/man8/puppet-epp.8 +3 -3
  722. data/man/man8/puppet-facts.8 +3 -3
  723. data/man/man8/puppet-file.8 +3 -3
  724. data/man/man8/puppet-filebucket.8 +3 -3
  725. data/man/man8/puppet-help.8 +3 -3
  726. data/man/man8/puppet-inspect.8 +3 -3
  727. data/man/man8/puppet-key.8 +3 -3
  728. data/man/man8/puppet-man.8 +3 -3
  729. data/man/man8/puppet-master.8 +6 -3
  730. data/man/man8/puppet-module.8 +10 -10
  731. data/man/man8/puppet-node.8 +3 -3
  732. data/man/man8/puppet-parser.8 +3 -3
  733. data/man/man8/puppet-plugin.8 +3 -3
  734. data/man/man8/puppet-report.8 +3 -3
  735. data/man/man8/puppet-resource.8 +3 -3
  736. data/man/man8/puppet-resource_type.8 +3 -3
  737. data/man/man8/puppet-status.8 +4 -4
  738. data/man/man8/puppet.8 +2 -2
  739. data/spec/fixtures/module.tar.gz +0 -0
  740. data/spec/fixtures/unit/application/environments/production/data/common.yaml +22 -0
  741. data/spec/fixtures/unit/application/environments/production/environment.conf +1 -0
  742. data/spec/fixtures/unit/application/environments/production/manifests/site.pp +1 -0
  743. data/spec/fixtures/unit/application/environments/puppet_func_provider/environment.conf +1 -0
  744. data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/environment/data.pp +10 -0
  745. data/spec/fixtures/unit/application/environments/puppet_func_provider/manifests/site.pp +1 -0
  746. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/data/bad.json +3 -0
  747. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/environment.conf +2 -0
  748. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/hiera.yaml +5 -0
  749. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/manifests/site.pp +5 -0
  750. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/data/bad.yaml +3 -0
  751. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/environment.conf +2 -0
  752. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/hiera.yaml +5 -0
  753. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/manifests/site.pp +5 -0
  754. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/data/common.yaml +2 -0
  755. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/environment.conf +2 -0
  756. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/manifests/site.pp +1 -0
  757. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/data/common.yaml +2 -0
  758. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/manifests/init.pp +5 -0
  759. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/metadata.json +9 -0
  760. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/first.json +3 -0
  761. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/name.yaml +2 -0
  762. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/second.json +3 -0
  763. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/single.yaml +2 -0
  764. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/third_utf8.json +3 -0
  765. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/utf8.yaml +3 -0
  766. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data2/single.yaml +2 -0
  767. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/environment.conf +2 -0
  768. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/hiera.yaml +22 -0
  769. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/manifests/site.pp +5 -0
  770. data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +48 -0
  771. data/spec/fixtures/unit/data_providers/environments/hiera_misc/environment.conf +2 -0
  772. data/spec/fixtures/unit/data_providers/environments/hiera_misc/manifests/site.pp +1 -0
  773. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/data/common.yaml +30 -0
  774. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/manifests/init.pp +13 -0
  775. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/metadata.json +9 -0
  776. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/common.yaml +4 -0
  777. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/specific.yaml +4 -0
  778. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/environment.conf +2 -0
  779. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/hiera.yaml +7 -0
  780. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/manifests/site.pp +1 -0
  781. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/first.json +3 -0
  782. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/name.yaml +2 -0
  783. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/second.json +3 -0
  784. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/server1.yaml +1 -0
  785. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/server2.yaml +1 -0
  786. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/single.yaml +2 -0
  787. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data2/single.yaml +2 -0
  788. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/hiera.yaml +20 -0
  789. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/manifests/init.pp +5 -0
  790. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/metadata.json +9 -0
  791. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/common.yaml +4 -0
  792. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/specific.yaml +4 -0
  793. data/spec/fixtures/unit/data_providers/environments/hiera_modules/environment.conf +2 -0
  794. data/spec/fixtures/unit/data_providers/environments/hiera_modules/hiera.yaml +7 -0
  795. data/spec/fixtures/unit/data_providers/environments/hiera_modules/manifests/site.pp +1 -0
  796. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/data/common.yaml +6 -0
  797. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/hiera.yaml +5 -0
  798. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/manifests/init.pp +2 -0
  799. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/metadata.json +9 -0
  800. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +4 -0
  801. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/hiera.yaml +5 -0
  802. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/manifests/init.pp +3 -0
  803. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/metadata.json +9 -0
  804. data/spec/fixtures/unit/data_providers/environments/production/lib/puppet/functions/environment/data.rb +3 -1
  805. data/spec/fixtures/unit/data_providers/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +2 -1
  806. data/spec/fixtures/unit/data_providers/environments/production/modules/abc/manifests/init.pp +2 -1
  807. data/spec/fixtures/unit/data_providers/environments/production/modules/xyz/functions/data.pp +6 -0
  808. data/spec/fixtures/unit/data_providers/environments/production/modules/xyz/lib/puppet/bindings/xyz/default.rb +9 -0
  809. data/spec/fixtures/unit/data_providers/environments/production/modules/xyz/manifests/init.pp +9 -0
  810. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/hiera.yaml +5 -0
  811. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/lib/puppet/bindings/backend/default.rb +9 -0
  812. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/lib/puppet_x/backend/special_data_provider_factory.rb +23 -0
  813. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/manifests/init.pp +5 -0
  814. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/metadata.json +9 -0
  815. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_env_data.rb +2 -0
  816. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_module_data.rb +1 -0
  817. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/manifests/init.pp +1 -1
  818. data/spec/fixtures/unit/functions/lookup/data/common.yaml +19 -0
  819. data/spec/fixtures/unit/functions/lookup_fixture/data/common.yaml +19 -0
  820. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  821. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/bad_data/manifests/init.pp +2 -0
  822. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_json/data/empty.json +0 -0
  823. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_json/hiera.yaml +5 -0
  824. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_json/manifests/init.pp +2 -0
  825. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_json/metadata.json +9 -0
  826. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_json/data/empty_key.json +1 -0
  827. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_json/hiera.yaml +5 -0
  828. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_json/manifests/init.pp +2 -0
  829. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_json/metadata.json +9 -0
  830. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_yaml/data/empty_key.yaml +1 -0
  831. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_yaml/hiera.yaml +5 -0
  832. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_yaml/manifests/init.pp +2 -0
  833. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_yaml/metadata.json +9 -0
  834. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_yaml/data/empty.yaml +2 -0
  835. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  836. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  837. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_yaml/metadata.json +9 -0
  838. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/hieraprovider/data/first.json +4 -0
  839. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/hieraprovider/hiera.yaml +8 -0
  840. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/hieraprovider/manifests/init.pp +5 -0
  841. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/hieraprovider/metadata.json +9 -0
  842. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +9 -0
  843. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/meta/manifests/init.pp +3 -0
  844. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/meta/metadata.json +9 -0
  845. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +10 -0
  846. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +23 -0
  847. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/metawcp/manifests/init.pp +3 -0
  848. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/metawcp/metadata.json +9 -0
  849. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  850. data/spec/fixtures/unit/parser/lexer/subclass_name_duplication.pp +0 -0
  851. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/functions/usee_puppet.pp +3 -0
  852. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/functions/usee/usee_ruby.rb +6 -0
  853. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/type/usee_type.rb +5 -0
  854. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +8 -0
  855. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  856. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee2/lib/puppet/functions/usee2/callee.rb +5 -0
  857. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet.pp +5 -0
  858. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet_init.pp +5 -0
  859. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_ruby.pp +5 -0
  860. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/caller2.rb +5 -0
  861. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet.rb +5 -0
  862. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet_init.rb +5 -0
  863. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_ruby.rb +5 -0
  864. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +87 -0
  865. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/metadata.json +2 -1
  866. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  867. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  868. data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/user/functions/puppetcalled.pp +3 -0
  869. data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/user/functions/puppetcaller.pp +3 -0
  870. data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/user/functions/puppetcaller4.pp +3 -0
  871. data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/user/lib/puppet/functions/user/callingpuppet.rb +5 -0
  872. data/spec/fixtures/unit/pops/loaders/loaders/module_no_lib/modules/modulea/functions/hello.pp +3 -0
  873. data/spec/fixtures/unit/pops/loaders/loaders/module_no_lib/modules/modulea/manifests/init.pp +3 -0
  874. data/spec/fixtures/unit/pops/loaders/loaders/module_no_lib/modules/modulea/metadata.json +10 -0
  875. data/spec/fixtures/unit/pops/loaders/loaders/no_modules/manifests/site.pp +10 -0
  876. data/spec/fixtures/unit/pops/loaders/loaders/single_module/modules/modulea/functions/hello.pp +3 -0
  877. data/spec/fixtures/unit/pops/loaders/loaders/single_module/modules/modulea/functions/subspace/hello.pp +3 -0
  878. data/spec/fixtures/unit/pops/loaders/loaders/single_module/modules/modulea/metadata.json +1 -10
  879. data/spec/fixtures/unit/pops/parser/lexer/subclass_name_duplication.pp +0 -0
  880. data/spec/fixtures/unit/provider/mount/parsed/aix.filesystems +93 -85
  881. data/spec/fixtures/unit/provider/mount/parsed/aix.mount +11 -7
  882. data/spec/fixtures/unit/provider/package/pkgng/pkg.info +8 -0
  883. data/spec/fixtures/unit/provider/package/pkgng/pkg.query +1 -0
  884. data/spec/fixtures/unit/provider/package/pkgng/pkg.query_absent +1 -0
  885. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +3 -0
  886. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  887. data/spec/fixtures/unit/provider/package/yum/yum-check-update-obsoletes.txt +195 -0
  888. data/spec/fixtures/unit/provider/package/yum/yum-check-update-security.txt +184 -0
  889. data/spec/fixtures/unit/provider/package/zypper/zypper-list-updates-empty.out +3 -0
  890. data/spec/fixtures/unit/provider/service/smf/svcs.out +4 -3
  891. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  892. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +24 -0
  893. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +24 -0
  894. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_post/should_yield_to_the_block.yml +24 -0
  895. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +205 -0
  896. 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 +213 -0
  897. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  898. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +205 -0
  899. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  900. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +205 -0
  901. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +205 -0
  902. data/spec/integration/agent/logging_spec.rb +15 -14
  903. data/spec/integration/application/apply_spec.rb +432 -29
  904. data/spec/integration/application/doc_spec.rb +0 -0
  905. data/spec/integration/application/lookup_spec.rb +155 -0
  906. data/spec/integration/configurer_spec.rb +0 -0
  907. data/spec/integration/data_binding_spec.rb +195 -0
  908. data/spec/integration/defaults_spec.rb +27 -2
  909. data/spec/integration/directory_environments_spec.rb +16 -0
  910. data/spec/integration/environments/default_manifest_spec.rb +16 -16
  911. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  912. data/spec/integration/environments/settings_spec.rb +32 -4
  913. data/spec/integration/faces/ca_spec.rb +0 -0
  914. data/spec/integration/faces/config_spec.rb +80 -0
  915. data/spec/integration/faces/documentation_spec.rb +1 -1
  916. data/spec/integration/faces/plugin_spec.rb +0 -4
  917. data/spec/integration/file_bucket/file_spec.rb +2 -2
  918. data/spec/integration/file_serving/fileset_spec.rb +0 -0
  919. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -0
  920. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  921. data/spec/integration/indirector/catalog/compiler_spec.rb +0 -0
  922. data/spec/integration/indirector/direct_file_server_spec.rb +0 -0
  923. data/spec/integration/indirector/facts/facter_spec.rb +97 -0
  924. data/spec/integration/indirector/file_content/file_server_spec.rb +0 -0
  925. data/spec/integration/indirector/file_metadata/file_server_spec.rb +0 -0
  926. data/spec/integration/indirector/node/ldap_spec.rb +0 -0
  927. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  928. data/spec/integration/network/formats_spec.rb +0 -0
  929. data/spec/integration/network/http/api/indirected_routes_spec.rb +33 -0
  930. data/spec/integration/node/environment_spec.rb +34 -0
  931. data/spec/integration/node/facts_spec.rb +0 -0
  932. data/spec/integration/node_spec.rb +0 -0
  933. data/spec/integration/parser/catalog_spec.rb +14 -2
  934. data/spec/integration/parser/collection_spec.rb +18 -0
  935. data/spec/integration/parser/compiler_spec.rb +877 -666
  936. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  937. data/spec/integration/parser/parameter_defaults_spec.rb +358 -0
  938. data/spec/integration/parser/pcore_resource_spec.rb +245 -0
  939. data/spec/integration/parser/resource_expressions_spec.rb +10 -5
  940. data/spec/integration/parser/scope_spec.rb +46 -7
  941. data/spec/integration/parser/undef_param_spec.rb +9 -1
  942. data/spec/integration/provider/mailalias/aliases_spec.rb +0 -0
  943. data/spec/integration/provider/mount_spec.rb +23 -36
  944. data/spec/integration/provider/service/init_spec.rb +0 -0
  945. data/spec/integration/provider/service/windows_spec.rb +3 -2
  946. data/spec/integration/provider/ssh_authorized_key_spec.rb +0 -0
  947. data/spec/integration/provider/yumrepo_spec.rb +4 -1
  948. data/spec/integration/reference/providers_spec.rb +0 -0
  949. data/spec/integration/reports_spec.rb +0 -0
  950. data/spec/integration/resource/catalog_spec.rb +1 -1
  951. data/spec/integration/resource/type_collection_spec.rb +8 -0
  952. data/spec/integration/ssl/autosign_spec.rb +18 -3
  953. data/spec/integration/ssl/certificate_authority_spec.rb +0 -1
  954. data/spec/integration/ssl/certificate_request_spec.rb +0 -1
  955. data/spec/integration/ssl/certificate_revocation_list_spec.rb +0 -1
  956. data/spec/integration/ssl/host_spec.rb +0 -1
  957. data/spec/integration/ssl/key_spec.rb +104 -0
  958. data/spec/integration/test/test_helper_spec.rb +32 -0
  959. data/spec/integration/transaction/report_spec.rb +682 -0
  960. data/spec/integration/transaction_spec.rb +126 -2
  961. data/spec/integration/type/exec_spec.rb +0 -0
  962. data/spec/integration/type/file_spec.rb +553 -51
  963. data/spec/integration/type/package_spec.rb +72 -1
  964. data/spec/integration/type/tidy_spec.rb +21 -9
  965. data/spec/integration/type/user_spec.rb +13 -6
  966. data/spec/integration/type_spec.rb +0 -0
  967. data/spec/integration/util/autoload_spec.rb +0 -0
  968. data/spec/integration/util/execution_spec.rb +30 -0
  969. data/spec/integration/util/rdoc/parser_spec.rb +1 -1
  970. data/spec/integration/util/settings_spec.rb +26 -0
  971. data/spec/integration/util/windows/adsi_spec.rb +99 -0
  972. data/spec/integration/util/windows/principal_spec.rb +250 -0
  973. data/spec/integration/util/windows/process_spec.rb +35 -2
  974. data/spec/{unit → integration}/util/windows/registry_spec.rb +92 -2
  975. data/spec/integration/util/windows/security_spec.rb +75 -21
  976. data/spec/integration/util/windows/user_spec.rb +27 -5
  977. data/spec/integration/util_spec.rb +49 -27
  978. data/spec/lib/matchers/include_in_order.rb +2 -3
  979. data/spec/lib/matchers/resource.rb +22 -1
  980. data/spec/lib/puppet/face/1.0.0/huzzah.rb +0 -0
  981. data/spec/lib/puppet/face/basetest.rb +0 -0
  982. data/spec/lib/puppet/face/huzzah.rb +0 -0
  983. data/spec/lib/puppet_spec/compiler.rb +32 -3
  984. data/spec/lib/puppet_spec/files.rb +16 -2
  985. data/spec/lib/puppet_spec/fixtures.rb +0 -0
  986. data/spec/lib/puppet_spec/language.rb +3 -1
  987. data/spec/lib/puppet_spec/matchers.rb +6 -4
  988. data/spec/lib/puppet_spec/module_tool/shared_functions.rb +2 -2
  989. data/spec/lib/puppet_spec/module_tool/stub_source.rb +1 -1
  990. data/spec/lib/puppet_spec/network.rb +12 -8
  991. data/spec/lib/puppet_spec/pops.rb +13 -0
  992. data/spec/lib/puppet_spec/unindent.rb +5 -0
  993. data/spec/lib/puppet_spec/verbose.rb +0 -0
  994. data/spec/shared_behaviours/all_parsedfile_providers.rb +0 -0
  995. data/spec/shared_behaviours/file_server_terminus.rb +0 -0
  996. data/spec/shared_behaviours/file_serving.rb +0 -0
  997. data/spec/shared_behaviours/iterative_functions.rb +9 -9
  998. data/spec/shared_behaviours/memory_terminus.rb +0 -0
  999. data/spec/shared_behaviours/path_parameters.rb +0 -0
  1000. data/spec/shared_behaviours/things_that_declare_options.rb +0 -0
  1001. data/spec/shared_contexts/types_setup.rb +106 -0
  1002. data/spec/shared_examples/rhel_package_provider.rb +357 -0
  1003. data/spec/spec_helper.rb +23 -2
  1004. data/spec/unit/agent/locker_spec.rb +4 -4
  1005. data/spec/unit/agent_spec.rb +12 -46
  1006. data/spec/unit/application/agent_spec.rb +15 -0
  1007. data/spec/unit/application/apply_spec.rb +31 -1
  1008. data/spec/unit/application/cert_spec.rb +20 -0
  1009. data/spec/unit/application/certificate_spec.rb +0 -0
  1010. data/spec/unit/application/config_spec.rb +0 -0
  1011. data/spec/unit/application/describe_spec.rb +0 -0
  1012. data/spec/unit/application/device_spec.rb +0 -0
  1013. data/spec/unit/application/doc_spec.rb +0 -0
  1014. data/spec/unit/application/face_base_spec.rb +16 -0
  1015. data/spec/unit/application/facts_spec.rb +0 -0
  1016. data/spec/unit/application/filebucket_spec.rb +88 -2
  1017. data/spec/unit/application/indirection_base_spec.rb +0 -0
  1018. data/spec/unit/application/inspect_spec.rb +28 -10
  1019. data/spec/unit/application/lookup_spec.rb +532 -0
  1020. data/spec/unit/application/master_spec.rb +33 -7
  1021. data/spec/unit/application/resource_spec.rb +0 -0
  1022. data/spec/unit/application_spec.rb +3 -3
  1023. data/spec/unit/capability_spec.rb +416 -0
  1024. data/spec/unit/configurer/downloader_factory_spec.rb +0 -0
  1025. data/spec/unit/configurer/downloader_spec.rb +5 -5
  1026. data/spec/unit/configurer/fact_handler_spec.rb +0 -0
  1027. data/spec/unit/configurer/plugin_handler_spec.rb +18 -15
  1028. data/spec/unit/configurer_spec.rb +336 -39
  1029. data/spec/unit/confine/exists_spec.rb +0 -0
  1030. data/spec/unit/confine/false_spec.rb +0 -0
  1031. data/spec/unit/confine/feature_spec.rb +0 -0
  1032. data/spec/unit/confine/true_spec.rb +0 -0
  1033. data/spec/unit/confine/variable_spec.rb +0 -0
  1034. data/spec/unit/confine_collection_spec.rb +0 -0
  1035. data/spec/unit/confine_spec.rb +0 -0
  1036. data/spec/unit/confiner_spec.rb +0 -0
  1037. data/spec/unit/context/trusted_information_spec.rb +24 -1
  1038. data/spec/unit/daemon_spec.rb +18 -8
  1039. data/spec/unit/data_providers/{sample_data_provider_spec.rb → custom_data_provider_spec.rb} +14 -16
  1040. data/spec/unit/data_providers/function_data_provider_spec.rb +30 -3
  1041. data/spec/unit/data_providers/hiera_data_provider_spec.rb +361 -0
  1042. data/spec/unit/defaults_spec.rb +47 -0
  1043. data/spec/unit/environments_spec.rb +26 -4
  1044. data/spec/unit/etc_spec.rb +234 -0
  1045. data/spec/unit/external/pson_spec.rb +0 -0
  1046. data/spec/unit/face/ca_spec.rb +10 -0
  1047. data/spec/unit/face/catalog_spec.rb +0 -0
  1048. data/spec/unit/face/certificate_request_spec.rb +10 -0
  1049. data/spec/unit/face/certificate_revocation_list_spec.rb +10 -0
  1050. data/spec/unit/face/certificate_spec.rb +10 -2
  1051. data/spec/unit/face/config_spec.rb +47 -0
  1052. data/spec/unit/face/epp_face_spec.rb +24 -5
  1053. data/spec/unit/face/facts_spec.rb +0 -0
  1054. data/spec/unit/face/file_spec.rb +4 -0
  1055. data/spec/unit/face/generate_spec.rb +230 -0
  1056. data/spec/unit/face/help_spec.rb +70 -0
  1057. data/spec/unit/face/key_spec.rb +10 -0
  1058. data/spec/unit/face/module/search_spec.rb +1 -1
  1059. data/spec/unit/face/node_spec.rb +1 -1
  1060. data/spec/unit/face/parser_spec.rb +49 -2
  1061. data/spec/unit/face/plugin_spec.rb +29 -4
  1062. data/spec/unit/face/status_spec.rb +10 -0
  1063. data/spec/unit/face_spec.rb +0 -0
  1064. data/spec/unit/file_bucket/dipper_spec.rb +210 -1
  1065. data/spec/unit/file_bucket/file_spec.rb +0 -0
  1066. data/spec/unit/file_serving/base_spec.rb +0 -0
  1067. data/spec/unit/file_serving/configuration/parser_spec.rb +25 -30
  1068. data/spec/unit/file_serving/configuration_spec.rb +1 -1
  1069. data/spec/unit/file_serving/content_spec.rb +0 -0
  1070. data/spec/unit/file_serving/fileset_spec.rb +0 -0
  1071. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  1072. data/spec/unit/file_serving/metadata_spec.rb +51 -1
  1073. data/spec/unit/file_serving/mount/file_spec.rb +0 -0
  1074. data/spec/unit/file_serving/mount/modules_spec.rb +0 -0
  1075. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +0 -0
  1076. data/spec/unit/file_serving/mount/plugins_spec.rb +0 -0
  1077. data/spec/unit/file_serving/mount_spec.rb +0 -0
  1078. data/spec/unit/file_serving/terminus_helper_spec.rb +2 -3
  1079. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  1080. data/spec/unit/file_system/uniquefile_spec.rb +20 -0
  1081. data/spec/unit/file_system_spec.rb +373 -6
  1082. data/spec/unit/forge/repository_spec.rb +27 -0
  1083. data/spec/unit/functions/assert_type_spec.rb +48 -8
  1084. data/spec/unit/functions/binary_file_spec.rb +46 -0
  1085. data/spec/unit/functions/break_spec.rb +89 -0
  1086. data/spec/unit/{parser/functions → functions}/contain_spec.rb +68 -3
  1087. data/spec/unit/functions/defined_spec.rb +289 -0
  1088. data/spec/unit/functions/dig_spec.rb +58 -0
  1089. data/spec/unit/functions/epp_spec.rb +17 -9
  1090. data/spec/unit/functions/filter_spec.rb +18 -0
  1091. data/spec/unit/functions/find_file_spec.rb +69 -0
  1092. data/spec/unit/functions/hiera_spec.rb +451 -49
  1093. data/spec/unit/functions/include_spec.rb +175 -0
  1094. data/spec/unit/functions/inline_epp_spec.rb +4 -4
  1095. data/spec/unit/functions/lest_spec.rb +34 -0
  1096. data/spec/unit/functions/logging_spec.rb +54 -0
  1097. data/spec/unit/functions/lookup_fixture_spec.rb +693 -0
  1098. data/spec/unit/functions/lookup_spec.rb +2904 -265
  1099. data/spec/unit/functions/match_spec.rb +2 -2
  1100. data/spec/unit/functions/new_spec.rb +694 -0
  1101. data/spec/unit/functions/next_spec.rb +93 -0
  1102. data/spec/unit/functions/regsubst_spec.rb +30 -9
  1103. data/spec/unit/functions/require_spec.rb +83 -0
  1104. data/spec/unit/functions/return_spec.rb +105 -0
  1105. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  1106. data/spec/unit/functions/scanf_spec.rb +1 -1
  1107. data/spec/unit/{parser/functions → functions}/shared.rb +15 -12
  1108. data/spec/unit/functions/split_spec.rb +11 -3
  1109. data/spec/unit/functions/step_spec.rb +113 -0
  1110. data/spec/unit/functions/strftime_spec.rb +152 -0
  1111. data/spec/unit/functions/then_spec.rb +40 -0
  1112. data/spec/unit/functions/type_spec.rb +35 -0
  1113. data/spec/unit/functions/unwrap_spec.rb +29 -0
  1114. data/spec/unit/functions/versioncmp_spec.rb +36 -0
  1115. data/spec/unit/functions4_spec.rb +357 -71
  1116. data/spec/unit/graph/rb_tree_map_spec.rb +1 -1
  1117. data/spec/unit/graph/relationship_graph_spec.rb +0 -0
  1118. data/spec/unit/graph/sequential_prioritizer_spec.rb +1 -1
  1119. data/spec/unit/graph/simple_graph_spec.rb +1 -1
  1120. data/spec/unit/hiera/scope_spec.rb +6 -3
  1121. data/spec/unit/hiera_puppet_spec.rb +49 -8
  1122. data/spec/unit/indirector/catalog/compiler_spec.rb +752 -8
  1123. data/spec/unit/indirector/catalog/json_spec.rb +0 -0
  1124. data/spec/unit/indirector/catalog/msgpack_spec.rb +0 -0
  1125. data/spec/unit/indirector/catalog/rest_spec.rb +0 -0
  1126. data/spec/unit/indirector/catalog/static_compiler_spec.rb +38 -20
  1127. data/spec/unit/indirector/catalog/store_configs_spec.rb +0 -0
  1128. data/spec/unit/indirector/catalog/yaml_spec.rb +0 -0
  1129. data/spec/unit/indirector/certificate/ca_spec.rb +0 -0
  1130. data/spec/unit/indirector/certificate/disabled_ca_spec.rb +0 -0
  1131. data/spec/unit/indirector/certificate/file_spec.rb +0 -0
  1132. data/spec/unit/indirector/certificate/rest_spec.rb +0 -0
  1133. data/spec/unit/indirector/certificate_request/ca_spec.rb +0 -0
  1134. data/spec/unit/indirector/certificate_request/disabled_ca_spec.rb +0 -0
  1135. data/spec/unit/indirector/certificate_request/file_spec.rb +0 -0
  1136. data/spec/unit/indirector/certificate_request/rest_spec.rb +0 -0
  1137. data/spec/unit/indirector/certificate_revocation_list/ca_spec.rb +0 -0
  1138. data/spec/unit/indirector/certificate_revocation_list/disabled_ca_spec.rb +0 -0
  1139. data/spec/unit/indirector/certificate_revocation_list/file_spec.rb +0 -0
  1140. data/spec/unit/indirector/certificate_revocation_list/rest_spec.rb +0 -0
  1141. data/spec/unit/indirector/certificate_status/file_spec.rb +0 -0
  1142. data/spec/unit/indirector/certificate_status/rest_spec.rb +0 -0
  1143. data/spec/unit/indirector/code_spec.rb +0 -0
  1144. data/spec/unit/indirector/data_binding/none_spec.rb +2 -2
  1145. data/spec/unit/indirector/direct_file_server_spec.rb +0 -0
  1146. data/spec/unit/indirector/envelope_spec.rb +0 -0
  1147. data/spec/unit/indirector/exec_spec.rb +0 -0
  1148. data/spec/unit/indirector/face_spec.rb +10 -2
  1149. data/spec/unit/indirector/facts/facter_spec.rb +7 -7
  1150. data/spec/unit/indirector/facts/network_device_spec.rb +0 -0
  1151. data/spec/unit/indirector/facts/store_configs_spec.rb +0 -0
  1152. data/spec/unit/indirector/facts/yaml_spec.rb +0 -0
  1153. data/spec/unit/indirector/file_bucket_file/file_spec.rb +86 -4
  1154. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +0 -0
  1155. data/spec/unit/indirector/file_content/file_server_spec.rb +0 -0
  1156. data/spec/unit/indirector/file_content/file_spec.rb +0 -0
  1157. data/spec/unit/indirector/file_content/rest_spec.rb +0 -0
  1158. data/spec/unit/indirector/file_metadata/file_server_spec.rb +0 -0
  1159. data/spec/unit/indirector/file_metadata/file_spec.rb +0 -0
  1160. data/spec/unit/indirector/file_metadata/rest_spec.rb +0 -0
  1161. data/spec/unit/indirector/file_server_spec.rb +0 -0
  1162. data/spec/unit/indirector/indirection_spec.rb +13 -2
  1163. data/spec/unit/indirector/json_spec.rb +1 -1
  1164. data/spec/unit/indirector/key/ca_spec.rb +0 -0
  1165. data/spec/unit/indirector/key/disabled_ca_spec.rb +0 -0
  1166. data/spec/unit/indirector/key/file_spec.rb +1 -1
  1167. data/spec/unit/indirector/ldap_spec.rb +0 -0
  1168. data/spec/unit/indirector/memory_spec.rb +0 -0
  1169. data/spec/unit/indirector/msgpack_spec.rb +11 -1
  1170. data/spec/unit/indirector/node/exec_spec.rb +0 -0
  1171. data/spec/unit/indirector/node/ldap_spec.rb +0 -0
  1172. data/spec/unit/indirector/node/memory_spec.rb +0 -0
  1173. data/spec/unit/indirector/node/msgpack_spec.rb +0 -0
  1174. data/spec/unit/indirector/node/plain_spec.rb +0 -0
  1175. data/spec/unit/indirector/node/rest_spec.rb +0 -0
  1176. data/spec/unit/indirector/node/store_configs_spec.rb +0 -0
  1177. data/spec/unit/indirector/node/yaml_spec.rb +0 -0
  1178. data/spec/unit/indirector/plain_spec.rb +0 -0
  1179. data/spec/unit/indirector/report/msgpack_spec.rb +0 -0
  1180. data/spec/unit/indirector/report/processor_spec.rb +0 -0
  1181. data/spec/unit/indirector/report/rest_spec.rb +0 -0
  1182. data/spec/unit/indirector/report/yaml_spec.rb +0 -0
  1183. data/spec/unit/indirector/request_spec.rb +17 -8
  1184. data/spec/unit/indirector/resource/ral_spec.rb +0 -0
  1185. data/spec/unit/indirector/resource/store_configs_spec.rb +0 -0
  1186. data/spec/unit/indirector/resource_type/parser_spec.rb +5 -0
  1187. data/spec/unit/indirector/resource_type/rest_spec.rb +0 -0
  1188. data/spec/unit/indirector/rest_spec.rb +107 -9
  1189. data/spec/unit/indirector/ssl_file_spec.rb +4 -4
  1190. data/spec/unit/indirector/status/rest_spec.rb +0 -0
  1191. data/spec/unit/indirector/store_configs_spec.rb +0 -0
  1192. data/spec/unit/indirector/terminus_spec.rb +0 -0
  1193. data/spec/unit/indirector/yaml_spec.rb +1 -1
  1194. data/spec/unit/indirector_spec.rb +0 -0
  1195. data/spec/unit/info_service_spec.rb +298 -0
  1196. data/spec/unit/interface/action_builder_spec.rb +0 -0
  1197. data/spec/unit/interface/action_manager_spec.rb +0 -0
  1198. data/spec/unit/interface/action_spec.rb +0 -0
  1199. data/spec/unit/interface/documentation_spec.rb +0 -0
  1200. data/spec/unit/interface/face_collection_spec.rb +0 -0
  1201. data/spec/unit/interface/option_builder_spec.rb +0 -0
  1202. data/spec/unit/interface/option_spec.rb +0 -0
  1203. data/spec/unit/interface_spec.rb +27 -0
  1204. data/spec/unit/man_spec.rb +1 -1
  1205. data/spec/unit/module_spec.rb +118 -74
  1206. data/spec/unit/module_tool/application_spec.rb +1 -1
  1207. data/spec/unit/module_tool/applications/builder_spec.rb +44 -9
  1208. data/spec/unit/module_tool/applications/installer_spec.rb +11 -2
  1209. data/spec/unit/module_tool/applications/unpacker_spec.rb +2 -1
  1210. data/spec/unit/module_tool/applications/upgrader_spec.rb +9 -1
  1211. data/spec/unit/module_tool/installed_modules_spec.rb +6 -6
  1212. data/spec/unit/module_tool/metadata_spec.rb +31 -2
  1213. data/spec/unit/module_tool/tar/mini_spec.rb +3 -3
  1214. data/spec/unit/module_tool_spec.rb +3 -3
  1215. data/spec/unit/network/auth_config_parser_spec.rb +16 -0
  1216. data/spec/unit/network/authconfig_spec.rb +62 -32
  1217. data/spec/unit/network/authorization_spec.rb +30 -2
  1218. data/spec/unit/network/authstore_spec.rb +2 -2
  1219. data/spec/unit/network/format_handler_spec.rb +0 -0
  1220. data/spec/unit/network/format_spec.rb +0 -0
  1221. data/spec/unit/network/formats_spec.rb +0 -0
  1222. data/spec/unit/network/http/api/indirected_routes_spec.rb +70 -71
  1223. data/spec/unit/network/http/api/master/v3/environment_spec.rb +60 -0
  1224. data/spec/unit/network/http/api/master/v3_spec.rb +22 -4
  1225. data/spec/unit/network/http/compression_spec.rb +40 -9
  1226. data/spec/unit/network/http/connection_spec.rb +25 -19
  1227. data/spec/unit/network/http/error_spec.rb +2 -1
  1228. data/spec/unit/network/http/factory_spec.rb +18 -0
  1229. data/spec/unit/network/http/handler_spec.rb +11 -8
  1230. data/spec/unit/network/http/nocache_pool_spec.rb +0 -0
  1231. data/spec/unit/network/http/pool_spec.rb +30 -0
  1232. data/spec/unit/network/http/rack/rest_spec.rb +7 -0
  1233. data/spec/unit/network/http/rack_spec.rb +0 -0
  1234. data/spec/unit/network/http/session_spec.rb +0 -0
  1235. data/spec/unit/network/http/site_spec.rb +0 -0
  1236. data/spec/unit/network/http/webrick/rest_spec.rb +0 -0
  1237. data/spec/unit/network/http/webrick_spec.rb +1 -1
  1238. data/spec/unit/network/http_pool_spec.rb +0 -0
  1239. data/spec/unit/network/http_spec.rb +0 -0
  1240. data/spec/unit/network/resolver_spec.rb +0 -0
  1241. data/spec/unit/network/rights_spec.rb +4 -4
  1242. data/spec/unit/network/server_spec.rb +0 -0
  1243. data/spec/unit/node/environment_spec.rb +10 -0
  1244. data/spec/unit/node/facts_spec.rb +0 -0
  1245. data/spec/unit/node_spec.rb +41 -0
  1246. data/spec/unit/other/selinux_spec.rb +0 -0
  1247. data/spec/unit/parameter/path_spec.rb +0 -0
  1248. data/spec/unit/parameter/value_collection_spec.rb +0 -0
  1249. data/spec/unit/parameter/value_spec.rb +0 -0
  1250. data/spec/unit/parameter_spec.rb +11 -0
  1251. data/spec/unit/parser/ast/leaf_spec.rb +1 -1
  1252. data/spec/unit/parser/compiler_spec.rb +134 -33
  1253. data/spec/unit/parser/environment_compiler_spec.rb +688 -0
  1254. data/spec/unit/parser/files_spec.rb +0 -0
  1255. data/spec/unit/parser/functions/create_resources_spec.rb +86 -5
  1256. data/spec/unit/parser/functions/digest_spec.rb +0 -0
  1257. data/spec/unit/parser/functions/fail_spec.rb +0 -0
  1258. data/spec/unit/parser/functions/file_spec.rb +7 -1
  1259. data/spec/unit/parser/functions/fqdn_rand_spec.rb +6 -2
  1260. data/spec/unit/parser/functions/generate_spec.rb +3 -12
  1261. data/spec/unit/parser/functions/hiera_array_spec.rb +1 -1
  1262. data/spec/unit/parser/functions/hiera_hash_spec.rb +1 -1
  1263. data/spec/unit/parser/functions/hiera_include_spec.rb +1 -1
  1264. data/spec/unit/parser/functions/hiera_spec.rb +1 -1
  1265. data/spec/unit/parser/functions/inline_template_spec.rb +0 -0
  1266. data/spec/unit/parser/functions/lookup_spec.rb +1 -1
  1267. data/spec/unit/parser/functions/realize_spec.rb +0 -0
  1268. data/spec/unit/parser/functions/regsubst_spec.rb +1 -1
  1269. data/spec/unit/parser/functions/scanf_spec.rb +0 -0
  1270. data/spec/unit/parser/functions/shellquote_spec.rb +0 -0
  1271. data/spec/unit/parser/functions/split_spec.rb +1 -1
  1272. data/spec/unit/parser/functions/sprintf_spec.rb +0 -0
  1273. data/spec/unit/parser/functions/tag_spec.rb +0 -0
  1274. data/spec/unit/parser/functions/template_spec.rb +1 -1
  1275. data/spec/unit/parser/functions/versioncmp_spec.rb +0 -0
  1276. data/spec/unit/parser/functions_spec.rb +0 -0
  1277. data/spec/unit/parser/relationship_spec.rb +0 -0
  1278. data/spec/unit/parser/resource/param_spec.rb +0 -0
  1279. data/spec/unit/parser/resource_spec.rb +31 -32
  1280. data/spec/unit/parser/scope_spec.rb +85 -18
  1281. data/spec/unit/parser/templatewrapper_spec.rb +1 -1
  1282. data/spec/unit/parser/type_loader_spec.rb +0 -0
  1283. data/spec/unit/pops/binder/config/binder_config_spec.rb +1 -1
  1284. data/spec/unit/pops/binder/injector_spec.rb +3 -3
  1285. data/spec/unit/pops/evaluator/access_ops_spec.rb +133 -18
  1286. data/spec/unit/pops/evaluator/arithmetic_ops_spec.rb +170 -0
  1287. data/spec/unit/pops/evaluator/basic_expressions_spec.rb +1 -2
  1288. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  1289. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +160 -41
  1290. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +29 -25
  1291. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  1292. data/spec/unit/pops/evaluator/literal_evaluator_spec.rb +43 -0
  1293. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +133 -0
  1294. data/spec/unit/pops/evaluator/variables_spec.rb +2 -2
  1295. data/spec/unit/pops/issues_spec.rb +16 -16
  1296. data/spec/unit/pops/label_provider_spec.rb +5 -1
  1297. data/spec/unit/pops/loaders/dependency_loader_spec.rb +66 -1
  1298. data/spec/unit/pops/loaders/environment_loader_spec.rb +172 -0
  1299. data/spec/unit/pops/loaders/loader_paths_spec.rb +1 -1
  1300. data/spec/unit/pops/loaders/loaders_spec.rb +410 -56
  1301. data/spec/unit/pops/loaders/module_loaders_spec.rb +63 -2
  1302. data/spec/unit/pops/loaders/static_loader_spec.rb +83 -18
  1303. data/spec/unit/pops/lookup/context_spec.rb +334 -0
  1304. data/spec/unit/pops/lookup/interpolation_spec.rb +333 -0
  1305. data/spec/unit/pops/lookup/lookup_spec.rb +262 -0
  1306. data/spec/unit/pops/merge_strategy_spec.rb +18 -0
  1307. data/spec/unit/pops/migration_spec.rb +53 -0
  1308. data/spec/unit/pops/parser/lexer2_spec.rb +377 -10
  1309. data/spec/unit/pops/parser/parse_application_spec.rb +35 -0
  1310. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +31 -0
  1311. data/spec/unit/pops/parser/parse_calls_spec.rb +25 -0
  1312. data/spec/unit/pops/parser/parse_capabilities_spec.rb +40 -0
  1313. data/spec/unit/pops/parser/parse_functions_spec.rb +19 -0
  1314. data/spec/unit/pops/parser/parse_heredoc_spec.rb +26 -0
  1315. data/spec/unit/pops/parser/parse_lambda_spec.rb +19 -0
  1316. data/spec/unit/pops/parser/parse_site_spec.rb +51 -0
  1317. data/spec/unit/pops/parser/parser_rspec_helper.rb +6 -0
  1318. data/spec/unit/pops/parser/parser_spec.rb +28 -0
  1319. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  1320. data/spec/unit/pops/puppet_stack_spec.rb +79 -0
  1321. data/spec/unit/pops/resource/resource_type_impl_spec.rb +111 -0
  1322. data/spec/unit/pops/serialization/packer_spec.rb +154 -0
  1323. data/spec/unit/pops/serialization/rgen_spec.rb +88 -0
  1324. data/spec/unit/pops/serialization/serialization_spec.rb +314 -0
  1325. data/spec/unit/pops/time/timespan_spec.rb +121 -0
  1326. data/spec/unit/pops/types/enumeration_spec.rb +13 -12
  1327. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  1328. data/spec/unit/pops/types/p_binary_type_spec.rb +243 -0
  1329. data/spec/unit/pops/types/p_object_type_spec.rb +1167 -0
  1330. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +327 -0
  1331. data/spec/unit/pops/types/p_sensitive_type_spec.rb +169 -0
  1332. data/spec/unit/pops/types/p_timespan_type_spec.rb +273 -0
  1333. data/spec/unit/pops/types/p_timestamp_type_spec.rb +311 -0
  1334. data/spec/unit/pops/types/p_type_set_type_spec.rb +453 -0
  1335. data/spec/unit/pops/types/recursion_guard_spec.rb +93 -0
  1336. data/spec/unit/pops/types/ruby_generator_spec.rb +625 -0
  1337. data/spec/unit/pops/types/string_converter_spec.rb +1029 -0
  1338. data/spec/unit/pops/types/type_acceptor_spec.rb +106 -0
  1339. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  1340. data/spec/unit/pops/types/type_calculator_spec.rb +1095 -871
  1341. data/spec/unit/pops/types/type_factory_spec.rb +132 -91
  1342. data/spec/unit/pops/types/type_formatter_spec.rb +396 -0
  1343. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +228 -0
  1344. data/spec/unit/pops/types/type_parser_spec.rb +203 -36
  1345. data/spec/unit/pops/types/types_spec.rb +599 -0
  1346. data/spec/unit/pops/validation_spec.rb +66 -0
  1347. data/spec/unit/pops/validator/validator_spec.rb +400 -18
  1348. data/spec/unit/property/ensure_spec.rb +0 -0
  1349. data/spec/unit/property/keyvalue_spec.rb +0 -0
  1350. data/spec/unit/property/list_spec.rb +0 -0
  1351. data/spec/unit/property/ordered_list_spec.rb +0 -0
  1352. data/spec/unit/property_spec.rb +49 -12
  1353. data/spec/unit/provider/augeas/augeas_spec.rb +59 -0
  1354. data/spec/unit/provider/cisco_spec.rb +0 -0
  1355. data/spec/unit/provider/command_spec.rb +0 -0
  1356. data/spec/unit/provider/cron/crontab_spec.rb +0 -0
  1357. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  1358. data/spec/unit/provider/exec/posix_spec.rb +0 -0
  1359. data/spec/unit/provider/exec/shell_spec.rb +0 -0
  1360. data/spec/unit/provider/exec/windows_spec.rb +0 -0
  1361. data/spec/unit/provider/exec_spec.rb +0 -0
  1362. data/spec/unit/provider/file/posix_spec.rb +0 -0
  1363. data/spec/unit/provider/file/windows_spec.rb +0 -0
  1364. data/spec/unit/provider/group/directoryservice_spec.rb +33 -0
  1365. data/spec/unit/provider/group/groupadd_spec.rb +0 -0
  1366. data/spec/unit/provider/group/ldap_spec.rb +0 -0
  1367. data/spec/unit/provider/group/pw_spec.rb +0 -0
  1368. data/spec/unit/provider/group/windows_adsi_spec.rb +88 -18
  1369. data/spec/unit/provider/host/parsed_spec.rb +0 -0
  1370. data/spec/unit/provider/interface/cisco_spec.rb +0 -0
  1371. data/spec/unit/provider/ldap_spec.rb +0 -0
  1372. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  1373. data/spec/unit/provider/mcx/mcxcontent_spec.rb +0 -0
  1374. data/spec/unit/provider/mount/parsed_spec.rb +31 -5
  1375. data/spec/unit/provider/mount_spec.rb +0 -0
  1376. data/spec/unit/provider/naginator_spec.rb +0 -0
  1377. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  1378. data/spec/unit/provider/nameservice_spec.rb +54 -12
  1379. data/spec/unit/provider/network_device_spec.rb +0 -0
  1380. data/spec/unit/provider/package/aix_spec.rb +0 -0
  1381. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  1382. data/spec/unit/provider/package/apt_spec.rb +5 -0
  1383. data/spec/unit/provider/package/aptitude_spec.rb +0 -0
  1384. data/spec/unit/provider/package/aptrpm_spec.rb +3 -3
  1385. data/spec/unit/provider/package/base_spec.rb +18 -0
  1386. data/spec/unit/provider/package/dnf_spec.rb +30 -0
  1387. data/spec/unit/provider/package/dpkg_spec.rb +0 -0
  1388. data/spec/unit/provider/package/freebsd_spec.rb +0 -0
  1389. data/spec/unit/provider/package/gem_spec.rb +77 -0
  1390. data/spec/unit/provider/package/hpux_spec.rb +0 -0
  1391. data/spec/unit/provider/package/macports_spec.rb +0 -0
  1392. data/spec/unit/provider/package/nim_spec.rb +6 -6
  1393. data/spec/unit/provider/package/openbsd_spec.rb +0 -0
  1394. data/spec/unit/provider/package/opkg_spec.rb +0 -0
  1395. data/spec/unit/provider/package/pacman_spec.rb +55 -0
  1396. data/spec/unit/provider/package/pip3_spec.rb +22 -0
  1397. data/spec/unit/provider/package/pip_spec.rb +173 -46
  1398. data/spec/unit/provider/package/pkg_spec.rb +139 -99
  1399. data/spec/unit/provider/package/pkgdmg_spec.rb +32 -8
  1400. data/spec/unit/provider/package/pkgin_spec.rb +23 -13
  1401. data/spec/unit/provider/package/pkgng_spec.rb +186 -0
  1402. data/spec/unit/provider/package/pkgutil_spec.rb +0 -0
  1403. data/spec/unit/provider/package/portage_spec.rb +64 -8
  1404. data/spec/unit/provider/package/puppet_gem_spec.rb +0 -0
  1405. data/spec/unit/provider/package/rpm_spec.rb +170 -12
  1406. data/spec/unit/provider/package/sun_spec.rb +0 -0
  1407. data/spec/unit/provider/package/tdnf_spec.rb +18 -0
  1408. data/spec/unit/provider/package/windows/exe_package_spec.rb +0 -1
  1409. data/spec/unit/provider/package/windows/msi_package_spec.rb +0 -1
  1410. data/spec/unit/provider/package/windows/package_spec.rb +45 -1
  1411. data/spec/unit/provider/package/windows_spec.rb +8 -2
  1412. data/spec/unit/provider/package/yum_spec.rb +29 -466
  1413. data/spec/unit/provider/package/zypper_spec.rb +64 -19
  1414. data/spec/unit/provider/parsedfile_spec.rb +0 -0
  1415. data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +523 -70
  1416. data/spec/unit/provider/selboolean_spec.rb +0 -0
  1417. data/spec/unit/provider/selmodule_spec.rb +0 -0
  1418. data/spec/unit/provider/service/base_spec.rb +44 -27
  1419. data/spec/unit/provider/service/bsd_spec.rb +130 -0
  1420. data/spec/unit/provider/service/daemontools_spec.rb +0 -0
  1421. data/spec/unit/provider/service/debian_spec.rb +38 -0
  1422. data/spec/unit/provider/service/freebsd_spec.rb +17 -0
  1423. data/spec/unit/provider/service/gentoo_spec.rb +8 -0
  1424. data/spec/unit/provider/service/init_spec.rb +42 -1
  1425. data/spec/unit/provider/service/launchd_spec.rb +124 -25
  1426. data/spec/unit/provider/service/openbsd_spec.rb +1 -0
  1427. data/spec/unit/provider/service/openrc_spec.rb +7 -0
  1428. data/spec/unit/provider/service/openwrt_spec.rb +0 -0
  1429. data/spec/unit/provider/service/rcng_spec.rb +41 -0
  1430. data/spec/unit/provider/service/redhat_spec.rb +9 -1
  1431. data/spec/unit/provider/service/runit_spec.rb +0 -0
  1432. data/spec/unit/provider/service/smf_spec.rb +77 -13
  1433. data/spec/unit/provider/service/src_spec.rb +31 -4
  1434. data/spec/unit/provider/service/systemd_spec.rb +228 -39
  1435. data/spec/unit/provider/service/upstart_spec.rb +64 -0
  1436. data/spec/unit/provider/service/windows_spec.rb +0 -0
  1437. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +2 -1
  1438. data/spec/unit/provider/sshkey/parsed_spec.rb +42 -18
  1439. data/spec/unit/provider/user/aix_spec.rb +7 -0
  1440. data/spec/unit/provider/user/directoryservice_spec.rb +164 -83
  1441. data/spec/unit/provider/user/hpux_spec.rb +0 -0
  1442. data/spec/unit/provider/user/ldap_spec.rb +0 -0
  1443. data/spec/unit/provider/user/openbsd_spec.rb +0 -0
  1444. data/spec/unit/provider/user/pw_spec.rb +0 -0
  1445. data/spec/unit/provider/user/user_role_add_spec.rb +0 -0
  1446. data/spec/unit/provider/user/useradd_spec.rb +1 -0
  1447. data/spec/unit/provider/user/windows_adsi_spec.rb +160 -7
  1448. data/spec/unit/provider/vlan/cisco_spec.rb +0 -0
  1449. data/spec/unit/provider/yumrepo/inifile_spec.rb +16 -0
  1450. data/spec/unit/provider/zfs/zfs_spec.rb +0 -0
  1451. data/spec/unit/provider/zone/solaris_spec.rb +64 -12
  1452. data/spec/unit/provider/zpool/zpool_spec.rb +0 -0
  1453. data/spec/unit/provider_spec.rb +0 -0
  1454. data/spec/unit/puppet_spec.rb +15 -1
  1455. data/spec/unit/relationship_spec.rb +0 -0
  1456. data/spec/unit/reports/http_spec.rb +0 -0
  1457. data/spec/unit/reports/store_spec.rb +0 -0
  1458. data/spec/unit/reports_spec.rb +10 -0
  1459. data/spec/unit/resource/capability_finder_spec.rb +147 -0
  1460. data/spec/unit/resource/catalog_spec.rb +235 -10
  1461. data/spec/unit/resource/status_spec.rb +0 -0
  1462. data/spec/unit/resource/type_collection_spec.rb +23 -2
  1463. data/spec/unit/resource/type_spec.rb +169 -12
  1464. data/spec/unit/resource_spec.rb +137 -48
  1465. data/spec/unit/semver_spec.rb +241 -0
  1466. data/spec/unit/settings/directory_setting_spec.rb +0 -0
  1467. data/spec/unit/settings/duration_setting_spec.rb +0 -0
  1468. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  1469. data/spec/unit/settings/file_setting_spec.rb +37 -0
  1470. data/spec/unit/settings/ini_file_spec.rb +58 -1
  1471. data/spec/unit/settings/path_setting_spec.rb +0 -0
  1472. data/spec/unit/settings/priority_setting_spec.rb +0 -0
  1473. data/spec/unit/settings_spec.rb +116 -3
  1474. data/spec/unit/ssl/base_spec.rb +9 -0
  1475. data/spec/unit/ssl/certificate_authority/interface_spec.rb +180 -13
  1476. data/spec/unit/ssl/certificate_authority_spec.rb +82 -28
  1477. data/spec/unit/ssl/certificate_factory_spec.rb +2 -2
  1478. data/spec/unit/ssl/certificate_request_attributes_spec.rb +6 -0
  1479. data/spec/unit/ssl/certificate_request_spec.rb +4 -5
  1480. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  1481. data/spec/unit/ssl/certificate_spec.rb +1 -1
  1482. data/spec/unit/ssl/configuration_spec.rb +11 -2
  1483. data/spec/unit/ssl/host_spec.rb +3 -3
  1484. data/spec/unit/ssl/inventory_spec.rb +27 -3
  1485. data/spec/unit/ssl/key_spec.rb +7 -7
  1486. data/spec/unit/ssl/oids_spec.rb +24 -13
  1487. data/spec/unit/status_spec.rb +0 -0
  1488. data/spec/unit/transaction/additional_resource_generator_spec.rb +160 -31
  1489. data/spec/unit/transaction/event_manager_spec.rb +0 -0
  1490. data/spec/unit/transaction/event_spec.rb +3 -1
  1491. data/spec/unit/transaction/persistence_spec.rb +178 -0
  1492. data/spec/unit/transaction/report_spec.rb +138 -2
  1493. data/spec/unit/transaction/resource_harness_spec.rb +81 -37
  1494. data/spec/unit/transaction_spec.rb +50 -0
  1495. data/spec/unit/type/augeas_spec.rb +0 -0
  1496. data/spec/unit/type/component_spec.rb +0 -0
  1497. data/spec/unit/type/computer_spec.rb +0 -0
  1498. data/spec/unit/type/cron_spec.rb +0 -0
  1499. data/spec/unit/type/exec_spec.rb +57 -12
  1500. data/spec/unit/type/file/checksum_spec.rb +6 -0
  1501. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  1502. data/spec/unit/type/file/content_spec.rb +59 -208
  1503. data/spec/unit/type/file/ctime_spec.rb +0 -0
  1504. data/spec/unit/type/file/ensure_spec.rb +0 -0
  1505. data/spec/unit/type/file/group_spec.rb +0 -0
  1506. data/spec/unit/type/file/mode_spec.rb +0 -0
  1507. data/spec/unit/type/file/mtime_spec.rb +0 -0
  1508. data/spec/unit/type/file/owner_spec.rb +0 -0
  1509. data/spec/unit/type/file/selinux_spec.rb +0 -0
  1510. data/spec/unit/type/file/source_spec.rb +211 -119
  1511. data/spec/unit/type/file/type_spec.rb +0 -0
  1512. data/spec/unit/type/file_spec.rb +165 -35
  1513. data/spec/unit/type/filebucket_spec.rb +0 -0
  1514. data/spec/unit/type/group_spec.rb +0 -0
  1515. data/spec/unit/type/host_spec.rb +4 -4
  1516. data/spec/unit/type/interface_spec.rb +32 -0
  1517. data/spec/unit/type/k5login_spec.rb +0 -0
  1518. data/spec/unit/type/macauthorization_spec.rb +4 -1
  1519. data/spec/unit/type/mailalias_spec.rb +0 -0
  1520. data/spec/unit/type/maillist_spec.rb +0 -0
  1521. data/spec/unit/type/mcx_spec.rb +0 -0
  1522. data/spec/unit/type/mount_spec.rb +50 -8
  1523. data/spec/unit/type/nagios_spec.rb +0 -0
  1524. data/spec/unit/type/noop_metaparam_spec.rb +0 -0
  1525. data/spec/unit/type/package/package_settings_spec.rb +0 -0
  1526. data/spec/unit/type/package_spec.rb +1 -0
  1527. data/spec/unit/type/resources_spec.rb +0 -0
  1528. data/spec/unit/type/schedule_spec.rb +0 -0
  1529. data/spec/unit/type/selboolean_spec.rb +0 -0
  1530. data/spec/unit/type/selmodule_spec.rb +0 -0
  1531. data/spec/unit/type/service_spec.rb +21 -0
  1532. data/spec/unit/type/ssh_authorized_key_spec.rb +0 -0
  1533. data/spec/unit/type/sshkey_spec.rb +0 -0
  1534. data/spec/unit/type/stage_spec.rb +0 -0
  1535. data/spec/unit/type/tidy_spec.rb +4 -4
  1536. data/spec/unit/type/user_spec.rb +40 -7
  1537. data/spec/unit/type/vlan_spec.rb +1 -1
  1538. data/spec/unit/type/whit_spec.rb +0 -0
  1539. data/spec/unit/type/yumrepo_spec.rb +3 -7
  1540. data/spec/unit/type/zfs_spec.rb +0 -0
  1541. data/spec/unit/type/zone_spec.rb +0 -0
  1542. data/spec/unit/type/zpool_spec.rb +0 -0
  1543. data/spec/unit/type_spec.rb +119 -1
  1544. data/spec/unit/util/autoload_spec.rb +0 -0
  1545. data/spec/unit/util/backups_spec.rb +0 -0
  1546. data/spec/unit/util/character_encoding_spec.rb +88 -0
  1547. data/spec/unit/util/checksums_spec.rb +0 -0
  1548. data/spec/unit/util/colors_spec.rb +0 -0
  1549. data/spec/unit/util/command_line_spec.rb +11 -0
  1550. data/spec/unit/util/constant_inflector_spec.rb +0 -0
  1551. data/spec/unit/util/diff_spec.rb +0 -0
  1552. data/spec/unit/util/errors_spec.rb +0 -0
  1553. data/spec/unit/util/execution_spec.rb +13 -1
  1554. data/spec/unit/util/execution_stub_spec.rb +0 -0
  1555. data/spec/unit/util/feature_spec.rb +1 -1
  1556. data/spec/unit/util/filetype_spec.rb +4 -4
  1557. data/spec/unit/util/http_proxy_spec.rb +91 -0
  1558. data/spec/unit/util/ldap/connection_spec.rb +0 -0
  1559. data/spec/unit/util/ldap/generator_spec.rb +1 -1
  1560. data/spec/unit/util/ldap/manager_spec.rb +0 -0
  1561. data/spec/unit/util/log/destinations_spec.rb +0 -2
  1562. data/spec/unit/util/log_spec.rb +125 -1
  1563. data/spec/unit/util/logging_spec.rb +69 -0
  1564. data/spec/unit/util/metric_spec.rb +0 -0
  1565. data/spec/unit/util/monkey_patches_spec.rb +95 -3
  1566. data/spec/unit/util/multi_match_spec.rb +39 -0
  1567. data/spec/unit/util/nagios_maker_spec.rb +0 -0
  1568. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  1569. data/spec/unit/util/network_device/cisco/facts_spec.rb +0 -0
  1570. data/spec/unit/util/network_device/cisco/interface_spec.rb +0 -0
  1571. data/spec/unit/util/network_device/config_spec.rb +0 -0
  1572. data/spec/unit/util/network_device/ipcalc_spec.rb +0 -0
  1573. data/spec/unit/util/network_device/transport/base_spec.rb +0 -0
  1574. data/spec/unit/util/network_device/transport/ssh_spec.rb +1 -1
  1575. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  1576. data/spec/unit/util/network_device_spec.rb +1 -1
  1577. data/spec/unit/util/package_spec.rb +0 -0
  1578. data/spec/unit/util/plist_spec.rb +135 -0
  1579. data/spec/unit/util/posix_spec.rb +0 -0
  1580. data/spec/unit/util/rdoc_spec.rb +0 -0
  1581. data/spec/unit/util/resource_template_spec.rb +2 -2
  1582. data/spec/unit/util/retry_action_spec.rb +0 -0
  1583. data/spec/unit/util/run_mode_spec.rb +27 -3
  1584. data/spec/unit/util/selinux_spec.rb +0 -0
  1585. data/spec/unit/util/splayer_spec.rb +45 -0
  1586. data/spec/unit/util/storage_spec.rb +8 -1
  1587. data/spec/unit/util/suidmanager_spec.rb +0 -0
  1588. data/spec/unit/util/symbolic_file_mode_spec.rb +0 -0
  1589. data/spec/unit/util/tagging_spec.rb +4 -0
  1590. data/spec/unit/util/user_attr_spec.rb +0 -0
  1591. data/spec/unit/util/warnings_spec.rb +0 -0
  1592. data/spec/unit/util/windows/adsi_spec.rb +196 -60
  1593. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  1594. data/spec/unit/util/windows/file_spec.rb +89 -0
  1595. data/spec/unit/util/windows/root_certs_spec.rb +0 -0
  1596. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  1597. data/spec/unit/util/windows/sid_spec.rb +76 -24
  1598. data/spec/unit/util/yaml_spec.rb +13 -1
  1599. data/spec/unit/util_spec.rb +219 -15
  1600. data/spec/unit/version_spec.rb +19 -0
  1601. data/spec/watchr.rb +0 -0
  1602. data/tasks/cfpropertylist.rake +15 -0
  1603. metadata +770 -115
  1604. data/ext/puppet-nm-dispatcher +0 -13
  1605. data/ext/puppetlisten/puppetlisten.rb +0 -77
  1606. data/ext/puppetlisten/puppetrun.rb +0 -38
  1607. data/ext/systemd/puppetmaster.service +0 -11
  1608. data/lib/puppet/pops/evaluator/callable_mismatch_describer.rb +0 -175
  1609. data/lib/puppet/pops/types/types_meta.rb +0 -223
  1610. data/lib/puppet/resource/type_collection_helper.rb +0 -7
  1611. data/lib/puppet/vendor/load_plist.rb +0 -1
  1612. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  1613. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  1614. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  1615. data/lib/puppet/vendor/plist/README +0 -36
  1616. data/lib/puppet/vendor/plist/Rakefile +0 -144
  1617. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  1618. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  1619. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  1620. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  1621. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  1622. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  1623. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  1624. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  1625. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  1626. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  1627. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  1628. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  1629. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  1630. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  1631. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  1632. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  1633. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  1634. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
  1635. data/lib/puppet/vendor/semantic/Gemfile +0 -20
  1636. data/lib/puppet/vendor/semantic/PUPPET_README.md +0 -6
  1637. data/lib/puppet/vendor/semantic/Rakefile +0 -69
  1638. data/lib/puppet/vendor/semantic/spec/spec_helper.rb +0 -24
  1639. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_node_spec.rb +0 -141
  1640. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_spec.rb +0 -162
  1641. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/module_release_spec.rb +0 -143
  1642. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/source_spec.rb +0 -5
  1643. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/unsatisfiable_graph_spec.rb +0 -44
  1644. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency_spec.rb +0 -383
  1645. data/lib/puppet/vendor/semantic/spec/unit/semantic/version_range_spec.rb +0 -307
  1646. data/lib/puppet/vendor/semantic/spec/unit/semantic/version_spec.rb +0 -608
  1647. data/spec/fixtures/unit/data_providers/environments/sample/manifests/site.pp +0 -6
  1648. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -3
  1649. data/spec/integration/data_binding.rb +0 -104
  1650. data/spec/integration/parser/functions/require_spec.rb +0 -43
  1651. data/spec/integration/provider/package_spec.rb +0 -33
  1652. data/spec/unit/parser/functions/defined_spec.rb +0 -120
  1653. data/spec/unit/parser/functions/include_spec.rb +0 -55
  1654. data/spec/unit/parser/functions/require_spec.rb +0 -68
  1655. data/spec/unit/resource/type_collection_helper_spec.rb +0 -24
  1656. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/environment.conf +0 -0
  1657. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/lib/puppet/functions/environment/data.rb +0 -0
  1658. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/bindings/abc/default.rb +0 -0
  1659. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +0 -0
  1660. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/manifests/init.pp +0 -0
  1661. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/bindings/bad_data/default.rb +0 -0
  1662. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/bindings/bca/default.rb +0 -0
  1663. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/functions/bca/data.rb +0 -0
  1664. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/manifests/init.pp +0 -0
  1665. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/no_provider/manifests/init.pp +0 -0
  1666. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{usee → modules/usee}/lib/puppet/functions/usee/callee.rb +0 -0
  1667. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/lib/puppet/functions/user/caller.rb +0 -0
@@ -1,364 +1,3003 @@
1
1
  #! /usr/bin/env ruby
2
2
  require 'spec_helper'
3
3
  require 'puppet_spec/compiler'
4
+ require 'puppet_spec/files'
4
5
  require 'puppet/pops'
6
+ require 'deep_merge/core'
5
7
 
6
- describe "when performing lookup" do
8
+ describe "The lookup function" do
7
9
  include PuppetSpec::Compiler
10
+ include PuppetSpec::Files
8
11
 
9
- # Assembles code that includes the *abc* class and compiles it into a catalog. This class will use the global
10
- # variable $args to perform a lookup and assign the result to $abc::result. Unless the $block is set to
11
- # the string 'no_block_present', it will be passed as a lambda to the lookup. The assembled code will declare
12
- # a notify resource with a name that is formed by interpolating the result into a format string.
13
- #
14
- # The method performs the folloging steps.
15
- #
16
- # - Build the code that:
17
- # - sets the $args variable from _lookup_args_
18
- # - sets the $block parameter to the given block or the string 'no_block_present'
19
- # - includes the abc class
20
- # - assigns the $abc::result to $r
21
- # - interpolates a string using _fmt_ (which is assumed to use $r)
22
- # - declares a notify resource from the interpolated string
23
- # - Compile the code into a catalog
24
- # - Return the name of all Notify resources in that catalog
25
- #
26
- # @param fmt [String] The puppet interpolated string used when creating the notify title
27
- # @param *args [String] splat of args that will be concatenated to form the puppet args sent to lookup
28
- # @return [Array<String>] List of names of Notify resources in the resulting catalog
29
- #
30
- def assemble_and_compile(fmt, *lookup_args)
31
- assemble_and_compile_with_block(fmt, "'no_block_present'", *lookup_args)
12
+ let(:env_name) { 'spec' }
13
+ let(:code_dir_files) { {} }
14
+ let(:code_dir) { tmpdir('code') }
15
+ let(:ruby_dir) { tmpdir('ruby') }
16
+ let(:env_modules) { {} }
17
+ let(:env_hiera_yaml) do
18
+ <<-YAML.unindent
19
+ ---
20
+ version: 5
21
+ hierarchy:
22
+ - name: "Common"
23
+ data_hash: yaml_data
24
+ path: "common.yaml"
25
+ YAML
32
26
  end
33
27
 
34
- def assemble_and_compile_with_block(fmt, block, *lookup_args)
35
- Puppet[:code] = <<-END.gsub(/^ {6}/, '')
36
- $args = [#{lookup_args.join(',')}]
37
- $block = #{block}
38
- include abc
39
- $r = if $abc::result == undef { 'no_value' } else { $abc::result }
40
- notify { \"#{fmt}\": }
41
- END
42
- compiler.compile().resources.map(&:ref).select { |r| r.start_with?('Notify[') }.map { |r| r[7..-2] }
28
+ let(:env_data) { {} }
29
+
30
+ let(:environment_files) do
31
+ {
32
+ env_name => {
33
+ 'modules' => env_modules,
34
+ 'hiera.yaml' => env_hiera_yaml,
35
+ 'data' => env_data
36
+ }
37
+ }
43
38
  end
44
39
 
45
- # There is a fully configured 'production' environment in fixtures at this location
46
- let(:environmentpath) { File.join(my_fixture_dir, 'environments') }
47
- let(:node) { Puppet::Node.new("testnode", :facts => Puppet::Node::Facts.new("facts", {}), :environment => 'production') }
40
+ let(:ruby_dir_files) { {} }
41
+
42
+ let(:logs) { [] }
43
+ let(:scope_additions ) { {} }
44
+ let(:notices) { logs.select { |log| log.level == :notice }.map { |log| log.message } }
45
+ let(:warnings) { logs.select { |log| log.level == :warning }.map { |log| log.message } }
46
+ let(:debugs) { logs.select { |log| log.level == :debug }.map { |log| log.message } }
47
+ let(:env) { Puppet::Node::Environment.create(env_name.to_sym, [File.join(populated_env_dir, env_name, 'modules')]) }
48
+ let(:environments) { Puppet::Environments::Directories.new(populated_env_dir, []) }
49
+ let(:node) { Puppet::Node.new('test_lookup', :environment => env) }
48
50
  let(:compiler) { Puppet::Parser::Compiler.new(node) }
51
+ let(:lookup_func) { Puppet.lookup(:loaders).puppet_system_loader.load(:function, 'lookup') }
52
+ let(:invocation_with_explain) { Puppet::Pops::Lookup::Invocation.new(compiler.topscope, {}, {}, true) }
53
+ let(:explanation) { invocation_with_explain.explainer.explain }
49
54
 
50
- around(:each) do |example|
51
- # Initialize settings to get a full compile as close as possible to a real
52
- # environment load
53
- Puppet.settings.initialize_global_settings
54
-
55
- # Initialize loaders based on the environmentpath. It does not work to
56
- # just set the setting environmentpath for some reason - this achieves the same:
57
- # - first a loader is created, loading directory environments from the fixture (there is
58
- # one environment, 'sample', which will be loaded since the node references this
59
- # environment by name).
60
- # - secondly, the created env loader is set as 'environments' in the puppet context.
61
- #
62
- environments = Puppet::Environments::Directories.new(environmentpath, [])
63
- Puppet.override(:environments => environments) do
64
- example.run
65
- end
55
+ let(:populated_code_dir) do
56
+ dir_contained_in(code_dir, code_dir_files)
57
+ code_dir
66
58
  end
67
59
 
68
- context 'using normal parameters' do
69
- it 'can lookup value provided by the environment' do
70
- resources = assemble_and_compile('${r}', "'abc::a'")
71
- expect(resources).to include('env_a')
72
- end
60
+ let(:populated_ruby_dir) do
61
+ dir_contained_in(ruby_dir, ruby_dir_files)
62
+ ruby_dir
63
+ end
73
64
 
74
- it 'can lookup value provided by the module' do
75
- resources = assemble_and_compile('${r}', "'abc::b'")
76
- expect(resources).to include('module_b')
77
- end
65
+ let(:env_dir) do
66
+ d = File.join(populated_code_dir, 'environments')
67
+ Dir.mkdir(d)
68
+ d
69
+ end
78
70
 
79
- it 'can lookup value provided in global scope' do
80
- Hiera.any_instance.expects(:lookup).with('abc::a', any_parameters).returns('global_a')
81
- resources = assemble_and_compile('${r}', "'abc::a'")
82
- expect(resources).to include('global_a')
83
- end
71
+ let(:populated_env_dir) do
72
+ dir_contained_in(env_dir, environment_files)
73
+ env_dir
74
+ end
84
75
 
85
- it 'will stop at first found name when several names are provided' do
86
- resources = assemble_and_compile('${r}', "['abc::b', 'abc::a']")
87
- expect(resources).to include('module_b')
88
- end
76
+ before(:each) do
77
+ Puppet.settings[:codedir] = code_dir
78
+ Puppet.push_context(:environments => environments, :current_environment => env)
79
+ end
89
80
 
90
- it 'can lookup value provided by the module that is overriden by environment' do
91
- resources = assemble_and_compile('${r}', "'abc::c'")
92
- expect(resources).to include('env_c')
81
+ after(:each) do
82
+ Puppet.pop_context
83
+ if Object.const_defined?(:Hiera)
84
+ Hiera.send(:remove_instance_variable, :@config) if Hiera.instance_variable_defined?(:@config)
85
+ Hiera.send(:remove_instance_variable, :@logger) if Hiera.instance_variable_defined?(:@logger)
86
+ if Hiera.const_defined?(:Config)
87
+ Hiera::Config.send(:remove_instance_variable, :@config) if Hiera::Config.instance_variable_defined?(:@config)
88
+ end
89
+ if Hiera.const_defined?(:Backend) && Hiera::Backend.respond_to?(:clear!)
90
+ Hiera::Backend.clear!
91
+ end
93
92
  end
93
+ end
94
94
 
95
- it "can 'unique' merge values provided by both the module and the environment" do
96
- resources = assemble_and_compile('${r[0]}_${r[1]}', "'abc::c'", 'Array[String]', "'unique'")
97
- expect(resources).to include('env_c_module_c')
95
+ def collect_notices(code, explain = false, &block)
96
+ Puppet[:code] = code
97
+ Puppet::Util::Log.with_destination(Puppet::Test::LogCollector.new(logs)) do
98
+ scope = compiler.topscope
99
+ scope['environment'] = env_name
100
+ scope['domain'] = 'example.com'
101
+ scope_additions.each_pair { |k, v| scope[k] = v }
102
+ if explain
103
+ begin
104
+ invocation_with_explain.lookup('dummy', nil) do
105
+ if block_given?
106
+ compiler.compile { |catalog| block.call(compiler.topscope); catalog }
107
+ else
108
+ compiler.compile
109
+ end
110
+ end
111
+ rescue RuntimeError => e
112
+ invocation_with_explain.report_text { e.message }
113
+ end
114
+ else
115
+ if block_given?
116
+ compiler.compile { |catalog| block.call(compiler.topscope); catalog }
117
+ else
118
+ compiler.compile
119
+ end
120
+ end
98
121
  end
122
+ nil
123
+ end
99
124
 
100
- it "can 'hash' merge values provided by the environment only" do
101
- resources = assemble_and_compile('${r[k1]}_${r[k2]}_${r[k3]}', "'abc::d'", 'Hash[String,String]', "'hash'")
102
- expect(resources).to include('env_d1_env_d2_env_d3')
125
+ def lookup(key, options = {}, explain = false)
126
+ nc_opts = options.empty? ? '' : ", #{Puppet::Pops::Types::TypeFormatter.string(options)}"
127
+ keys = key.is_a?(Array) ? key : [key]
128
+ collect_notices(keys.map { |k| "notice(String(lookup('#{k}'#{nc_opts}), '%p'))" }.join("\n"), explain)
129
+ if explain
130
+ explanation
131
+ else
132
+ result = notices.map { |n| Puppet::Pops::Types::TypeParser.singleton.parse_literal(n) }
133
+ key.is_a?(Array) ? result : result[0]
103
134
  end
135
+ end
104
136
 
105
- it "can 'hash' merge values provided by both the environment and the module" do
106
- resources = assemble_and_compile('${r[k1]}_${r[k2]}_${r[k3]}', "'abc::e'", 'Hash[String,String]', "'hash'")
107
- expect(resources).to include('env_e1_module_e2_env_e3')
108
- end
137
+ def explain(key, options = {})
138
+ lookup(key, options, true)[1]
139
+ explanation
140
+ end
109
141
 
110
- it "can 'hash' merge values provided by global, environment, and module" do
111
- Hiera.any_instance.expects(:lookup).with('abc::e', any_parameters).returns({ 'k1' => 'global_e1' })
112
- resources = assemble_and_compile('${r[k1]}_${r[k2]}_${r[k3]}', "'abc::e'", 'Hash[String,String]', "'hash'")
113
- expect(resources).to include('global_e1_module_e2_env_e3')
114
- end
142
+ context 'with faulty hiera.yaml configuration' do
143
+ context 'in global layer' do
144
+ let(:global_data) do
145
+ {
146
+ 'common.yaml' => <<-YAML.unindent
147
+ a: value a (from global)
148
+ YAML
149
+ }
150
+ end
115
151
 
116
- it "can pass merge parameter in the form of a hash with a 'strategy=>unique'" do
117
- resources = assemble_and_compile('${r[0]}_${r[1]}', "'abc::c'", 'Array[String]', "{strategy => 'unique'}")
118
- expect(resources).to include('env_c_module_c')
119
- end
152
+ let(:code_dir_files) do
153
+ {
154
+ 'hiera.yaml' => hiera_yaml,
155
+ 'data' => global_data
156
+ }
157
+ end
120
158
 
121
- it "can pass merge parameter in the form of a hash with 'strategy=>hash'" do
122
- resources = assemble_and_compile('${r[k1]}_${r[k2]}_${r[k3]}', "'abc::e'", 'Hash[String,String]', "{strategy => 'hash'}")
123
- expect(resources).to include('env_e1_module_e2_env_e3')
124
- end
159
+ before(:each) do
160
+ # Need to set here since spec_helper defines these settings in its "before each"
161
+ Puppet.settings[:codedir] = populated_code_dir
162
+ Puppet.settings[:hiera_config] = File.join(code_dir, 'hiera.yaml')
163
+ end
125
164
 
126
- it "can pass merge parameter in the form of a hash with a 'strategy=>deep'" do
127
- resources = assemble_and_compile('${r[k1]}_${r[k2]}_${r[k3]}', "'abc::e'", 'Hash[String,String]', "{strategy => 'deep'}")
128
- expect(resources).to include('env_e1_module_e2_env_e3')
129
- end
165
+ context 'using a not yet supported hiera version' do
166
+ let(:hiera_yaml) { <<-YAML.unindent }
167
+ version: 6
168
+ YAML
130
169
 
131
- it "will fail unless merge in the form of a hash contains a 'strategy'" do
132
- expect do
133
- assemble_and_compile('${r[k1]}_${r[k2]}_${r[k3]}', "'abc::e'", 'Hash[String,String]', "{merge_key => 'hash'}")
134
- end.to raise_error(Puppet::ParseError, /hash given as 'merge' must contain the name of a strategy/)
135
- end
170
+ it 'fails and reports error' do
171
+ expect { lookup('a') }.to raise_error("This runtime does not support hiera.yaml version 6 in #{code_dir}/hiera.yaml")
172
+ end
173
+ end
136
174
 
137
- it 'will raise an exception when value is not found for single key and no default is provided' do
138
- expect do
139
- assemble_and_compile('${r}', "'abc::x'")
140
- end.to raise_error(Puppet::ParseError, /did not find a value for the name 'abc::x'/)
141
- end
175
+ context 'with multiply defined backend using hiera version 3' do
176
+ let(:hiera_yaml) { <<-YAML.unindent }
177
+ :version: 3
178
+ :backends:
179
+ - yaml
180
+ - json
181
+ - yaml
182
+ YAML
142
183
 
143
- it 'can lookup an undef value' do
144
- resources = assemble_and_compile('${r}', "'abc::n'")
145
- expect(resources).to include('no_value')
146
- end
184
+ it 'fails and reports error' do
185
+ expect { lookup('a') }.to raise_error(
186
+ "Backend 'yaml' is defined more than once. First defined at line 3 at #{code_dir}/hiera.yaml:5")
187
+ end
188
+ end
147
189
 
148
- it 'will not replace an undef value with a given default' do
149
- resources = assemble_and_compile('${r}', "'abc::n'", 'undef', 'undef', '"default_n"')
150
- expect(resources).to include('no_value')
151
- end
190
+ context 'using hiera version 4' do
191
+ let(:hiera_yaml) { <<-YAML.unindent }
192
+ version: 4
193
+ YAML
152
194
 
153
- it 'will not accept a succesful lookup of an undef value when the type rejects it' do
154
- expect do
155
- assemble_and_compile('${r}', "'abc::n'", 'String')
156
- end.to raise_error(Puppet::ParseError, /found value has wrong type/)
157
- end
195
+ it 'fails and reports error' do
196
+ expect { lookup('a') }.to raise_error(
197
+ "hiera.yaml version 4 cannot be used in the global layer in #{code_dir}/hiera.yaml")
198
+ end
199
+ end
158
200
 
159
- it 'will raise an exception when value is not found for array key and no default is provided' do
160
- expect do
161
- assemble_and_compile('${r}', "['abc::x', 'abc::y']")
162
- end.to raise_error(Puppet::ParseError, /did not find a value for any of the names \['abc::x', 'abc::y'\]/)
163
- end
201
+ context 'using hiera version 5' do
202
+ context 'with multiply defined hierarchy' do
203
+ let(:hiera_yaml) { <<-YAML.unindent }
204
+ version: 5
205
+ hierarchy:
206
+ - name: Common
207
+ path: common.yaml
208
+ - name: Other
209
+ path: other.yaml
210
+ - name: Common
211
+ path: common.yaml
212
+ YAML
213
+
214
+ it 'fails and reports error' do
215
+ expect { lookup('a') }.to raise_error(
216
+ "Hierarchy name 'Common' defined more than once. First defined at line 3 at #{code_dir}/hiera.yaml:7")
217
+ end
218
+ end
219
+
220
+ context 'with hiera3_backend that is provided as data_hash function' do
221
+ let(:hiera_yaml) { <<-YAML.unindent }
222
+ version: 5
223
+ hierarchy:
224
+ - name: Common
225
+ hiera3_backend: hocon
226
+ path: common.conf
227
+ YAML
228
+
229
+ it 'fails and reports error' do
230
+ expect { lookup('a') }.to raise_error(
231
+ "Use \"data_hash: hocon_data\" instead of \"hiera3_backend: hocon\" at #{code_dir}/hiera.yaml:4")
232
+ end
233
+ end
234
+
235
+ context 'with no data provider function defined' do
236
+ let(:hiera_yaml) { <<-YAML.unindent }
237
+ version: 5
238
+ defaults:
239
+ datadir: data
240
+ hierarchy:
241
+ - name: Common
242
+ path: common.txt
243
+ YAML
244
+
245
+ it 'fails and reports error' do
246
+ expect { lookup('a') }.to raise_error(
247
+ "One of data_hash, lookup_key, data_dig, or hiera3_backend must be defined in hierarchy 'Common' in #{code_dir}/hiera.yaml")
248
+ end
249
+ end
250
+
251
+ context 'with multiple data providers in defaults' do
252
+ let(:hiera_yaml) { <<-YAML.unindent }
253
+ version: 5
254
+ defaults:
255
+ data_hash: yaml_data
256
+ lookup_key: eyaml_lookup_key
257
+ datadir: data
258
+ hierarchy:
259
+ - name: Common
260
+ path: common.txt
261
+ YAML
262
+
263
+ it 'fails and reports error' do
264
+ expect { lookup('a') }.to raise_error(
265
+ "Only one of data_hash, lookup_key, data_dig, or hiera3_backend can be defined in defaults in #{code_dir}/hiera.yaml")
266
+ end
267
+ end
268
+
269
+ context 'with non existing data provider function' do
270
+ let(:hiera_yaml) { <<-YAML.unindent }
271
+ version: 5
272
+ hierarchy:
273
+ - name: Common
274
+ data_hash: nonesuch_txt_data
275
+ path: common.yaml
276
+ YAML
277
+
278
+ it 'fails and reports error' do
279
+ Puppet[:strict] = :error
280
+ expect { lookup('a') }.to raise_error(
281
+ "Unable to find 'data_hash' function named 'nonesuch_txt_data' in #{code_dir}/hiera.yaml")
282
+ end
283
+ end
284
+
285
+ context 'with a declared default_hierarchy' do
286
+ let(:hiera_yaml) { <<-YAML.unindent }
287
+ version: 5
288
+ hierarchy:
289
+ - name: Common
290
+ path: common.yaml
291
+ default_hierarchy:
292
+ - name: Defaults
293
+ path: defaults.yaml
294
+ YAML
295
+
296
+ it 'fails and reports error' do
297
+ Puppet[:strict] = :error
298
+ expect { lookup('a') }.to raise_error(
299
+ "'default_hierarchy' is only allowed in the module layer at #{code_dir}/hiera.yaml:5")
300
+ end
301
+ end
302
+
303
+ context 'with missing variables' do
304
+ let(:scope_additions) { { 'fqdn' => 'test.example.com' } }
305
+ let(:hiera_yaml) { <<-YAML.unindent }
306
+ version: 5
307
+ hierarchy:
308
+ - name: Common # don't report this line %{::nonesuch}
309
+ path: "%{::fqdn}/%{::nonesuch}/data.yaml"
310
+ YAML
311
+
312
+ it 'fails and reports errors when strict == error' do
313
+ Puppet[:strict] = :error
314
+ expect { lookup('a') }.to raise_error("Undefined variable '::nonesuch' at #{code_dir}/hiera.yaml:4")
315
+ end
316
+ end
164
317
 
165
- it 'can lookup and deep merge shallow values provided by the environment only' do
166
- resources = assemble_and_compile('${r[k1]}_${r[k2]}_${r[k3]}', "'abc::d'", 'Hash[String,String]', "'deep'")
167
- expect(resources).to include('env_d1_env_d2_env_d3')
318
+ context 'using interpolation functions' do
319
+ let(:hiera_yaml) { <<-YAML.unindent }
320
+ version: 5
321
+ hierarchy:
322
+ - name: Common # don't report this line %{::nonesuch}
323
+ path: "%{lookup('fqdn')}/data.yaml"
324
+ YAML
325
+
326
+ it 'fails and reports errors when strict == error' do
327
+ Puppet[:strict] = :error
328
+ expect { lookup('a') }.to raise_error("Interpolation using method syntax is not allowed in this context in #{code_dir}/hiera.yaml")
329
+ end
330
+ end
331
+ end
168
332
  end
169
333
 
170
- it 'can lookup and deep merge shallow values provided by both the module and the environment' do
171
- resources = assemble_and_compile('${r[k1]}_${r[k2]}_${r[k3]}', "'abc::e'", 'Hash[String,String]', "'deep'")
172
- expect(resources).to include('env_e1_module_e2_env_e3')
334
+ context 'in environment layer' do
335
+ context 'using hiera version 4' do
336
+ context 'with an unknown backend' do
337
+ let(:env_hiera_yaml) { <<-YAML.unindent }
338
+ version: 4
339
+ hierarchy:
340
+ - name: Common
341
+ backend: nonesuch
342
+ path: common.yaml
343
+ YAML
344
+
345
+ it 'fails and reports error' do
346
+ expect { lookup('a') }.to raise_error(
347
+ "No data provider is registered for backend 'nonesuch' at #{env_dir}/spec/hiera.yaml:4")
348
+ end
349
+ end
350
+
351
+ context 'with multiply defined hierarchy' do
352
+ let(:env_hiera_yaml) { <<-YAML.unindent }
353
+ version: 4
354
+ hierarchy:
355
+ - name: Common
356
+ backend: yaml
357
+ path: common.yaml
358
+ - name: Other
359
+ backend: yaml
360
+ path: other.yaml
361
+ - name: Common
362
+ backend: yaml
363
+ path: common.yaml
364
+ YAML
365
+
366
+ it 'fails and reports error' do
367
+ expect { lookup('a') }.to raise_error(
368
+ "Hierarchy name 'Common' defined more than once. First defined at line 3 at #{env_dir}/spec/hiera.yaml:9")
369
+ end
370
+ end
371
+ end
372
+
373
+ context 'using hiera version 5' do
374
+ context 'with a hiera3_backend declaration' do
375
+ let(:env_hiera_yaml) { <<-YAML.unindent }
376
+ version: 5
377
+ hierarchy:
378
+ - name: Common
379
+ hiera3_backend: something
380
+ YAML
381
+
382
+ it 'fails and reports error' do
383
+ expect { lookup('a') }.to raise_error(
384
+ "'hiera3_backend' is only allowed in the global layer at #{env_dir}/spec/hiera.yaml:4")
385
+ end
386
+ end
387
+
388
+ context 'with a declared default_hierarchy' do
389
+ let(:env_hiera_yaml) { <<-YAML.unindent }
390
+ version: 5
391
+ hierarchy:
392
+ - name: Common
393
+ path: common.yaml
394
+ default_hierarchy:
395
+ - name: Defaults
396
+ path: defaults.yaml
397
+ YAML
398
+
399
+ it 'fails and reports error' do
400
+ Puppet[:strict] = :error
401
+ expect { lookup('a') }.to raise_error(
402
+ "'default_hierarchy' is only allowed in the module layer at #{env_dir}/spec/hiera.yaml:5")
403
+ end
404
+ end
405
+ end
173
406
  end
407
+ end
174
408
 
175
- it 'can lookup and deep merge deep values provided by global, environment, and module' do
176
- Hiera.any_instance.expects(:lookup).with('abc::f', any_parameters).returns({ 'k1' => { 's1' => 'global_f11' }, 'k2' => { 's3' => 'global_f23' }})
177
- resources = assemble_and_compile('${r[k1][s1]}_${r[k1][s2]}_${r[k1][s3]}_${r[k2][s1]}_${r[k2][s2]}_${r[k2][s3]}', "'abc::f'", 'Hash[String,Hash[String,String]]', "'deep'")
178
- expect(resources).to include('global_f11_env_f12_module_f13_env_f21_module_f22_global_f23')
409
+ context 'with an environment' do
410
+ let(:env_data) do
411
+ {
412
+ 'common.yaml' => <<-YAML.unindent
413
+ ---
414
+ a: value a (from environment)
415
+ c:
416
+ c_b: value c_b (from environment)
417
+ mod_a::a: value mod_a::a (from environment)
418
+ mod_a::hash_a:
419
+ a: value mod_a::hash_a.a (from environment)
420
+ mod_a::hash_b:
421
+ a: value mod_a::hash_b.a (from environment)
422
+ hash_b:
423
+ hash_ba:
424
+ bab: value hash_b.hash_ba.bab (from environment)
425
+ hash_c:
426
+ hash_ca:
427
+ caa: value hash_c.hash_ca.caa (from environment)
428
+ lookup_options:
429
+ mod_a::hash_b:
430
+ merge: hash
431
+ hash_c:
432
+ merge: hash
433
+ YAML
434
+ }
179
435
  end
180
436
 
181
- it 'will propagate resolution_type :array to Hiera when merge == \'unique\'' do
182
- Hiera.any_instance.expects(:lookup).with('abc::c', anything, anything, anything, :array).returns(['global_c'])
183
- resources = assemble_and_compile('${r[0]}_${r[1]}_${r[2]}', "'abc::c'", 'Array[String]', "'unique'")
184
- expect(resources).to include('global_c_env_c_module_c')
437
+ it 'finds data in the environment' do
438
+ expect(lookup('a')).to eql('value a (from environment)')
185
439
  end
186
440
 
187
- it 'will propagate a Hash resolution_type with :behavior => :native to Hiera when merge == \'hash\'' do
188
- Hiera.any_instance.expects(:lookup).with('abc::e', anything, anything, anything, { :behavior => :native }).returns({ 'k1' => 'global_e1' })
189
- resources = assemble_and_compile('${r[k1]}_${r[k2]}_${r[k3]}', "'abc::e'", 'Hash[String,String]', "{strategy => 'hash'}")
190
- expect(resources).to include('global_e1_module_e2_env_e3')
441
+ context 'that has no lookup configured' do
442
+ let(:environment_files) do
443
+ {
444
+ env_name => {
445
+ 'data' => env_data
446
+ }
447
+ }
448
+ end
449
+
450
+ it 'does not find data in the environment' do
451
+ expect { lookup('a') }.to raise_error(Puppet::DataBinding::LookupError, /did not find a value for the name 'a'/)
452
+ end
453
+
454
+ context "but an environment.conf with 'environment_data_provider=hiera'" do
455
+ let(:environment_files) do
456
+ {
457
+ env_name => {
458
+ 'environment.conf' => "environment_data_provider=hiera\n",
459
+ 'data' => env_data
460
+ }
461
+ }
462
+ end
463
+
464
+ it 'finds data in the environment and reports deprecation warning for environment.conf' do
465
+ expect(lookup('a')).to eql('value a (from environment)')
466
+ expect(warnings).to include(/Defining environment_data_provider='hiera' in environment.conf is deprecated. A 'hiera.yaml' file should be used instead/)
467
+ end
468
+
469
+ context 'and a hiera.yaml file' do
470
+ let(:env_hiera_yaml) do
471
+ <<-YAML.unindent
472
+ ---
473
+ version: 4
474
+ hierarchy:
475
+ - name: common
476
+ backend: yaml
477
+ YAML
478
+ end
479
+
480
+ let(:environment_files) do
481
+ {
482
+ env_name => {
483
+ 'hiera.yaml' => env_hiera_yaml,
484
+ 'environment.conf' => "environment_data_provider=hiera\n",
485
+ 'data' => env_data
486
+ }
487
+ }
488
+ end
489
+
490
+ it 'finds data in the environment and reports deprecation warnings for both environment.conf and hiera.yaml' do
491
+ expect(lookup('a')).to eql('value a (from environment)')
492
+ expect(warnings).to include(/Defining environment_data_provider='hiera' in environment.conf is deprecated/)
493
+ expect(warnings).to include(/Use of 'hiera.yaml' version 4 is deprecated. It should be converted to version 5/)
494
+ end
495
+ end
496
+ end
497
+
498
+ context "but an environment.conf with 'environment_data_provider=function'" do
499
+ let(:environment_files) do
500
+ {
501
+ env_name => {
502
+ 'environment.conf' => "environment_data_provider=function\n",
503
+ 'functions' => {
504
+ 'environment' => { 'data.pp' => <<-PUPPET.unindent }
505
+ function environment::data() {
506
+ { 'a' => 'value a' }
507
+ }
508
+ PUPPET
509
+ }
510
+ }
511
+ }
512
+ end
513
+
514
+ it 'finds data in the environment and reports deprecation warning for environment.conf' do
515
+ expect(lookup('a')).to eql('value a')
516
+ expect(warnings).to include(/Defining environment_data_provider='function' in environment.conf is deprecated. A 'hiera.yaml' file should be used instead/)
517
+ expect(warnings).to include(/Using of legacy data provider function 'environment::data'. Please convert to a 'data_hash' function/)
518
+ end
519
+ end
191
520
  end
192
521
 
193
- it 'will propagate a Hash resolution_type with :behavior => :deeper to Hiera when merge == \'deep\'' do
194
- Hiera.any_instance.expects(:lookup).with('abc::f', anything, anything, anything, { :behavior => :deeper }).returns({ 'k1' => { 's1' => 'global_f11' }, 'k2' => { 's3' => 'global_f23' }})
195
- resources = assemble_and_compile('${r[k1][s1]}_${r[k1][s2]}_${r[k1][s3]}_${r[k2][s1]}_${r[k2][s2]}_${r[k2][s3]}', "'abc::f'", 'Hash[String,Hash[String,String]]', "'deep'")
196
- expect(resources).to include('global_f11_env_f12_module_f13_env_f21_module_f22_global_f23')
522
+ context 'that has interpolated paths configured' do
523
+ let(:env_hiera_yaml) do
524
+ <<-YAML.unindent
525
+ ---
526
+ version: 5
527
+ hierarchy:
528
+ - name: "Varying"
529
+ data_hash: yaml_data
530
+ path: "#{data_path}"
531
+ YAML
532
+ end
533
+
534
+ let(:environment_files) do
535
+ {
536
+ env_name => {
537
+ 'hiera.yaml' => env_hiera_yaml,
538
+ 'modules' => {},
539
+ 'data' => {
540
+ 'x.yaml' => <<-YAML.unindent,
541
+ y: value y from x
542
+ YAML
543
+ 'x_d.yaml' => <<-YAML.unindent,
544
+ y: value y from x_d
545
+ YAML
546
+ 'x_e.yaml' => <<-YAML.unindent,
547
+ y: value y from x_e
548
+ YAML
549
+ }
550
+ }
551
+ }
552
+ end
553
+
554
+ context 'using local variable reference' do
555
+ let(:data_path) { 'x%{var.sub}.yaml' }
556
+
557
+ it 'reloads the configuration if interpolated values change' do
558
+ Puppet[:log_level] = 'debug'
559
+ collect_notices("notice('success')") do |scope|
560
+ expect(lookup_func.call(scope, 'y')).to eql('value y from x')
561
+ scope['var'] = { 'sub' => '_d' }
562
+ expect(lookup_func.call(scope, 'y')).to eql('value y from x_d')
563
+ nested_scope = scope.compiler.newscope(scope)
564
+ nested_scope['var'] = { 'sub' => '_e' }
565
+ expect(lookup_func.call(nested_scope, 'y')).to eql('value y from x_e')
566
+ end
567
+ expect(notices).to eql(['success'])
568
+ expect(debugs.any? { |m| m =~ /Hiera configuration recreated due to change of scope variables used in interpolation expressions/ }).to be_truthy
569
+ end
570
+
571
+ it 'does not include the lookups performed during stability check in explain output' do
572
+ Puppet[:log_level] = 'debug'
573
+ collect_notices("notice('success')") do |scope|
574
+ var = { 'sub' => '_d' }
575
+ scope['var'] = var
576
+ expect(lookup_func.call(scope, 'y')).to eql('value y from x_d')
577
+
578
+ # Second call triggers the check
579
+ expect(lookup_func.call(scope, 'y')).to eql('value y from x_d')
580
+ end
581
+ expect(notices).to eql(['success'])
582
+ expect(debugs.any? { |m| m =~ /Sub key: "sub"/ }).to be_falsey
583
+ end
584
+ end
585
+
586
+ context 'using global variable reference' do
587
+ let(:data_path) { 'x%{::var.sub}.yaml' }
588
+
589
+ it 'reloads the configuration if interpolated that was previously undefined, gets defined' do
590
+ Puppet[:log_level] = 'debug'
591
+ collect_notices("notice('success')") do |scope|
592
+ expect(lookup_func.call(scope, 'y')).to eql('value y from x')
593
+ scope['var'] = { 'sub' => '_d' }
594
+ expect(lookup_func.call(scope, 'y')).to eql('value y from x_d')
595
+ end
596
+ expect(notices).to eql(['success'])
597
+ expect(debugs.any? { |m| m =~ /Hiera configuration recreated due to change of scope variables used in interpolation expressions/ }).to be_truthy
598
+ end
599
+
600
+ it 'does not reload the configuration if value changes locally' do
601
+ Puppet[:log_level] = 'debug'
602
+ collect_notices("notice('success')") do |scope|
603
+ scope['var'] = { 'sub' => '_d' }
604
+ expect(lookup_func.call(scope, 'y')).to eql('value y from x_d')
605
+ nested_scope = scope.compiler.newscope(scope)
606
+ nested_scope['var'] = { 'sub' => '_e' }
607
+ expect(lookup_func.call(nested_scope, 'y')).to eql('value y from x_d')
608
+ end
609
+ expect(notices).to eql(['success'])
610
+ expect(debugs.any? { |m| m =~ /Hiera configuration recreated due to change of scope variables used in interpolation expressions/ }).to be_falsey
611
+ end
612
+ end
197
613
  end
198
614
 
199
- it 'will propagate a Hash resolution_type with symbolic deep merge options to Hiera' do
200
- Hiera.any_instance.expects(:lookup).with('abc::f', anything, anything, anything, { :behavior => :deeper, :knockout_prefix => '--' }).returns({ 'k1' => { 's1' => 'global_f11' }, 'k2' => { 's3' => 'global_f23' }})
201
- resources = assemble_and_compile('${r[k1][s1]}_${r[k1][s2]}_${r[k1][s3]}_${r[k2][s1]}_${r[k2][s2]}_${r[k2][s3]}', "'abc::f'", 'Hash[String,Hash[String,String]]', "{ 'strategy' => 'deep', 'knockout_prefix' => '--' }")
202
- expect(resources).to include('global_f11_env_f12_module_f13_env_f21_module_f22_global_f23')
615
+ context 'that uses reserved' do
616
+ let(:environment_files) do
617
+ { env_name => { 'hiera.yaml' => hiera_yaml } }
618
+ end
619
+
620
+ context 'option' do
621
+ let(:hiera_yaml) { <<-YAML.unindent }
622
+ version: 5
623
+ hierarchy:
624
+ - name: "Illegal"
625
+ options:
626
+ #{opt_spec}
627
+ data_hash: yaml_data
628
+ YAML
629
+
630
+ context 'path' do
631
+ let(:opt_spec) { 'path: data/foo.yaml' }
632
+
633
+ it 'fails and reports the reserved option key' do
634
+ expect { lookup('a') }.to raise_error do |e|
635
+ expect(e.message).to match(/Option key 'path' used in hierarchy 'Illegal' is reserved by Puppet/)
636
+ end
637
+ end
638
+ end
639
+
640
+ context 'uri' do
641
+ let(:opt_spec) { 'uri: file:///data/foo.yaml' }
642
+
643
+ it 'fails and reports the reserved option key' do
644
+ expect { lookup('a') }.to raise_error do |e|
645
+ expect(e.message).to match(/Option key 'uri' used in hierarchy 'Illegal' is reserved by Puppet/)
646
+ end
647
+ end
648
+ end
649
+ end
650
+
651
+ context 'default option' do
652
+ let(:hiera_yaml) { <<-YAML.unindent }
653
+ ---
654
+ version: 5
655
+ defaults:
656
+ options:
657
+ #{opt_spec}
658
+ hierarchy:
659
+ - name: "Illegal"
660
+ data_hash: yaml_data
661
+ YAML
662
+
663
+ context 'path' do
664
+ let(:opt_spec) { 'path: data/foo.yaml' }
665
+
666
+ it 'fails and reports the reserved option key' do
667
+ expect { lookup('a') }.to raise_error do |e|
668
+ expect(e.message).to match(/Option key 'path' used in defaults is reserved by Puppet/)
669
+ end
670
+ end
671
+ end
672
+
673
+ context 'uri' do
674
+ let(:opt_spec) { 'uri: file:///data/foo.yaml' }
675
+
676
+ it 'fails and reports the reserved option key' do
677
+ expect { lookup('a') }.to raise_error do |e|
678
+ expect(e.message).to match(/Option key 'uri' used in defaults is reserved by Puppet/)
679
+ end
680
+ end
681
+ end
682
+ end
203
683
  end
204
684
 
205
- context 'with provided default' do
206
- it 'will return default when lookup fails' do
207
- resources = assemble_and_compile('${r}', "'abc::x'", 'String', 'undef', "'dflt_x'")
208
- expect(resources).to include('dflt_x')
685
+ context 'with yaml data file' do
686
+ let(:environment_files) do
687
+ {
688
+ env_name => {
689
+ 'hiera.yaml' => <<-YAML.unindent,
690
+ ---
691
+ version: 5
692
+ YAML
693
+ 'data' => {
694
+ 'common.yaml' => common_yaml
695
+ }
696
+ }
697
+ }
698
+ end
699
+
700
+ context 'that contains hash values with interpolated keys' do
701
+ let(:common_yaml) do
702
+ <<-YAML.unindent
703
+ ---
704
+ a:
705
+ "%{key}": "the %{value}"
706
+ b: "Detail in %{lookup('a.a_key')}"
707
+ YAML
708
+ end
709
+
710
+ it 'interpolates both key and value"' do
711
+ Puppet[:log_level] = 'debug'
712
+ collect_notices("notice('success')") do |scope|
713
+ expect(lookup_func.call(scope, 'a')).to eql({'' => 'the '})
714
+ scope['key'] = 'a_key'
715
+ scope['value'] = 'interpolated value'
716
+ expect(lookup_func.call(scope, 'a')).to eql({'a_key' => 'the interpolated value'})
717
+ end
718
+ expect(notices).to eql(['success'])
719
+ end
720
+
721
+ it 'navigates to a value behind an interpolated key"' do
722
+ Puppet[:log_level] = 'debug'
723
+ collect_notices("notice('success')") do |scope|
724
+ scope['key'] = 'a_key'
725
+ scope['value'] = 'interpolated value'
726
+ expect(lookup_func.call(scope, 'a.a_key')).to eql('the interpolated value')
727
+ end
728
+ expect(notices).to eql(['success'])
729
+ end
730
+
731
+ it 'navigates to a value behind an interpolated key using an interpolated value"' do
732
+ Puppet[:log_level] = 'debug'
733
+ collect_notices("notice('success')") do |scope|
734
+ scope['key'] = 'a_key'
735
+ scope['value'] = 'interpolated value'
736
+ expect(lookup_func.call(scope, 'b')).to eql('Detail in the interpolated value')
737
+ end
738
+ expect(notices).to eql(['success'])
739
+ end
209
740
  end
210
741
 
211
- it 'can precede default parameter with undef as the value_type and undef as the merge type' do
212
- resources = assemble_and_compile('${r}', "'abc::x'", 'undef', 'undef', "'dflt_x'")
213
- expect(resources).to include('dflt_x')
742
+ context 'that is empty' do
743
+ let(:common_yaml) { '' }
744
+
745
+ it 'fails with a "did not find"' do
746
+ expect { lookup('a') }.to raise_error do |e|
747
+ expect(e.message).to match(/did not find a value for the name 'a'/)
748
+ end
749
+ end
750
+
751
+ it 'logs a warning that the file does not contain a hash' do
752
+ expect { lookup('a') }.to raise_error(Puppet::DataBinding::LookupError)
753
+ expect(warnings).to include(/spec\/data\/common.yaml: file does not contain a valid yaml hash/)
754
+ end
755
+ end
756
+
757
+ context 'that contains illegal yaml' do
758
+ let(:common_yaml) { "@!#%**&:\n" }
759
+
760
+ it 'fails lookup and that the key is not found' do
761
+ expect { lookup('a') }.to raise_error do |e|
762
+ expect(e.message).to match(/Unable to parse/)
763
+ end
764
+ end
214
765
  end
215
766
 
216
- it 'can use array' do
217
- resources = assemble_and_compile('${r[0]}_${r[1]}', "'abc::x'", 'Array[String]', 'undef', "['dflt_x', 'dflt_y']")
218
- expect(resources).to include('dflt_x_dflt_y')
767
+ context 'that contains a legal yaml that is not a hash' do
768
+ let(:common_yaml) { "- A list\n- of things" }
769
+
770
+ it 'fails with a "did not find"' do
771
+ expect { lookup('a') }.to raise_error do |e|
772
+ expect(e.message).to match(/did not find a value for the name 'a'/)
773
+ end
774
+ end
775
+
776
+ it 'logs a warning that the file does not contain a hash' do
777
+ expect { lookup('a') }.to raise_error(Puppet::DataBinding::LookupError)
778
+ expect(warnings).to include(/spec\/data\/common.yaml: file does not contain a valid yaml hash/)
779
+ end
219
780
  end
220
781
 
221
- it 'can use hash' do
222
- resources = assemble_and_compile('${r[a]}_${r[b]}', "'abc::x'", 'Hash[String,String]', 'undef', "{'a' => 'dflt_x', 'b' => 'dflt_y'}")
223
- expect(resources).to include('dflt_x_dflt_y')
782
+ context 'that contains a legal yaml hash with illegal types' do
783
+ let(:common_yaml) do
784
+ <<-YAML.unindent
785
+ ---
786
+ a: !ruby/object:Puppet::Graph::Key
787
+ value: x
788
+ YAML
789
+ end
790
+
791
+ it 'fails lookup and reports a type mismatch' do
792
+ expect { lookup('a') }.to raise_error do |e|
793
+ expect(e.message).to match(/key 'a'.*data_hash function 'yaml_data'.*using location.*wrong type, expects Puppet::LookupValue, got Runtime/)
794
+ end
795
+ end
224
796
  end
225
797
 
226
- it 'fails unless default is an instance of value_type' do
227
- expect do
228
- assemble_and_compile('${r[a]}_${r[b]}', "'abc::x'", 'Hash[String,String]', 'undef', "{'a' => 'dflt_x', 'b' => 32}")
229
- end.to raise_error(Puppet::ParseError, /default_value value has wrong type/)
798
+ context 'that contains illegal interpolations' do
799
+ context 'in the form of an alias that is not the entire string' do
800
+ let(:common_yaml) { <<-YAML.unindent }
801
+ a: "%{alias('x')} and then some"
802
+ x: value x
803
+ YAML
804
+
805
+ it 'fails lookup and reports a type mismatch' do
806
+ expect { lookup('a') }.to raise_error("'alias' interpolation is only permitted if the expression is equal to the entire string")
807
+ end
808
+ end
809
+
810
+ context 'in the form of an unknown function name' do
811
+ let(:common_yaml) { <<-YAML.unindent }
812
+ a: "%{what('x')}"
813
+ x: value x
814
+ YAML
815
+
816
+ it 'fails lookup and reports a type mismatch' do
817
+ expect { lookup('a') }.to raise_error("Unknown interpolation method 'what'")
818
+ end
819
+ end
230
820
  end
231
821
  end
232
822
 
233
- context 'with a default block' do
234
- it 'will be called when lookup fails' do
235
- resources = assemble_and_compile_with_block('${r}', "'dflt_x'", "'abc::x'")
236
- expect(resources).to include('dflt_x')
823
+ context 'with lookup_options configured using patterns' do
824
+ let(:mod_common) {
825
+ <<-YAML.unindent
826
+ mod::hash_a:
827
+ aa:
828
+ aaa: aaa (from module)
829
+ ab:
830
+ aba: aba (from module)
831
+ mod::hash_b:
832
+ ba:
833
+ baa: baa (from module)
834
+ bb:
835
+ bba: bba (from module)
836
+ lookup_options:
837
+ '^mod::ha.*_a':
838
+ merge: deep
839
+ '^mod::ha.*_b':
840
+ merge: deep
841
+ YAML
842
+ }
843
+
844
+ let(:mod_base) do
845
+ {
846
+ 'hiera.yaml' => <<-YAML.unindent,
847
+ version: 5
848
+ YAML
849
+ 'data' => {
850
+ 'common.yaml' => mod_common
851
+ }
852
+ }
237
853
  end
238
854
 
239
- it 'will not called when lookup succeeds but the found value is nil' do
240
- resources = assemble_and_compile_with_block('${r}', "'dflt_x'", "'abc::n'")
241
- expect(resources).to include('no_value')
855
+ let(:env_modules) do
856
+ {
857
+ 'mod' => mod_base
858
+ }
242
859
  end
243
860
 
244
- it 'can use array' do
245
- resources = assemble_and_compile_with_block('${r[0]}_${r[1]}', "['dflt_x', 'dflt_y']", "'abc::x'")
246
- expect(resources).to include('dflt_x_dflt_y')
861
+ let(:env_hiera_yaml) do
862
+ <<-YAML.unindent
863
+ ---
864
+ version: 5
865
+ hierarchy:
866
+ - name: X
867
+ paths:
868
+ - first.yaml
869
+ - second.yaml
870
+ YAML
247
871
  end
248
872
 
249
- it 'can use hash' do
250
- resources = assemble_and_compile_with_block('${r[a]}_${r[b]}', "{'a' => 'dflt_x', 'b' => 'dflt_y'}", "'abc::x'")
251
- expect(resources).to include('dflt_x_dflt_y')
873
+ let(:env_lookup_options) { <<-YAML.unindent }
874
+ lookup_options:
875
+ b:
876
+ merge: hash
877
+ '^[^b]$':
878
+ merge: deep
879
+ '^c':
880
+ merge: first
881
+ '^b':
882
+ merge: first
883
+ '^mod::ha.*_b':
884
+ merge: hash
885
+ YAML
886
+
887
+ let(:env_data) do
888
+ {
889
+ 'first.yaml' => <<-YAML.unindent + env_lookup_options,
890
+ a:
891
+ aa:
892
+ aaa: a.aa.aaa
893
+ b:
894
+ ba:
895
+ baa: b.ba.baa
896
+ bb:
897
+ bba: b.bb.bba
898
+ c:
899
+ ca:
900
+ caa: c.ca.caa
901
+ mod::hash_a:
902
+ aa:
903
+ aab: aab (from environment)
904
+ ab:
905
+ aba: aba (from environment)
906
+ abb: abb (from environment)
907
+ mod::hash_b:
908
+ ba:
909
+ bab: bab (from environment)
910
+ bc:
911
+ bca: bca (from environment)
912
+ YAML
913
+ 'second.yaml' => <<-YAML.unindent,
914
+ a:
915
+ aa:
916
+ aab: a.aa.aab
917
+ b:
918
+ ba:
919
+ bab: b.ba.bab
920
+ bb:
921
+ bbb: b.bb.bbb
922
+ c:
923
+ ca:
924
+ cab: c.ca.cab
925
+ YAML
926
+ }
252
927
  end
253
928
 
254
- it 'can return undef from block' do
255
- resources = assemble_and_compile_with_block('${r}', 'undef', "'abc::x'")
256
- expect(resources).to include('no_value')
929
+ it 'finds lookup_options that matches a pattern' do
930
+ expect(lookup('a')).to eql({'aa' => { 'aaa' => 'a.aa.aaa', 'aab' => 'a.aa.aab' }})
257
931
  end
258
932
 
259
- it 'fails unless block returns an instance of value_type' do
260
- expect do
261
- assemble_and_compile_with_block('${r[a]}_${r[b]}', "{'a' => 'dflt_x', 'b' => 32}", "'abc::x'", 'Hash[String,String]')
262
- end.to raise_error(Puppet::ParseError, /default_block value has wrong type/)
933
+ it 'gives a direct key match higher priority than a matching pattern' do
934
+ expect(lookup('b')).to eql({'ba' => { 'baa' => 'b.ba.baa' }, 'bb' => { 'bba'=>'b.bb.bba' }})
263
935
  end
264
936
 
265
- it 'receives a single name parameter' do
266
- resources = assemble_and_compile_with_block('${r}', 'true', "'name_x'")
267
- expect(resources).to include('name_x')
937
+ it 'uses the first matching pattern' do
938
+ expect(lookup('c')).to eql({'ca' => { 'caa' => 'c.ca.caa', 'cab' => 'c.ca.cab' }})
268
939
  end
269
940
 
270
- it 'receives an array name parameter' do
271
- resources = assemble_and_compile_with_block('${r[0]}_${r[1]}', 'true', "['name_x', 'name_y']")
272
- expect(resources).to include('name_x_name_y')
941
+ it 'uses lookup_option found by pattern from module' do
942
+ expect(lookup('mod::hash_a')).to eql({
943
+ 'aa' => {
944
+ 'aaa' => 'aaa (from module)',
945
+ 'aab' => 'aab (from environment)'
946
+ },
947
+ 'ab' => {
948
+ 'aba' => 'aba (from environment)',
949
+ 'abb' => 'abb (from environment)'
950
+ }
951
+ })
273
952
  end
274
- end
275
- end
276
953
 
277
- context 'when passing a hash as the only parameter' do
278
- it 'can pass a single name correctly' do
279
- resources = assemble_and_compile('${r}', "{name => 'abc::a'}")
280
- expect(resources).to include('env_a')
281
- end
954
+ it 'merges lookup_options found by pattern in environment and module (environment wins)' do
955
+ expect(lookup('mod::hash_b')).to eql({
956
+ 'ba' => {
957
+ 'bab' => 'bab (from environment)'
958
+ },
959
+ 'bb' => {
960
+ 'bba' => 'bba (from module)'
961
+ },
962
+ 'bc' => {
963
+ 'bca' => 'bca (from environment)'
964
+ }
965
+ })
966
+ end
282
967
 
283
- it 'can pass a an array of names correctly' do
284
- resources = assemble_and_compile('${r}', "{name => ['abc::b', 'abc::a']}")
285
- expect(resources).to include('module_b')
286
- end
968
+ context 'and patterns in module are not limited to module keys' do
969
+ let(:mod_common) {
970
+ <<-YAML.unindent
971
+ mod::hash_a:
972
+ aa:
973
+ aaa: aaa (from module)
974
+ ab:
975
+ aba: aba (from module)
976
+ lookup_options:
977
+ '^.*_a':
978
+ merge: deep
979
+ YAML
980
+ }
287
981
 
288
- it 'can pass an override map and find values there even though they would be found' do
289
- resources = assemble_and_compile('${r}', "{name => 'abc::a', override => { abc::a => 'override_a'}}")
290
- expect(resources).to include('override_a')
291
- end
982
+ it 'fails with error' do
983
+ expect { lookup('mod::a') }.to raise_error(Puppet::DataBinding::LookupError, /all lookup_options patterns must match a key starting with module name/)
984
+ end
985
+ end
292
986
 
293
- it 'can pass an default_values_hash and find values there correctly' do
294
- resources = assemble_and_compile('${r}', "{name => 'abc::x', default_values_hash => { abc::x => 'extra_x'}}")
295
- expect(resources).to include('extra_x')
296
- end
987
+ context 'and there are no lookup options that do not use patterns' do
297
988
 
298
- it 'can pass an default_values_hash but not use it when value is found elsewhere' do
299
- resources = assemble_and_compile('${r}', "{name => 'abc::a', default_values_hash => { abc::a => 'extra_a'}}")
300
- expect(resources).to include('env_a')
301
- end
989
+ let(:env_lookup_options) { <<-YAML.unindent }
990
+ lookup_options:
991
+ '^[^b]$':
992
+ merge: deep
993
+ '^c':
994
+ merge: first
995
+ '^b':
996
+ merge: first
997
+ '^mod::ha.*_b':
998
+ merge: hash
999
+ YAML
302
1000
 
303
- it 'can pass an default_values_hash but not use it when value is found elsewhere even when found value is undef' do
304
- resources = assemble_and_compile('${r}', "{name => 'abc::n', default_values_hash => { abc::n => 'extra_n'}}")
305
- expect(resources).to include('no_value')
1001
+ it 'finds lookup_options that matches a pattern' do
1002
+ expect(lookup('a')).to eql({'aa' => { 'aaa' => 'a.aa.aaa', 'aab' => 'a.aa.aab' }})
1003
+ end
1004
+ end
306
1005
  end
307
1006
 
308
- it 'can pass an override and an default_values_hash and find the override value' do
309
- resources = assemble_and_compile('${r}', "{name => 'abc::x', override => { abc::x => 'override_x'}, default_values_hash => { abc::x => 'extra_x'}}")
310
- expect(resources).to include('override_x')
1007
+ context 'and an environment Hiera v5 configuration using globs' do
1008
+ let(:env_hiera_yaml) do
1009
+ <<-YAML.unindent
1010
+ ---
1011
+ version: 5
1012
+ hierarchy:
1013
+ - name: Globs
1014
+ globs:
1015
+ - "globs/*.yaml"
1016
+ - "globs_%{domain}/*.yaml"
1017
+ YAML
1018
+ end
1019
+
1020
+ let(:env_data) do
1021
+ {
1022
+ 'globs' => {
1023
+ 'a.yaml' => <<-YAML.unindent,
1024
+ glob_a: value glob_a
1025
+ YAML
1026
+ 'b.yaml' => <<-YAML.unindent
1027
+ glob_b:
1028
+ a: value glob_b.a
1029
+ b: value glob_b.b
1030
+ YAML
1031
+ },
1032
+ 'globs_example.com' => {
1033
+ 'a.yaml' => <<-YAML.unindent,
1034
+ glob_c: value glob_a
1035
+ YAML
1036
+ 'b.yaml' => <<-YAML.unindent
1037
+ glob_b:
1038
+ c: value glob_b.c
1039
+ d: value glob_b.d
1040
+ YAML
1041
+
1042
+ }
1043
+ }
1044
+ end
311
1045
  end
312
1046
 
313
- it 'will raise an exception when value is not found for single key and no default is provided' do
314
- expect do
315
- assemble_and_compile('${r}', "{name => 'abc::x'}")
316
- end.to raise_error(Puppet::ParseError, /did not find a value for the name 'abc::x'/)
1047
+ context 'and an environment Hiera v5 configuration using mapped_paths' do
1048
+ let(:scope_additions) do
1049
+ {
1050
+ 'mapped' => {
1051
+ 'array_var' => ['a', 'b', 'c'],
1052
+ 'hash_var' => { 'x' => 'a', 'y' => 'b', 'z' => 'c' },
1053
+ 'string_var' => 's' },
1054
+ 'var' => 'global_var' # overridden by mapped path variable
1055
+ }
1056
+ end
1057
+
1058
+ let(:env_hiera_yaml) do
1059
+ <<-YAML.unindent
1060
+ ---
1061
+ version: 5
1062
+ hierarchy:
1063
+ - name: Mapped Paths
1064
+ mapped_paths: #{mapped_paths}
1065
+ - name: Global Path
1066
+ path: "%{var}.yaml"
1067
+ YAML
1068
+ end
1069
+
1070
+ let(:environment_files) do
1071
+ {
1072
+ env_name => {
1073
+ 'hiera.yaml' => env_hiera_yaml,
1074
+ 'data' => env_data
1075
+ }
1076
+ }
1077
+ end
1078
+
1079
+ context 'that originates from an array' do
1080
+ let (:mapped_paths) { '[mapped.array_var, var, "paths/%{var}.yaml"]' }
1081
+
1082
+ let(:env_data) do
1083
+ {
1084
+ 'paths' => {
1085
+ 'a.yaml' => <<-YAML.unindent,
1086
+ path_a: value path_a
1087
+ path_h:
1088
+ a: value path_h.a
1089
+ c: value path_h.c
1090
+ YAML
1091
+ 'b.yaml' => <<-YAML.unindent,
1092
+ path_h:
1093
+ b: value path_h.b
1094
+ d: value path_h.d
1095
+ YAML
1096
+ 'd.yaml' => <<-YAML.unindent
1097
+ path_h:
1098
+ b: value path_h.b (from d.yaml)
1099
+ d: value path_h.d (from d.yaml)
1100
+ YAML
1101
+ },
1102
+ 'global_var.yaml' => <<-YAML.unindent,
1103
+ path_h:
1104
+ e: value path_h.e
1105
+ YAML
1106
+ 'other_var.yaml' => <<-YAML.unindent
1107
+ path_h:
1108
+ e: value path_h.e (from other_var.yaml)
1109
+ YAML
1110
+ }
1111
+ end
1112
+
1113
+ it 'finds environment data using mapped_paths' do
1114
+ expect(lookup('path_a')).to eql('value path_a')
1115
+ expect(warnings).to be_empty
1116
+ end
1117
+
1118
+ it 'includes mapped path in explain output' do
1119
+ explanation = explain('path_h', 'merge' => 'deep')
1120
+ ['a', 'b', 'c'].each do |var|
1121
+ expect(explanation).to match(/^\s+Path "#{env_dir}\/spec\/data\/paths\/#{var}\.yaml"\n\s+Original path: "paths\/%\{var\}\.yaml"/)
1122
+ end
1123
+ expect(warnings).to be_empty
1124
+ end
1125
+
1126
+ it 'performs merges between mapped paths and global path interpolated using same key' do
1127
+ expect(lookup('path_h', 'merge' => 'hash')).to eql(
1128
+ {
1129
+ 'a' => 'value path_h.a',
1130
+ 'b' => 'value path_h.b',
1131
+ 'c' => 'value path_h.c',
1132
+ 'd' => 'value path_h.d',
1133
+ 'e' => 'value path_h.e'
1134
+ })
1135
+ expect(warnings).to be_empty
1136
+ end
1137
+
1138
+ it 'keeps track of changes in key overridden by interpolated key' do
1139
+ Puppet[:log_level] = 'debug'
1140
+ collect_notices("notice('success')") do |scope|
1141
+ expect(lookup_func.call(scope, 'path_h', 'merge' => 'hash')).to eql(
1142
+ {
1143
+ 'a' => 'value path_h.a',
1144
+ 'b' => 'value path_h.b',
1145
+ 'c' => 'value path_h.c',
1146
+ 'd' => 'value path_h.d',
1147
+ 'e' => 'value path_h.e'
1148
+ })
1149
+ scope.with_local_scope('var' => 'other_var') do
1150
+ expect(lookup_func.call(scope, 'path_h', 'merge' => 'hash')).to eql(
1151
+ {
1152
+ 'a' => 'value path_h.a',
1153
+ 'b' => 'value path_h.b',
1154
+ 'c' => 'value path_h.c',
1155
+ 'd' => 'value path_h.d',
1156
+ 'e' => 'value path_h.e (from other_var.yaml)'
1157
+ })
1158
+ end
1159
+ end
1160
+ expect(notices).to eql(['success'])
1161
+ expect(debugs.any? { |m| m =~ /Hiera configuration recreated due to change of scope variables used in interpolation expressions/ }).to be_truthy
1162
+ end
1163
+
1164
+ it 'keeps track of changes in elements of mapped key' do
1165
+ Puppet[:log_level] = 'debug'
1166
+ collect_notices("notice('success')") do |scope|
1167
+ expect(lookup_func.call(scope, 'path_h', 'merge' => 'hash')).to eql(
1168
+ {
1169
+ 'a' => 'value path_h.a',
1170
+ 'b' => 'value path_h.b',
1171
+ 'c' => 'value path_h.c',
1172
+ 'd' => 'value path_h.d',
1173
+ 'e' => 'value path_h.e'
1174
+ })
1175
+ scope['mapped']['array_var'] = ['a', 'c', 'd']
1176
+ expect(lookup_func.call(scope, 'path_h', 'merge' => 'hash')).to eql(
1177
+ {
1178
+ 'a' => 'value path_h.a',
1179
+ 'b' => 'value path_h.b (from d.yaml)',
1180
+ 'c' => 'value path_h.c',
1181
+ 'd' => 'value path_h.d (from d.yaml)',
1182
+ 'e' => 'value path_h.e'
1183
+ })
1184
+ end
1185
+ expect(notices).to eql(['success'])
1186
+ expect(debugs.any? { |m| m =~ /Hiera configuration recreated due to change of scope variables used in interpolation expressions/ }).to be_truthy
1187
+ end
1188
+ end
1189
+
1190
+ context 'that originates from a hash' do
1191
+ let (:mapped_paths) { '[mapped.hash_var, var, "paths/%{var.0}.%{var.1}.yaml"]' }
1192
+
1193
+ let(:env_data) do
1194
+ {
1195
+ 'paths' => {
1196
+ 'x.a.yaml' => <<-YAML.unindent,
1197
+ path_xa: value path_xa
1198
+ path_m:
1199
+ a: value path_m.a
1200
+ c: value path_m.c
1201
+ YAML
1202
+ 'y.b.yaml' => <<-YAML.unindent
1203
+ path_m:
1204
+ b: value path_m.b
1205
+ d: value path_m.d
1206
+ YAML
1207
+ },
1208
+ 'global_var.yaml' => <<-YAML.unindent
1209
+ path_m:
1210
+ e: value path_m.e
1211
+ YAML
1212
+ }
1213
+ end
1214
+
1215
+ it 'finds environment data using mapped_paths' do
1216
+ expect(lookup('path_xa')).to eql('value path_xa')
1217
+ expect(warnings).to be_empty
1218
+ end
1219
+
1220
+ it 'includes mapped path in explain output' do
1221
+ explanation = explain('path_h', 'merge' => 'deep')
1222
+ ['x\.a', 'y\.b', 'z\.c'].each do |var|
1223
+ expect(explanation).to match(/^\s+Path "#{env_dir}\/spec\/data\/paths\/#{var}\.yaml"\n\s+Original path: "paths\/%\{var\.0\}\.%\{var\.1\}\.yaml"/)
1224
+ end
1225
+ expect(warnings).to be_empty
1226
+ end
1227
+
1228
+ it 'performs merges between mapped paths' do
1229
+ expect(lookup('path_m', 'merge' => 'hash')).to eql(
1230
+ {
1231
+ 'a' => 'value path_m.a',
1232
+ 'b' => 'value path_m.b',
1233
+ 'c' => 'value path_m.c',
1234
+ 'd' => 'value path_m.d',
1235
+ 'e' => 'value path_m.e'
1236
+ })
1237
+ expect(warnings).to be_empty
1238
+ end
1239
+ end
1240
+
1241
+ context 'that originates from a string' do
1242
+ let (:mapped_paths) { '[mapped.string_var, var, "paths/%{var}.yaml"]' }
1243
+
1244
+ let(:env_data) do
1245
+ {
1246
+ 'paths' => {
1247
+ 's.yaml' => <<-YAML.unindent,
1248
+ path_s: value path_s
1249
+ YAML
1250
+ }
1251
+ }
1252
+ end
1253
+
1254
+ it 'includes mapped path in explain output' do
1255
+ expect(explain('path_s')).to match(/^\s+Path "#{env_dir}\/spec\/data\/paths\/s\.yaml"\n\s+Original path: "paths\/%\{var\}\.yaml"/)
1256
+ expect(warnings).to be_empty
1257
+ end
1258
+
1259
+ it 'finds environment data using mapped_paths' do
1260
+ expect(lookup('path_s')).to eql('value path_s')
1261
+ expect(warnings).to be_empty
1262
+ end
1263
+ end
1264
+
1265
+ context 'where the enty does not exist' do
1266
+ let (:mapped_paths) { '[mapped.nosuch_var, var, "paths/%{var}.yaml"]' }
1267
+
1268
+ it 'finds environment data using mapped_paths' do
1269
+ expect(explain('hello')).to match(/No such key: "hello"/)
1270
+ expect(warnings).to be_empty
1271
+ end
1272
+ end
317
1273
  end
318
1274
 
319
- it 'will not raise an exception when value is not found default value is nil' do
320
- resources = assemble_and_compile('${r}', "{name => 'abc::x', default_value => undef}")
321
- expect(resources).to include('no_value')
1275
+ context 'and an environment Hiera v3 configuration' do
1276
+ let(:env_hiera_yaml) do
1277
+ <<-YAML.unindent
1278
+ ---
1279
+ :backends: yaml
1280
+ :yaml:
1281
+ :datadir: #{env_dir}/#{env_name}/hieradata
1282
+ YAML
1283
+ end
1284
+
1285
+ let(:environment_files) do
1286
+ {
1287
+ env_name => {
1288
+ 'hiera.yaml' => env_hiera_yaml,
1289
+ 'hieradata' => {
1290
+ 'common.yaml' => <<-YAML.unindent,
1291
+ g: Value g
1292
+ YAML
1293
+ }
1294
+ }
1295
+ }
1296
+ end
1297
+
1298
+ it 'will raise an error if --strict is set to error' do
1299
+ Puppet[:strict] = :error
1300
+ expect { lookup('g') }.to raise_error(Puppet::Error, /hiera.yaml version 3 cannot be used in an environment/)
1301
+ end
1302
+
1303
+ it 'will log a warning and ignore the file if --strict is set to warning' do
1304
+ Puppet[:strict] = :warning
1305
+ expect { lookup('g') }.to raise_error(Puppet::Error, /did not find a value for the name 'g'/)
1306
+ end
1307
+
1308
+ it 'will not log a warning and ignore the file if --strict is set to off' do
1309
+ Puppet[:strict] = :off
1310
+ expect { lookup('g') }.to raise_error(Puppet::Error, /did not find a value for the name 'g'/)
1311
+ expect(warnings).to include(/hiera.yaml version 3 found at the environment root was ignored/)
1312
+ end
1313
+
1314
+ it 'will use the configuration if appointed by global setting but still warn when encountered by environment data provider' do
1315
+ Puppet[:strict] = :warning
1316
+ Puppet.settings[:hiera_config] = File.join(env_dir, env_name, 'hiera.yaml')
1317
+ expect(lookup('g')).to eql('Value g')
1318
+ expect(warnings).to include(/hiera.yaml version 3 found at the environment root was ignored/)
1319
+ end
322
1320
  end
323
- end
324
1321
 
325
- context 'when accessing from outside a module' do
326
- it 'will raise an exception when key in the function provided module data is not prefixed' do
327
- Puppet[:code] = "include bad_data\nlookup(bad_data::b)"
328
- expect do
329
- compiler.compile()
330
- end.to raise_error(Puppet::ParseError, /data for module 'bad_data' must use keys qualified with the name of the module/)
1322
+ context 'and a global empty Hiera configuration' do
1323
+ let(:hiera_yaml_path) { File.join(code_dir, 'hiera.yaml') }
1324
+ let(:code_dir_files) do
1325
+ {
1326
+ 'hiera.yaml' => '',
1327
+ }
1328
+ end
1329
+
1330
+ let(:environment_files) do
1331
+ {
1332
+ env_name => {
1333
+ 'hieradata' => {
1334
+ 'common.yaml' => <<-YAML.unindent,
1335
+ x: value x (from environment)
1336
+ YAML
1337
+ }
1338
+ }
1339
+ }
1340
+ end
1341
+
1342
+ before(:each) do
1343
+ # Need to set here since spec_helper defines these settings in its "before each"
1344
+ Puppet.settings[:hiera_config] = hiera_yaml_path
1345
+ end
1346
+
1347
+ it 'uses a Hiera version 3 defaults' do
1348
+ expect(lookup('x')).to eql('value x (from environment)')
1349
+ end
1350
+
1351
+ context 'obtained using /dev/null', :unless => Puppet.features.microsoft_windows? do
1352
+ let(:code_dir_files) { {} }
1353
+
1354
+ it 'uses a Hiera version 3 defaults' do
1355
+ Puppet[:hiera_config] = '/dev/null'
1356
+ expect(lookup('x')).to eql('value x (from environment)')
1357
+ end
1358
+ end
331
1359
  end
332
1360
 
333
- it 'will resolve global, environment, and module correctly' do
334
- Hiera.any_instance.expects(:lookup).with('bca::e', any_parameters).returns({ 'k1' => 'global_e1' })
335
- Puppet[:code] = <<-END.gsub(/^ {8}/, '')
336
- include bca
337
- $r = lookup(bca::e, Hash[String,String], hash)
338
- notify { "${r[k1]}_${r[k2]}_${r[k3]}": }
339
- END
340
- resources = compiler.compile().resources.map(&:ref).select { |r| r.start_with?('Notify[') }.map { |r| r[7..-2] }
341
- expect(resources).to include('global_e1_module_bca_e2_env_bca_e3')
1361
+ context 'and a global configuration' do
1362
+ let(:hiera_yaml) do
1363
+ <<-YAML.unindent
1364
+ ---
1365
+ :backends:
1366
+ - yaml
1367
+ - json
1368
+ - custom
1369
+ - hocon
1370
+ :yaml:
1371
+ :datadir: #{code_dir}/hieradata
1372
+ :json:
1373
+ :datadir: #{code_dir}/hieradata
1374
+ :hocon:
1375
+ :datadir: #{code_dir}/hieradata
1376
+ :hierarchy:
1377
+ - common
1378
+ - "%{domain}"
1379
+ :merge_behavior: deeper
1380
+ YAML
1381
+ end
1382
+
1383
+ let(:code_dir_files) do
1384
+ {
1385
+ 'hiera.yaml' => hiera_yaml,
1386
+ 'hieradata' => {
1387
+ 'common.yaml' => <<-YAML.unindent,
1388
+ a: value a (from global)
1389
+ hash_b:
1390
+ hash_ba:
1391
+ bab: value hash_b.hash_ba.bab (from global)
1392
+ hash_c:
1393
+ hash_ca:
1394
+ cab: value hash_c.hash_ca.cab (from global)
1395
+ ipl_hiera_env: "environment value '%{hiera('mod_a::hash_a.a')}'"
1396
+ ipl_hiera_mod: "module value '%{hiera('mod_a::abc')}'"
1397
+ ipl_hiera_modc: "module value '%{hiera('mod_a::caller')}'"
1398
+ YAML
1399
+ 'example.com.yaml' => <<-YAML.unindent,
1400
+ x: value x (from global example.com.yaml)
1401
+ YAML
1402
+ 'common.json' => <<-JSON.unindent,
1403
+ {
1404
+ "hash_b": {
1405
+ "hash_ba": {
1406
+ "bac": "value hash_b.hash_ba.bac (from global json)"
1407
+ }
1408
+ },
1409
+ "hash_c": {
1410
+ "hash_ca": {
1411
+ "cac": "value hash_c.hash_ca.cac (from global json)"
1412
+ }
1413
+ }
1414
+ }
1415
+ JSON
1416
+ 'common.conf' => <<-HOCON.unindent,
1417
+ // The 'xs' is a value used for testing
1418
+ xs = { subkey = value xs.subkey (from global hocon) }
1419
+ HOCON
1420
+ }
1421
+ }
1422
+ end
1423
+
1424
+ let(:ruby_dir_files) do
1425
+ {
1426
+ 'hiera' => {
1427
+ 'backend' => {
1428
+ 'custom_backend.rb' => <<-RUBY.unindent,
1429
+ class Hiera::Backend::Custom_backend
1430
+ def lookup(key, scope, order_override, resolution_type, context)
1431
+ case key
1432
+ when 'hash_c'
1433
+ { 'hash_ca' => { 'cad' => 'value hash_c.hash_ca.cad (from global custom)' }}
1434
+ when 'hash'
1435
+ { 'array' => [ 'x5,x6' ] }
1436
+ when 'array'
1437
+ [ 'x5,x6' ]
1438
+ when 'datasources'
1439
+ Hiera::Backend.datasources(scope, order_override) { |source| source }
1440
+ when 'dotted.key'
1441
+ 'custom backend received request for dotted.key value'
1442
+ else
1443
+ throw :no_such_key
1444
+ end
1445
+ end
1446
+ end
1447
+ RUBY
1448
+ 'other_backend.rb' => <<-RUBY.unindent,
1449
+ class Hiera::Backend::Other_backend
1450
+ def lookup(key, scope, order_override, resolution_type, context)
1451
+ value = Hiera::Config[:other][key.to_sym]
1452
+ throw :no_such_key if value.nil?
1453
+ value
1454
+ end
1455
+ end
1456
+ RUBY
1457
+ }
1458
+ }
1459
+ }
1460
+ end
1461
+
1462
+ before(:each) do
1463
+ # Need to set here since spec_helper defines these settings in its "before each"
1464
+ Puppet.settings[:codedir] = populated_code_dir
1465
+ Puppet.settings[:hiera_config] = File.join(code_dir, 'hiera.yaml')
1466
+ end
1467
+
1468
+ around(:each) do |example|
1469
+ # Faking the load path to enable 'require' to load from 'ruby_stuff'. It removes the need for a static fixture
1470
+ # for the custom backend
1471
+ $LOAD_PATH.unshift(populated_ruby_dir)
1472
+ begin
1473
+ Puppet.override(:environments => environments, :current_environment => env) do
1474
+ example.run
1475
+ end
1476
+ ensure
1477
+ if Kernel.const_defined?(:Hiera) && Hiera.const_defined?(:Backend)
1478
+ Hiera::Backend.send(:remove_const, :Custom_backend) if Hiera::Backend.const_defined?(:Custom_backend)
1479
+ Hiera::Backend.send(:remove_const, :Other_backend) if Hiera::Backend.const_defined?(:Other_backend)
1480
+ end
1481
+ $LOAD_PATH.shift
1482
+ end
1483
+ end
1484
+
1485
+ context 'version 3' do
1486
+ it 'finds data in in global layer and reports deprecation warnings for hiera.yaml' do
1487
+ expect(lookup('a')).to eql('value a (from global)')
1488
+ expect(warnings).to include(/Use of 'hiera.yaml' version 3 is deprecated. It should be converted to version 5/)
1489
+ end
1490
+
1491
+ it 'explain contains output from global layer' do
1492
+ explanation = explain('a')
1493
+ expect(explanation).to include('Global Data Provider (hiera configuration version 3)')
1494
+ expect(explanation).to include('Hierarchy entry "yaml"')
1495
+ expect(explanation).to include('Hierarchy entry "json"')
1496
+ expect(explanation).to include('Found key: "a" value: "value a (from global)"')
1497
+ end
1498
+
1499
+ it 'ignores merge behavior specified in global hiera.yaml' do
1500
+ expect(lookup('hash_b')).to eql(
1501
+ { 'hash_ba' => { 'bab' => 'value hash_b.hash_ba.bab (from global)'} })
1502
+ end
1503
+
1504
+ it 'uses the merge from lookup options to merge all layers' do
1505
+ expect(lookup('hash_c')).to eql(
1506
+ { 'hash_ca' => { 'cab' => 'value hash_c.hash_ca.cab (from global)' } })
1507
+ end
1508
+
1509
+ it 'uses the explicitly given merge to override lookup options and to merge all layers' do
1510
+ expect(lookup('hash_c', 'merge' => 'deep')).to eql(
1511
+ {
1512
+ 'hash_ca' =>
1513
+ {
1514
+ 'caa' => 'value hash_c.hash_ca.caa (from environment)',
1515
+ 'cab' => 'value hash_c.hash_ca.cab (from global)',
1516
+ 'cac' => 'value hash_c.hash_ca.cac (from global json)',
1517
+ 'cad' => 'value hash_c.hash_ca.cad (from global custom)'
1518
+ }
1519
+ })
1520
+ end
1521
+
1522
+ it 'paths are interpolated' do
1523
+ expect(lookup('x')).to eql('value x (from global example.com.yaml)')
1524
+ end
1525
+
1526
+ it 'backend data sources are propagated to custom backend' do
1527
+ expect(lookup('datasources')).to eql(['common', 'example.com'])
1528
+ end
1529
+
1530
+ it 'delegates configured hocon backend to hocon_data function' do
1531
+ expect(explain('xs')).to match(/Hierarchy entry "hocon"\n.*\n.*\n.*"common"\n\s*Found key: "xs"/m)
1532
+ end
1533
+
1534
+ it 'can dig down into subkeys provided by hocon_data function' do
1535
+ expect(lookup('xs.subkey')).to eql('value xs.subkey (from global hocon)')
1536
+ end
1537
+
1538
+ context 'with a module data provider' do
1539
+ let(:module_files) do
1540
+ {
1541
+ 'mod_a' => {
1542
+ 'hiera.yaml' => <<-YAML.unindent,
1543
+ version: 5
1544
+ hierarchy:
1545
+ - name: Common
1546
+ path: common.yaml
1547
+ YAML
1548
+ 'data' => {
1549
+ 'common.yaml' => <<-YAML.unindent
1550
+ mod_a::abc: value mod_a::abc (from module)
1551
+ mod_a::caller: "calling module is %{calling_module}"
1552
+ YAML
1553
+ }
1554
+ }
1555
+ }
1556
+ end
1557
+
1558
+ let(:environment_files) do
1559
+ {
1560
+ env_name => {
1561
+ 'hiera.yaml' => env_hiera_yaml,
1562
+ 'data' => env_data,
1563
+ 'modules' => module_files
1564
+ }
1565
+ }
1566
+ end
1567
+
1568
+ it "interpolation function 'hiera' finds values in environment" do
1569
+ expect(lookup('ipl_hiera_env')).to eql("environment value 'value mod_a::hash_a.a (from environment)'")
1570
+ end
1571
+
1572
+ it "interpolation function 'hiera' finds values in module" do
1573
+ expect(lookup('ipl_hiera_mod')).to eql("module value 'value mod_a::abc (from module)'")
1574
+ end
1575
+
1576
+ it "interpolation function 'hiera' finds values in module and that module does not find %{calling_module}" do
1577
+ expect(lookup('ipl_hiera_modc')).to eql("module value 'calling module is '")
1578
+ end
1579
+
1580
+ context 'but no environment data provider' do
1581
+ let(:environment_files) do
1582
+ {
1583
+ env_name => {
1584
+ 'modules' => module_files
1585
+ }
1586
+ }
1587
+ end
1588
+
1589
+ it "interpolation function 'hiera' does not find values in a module" do
1590
+ expect(lookup('ipl_hiera_mod')).to eql("module value ''")
1591
+ end
1592
+ end
1593
+ end
1594
+
1595
+
1596
+ context 'using an eyaml backend' do
1597
+ let(:private_key_name) { 'private_key.pkcs7.pem' }
1598
+ let(:public_key_name) { 'public_key.pkcs7.pem' }
1599
+
1600
+ let(:private_key) do
1601
+ <<-PKCS7.unindent
1602
+ -----BEGIN RSA PRIVATE KEY-----
1603
+ MIIEogIBAAKCAQEAwHB3GvImq59em4LV9DMfP0Zjs21eW3Jd5I9fuY0jLJhIkH6f
1604
+ CR7tyOpYV6xUj+TF8giq9WLxZI7sourMJMWjEWhVjgUr5lqp1RLv4lwfDv3Wk4XC
1605
+ 2LUuqj1IAErUXKeRz8i3lUSZW1Pf4CaMpnIiPdWbz6f0KkaJSFi9bqexONBx4fKQ
1606
+ NlgZwm2/aYjjrYng788I0QhWDKUqsQOi5mZKlHNRsDlk7J3Afhsx/jTLrCX/G8+2
1607
+ tPtLsHyRN39kluM5vYHbKXDsCG/a88Z2yUE2+r4Clp0FUKffiEDBPm0/H0sQ4Q1o
1608
+ EfQFDQRKaIkhpsm0nOnLYTy3/xJc5uqDNkLiawIDAQABAoIBAE98pNXOe8ab93oI
1609
+ mtNZYmjCbGAqprTjEoFb71A3SfYbmK2Gf65GxjUdBwx/tBYTiuekSOk+yzKcDoZk
1610
+ sZnmwKpqDByzaiSmAkxunANFxdZtZvpcX9UfUX0j/t+QCROUa5gF8j6HrUiZ5nkx
1611
+ sxr1PcuItekaGLJ1nDLz5JsWTQ+H4M+GXQw7/t96x8v8g9el4exTiAHGk6Fv16kD
1612
+ 017T02M9qTTmV3Ab/enDIBmKVD42Ta36K/wc4l1aoUQNiRbIGVh96Cgd1CFXLF3x
1613
+ CsaNbYT4SmRXaYqoj6MKq+QFEGxadFmJy48NoSd4joirIn2lUjHxJebw3lLbNLDR
1614
+ uvQnQ2ECgYEA/nD94wEMr6078uMv6nKxPpNGq7fihwSKf0G/PQDqrRmjUCewuW+k
1615
+ /iXMe1Y/y0PjFeNlSbUsUvKQ5xF7F/1AnpuPHIrn3cjGVLb71W+zen1m8SnhsW/f
1616
+ 7dPgtcb4SCvfhmLgoov+P34YcNfGi6qgPUu6319IqoB3BIi7PvfEomkCgYEAwZ4+
1617
+ V0bMjFdDn2hnYzjTNcF2aUQ1jPvtuETizGwyCbbMLl9522lrjC2DrH41vvqX35ct
1618
+ CBJkhQFbtHM8Gnmozv0vxhI2jP+u14mzfePZsaXuYrEgWRj+BCsYUHodXryxnEWj
1619
+ yVrTNskab1B5jFm2SCJDmKcycBOYpRBLCMx6W7MCgYBA99z7/6KboOIzzKrJdGup
1620
+ jLV410UyMIikoccQ7pD9jhRTPS80yjsY4dHqlEVJw5XSWvPb9DTTITi6p44EvBep
1621
+ 6BKMuTMnQELUEr0O7KypVCfa4FTOl8BX28f+4kU3OGykxc6R8qkC0VGwTohV1UWB
1622
+ ITsgGhZV4uOA9uDI3T8KMQKBgEnQY2HwmuDSD/TA39GDA3qV8+ez2lqSXRGIKZLX
1623
+ mMf9SaBQQ+uzKA4799wWDbVuYeIbB07xfCL83pJP8FUDlqi6+7Celu9wNp7zX1ua
1624
+ Nw8z/ErhzjxJe+Xo7A8aTwIkG+5A2m1UU/up9YsEeiJYvVaIwY58B42U2vfq20BS
1625
+ fD9jAoGAX2MscBzIsmN+U9R0ptL4SXcPiVnOl8mqvQWr1B4OLgxX7ghht5Fs956W
1626
+ bHipxOWMFCPJA/AhNB8q1DvYiD1viZbIALSCJVUkzs4AEFIjiPsCBKxerl7jF6Xp
1627
+ 1WYSaCmfvoCVEpFNt8cKp4Gq+zEBYAV4Q6TkcD2lDtEW49MuN8A=
1628
+ -----END RSA PRIVATE KEY-----
1629
+ PKCS7
1630
+ end
1631
+
1632
+ let(:public_key) do
1633
+ <<-PKCS7.unindent
1634
+ -----BEGIN CERTIFICATE-----
1635
+ MIIC2TCCAcGgAwIBAgIBATANBgkqhkiG9w0BAQUFADAAMCAXDTE3MDExMzA5MTY1
1636
+ MloYDzIwNjcwMTAxMDkxNjUyWjAAMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
1637
+ CgKCAQEAwHB3GvImq59em4LV9DMfP0Zjs21eW3Jd5I9fuY0jLJhIkH6fCR7tyOpY
1638
+ V6xUj+TF8giq9WLxZI7sourMJMWjEWhVjgUr5lqp1RLv4lwfDv3Wk4XC2LUuqj1I
1639
+ AErUXKeRz8i3lUSZW1Pf4CaMpnIiPdWbz6f0KkaJSFi9bqexONBx4fKQNlgZwm2/
1640
+ aYjjrYng788I0QhWDKUqsQOi5mZKlHNRsDlk7J3Afhsx/jTLrCX/G8+2tPtLsHyR
1641
+ N39kluM5vYHbKXDsCG/a88Z2yUE2+r4Clp0FUKffiEDBPm0/H0sQ4Q1oEfQFDQRK
1642
+ aIkhpsm0nOnLYTy3/xJc5uqDNkLiawIDAQABo1wwWjAPBgNVHRMBAf8EBTADAQH/
1643
+ MB0GA1UdDgQWBBSejWrVnw7QaBjNFCHMNFi+doSOcTAoBgNVHSMEITAfgBSejWrV
1644
+ nw7QaBjNFCHMNFi+doSOcaEEpAIwAIIBATANBgkqhkiG9w0BAQUFAAOCAQEAAe85
1645
+ BQ1ydAHFqo0ib38VRPOwf5xPHGbYGhvQi4/sU6aTuR7pxaOJPYz05jLhS+utEmy1
1646
+ sknBq60G67yhQE7IHcfwrl1arirG2WmKGvAbjeYL2K1UiU0pVD3D+Klkv/pK6jIQ
1647
+ eOJRGb3qNUn0Sq9EoYIOXiGXQ641F0bZZ0+5H92kT1lmnF5oLfCb84ImD9T3snH6
1648
+ pIr5RKRx/0YmJIcv3WdpoPT903rOJiRIEgIj/hDk9QZTBpm222Ul5yQQ5pBywpSp
1649
+ xh0bmJKAQWhQm7QlybKfyaQmg5ot1jEzWAvD2I5FjHQxmAlchjb6RreaRhExj+JE
1650
+ 5O117dMBdzDBjcNMOA==
1651
+ -----END CERTIFICATE-----
1652
+ PKCS7
1653
+ end
1654
+
1655
+ let(:keys_dir) do
1656
+ keys = tmpdir('keys')
1657
+ dir_contained_in(keys, {
1658
+ private_key_name => private_key,
1659
+ public_key_name => public_key
1660
+ })
1661
+ keys
1662
+ end
1663
+
1664
+ let(:private_key_path) { File.join(keys_dir, private_key_name) }
1665
+ let(:public_key_path) { File.join(keys_dir, public_key_name) }
1666
+ let(:hiera_yaml) do
1667
+ <<-YAML.unindent
1668
+ :backends:
1669
+ - eyaml
1670
+ - yaml
1671
+ :eyaml:
1672
+ :datadir: #{code_dir}/hieradata
1673
+ :pkcs7_private_key: #{private_key_path}
1674
+ :pkcs7_public_key: #{public_key_path}
1675
+ :yaml:
1676
+ :datadir: #{code_dir}/hieradata
1677
+ :hierarchy:
1678
+ - common
1679
+ YAML
1680
+ end
1681
+
1682
+ let(:data_files) do
1683
+ {
1684
+ 'common.yaml' => <<-YAML.unindent,
1685
+ b: value 'b' (from global)
1686
+ c:
1687
+ c_a: value c_a (from global)
1688
+ YAML
1689
+ 'common.eyaml' => <<-YAML.unindent
1690
+ a: >
1691
+ ENC[PKCS7,MIIBmQYJKoZIhvcNAQcDoIIBijCCAYYCAQAxggEhMIIBHQIBADAFMAACAQEw
1692
+ DQYJKoZIhvcNAQEBBQAEggEAH457bsfL8kYw9O50roE3dcE21nCnmPnQ2XSX
1693
+ LYRJ2C78LarbfFonKz0gvDW7tyhsLWASFCFaiU8T1QPBd2b3hoQK8E4B2Ual
1694
+ xga/K7r9y3OSgRomTm9tpTltC6re0Ubh3Dy71H61obwxEdNVTqjPe95+m2b8
1695
+ 6zWZVnzZzXXsTG1S17yJn1zaB/LXHbWNy4KyLLKCGAml+Gfl6ZMjmaplTmUA
1696
+ QIC5rI8abzbPP3TDMmbLOGNkrmLqI+3uS8tSueTMoJmWaMF6c+H/cA7oRxmV
1697
+ QCeEUVXjyFvCHcmbA+keS/RK9XF+vc07/XS4XkYSPs/I5hLQji1y9bkkGAs0
1698
+ tehxQjBcBgkqhkiG9w0BBwEwHQYJYIZIAWUDBAEqBBDHpA6Fcl/R16aIYcow
1699
+ oiO4gDAvfFH6jLUwXkcYtagnwdmhkd9TQJtxNWcIwMpvmk036MqIoGwwhQdg
1700
+ gV4beiCFtLU=]
1701
+ a_ref: "A reference to %{hiera('a')}"
1702
+ b_ref: "A reference to %{hiera('b')}"
1703
+ c_ref: "%{alias('c')}"
1704
+ YAML
1705
+ }
1706
+ end
1707
+
1708
+ let(:code_dir_files) do
1709
+ {
1710
+ 'hiera.yaml' => hiera_yaml,
1711
+ 'hieradata' => data_files
1712
+ }
1713
+ end
1714
+
1715
+ before(:each) do
1716
+ Puppet.settings[:hiera_config] = File.join(code_dir, 'hiera.yaml')
1717
+ end
1718
+
1719
+ it 'finds data in the global layer' do
1720
+ expect(lookup('a')).to eql("Encrypted value 'a' (from global)")
1721
+ end
1722
+
1723
+ it 'can use a hiera interpolation' do
1724
+ expect(lookup('a_ref')).to eql("A reference to Encrypted value 'a' (from global)")
1725
+ end
1726
+
1727
+ it 'can use a hiera interpolation that refers back to yaml' do
1728
+ expect(lookup('b_ref')).to eql("A reference to value 'b' (from global)")
1729
+ end
1730
+
1731
+ it 'can use a hiera interpolation that refers back to yaml, but only in global layer' do
1732
+ expect(lookup(['c', 'c_ref'], 'merge' => 'deep')).to eql([{'c_a' => 'value c_a (from global)', 'c_b' => 'value c_b (from environment)'}, { 'c_a' => 'value c_a (from global)' }])
1733
+ end
1734
+
1735
+ it 'delegates configured eyaml backend to eyaml_lookup_key function' do
1736
+ expect(explain('a')).to match(/Hierarchy entry "eyaml"\n.*\n.*\n.*"common"\n\s*Found key: "a"/m)
1737
+ end
1738
+ end
1739
+
1740
+ context 'using deep_merge_options' do
1741
+ let(:hiera_yaml) do
1742
+ <<-YAML.unindent
1743
+ ---
1744
+ :backends:
1745
+ - yaml
1746
+ :yaml:
1747
+ :datadir: #{code_dir}/hieradata
1748
+ :hierarchy:
1749
+ - common
1750
+ - other
1751
+ :merge_behavior: deeper
1752
+ :deep_merge_options:
1753
+ :unpack_arrays: ','
1754
+ YAML
1755
+ end
1756
+
1757
+ let(:code_dir_files) do
1758
+ {
1759
+ 'hiera.yaml' => hiera_yaml,
1760
+ 'hieradata' => {
1761
+ 'common.yaml' => <<-YAML.unindent,
1762
+ hash:
1763
+ array:
1764
+ - x1,x2
1765
+ array:
1766
+ - x1,x2
1767
+ str: a string
1768
+ mixed:
1769
+ x: hx
1770
+ y: hy
1771
+ YAML
1772
+ 'other.yaml' => <<-YAML.unindent,
1773
+ hash:
1774
+ array:
1775
+ - x3
1776
+ - x4
1777
+ array:
1778
+ - x3
1779
+ - x4
1780
+ str: another string
1781
+ mixed:
1782
+ - h1
1783
+ - h2
1784
+ YAML
1785
+ }
1786
+ }
1787
+ end
1788
+
1789
+ it 'ignores configured merge_behavior when looking up arrays' do
1790
+ expect(lookup('array')).to eql(['x1,x2'])
1791
+ end
1792
+
1793
+ it 'ignores configured merge_behavior when merging arrays' do
1794
+ expect(lookup('array', 'merge' => 'unique')).to eql(['x1,x2', 'x3', 'x4'])
1795
+ end
1796
+
1797
+ it 'ignores configured merge_behavior when looking up hashes' do
1798
+ expect(lookup('hash')).to eql({'array' => ['x1,x2']})
1799
+ end
1800
+
1801
+ it 'ignores configured merge_behavior when merging hashes' do
1802
+ expect(lookup('hash', 'merge' => 'hash')).to eql({'array' => ['x1,x2']})
1803
+ end
1804
+ end
1805
+
1806
+ context 'using relative datadir paths' do
1807
+ let(:hiera_yaml) do
1808
+ <<-YAML.unindent
1809
+ ---
1810
+ :backends:
1811
+ - yaml
1812
+ :yaml:
1813
+ :datadir: relative_data
1814
+ :hierarchy:
1815
+ - common
1816
+ YAML
1817
+ end
1818
+
1819
+ let(:populated_code_dir) do
1820
+ dir_contained_in(code_dir, code_dir_files.merge({
1821
+ 'fake_cwd' => {
1822
+ 'relative_data' => {
1823
+ 'common.yaml' => <<-YAML.unindent
1824
+ a: value a (from fake_cwd/relative_data/common.yaml)
1825
+ YAML
1826
+ }
1827
+ }
1828
+ }))
1829
+ code_dir
1830
+ end
1831
+
1832
+ around(:each) do |example|
1833
+ cwd = Dir.pwd
1834
+ Dir.chdir(File.join(code_dir, 'fake_cwd'))
1835
+ begin
1836
+ example.run
1837
+ ensure
1838
+ Dir.chdir(cwd)
1839
+ end
1840
+ end
1841
+
1842
+ it 'finds data from data file beneath relative datadir' do
1843
+ expect(lookup('a')).to eql('value a (from fake_cwd/relative_data/common.yaml)')
1844
+ end
1845
+ end
1846
+ end
1847
+
1848
+ context 'version 5' do
1849
+ let(:scope_additions) { { 'ipl_datadir' => 'hieradata' } }
1850
+ let(:hiera_yaml) do
1851
+ <<-YAML.unindent
1852
+ ---
1853
+ version: 5
1854
+ defaults:
1855
+ datadir: "%{ipl_datadir}"
1856
+
1857
+ hierarchy:
1858
+ - name: Yaml
1859
+ data_hash: yaml_data
1860
+ paths:
1861
+ - common.yaml
1862
+ - "%{domain}.yaml"
1863
+ - name: Json
1864
+ data_hash: json_data
1865
+ paths:
1866
+ - common.json
1867
+ - "%{domain}.json"
1868
+ - name: Hocon
1869
+ data_hash: hocon_data
1870
+ paths:
1871
+ - common.conf
1872
+ - "%{domain}.conf"
1873
+ - name: Custom
1874
+ hiera3_backend: custom
1875
+ paths:
1876
+ - common.custom
1877
+ - "%{domain}.custom"
1878
+ - name: Other
1879
+ hiera3_backend: other
1880
+ options:
1881
+ other_option: value of other_option
1882
+ paths:
1883
+ - common.other
1884
+ - "%{domain}.other"
1885
+ YAML
1886
+ end
1887
+
1888
+ it 'finds global data and reports no deprecation warnings' do
1889
+ expect(lookup('a')).to eql('value a (from global)')
1890
+ expect(warnings).to be_empty
1891
+ end
1892
+
1893
+ it 'explain contains output from global layer' do
1894
+ explanation = explain('a')
1895
+ expect(explanation).to include('Global Data Provider (hiera configuration version 5)')
1896
+ expect(explanation).to include('Hierarchy entry "Yaml"')
1897
+ expect(explanation).to include('Hierarchy entry "Json"')
1898
+ expect(explanation).to include('Hierarchy entry "Hocon"')
1899
+ expect(explanation).to include('Hierarchy entry "Custom"')
1900
+ expect(explanation).to include('Found key: "a" value: "value a (from global)"')
1901
+ end
1902
+
1903
+ it 'uses the explicitly given merge to override lookup options and to merge all layers' do
1904
+ expect(lookup('hash_c', 'merge' => 'deep')).to eql(
1905
+ {
1906
+ 'hash_ca' =>
1907
+ {
1908
+ 'caa' => 'value hash_c.hash_ca.caa (from environment)',
1909
+ 'cab' => 'value hash_c.hash_ca.cab (from global)',
1910
+ 'cac' => 'value hash_c.hash_ca.cac (from global json)',
1911
+ 'cad' => 'value hash_c.hash_ca.cad (from global custom)'
1912
+ }
1913
+ })
1914
+ end
1915
+
1916
+ it 'backend data sources are propagated to custom backend' do
1917
+ expect(lookup('datasources')).to eql(['common', 'example.com'])
1918
+ end
1919
+
1920
+ it 'backend specific options are propagated to custom backend' do
1921
+ expect(lookup('other_option')).to eql('value of other_option')
1922
+ end
1923
+
1924
+ it 'dotted keys are passed down to custom backend' do
1925
+ expect(lookup('dotted.key')).to eql('custom backend received request for dotted.key value')
1926
+ end
1927
+
1928
+ it 'multiple hiera3_backend declarations can be used and are merged into the generated config' do
1929
+ expect(lookup(['datasources', 'other_option'])).to eql([['common', 'example.com'], 'value of other_option'])
1930
+ expect(Hiera::Config.instance_variable_get(:@config)).to eql(
1931
+ {
1932
+ :backends => ['custom', 'other'],
1933
+ :hierarchy => ['common', '%{domain}'],
1934
+ :custom => { :datadir => "#{code_dir}/hieradata" },
1935
+ :other => { :other_option => 'value of other_option', :datadir=>"#{code_dir}/hieradata" },
1936
+ :logger => 'puppet'
1937
+ })
1938
+ end
1939
+
1940
+ it 'provides a sensible error message when the hocon library is not loaded' do
1941
+ Puppet.features.stubs(:hocon?).returns(false)
1942
+
1943
+ expect { lookup('a') }.to raise_error do |e|
1944
+ expect(e.message).to match(/Lookup using Hocon data_hash function is not supported without hocon library/)
1945
+ end
1946
+ end
1947
+
1948
+ context 'with missing path declaraion' do
1949
+ context 'and yaml_data function' do
1950
+ let(:hiera_yaml) { <<-YAML.unindent }
1951
+ version: 5
1952
+ hierarchy:
1953
+ - name: Yaml
1954
+ data_hash: yaml_data
1955
+ YAML
1956
+
1957
+ it 'fails and reports the missing path' do
1958
+ expect { lookup('a') }.to raise_error(/one of 'path', 'paths' 'glob', 'globs' or 'mapped_paths' must be declared in hiera.yaml when using this data_hash function/)
1959
+ end
1960
+ end
1961
+
1962
+ context 'and json_data function' do
1963
+ let(:hiera_yaml) { <<-YAML.unindent }
1964
+ version: 5
1965
+ hierarchy:
1966
+ - name: Json
1967
+ data_hash: json_data
1968
+ YAML
1969
+
1970
+ it 'fails and reports the missing path' do
1971
+ expect { lookup('a') }.to raise_error(/one of 'path', 'paths' 'glob', 'globs' or 'mapped_paths' must be declared in hiera.yaml when using this data_hash function/)
1972
+ end
1973
+ end
1974
+
1975
+ context 'and hocon_data function' do
1976
+ let(:hiera_yaml) { <<-YAML.unindent }
1977
+ version: 5
1978
+ hierarchy:
1979
+ - name: Hocon
1980
+ data_hash: hocon_data
1981
+ YAML
1982
+
1983
+ it 'fails and reports the missing path' do
1984
+ expect { lookup('a') }.to raise_error(/one of 'path', 'paths' 'glob', 'globs' or 'mapped_paths' must be declared in hiera.yaml when using this data_hash function/)
1985
+ end
1986
+ end
1987
+
1988
+ context 'and eyaml_lookup_key function' do
1989
+ let(:hiera_yaml) { <<-YAML.unindent }
1990
+ version: 5
1991
+ hierarchy:
1992
+ - name: Yaml
1993
+ lookup_key: eyaml_lookup_key
1994
+ YAML
1995
+
1996
+ it 'fails and reports the missing path' do
1997
+ expect { lookup('a') }.to raise_error(/one of 'path', 'paths' 'glob', 'globs' or 'mapped_paths' must be declared in hiera.yaml when using this lookup_key function/)
1998
+ end
1999
+ end
2000
+ end
2001
+ end
2002
+
2003
+ context 'with a hiera3_backend that has no paths' do
2004
+ let(:hiera_yaml) do
2005
+ <<-YAML.unindent
2006
+ ---
2007
+ version: 5
2008
+ hierarchy:
2009
+ - name: Custom
2010
+ hiera3_backend: custom
2011
+ YAML
2012
+ end
2013
+
2014
+ it 'calls the backend' do
2015
+ expect(lookup('hash_c')).to eql(
2016
+ { 'hash_ca' => { 'cad' => 'value hash_c.hash_ca.cad (from global custom)' }})
2017
+ end
2018
+ end
342
2019
  end
343
2020
 
344
- it 'will resolve global and environment correctly when module has no provider' do
345
- Hiera.any_instance.expects(:lookup).with('no_provider::e', any_parameters).returns({ 'k1' => 'global_e1' })
346
- Puppet[:code] = <<-END.gsub(/^ {8}/, '')
347
- include no_provider
348
- $r = lookup(no_provider::e, Hash[String,String], hash)
349
- notify { "${r[k1]}_${r[k2]}_${r[k3]}": }
350
- END
351
- resources = compiler.compile().resources.map(&:ref).select { |r| r.start_with?('Notify[') }.map { |r| r[7..-2] }
352
- expect(resources).to include('global_e1__env_no_provider_e3') # k2 is missing
2021
+ context 'and a module' do
2022
+ let(:mod_a_files) { {} }
2023
+
2024
+ let(:populated_env_dir) do
2025
+ dir_contained_in(env_dir, DeepMerge.deep_merge!(environment_files, env_name => { 'modules' => mod_a_files }))
2026
+ env_dir
2027
+ end
2028
+
2029
+ context 'that has no lookup configured' do
2030
+ let(:mod_a_files) do
2031
+ {
2032
+ 'mod_a' => {
2033
+ 'data' => {
2034
+ 'common.yaml' => <<-YAML.unindent
2035
+ ---
2036
+ mod_a::b: value mod_a::b (from mod_a)
2037
+ YAML
2038
+ }
2039
+ }
2040
+ }
2041
+ end
2042
+
2043
+ it 'does not find data in the module' do
2044
+ expect { lookup('mod_a::b') }.to raise_error(Puppet::DataBinding::LookupError, /did not find a value for the name 'mod_a::b'/)
2045
+ end
2046
+
2047
+ context 'with a Hiera v3 configuration' do
2048
+ let(:mod_a_files) do
2049
+ {
2050
+ 'mod_a' => {
2051
+ 'hiera.yaml' => <<-YAML.unindent
2052
+ ---
2053
+ :backends: yaml
2054
+ YAML
2055
+ }
2056
+ }
2057
+ end
2058
+
2059
+ it 'raises an error' do
2060
+ expect { lookup('mod_a::a') }.to raise_error(Puppet::Error, /hiera.yaml version 3 cannot be used in a module/)
2061
+ end
2062
+ end
2063
+
2064
+ context "but a metadata.json with 'module_data_provider=hiera'" do
2065
+ let(:mod_a_files_1) { DeepMerge.deep_merge!(mod_a_files, 'mod_a' => { 'metadata.json' => <<-JSON.unindent }) }
2066
+ {
2067
+ "name": "example/mod_a",
2068
+ "version": "0.0.2",
2069
+ "source": "git@github.com/example/mod_a.git",
2070
+ "dependencies": [],
2071
+ "author": "Bob the Builder",
2072
+ "license": "Apache-2.0",
2073
+ "data_provider": "hiera"
2074
+ }
2075
+ JSON
2076
+
2077
+ let(:populated_env_dir) do
2078
+ dir_contained_in(env_dir, DeepMerge.deep_merge!(environment_files, env_name => { 'modules' => mod_a_files_1 }))
2079
+ env_dir
2080
+ end
2081
+
2082
+ it 'finds data in the module and reports deprecation warning for metadata.json' do
2083
+ expect(lookup('mod_a::b')).to eql('value mod_a::b (from mod_a)')
2084
+ expect(warnings).to include(/Defining "data_provider": "hiera" in metadata.json is deprecated. A 'hiera.yaml' file should be used instead/)
2085
+ end
2086
+
2087
+ context 'and a hiera.yaml file' do
2088
+ let(:mod_a_files_2) { DeepMerge.deep_merge!(mod_a_files_1, 'mod_a' => { 'hiera.yaml' => <<-YAML.unindent }) }
2089
+ ---
2090
+ version: 4
2091
+ hierarchy:
2092
+ - name: common
2093
+ backend: yaml
2094
+ YAML
2095
+
2096
+ let(:populated_env_dir) do
2097
+ dir_contained_in(env_dir, DeepMerge.deep_merge!(environment_files, env_name => { 'modules' => mod_a_files_2 }))
2098
+ env_dir
2099
+ end
2100
+
2101
+ it 'finds data in the module and reports deprecation warnings for both metadata.json and hiera.yaml' do
2102
+ expect(lookup('mod_a::b')).to eql('value mod_a::b (from mod_a)')
2103
+ expect(warnings).to include(/Defining "data_provider": "hiera" in metadata.json is deprecated/)
2104
+ expect(warnings).to include(/Use of 'hiera.yaml' version 4 is deprecated. It should be converted to version 5/)
2105
+ end
2106
+ end
2107
+ end
2108
+ end
2109
+
2110
+ context 'using a data_hash that reads a yaml file' do
2111
+ let(:defaults) {
2112
+ {
2113
+ 'mod_a::xd' => 'value mod_a::xd (from default)',
2114
+ 'mod_a::xd_found' => 'value mod_a::xd_found (from default)',
2115
+ 'scope_xd' => 'value scope_xd (from default)'
2116
+ }}
2117
+ let(:overrides) {
2118
+ {
2119
+ 'mod_a::xo' => 'value mod_a::xo (from override)',
2120
+ 'scope_xo' => 'value scope_xo (from override)'
2121
+ }}
2122
+
2123
+ let(:scope_additions) do
2124
+ {
2125
+ 'scope_scalar' => 'scope scalar value',
2126
+ 'scope_hash' => { 'a' => 'scope hash a', 'b' => 'scope hash b' }
2127
+ }
2128
+ end
2129
+ let(:mod_a_files) do
2130
+ {
2131
+ 'mod_a' => {
2132
+ 'data' => {
2133
+ 'common.yaml' => <<-YAML.unindent
2134
+ ---
2135
+ mod_a::a: value mod_a::a (from mod_a)
2136
+ mod_a::b: value mod_a::b (from mod_a)
2137
+ mod_a::xo: value mod_a::xo (from mod_a)
2138
+ mod_a::xd_found: value mod_a::xd_found (from mod_a)
2139
+ mod_a::interpolate_xo: "-- %{lookup('mod_a::xo')} --"
2140
+ mod_a::interpolate_xd: "-- %{lookup('mod_a::xd')} --"
2141
+ mod_a::interpolate_scope_xo: "-- %{scope_xo} --"
2142
+ mod_a::interpolate_scope_xd: "-- %{scope_xd} --"
2143
+ mod_a::hash_a:
2144
+ a: value mod_a::hash_a.a (from mod_a)
2145
+ b: value mod_a::hash_a.b (from mod_a)
2146
+ mod_a::hash_b:
2147
+ a: value mod_a::hash_b.a (from mod_a)
2148
+ b: value mod_a::hash_b.b (from mod_a)
2149
+ mod_a::interpolated: "-- %{lookup('mod_a::a')} --"
2150
+ mod_a::a_a: "-- %{lookup('mod_a::hash_a.a')} --"
2151
+ mod_a::a_b: "-- %{lookup('mod_a::hash_a.b')} --"
2152
+ mod_a::b_a: "-- %{lookup('mod_a::hash_b.a')} --"
2153
+ mod_a::b_b: "-- %{lookup('mod_a::hash_b.b')} --"
2154
+ mod_a::interpolate_array:
2155
+ - "-- %{lookup('mod_a::a')} --"
2156
+ - "-- %{lookup('mod_a::b')} --"
2157
+ mod_a::interpolate_literal: "-- %{literal('hello')} --"
2158
+ mod_a::interpolate_scope: "-- %{scope_scalar} --"
2159
+ mod_a::interpolate_scope_not_found: "-- %{scope_nope} --"
2160
+ mod_a::interpolate_scope_dig: "-- %{scope_hash.a} --"
2161
+ mod_a::interpolate_scope_dig_not_found: "-- %{scope_hash.nope} --"
2162
+ mod_a::quoted_interpolation: '-- %{lookup(''"mod_a::a.quoted.key"'')} --'
2163
+ "mod_a::a.quoted.key": "value mod_a::a.quoted.key (from mod_a)"
2164
+ YAML
2165
+ },
2166
+ 'hiera.yaml' => <<-YAML.unindent,
2167
+ ---
2168
+ version: 5
2169
+ hierarchy:
2170
+ - name: "Common"
2171
+ data_hash: yaml_data
2172
+ path: "common.yaml"
2173
+ YAML
2174
+ }
2175
+ }
2176
+ end
2177
+
2178
+ it 'finds data in the module' do
2179
+ expect(lookup('mod_a::b')).to eql('value mod_a::b (from mod_a)')
2180
+ end
2181
+
2182
+ it 'environment data has higher priority than module data' do
2183
+ expect(lookup('mod_a::a')).to eql('value mod_a::a (from environment)')
2184
+ end
2185
+
2186
+ it 'environment data has higher priority than module data in interpolated module data' do
2187
+ expect(lookup('mod_a::interpolated')).to eql('-- value mod_a::a (from environment) --')
2188
+ end
2189
+
2190
+ it 'overrides have higher priority than found data' do
2191
+ expect(lookup('mod_a::xo', { 'override' => overrides })).to eql('value mod_a::xo (from override)')
2192
+ end
2193
+
2194
+ it 'overrides have higher priority than found data in lookup interpolations' do
2195
+ expect(lookup('mod_a::interpolate_xo', { 'override' => overrides })).to eql('-- value mod_a::xo (from override) --')
2196
+ end
2197
+
2198
+ it 'overrides have higher priority than found data in scope interpolations' do
2199
+ expect(lookup('mod_a::interpolate_scope_xo', { 'override' => overrides })).to eql('-- value scope_xo (from override) --')
2200
+ end
2201
+
2202
+ it 'defaults have lower priority than found data' do
2203
+ expect(lookup('mod_a::xd_found', { 'default_values_hash' => defaults })).to eql('value mod_a::xd_found (from mod_a)')
2204
+ end
2205
+
2206
+ it 'defaults are used when data is not found' do
2207
+ expect(lookup('mod_a::xd', { 'default_values_hash' => defaults })).to eql('value mod_a::xd (from default)')
2208
+ end
2209
+
2210
+ it 'defaults are used when data is not found in lookup interpolations' do
2211
+ expect(lookup('mod_a::interpolate_xd', { 'default_values_hash' => defaults })).to eql('-- value mod_a::xd (from default) --')
2212
+ end
2213
+
2214
+ it 'defaults are used when data is not found in scope interpolations' do
2215
+ expect(lookup('mod_a::interpolate_scope_xd', { 'default_values_hash' => defaults })).to eql('-- value scope_xd (from default) --')
2216
+ end
2217
+
2218
+ it 'merges hashes from environment and module unless strategy hash is used' do
2219
+ expect(lookup('mod_a::hash_a')).to eql({'a' => 'value mod_a::hash_a.a (from environment)'})
2220
+ end
2221
+
2222
+ it 'merges hashes from environment and module when merge strategy hash is used' do
2223
+ expect(lookup('mod_a::hash_a', :merge => 'hash')).to eql(
2224
+ {'a' => 'value mod_a::hash_a.a (from environment)', 'b' => 'value mod_a::hash_a.b (from mod_a)'})
2225
+ end
2226
+
2227
+ it 'will not merge hashes from environment and module in interpolated expressions' do
2228
+ expect(lookup(['mod_a::a_a', 'mod_a::a_b'])).to eql(
2229
+ ['-- value mod_a::hash_a.a (from environment) --', '-- --']) # root key found in environment, no hash merge is performed
2230
+ end
2231
+
2232
+ it 'interpolates arrays' do
2233
+ expect(lookup('mod_a::interpolate_array')).to eql(['-- value mod_a::a (from environment) --', '-- value mod_a::b (from mod_a) --'])
2234
+ end
2235
+
2236
+ it 'can dig into arrays using subkeys' do
2237
+ expect(lookup('mod_a::interpolate_array.1')).to eql('-- value mod_a::b (from mod_a) --')
2238
+ end
2239
+
2240
+ it 'treats an out of range subkey as not found' do
2241
+ expect(explain('mod_a::interpolate_array.2')).to match(/No such key: "2"/)
2242
+ end
2243
+
2244
+ it 'interpolates a literal' do
2245
+ expect(lookup('mod_a::interpolate_literal')).to eql('-- hello --')
2246
+ end
2247
+
2248
+ it 'interpolates scalar from scope' do
2249
+ expect(lookup('mod_a::interpolate_scope')).to eql('-- scope scalar value --')
2250
+ end
2251
+
2252
+ it 'interpolates not found in scope as empty string' do
2253
+ expect(lookup('mod_a::interpolate_scope_not_found')).to eql('-- --')
2254
+ end
2255
+
2256
+ it 'interpolates dotted key from scope' do
2257
+ expect(lookup('mod_a::interpolate_scope_dig')).to eql('-- scope hash a --')
2258
+ end
2259
+
2260
+ it 'treates interpolated dotted key but not found in scope as empty string' do
2261
+ expect(lookup('mod_a::interpolate_scope_dig_not_found')).to eql('-- --')
2262
+ end
2263
+
2264
+ it 'can use quoted keys in interpolation' do
2265
+ expect(lookup('mod_a::quoted_interpolation')).to eql('-- value mod_a::a.quoted.key (from mod_a) --') # root key found in environment, no hash merge is performed
2266
+ end
2267
+
2268
+ it 'merges hashes from environment and module in interpolated expressions if hash merge is specified in lookup options' do
2269
+ expect(lookup(['mod_a::b_a', 'mod_a::b_b'])).to eql(
2270
+ ['-- value mod_a::hash_b.a (from environment) --', '-- value mod_a::hash_b.b (from mod_a) --'])
2271
+ end
2272
+ end
2273
+
2274
+ context 'using a lookup_key that uses a path' do
2275
+ let(:mod_a_files) do
2276
+ {
2277
+ 'mod_a' => {
2278
+ 'functions' => {
2279
+ 'pp_lookup_key.pp' => <<-PUPPET.unindent
2280
+ function mod_a::pp_lookup_key($key, $options, $context) {
2281
+ if !$context.cache_has_key(undef) {
2282
+ $context.cache_all(yaml_data($options, $context))
2283
+ $context.cache(undef, true)
2284
+ }
2285
+ if $context.cache_has_key($key) { $context.cached_value($key) } else { $context.not_found }
2286
+ }
2287
+ PUPPET
2288
+ },
2289
+ 'hiera.yaml' => <<-YAML.unindent,
2290
+ ---
2291
+ version: 5
2292
+ hierarchy:
2293
+ - name: "Common"
2294
+ lookup_key: mod_a::pp_lookup_key
2295
+ path: common.yaml
2296
+ YAML
2297
+ 'data' => {
2298
+ 'common.yaml' => <<-YAML.unindent
2299
+ mod_a::b: value mod_a::b (from mod_a)
2300
+ YAML
2301
+ }
2302
+ }
2303
+ }
2304
+ end
2305
+
2306
+ it 'finds data in the module' do
2307
+ expect(lookup('mod_a::b')).to eql('value mod_a::b (from mod_a)')
2308
+ end
2309
+ end
2310
+
2311
+ context 'using a lookup_key that is a puppet function' do
2312
+ let(:puppet_function) { <<-PUPPET.unindent }
2313
+ function mod_a::pp_lookup_key(Puppet::LookupKey $key, Hash[String,String] $options, Puppet::LookupContext $context) >> Puppet::LookupValue {
2314
+ case $key {
2315
+ 'mod_a::really_interpolated': { $context.interpolate("-- %{lookup('mod_a::a')} --") }
2316
+ 'mod_a::recursive': { lookup($key) }
2317
+ default: {
2318
+ if $context.cache_has_key(mod_a::a) {
2319
+ $context.explain || { 'reusing cache' }
2320
+ } else {
2321
+ $context.explain || { 'initializing cache' }
2322
+ $context.cache_all({
2323
+ mod_a::a => 'value mod_a::a (from mod_a)',
2324
+ mod_a::b => 'value mod_a::b (from mod_a)',
2325
+ mod_a::c => 'value mod_a::c (from mod_a)',
2326
+ mod_a::hash_a => {
2327
+ a => 'value mod_a::hash_a.a (from mod_a)',
2328
+ b => 'value mod_a::hash_a.b (from mod_a)'
2329
+ },
2330
+ mod_a::hash_b => {
2331
+ a => 'value mod_a::hash_b.a (from mod_a)',
2332
+ b => 'value mod_a::hash_b.b (from mod_a)'
2333
+ },
2334
+ mod_a::interpolated => "-- %{lookup('mod_a::a')} --",
2335
+ mod_a::a_a => "-- %{lookup('mod_a::hash_a.a')} --",
2336
+ mod_a::a_b => "-- %{lookup('mod_a::hash_a.b')} --",
2337
+ mod_a::b_a => "-- %{lookup('mod_a::hash_b.a')} --",
2338
+ mod_a::b_b => "-- %{lookup('mod_a::hash_b.b')} --",
2339
+ 'mod_a::a.quoted.key' => 'value mod_a::a.quoted.key (from mod_a)',
2340
+ mod_a::sensitive => Sensitive('reduct me please'),
2341
+ mod_a::type => Object[{name => 'FindMe', 'attributes' => {'x' => String}}],
2342
+ mod_a::version => SemVer('3.4.1'),
2343
+ mod_a::version_range => SemVerRange('>=3.4.1'),
2344
+ mod_a::timestamp => Timestamp("1994-03-25T19:30:00"),
2345
+ mod_a::timespan => Timespan("3-10:00:00")
2346
+ })
2347
+ }
2348
+ if !$context.cache_has_key($key) {
2349
+ $context.not_found
2350
+ }
2351
+ $context.explain || { "returning value for $key" }
2352
+ $context.cached_value($key)
2353
+ }
2354
+ }
2355
+ }
2356
+ PUPPET
2357
+
2358
+ let(:mod_a_files) do
2359
+ {
2360
+ 'mod_a' => {
2361
+ 'functions' => {
2362
+ 'pp_lookup_key.pp' => puppet_function
2363
+ },
2364
+ 'hiera.yaml' => <<-YAML.unindent,
2365
+ ---
2366
+ version: 5
2367
+ hierarchy:
2368
+ - name: "Common"
2369
+ lookup_key: mod_a::pp_lookup_key
2370
+ YAML
2371
+ }
2372
+ }
2373
+ end
2374
+
2375
+ it 'finds data in the module' do
2376
+ expect(lookup('mod_a::b')).to eql('value mod_a::b (from mod_a)')
2377
+ end
2378
+
2379
+ it 'environment data has higher priority than module data' do
2380
+ expect(lookup('mod_a::a')).to eql('value mod_a::a (from environment)')
2381
+ end
2382
+
2383
+ it 'finds quoted keys in the module' do
2384
+ expect(lookup('"mod_a::a.quoted.key"')).to eql('value mod_a::a.quoted.key (from mod_a)')
2385
+ end
2386
+
2387
+ it 'will not resolve interpolated expressions' do
2388
+ expect(lookup('mod_a::interpolated')).to eql("-- %{lookup('mod_a::a')} --")
2389
+ end
2390
+
2391
+ it 'resolves interpolated expressions using Context#interpolate' do
2392
+ expect(lookup('mod_a::really_interpolated')).to eql("-- value mod_a::a (from environment) --")
2393
+ end
2394
+
2395
+ it 'will not merge hashes from environment and module unless strategy hash is used' do
2396
+ expect(lookup('mod_a::hash_a')).to eql({ 'a' => 'value mod_a::hash_a.a (from environment)' })
2397
+ end
2398
+
2399
+ it 'merges hashes from environment and module when merge strategy hash is used' do
2400
+ expect(lookup('mod_a::hash_a', :merge => 'hash')).to eql({ 'a' => 'value mod_a::hash_a.a (from environment)', 'b' => 'value mod_a::hash_a.b (from mod_a)' })
2401
+ end
2402
+
2403
+ it 'traps recursive lookup trapped' do
2404
+ expect(explain('mod_a::recursive')).to include('Recursive lookup detected')
2405
+ end
2406
+
2407
+ it 'private cache is persisted over multiple calls' do
2408
+ collect_notices("notice(lookup('mod_a::b')) notice(lookup('mod_a::c'))", true)
2409
+ expect(notices).to eql(['value mod_a::b (from mod_a)', 'value mod_a::c (from mod_a)'])
2410
+ expect(explanation).to match(/initializing cache.*reusing cache/m)
2411
+ expect(explanation).not_to match(/initializing cache.*initializing cache/m)
2412
+ end
2413
+
2414
+ it 'the same key is requested only once' do
2415
+ collect_notices("notice(lookup('mod_a::b')) notice(lookup('mod_a::b'))", true)
2416
+ expect(notices).to eql(['value mod_a::b (from mod_a)', 'value mod_a::b (from mod_a)'])
2417
+ expect(explanation).to match(/Found key: "mod_a::b".*Found key: "mod_a::b"/m)
2418
+ expect(explanation).to match(/returning value for mod_a::b/m)
2419
+ expect(explanation).not_to match(/returning value for mod_a::b.*returning value for mod_a::b/m)
2420
+ end
2421
+
2422
+ context 'and calling function via API' do
2423
+ it 'finds and delivers rich data' do
2424
+ collect_notices("notice('success')") do |scope|
2425
+ expect(lookup_func.call(scope, 'mod_a::sensitive')).to be_a(Puppet::Pops::Types::PSensitiveType::Sensitive)
2426
+ expect(lookup_func.call(scope, 'mod_a::type')).to be_a(Puppet::Pops::Types::PObjectType)
2427
+ expect(lookup_func.call(scope, 'mod_a::version')).to eql(SemanticPuppet::Version.parse('3.4.1'))
2428
+ expect(lookup_func.call(scope, 'mod_a::version_range')).to eql(SemanticPuppet::VersionRange.parse('>=3.4.1'))
2429
+ expect(lookup_func.call(scope, 'mod_a::timestamp')).to eql(Puppet::Pops::Time::Timestamp.parse('1994-03-25T19:30:00'))
2430
+ expect(lookup_func.call(scope, 'mod_a::timespan')).to eql(Puppet::Pops::Time::Timespan.parse('3-10:00:00'))
2431
+ end
2432
+ expect(notices).to eql(['success'])
2433
+ end
2434
+ end
2435
+
2436
+ context 'with declared but incompatible return_type' do
2437
+ let(:puppet_function) { <<-PUPPET.unindent }
2438
+ function mod_a::pp_lookup_key(Puppet::LookupKey $key, Hash[String,String] $options, Puppet::LookupContext $context) >> Runtime['ruby','Symbol'] {
2439
+ undef
2440
+ }
2441
+ PUPPET
2442
+
2443
+ it 'fails and reports error' do
2444
+ expect{lookup('mod_a::a')}.to raise_error(
2445
+ "Return type of 'lookup_key' function named 'mod_a::pp_lookup_key' is incorrect, expects a value of type Undef, Scalar, Sensitive, Type, Hash, or Array, got Runtime")
2446
+ end
2447
+ end
2448
+ end
2449
+
2450
+ context 'using a data_dig that is a ruby function' do
2451
+ let(:mod_a_files) do
2452
+ {
2453
+ 'mod_a' => {
2454
+ 'lib' => {
2455
+ 'puppet' => {
2456
+ 'functions' => {
2457
+ 'mod_a' => {
2458
+ 'ruby_dig.rb' => <<-RUBY.unindent
2459
+ Puppet::Functions.create_function(:'mod_a::ruby_dig') do
2460
+ dispatch :ruby_dig do
2461
+ param 'Array[String[1]]', :segments
2462
+ param 'Hash[String,Any]', :options
2463
+ param 'Puppet::LookupContext', :context
2464
+ return_type 'Puppet::LookupValue'
2465
+ end
2466
+
2467
+ def ruby_dig(segments, options, context)
2468
+ sub_segments = segments.dup
2469
+ root_key = sub_segments.shift
2470
+ case root_key
2471
+ when 'mod_a::options'
2472
+ hash = { 'mod_a::options' => options }
2473
+ when 'mod_a::lookup'
2474
+ return call_function('lookup', segments.join('.'))
2475
+ else
2476
+ hash = {
2477
+ 'mod_a::a' => 'value mod_a::a (from mod_a)',
2478
+ 'mod_a::b' => 'value mod_a::b (from mod_a)',
2479
+ 'mod_a::hash_a' => {
2480
+ 'a' => 'value mod_a::hash_a.a (from mod_a)',
2481
+ 'b' => 'value mod_a::hash_a.b (from mod_a)'
2482
+ },
2483
+ 'mod_a::hash_b' => {
2484
+ 'a' => 'value mod_a::hash_b.a (from mod_a)',
2485
+ 'b' => 'value mod_a::hash_b.b (from mod_a)'
2486
+ },
2487
+ 'mod_a::interpolated' => "-- %{lookup('mod_a::a')} --",
2488
+ 'mod_a::really_interpolated' => "-- %{lookup('mod_a::a')} --",
2489
+ 'mod_a::a_a' => "-- %{lookup('mod_a::hash_a.a')} --",
2490
+ 'mod_a::a_b' => "-- %{lookup('mod_a::hash_a.b')} --",
2491
+ 'mod_a::b_a' => "-- %{lookup('mod_a::hash_b.a')} --",
2492
+ 'mod_a::b_b' => "-- %{lookup('mod_a::hash_b.b')} --",
2493
+ 'mod_a::bad_type' => :oops,
2494
+ 'mod_a::bad_type_in_hash' => { 'a' => :oops },
2495
+ }
2496
+ end
2497
+ context.not_found unless hash.include?(root_key)
2498
+ value = sub_segments.reduce(hash[root_key]) do |memo, segment|
2499
+ context.not_found unless memo.is_a?(Hash) && memo.include?(segment)
2500
+ memo[segment]
2501
+ end
2502
+ root_key == 'mod_a::really_interpolated' ? context.interpolate(value) : value
2503
+ end
2504
+ end
2505
+ RUBY
2506
+ }
2507
+ }
2508
+ }
2509
+ },
2510
+ 'hiera.yaml' => <<-YAML.unindent,
2511
+ ---
2512
+ version: 5
2513
+ defaults:
2514
+ options:
2515
+ option_b:
2516
+ z: Default option value b.z
2517
+
2518
+ hierarchy:
2519
+ - name: "Common"
2520
+ data_dig: mod_a::ruby_dig
2521
+ uri: "http://www.example.com/passed/as/option"
2522
+ options:
2523
+ option_a: Option value a
2524
+ option_b:
2525
+ x: Option value b.x
2526
+ y: Option value b.y
2527
+ - name: "Extra"
2528
+ data_dig: mod_a::ruby_dig
2529
+ YAML
2530
+ }
2531
+ }
2532
+ end
2533
+
2534
+ it 'finds data in the module' do
2535
+ expect(lookup('mod_a::b')).to eql('value mod_a::b (from mod_a)')
2536
+ end
2537
+
2538
+ it 'environment data has higher priority than module data' do
2539
+ expect(lookup('mod_a::a')).to eql('value mod_a::a (from environment)')
2540
+ end
2541
+
2542
+ it 'will not resolve interpolated expressions' do
2543
+ expect(lookup('mod_a::interpolated')).to eql("-- %{lookup('mod_a::a')} --")
2544
+ end
2545
+
2546
+ it 'resolves interpolated expressions using Context#interpolate' do
2547
+ expect(lookup('mod_a::really_interpolated')).to eql("-- value mod_a::a (from environment) --")
2548
+ end
2549
+
2550
+ it 'does not accept return of runtime type from function' do
2551
+ # Message is produced by the called function, not by the lookup framework
2552
+ expect(explain('mod_a::bad_type')).to include("value returned from function 'ruby_dig' has wrong type")
2553
+ end
2554
+
2555
+ it 'does not accept return of runtime type embedded in hash from function' do
2556
+ # Message is produced by the called function, not by the lookup framework
2557
+ expect(explain('mod_a::bad_type_in_hash')).to include("value returned from function 'ruby_dig' has wrong type")
2558
+ end
2559
+
2560
+ it 'will not merge hashes from environment and module unless strategy hash is used' do
2561
+ expect(lookup('mod_a::hash_a')).to eql({'a' => 'value mod_a::hash_a.a (from environment)'})
2562
+ end
2563
+
2564
+ it 'hierarchy entry options are passed to the function' do
2565
+ expect(lookup('mod_a::options.option_b.x')).to eql('Option value b.x')
2566
+ end
2567
+
2568
+ it 'default options are passed to the function' do
2569
+ expect(lookup('mod_a::options.option_b.z')).to eql('Default option value b.z')
2570
+ end
2571
+
2572
+ it 'default options are not merged with hierarchy options' do
2573
+ expect(lookup('mod_a::options')).to eql(
2574
+ {
2575
+ 'option_a' => 'Option value a',
2576
+ 'option_b' => {
2577
+ 'y' => 'Option value b.y',
2578
+ 'x' => 'Option value b.x'
2579
+ },
2580
+ 'uri' => 'http://www.example.com/passed/as/option'
2581
+ })
2582
+ end
2583
+
2584
+ it 'hierarchy entry "uri" is passed as location option to the function' do
2585
+ expect(lookup('mod_a::options.uri')).to eql('http://www.example.com/passed/as/option')
2586
+ end
2587
+
2588
+ it 'recursive lookup is trapped' do
2589
+ expect(explain('mod_a::lookup.mod_a::lookup')).to include('Recursive lookup detected')
2590
+ end
2591
+
2592
+ context 'with merge strategy hash' do
2593
+ it 'merges hashes from environment and module' do
2594
+ expect(lookup('mod_a::hash_a', :merge => 'hash')).to eql({'a' => 'value mod_a::hash_a.a (from environment)', 'b' => 'value mod_a::hash_a.b (from mod_a)'})
2595
+ end
2596
+
2597
+ it 'will "undig" value from data_dig function, merge root hashes, and then dig to get values by subkey' do
2598
+ expect(lookup(['mod_a::hash_a.a', 'mod_a::hash_a.b'], :merge => 'hash')).to eql(
2599
+ ['value mod_a::hash_a.a (from environment)', 'value mod_a::hash_a.b (from mod_a)'])
2600
+ end
2601
+ end
2602
+ end
2603
+
2604
+ context 'that has a default_hierarchy' do
2605
+ let(:mod_a_hiera_yaml) { <<-YAML.unindent }
2606
+ version: 5
2607
+ hierarchy:
2608
+ - name: "Common"
2609
+ path: common.yaml
2610
+ - name: "Common 2"
2611
+ path: common2.yaml
2612
+
2613
+ default_hierarchy:
2614
+ - name: "Default"
2615
+ path: defaults.yaml
2616
+ - name: "Default 2"
2617
+ path: defaults2.yaml
2618
+ YAML
2619
+
2620
+ let(:mod_a_common) { <<-YAML.unindent }
2621
+ mod_a::a: value mod_a::a (from module)
2622
+ mod_a::d:
2623
+ a: value mod_a::d.a (from module)
2624
+ mod_a::f:
2625
+ a:
2626
+ a: value mod_a::f.a.a (from module)
2627
+ lookup_options:
2628
+ mod_a::e:
2629
+ merge: deep
2630
+ YAML
2631
+
2632
+
2633
+ let(:mod_a_common2) { <<-YAML.unindent }
2634
+ mod_a::b: value mod_a::b (from module)
2635
+ mod_a::d:
2636
+ c: value mod_a::d.c (from module)
2637
+ mod_a::f:
2638
+ a:
2639
+ b: value mod_a::f.a.b (from module)
2640
+ YAML
2641
+
2642
+ let(:mod_a_defaults) { <<-YAML.unindent }
2643
+ mod_a::a: value mod_a::a (from module defaults)
2644
+ mod_a::b: value mod_a::b (from module defaults)
2645
+ mod_a::c: value mod_a::c (from module defaults)
2646
+ mod_a::d:
2647
+ b: value mod_a::d.b (from module defaults)
2648
+ mod_a::e:
2649
+ a:
2650
+ a: value mod_a::e.a.a (from module defaults)
2651
+ mod_a::g:
2652
+ a:
2653
+ a: value mod_a::g.a.a (from module defaults)
2654
+ lookup_options:
2655
+ mod_a::d:
2656
+ merge: hash
2657
+ mod_a::g:
2658
+ merge: deep
2659
+ YAML
2660
+
2661
+ let(:mod_a_defaults2) { <<-YAML.unindent }
2662
+ mod_a::e:
2663
+ a:
2664
+ b: value mod_a::e.a.b (from module defaults)
2665
+ mod_a::g:
2666
+ a:
2667
+ b: value mod_a::g.a.b (from module defaults)
2668
+ YAML
2669
+
2670
+ let(:mod_a_files) do
2671
+ {
2672
+ 'mod_a' => {
2673
+ 'data' => {
2674
+ 'common.yaml' => mod_a_common,
2675
+ 'common2.yaml' => mod_a_common2,
2676
+ 'defaults.yaml' => mod_a_defaults,
2677
+ 'defaults2.yaml' => mod_a_defaults2
2678
+ },
2679
+ 'hiera.yaml' => mod_a_hiera_yaml
2680
+ }
2681
+ }
2682
+ end
2683
+
2684
+ it 'the default hierarchy does not interfere with environment hierarchy' do
2685
+ expect(lookup('mod_a::a')).to eql('value mod_a::a (from environment)')
2686
+ end
2687
+
2688
+ it 'the default hierarchy does not interfere with regular hierarchy in module' do
2689
+ expect(lookup('mod_a::b')).to eql('value mod_a::b (from module)')
2690
+ end
2691
+
2692
+ it 'the default hierarchy is consulted when no value is found elsewhere' do
2693
+ expect(lookup('mod_a::c')).to eql('value mod_a::c (from module defaults)')
2694
+ end
2695
+
2696
+ it 'the default hierarchy does not participate in a merge' do
2697
+ expect(lookup('mod_a::d', 'merge' => 'hash')).to eql('a' => 'value mod_a::d.a (from module)', 'c' => 'value mod_a::d.c (from module)')
2698
+ end
2699
+
2700
+ it 'lookup_options from regular hierarchy does not effect values found in the default hierarchy' do
2701
+ expect(lookup('mod_a::e')).to eql('a' => { 'a' => 'value mod_a::e.a.a (from module defaults)' })
2702
+ end
2703
+
2704
+ it 'lookup_options from default hierarchy affects values found in the default hierarchy' do
2705
+ expect(lookup('mod_a::g')).to eql('a' => { 'a' => 'value mod_a::g.a.a (from module defaults)', 'b' => 'value mod_a::g.a.b (from module defaults)'})
2706
+ end
2707
+
2708
+ it 'merge parameter does not override lookup_options defined in the default hierarchy' do
2709
+ expect(lookup('mod_a::g', 'merge' => 'hash')).to eql(
2710
+ 'a' => { 'a' => 'value mod_a::g.a.a (from module defaults)', 'b' => 'value mod_a::g.a.b (from module defaults)'})
2711
+ end
2712
+
2713
+ it 'lookup_options from default hierarchy does not effect values found in the regular hierarchy' do
2714
+ expect(lookup('mod_a::d')).to eql('a' => 'value mod_a::d.a (from module)')
2715
+ end
2716
+
2717
+ it 'the default hierarchy lookup is included in the explain output' do
2718
+ explanation = explain('mod_a::c')
2719
+ expect(explanation).to match(/Searching default_hierarchy of module "mod_a".+Original path: "defaults.yaml"/m)
2720
+ end
2721
+ end
353
2722
  end
354
- end
355
2723
 
356
- context 'when accessing bad data' do
357
- it 'will raise an exception when key in the function provided module data is not prefixed' do
358
- Puppet[:code] = 'include bad_data'
359
- expect do
360
- compiler.compile()
361
- end.to raise_error(Puppet::ParseError, /data for module 'bad_data' must use keys qualified with the name of the module/)
2724
+ context 'and an eyaml lookup_key function' do
2725
+ let(:private_key_name) { 'private_key.pkcs7.pem' }
2726
+ let(:public_key_name) { 'public_key.pkcs7.pem' }
2727
+
2728
+ let(:private_key) do
2729
+ <<-PKCS7.unindent
2730
+ -----BEGIN RSA PRIVATE KEY-----
2731
+ MIIEogIBAAKCAQEAwHB3GvImq59em4LV9DMfP0Zjs21eW3Jd5I9fuY0jLJhIkH6f
2732
+ CR7tyOpYV6xUj+TF8giq9WLxZI7sourMJMWjEWhVjgUr5lqp1RLv4lwfDv3Wk4XC
2733
+ 2LUuqj1IAErUXKeRz8i3lUSZW1Pf4CaMpnIiPdWbz6f0KkaJSFi9bqexONBx4fKQ
2734
+ NlgZwm2/aYjjrYng788I0QhWDKUqsQOi5mZKlHNRsDlk7J3Afhsx/jTLrCX/G8+2
2735
+ tPtLsHyRN39kluM5vYHbKXDsCG/a88Z2yUE2+r4Clp0FUKffiEDBPm0/H0sQ4Q1o
2736
+ EfQFDQRKaIkhpsm0nOnLYTy3/xJc5uqDNkLiawIDAQABAoIBAE98pNXOe8ab93oI
2737
+ mtNZYmjCbGAqprTjEoFb71A3SfYbmK2Gf65GxjUdBwx/tBYTiuekSOk+yzKcDoZk
2738
+ sZnmwKpqDByzaiSmAkxunANFxdZtZvpcX9UfUX0j/t+QCROUa5gF8j6HrUiZ5nkx
2739
+ sxr1PcuItekaGLJ1nDLz5JsWTQ+H4M+GXQw7/t96x8v8g9el4exTiAHGk6Fv16kD
2740
+ 017T02M9qTTmV3Ab/enDIBmKVD42Ta36K/wc4l1aoUQNiRbIGVh96Cgd1CFXLF3x
2741
+ CsaNbYT4SmRXaYqoj6MKq+QFEGxadFmJy48NoSd4joirIn2lUjHxJebw3lLbNLDR
2742
+ uvQnQ2ECgYEA/nD94wEMr6078uMv6nKxPpNGq7fihwSKf0G/PQDqrRmjUCewuW+k
2743
+ /iXMe1Y/y0PjFeNlSbUsUvKQ5xF7F/1AnpuPHIrn3cjGVLb71W+zen1m8SnhsW/f
2744
+ 7dPgtcb4SCvfhmLgoov+P34YcNfGi6qgPUu6319IqoB3BIi7PvfEomkCgYEAwZ4+
2745
+ V0bMjFdDn2hnYzjTNcF2aUQ1jPvtuETizGwyCbbMLl9522lrjC2DrH41vvqX35ct
2746
+ CBJkhQFbtHM8Gnmozv0vxhI2jP+u14mzfePZsaXuYrEgWRj+BCsYUHodXryxnEWj
2747
+ yVrTNskab1B5jFm2SCJDmKcycBOYpRBLCMx6W7MCgYBA99z7/6KboOIzzKrJdGup
2748
+ jLV410UyMIikoccQ7pD9jhRTPS80yjsY4dHqlEVJw5XSWvPb9DTTITi6p44EvBep
2749
+ 6BKMuTMnQELUEr0O7KypVCfa4FTOl8BX28f+4kU3OGykxc6R8qkC0VGwTohV1UWB
2750
+ ITsgGhZV4uOA9uDI3T8KMQKBgEnQY2HwmuDSD/TA39GDA3qV8+ez2lqSXRGIKZLX
2751
+ mMf9SaBQQ+uzKA4799wWDbVuYeIbB07xfCL83pJP8FUDlqi6+7Celu9wNp7zX1ua
2752
+ Nw8z/ErhzjxJe+Xo7A8aTwIkG+5A2m1UU/up9YsEeiJYvVaIwY58B42U2vfq20BS
2753
+ fD9jAoGAX2MscBzIsmN+U9R0ptL4SXcPiVnOl8mqvQWr1B4OLgxX7ghht5Fs956W
2754
+ bHipxOWMFCPJA/AhNB8q1DvYiD1viZbIALSCJVUkzs4AEFIjiPsCBKxerl7jF6Xp
2755
+ 1WYSaCmfvoCVEpFNt8cKp4Gq+zEBYAV4Q6TkcD2lDtEW49MuN8A=
2756
+ -----END RSA PRIVATE KEY-----
2757
+ PKCS7
2758
+ end
2759
+
2760
+ let(:public_key) do
2761
+ <<-PKCS7.unindent
2762
+ -----BEGIN CERTIFICATE-----
2763
+ MIIC2TCCAcGgAwIBAgIBATANBgkqhkiG9w0BAQUFADAAMCAXDTE3MDExMzA5MTY1
2764
+ MloYDzIwNjcwMTAxMDkxNjUyWjAAMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
2765
+ CgKCAQEAwHB3GvImq59em4LV9DMfP0Zjs21eW3Jd5I9fuY0jLJhIkH6fCR7tyOpY
2766
+ V6xUj+TF8giq9WLxZI7sourMJMWjEWhVjgUr5lqp1RLv4lwfDv3Wk4XC2LUuqj1I
2767
+ AErUXKeRz8i3lUSZW1Pf4CaMpnIiPdWbz6f0KkaJSFi9bqexONBx4fKQNlgZwm2/
2768
+ aYjjrYng788I0QhWDKUqsQOi5mZKlHNRsDlk7J3Afhsx/jTLrCX/G8+2tPtLsHyR
2769
+ N39kluM5vYHbKXDsCG/a88Z2yUE2+r4Clp0FUKffiEDBPm0/H0sQ4Q1oEfQFDQRK
2770
+ aIkhpsm0nOnLYTy3/xJc5uqDNkLiawIDAQABo1wwWjAPBgNVHRMBAf8EBTADAQH/
2771
+ MB0GA1UdDgQWBBSejWrVnw7QaBjNFCHMNFi+doSOcTAoBgNVHSMEITAfgBSejWrV
2772
+ nw7QaBjNFCHMNFi+doSOcaEEpAIwAIIBATANBgkqhkiG9w0BAQUFAAOCAQEAAe85
2773
+ BQ1ydAHFqo0ib38VRPOwf5xPHGbYGhvQi4/sU6aTuR7pxaOJPYz05jLhS+utEmy1
2774
+ sknBq60G67yhQE7IHcfwrl1arirG2WmKGvAbjeYL2K1UiU0pVD3D+Klkv/pK6jIQ
2775
+ eOJRGb3qNUn0Sq9EoYIOXiGXQ641F0bZZ0+5H92kT1lmnF5oLfCb84ImD9T3snH6
2776
+ pIr5RKRx/0YmJIcv3WdpoPT903rOJiRIEgIj/hDk9QZTBpm222Ul5yQQ5pBywpSp
2777
+ xh0bmJKAQWhQm7QlybKfyaQmg5ot1jEzWAvD2I5FjHQxmAlchjb6RreaRhExj+JE
2778
+ 5O117dMBdzDBjcNMOA==
2779
+ -----END CERTIFICATE-----
2780
+ PKCS7
2781
+ end
2782
+
2783
+ let(:keys_dir) do
2784
+ keys = tmpdir('keys')
2785
+ dir_contained_in(keys, {
2786
+ private_key_name => private_key,
2787
+ public_key_name => public_key
2788
+ })
2789
+ keys
2790
+ end
2791
+
2792
+ let(:private_key_path) { File.join(keys_dir, private_key_name) }
2793
+ let(:public_key_path) { File.join(keys_dir, public_key_name) }
2794
+
2795
+ let(:env_hiera_yaml) do
2796
+ <<-YAML.unindent
2797
+ version: 5
2798
+ hierarchy:
2799
+ - name: EYaml
2800
+ path: common.eyaml
2801
+ lookup_key: eyaml_lookup_key
2802
+ options:
2803
+ pkcs7_private_key: #{private_key_path}
2804
+ pkcs7_public_key: #{public_key_path}
2805
+ YAML
2806
+ end
2807
+
2808
+ let(:scope_additions) { { 'ipl_suffix' => 'aa' } }
2809
+ let(:data_files) do
2810
+ {
2811
+ 'common.eyaml' => <<-YAML.unindent
2812
+ # a: Encrypted value 'a' (from environment)
2813
+ a: >
2814
+ ENC[PKCS7,MIIBmQYJKoZIhvcNAQcDoIIBijCCAYYCAQAxggEhMIIBHQIBADAFMAACAQEw
2815
+ DQYJKoZIhvcNAQEBBQAEggEAUwwNRA5ZKM87SLnjnJfzDFRQbeheSYMTOhcr
2816
+ sgTPCGtzEAzvRBrkdIRAvDZVRfadV9OB+bJsYrhWIkU1bYiOn1m78ginh96M
2817
+ 44RuspnIZYnL9Dhs+JyC8VvB5nlvlEph2RGt+KYg9iU4JYhwZ2+8+yxB6/UK
2818
+ H5HGKDCjBbEc8o9MbCckLsciIh11hKKgT6K0yhKB/nBxxM78nrX0BxmAHX2u
2819
+ bejKDRa9S/0uS7Y91nvnbIkaQpZ4KteSQ+J4/lQBMlMAeE+2F9ncM8jFKnQC
2820
+ rzzdbn1O/zwsEt5J5CRP1Sc+8hM644+IqkLs+17segxArHVGOsEqyDcHbXEK
2821
+ 9jspfzBcBgkqhkiG9w0BBwEwHQYJYIZIAWUDBAEqBBCIq/L5HeJgA9XQm67j
2822
+ JHUngDDS5s52FsuSIMin7Z/pV+XuaJGFkL80ia4bXnCWilmtM8oUa/DZuBje
2823
+ dCILO7I8QqU=]
2824
+ hash_a:
2825
+ "hash_%{ipl_suffix}":
2826
+ # aaa: Encrypted value hash_a.hash_aa.aaa (from environment)
2827
+ aaa: >
2828
+ ENC[PKCS7,MIIBqQYJKoZIhvcNAQcDoIIBmjCCAZYCAQAxggEhMIIBHQIBADAFMAACAQEw
2829
+ DQYJKoZIhvcNAQEBBQAEggEAhvGXL5RxVUs9wdqJvpCyXtfCHrm2HbG/u30L
2830
+ n8EuRD9ravlsgIISAnd27JPtrxA+0rZq4EQRGz6OcovnH9vTg86/lVBhhPnz
2831
+ b83ArptGJhRvTYUJ19GZI3AYjJbhWj/Jo5NL56oQJaPBccqHxMApm/U0wlus
2832
+ QtASL94cLuh4toVIBQCQzD5/Bx51p2wQobm9p4WKSl1zJhDceurmoLZXqhuN
2833
+ JwwEBwXopJvgid3ZDPbdX8nI6vHhb/8wDq9yb5DOsrkgqDqQgwPU9sUUioQj
2834
+ Hr1pGyeOWnbEe99iEb2+m7TWsC0NN7OBo06mAgFNbBLjvn2k4PiCxrOOgJ8S
2835
+ LI5eXjBsBgkqhkiG9w0BBwEwHQYJYIZIAWUDBAEqBBCWNS6j3m/Xvrp5RFaN
2836
+ ovm/gEB4oPlYJswoXuWqcEBfwZzbpy96x3b2Le/yoa72ylbPAUc5GfLENvFQ
2837
+ zXpTtSmQE0fixY4JMaBTke65ZRvoiOQO]
2838
+ array_a:
2839
+ # - "array_a[0]"
2840
+ - >
2841
+ ENC[PKCS7,MIIBeQYJKoZIhvcNAQcDoIIBajCCAWYCAQAxggEhMIIBHQIBADAFMAACAQEw
2842
+ DQYJKoZIhvcNAQEBBQAEggEAmXZfyfU77vVCZqHpR10qhD0Jy9DpMGBgal97
2843
+ vUO2VHX7KlCgagK0kz8/uLRIthkYzcpn8ISmw/+CIAny3jOjxOsylJiujqyu
2844
+ hx/JEFl8bOKOg40Bd0UuBaw/qZ+CoAtOorhiIW7x6t7DpknItC6gkH/cSJ4/
2845
+ p3MdhoARRuwj2fvuaChVsD39l2rXjgJj0OJOaDXdbuisG75VRZf5l8IH6+44
2846
+ Q7m6W7BU69LX+ozn+W3filQoiJ5MPf8w/KXAObMSbKYIDsrZUyIWyyNUbpW0
2847
+ MieIkHj93bX3gIEcenECLdWaEzcPa7MHgl6zevQKg4H0JVmcvKYyfHYqcrVE
2848
+ PqizKDA8BgkqhkiG9w0BBwEwHQYJYIZIAWUDBAEqBBDf259KZEay1widVSFy
2849
+ I9zGgBAICjm0x2GeqoCnHdiAA+jt]
2850
+ # - "array_a[1]"
2851
+ - >
2852
+ ENC[PKCS7,MIIBeQYJKoZIhvcNAQcDoIIBajCCAWYCAQAxggEhMIIBHQIBADAFMAACAQEw
2853
+ DQYJKoZIhvcNAQEBBQAEggEATVy4hHG356INFKOswAhoravh66iJljp+Vn3o
2854
+ UVD1kyRiqY5tz3UVSptzUmzD+YssX/f73AKCjUI3HrPNL7kAxsk6fWS7nDEj
2855
+ AuxtCqGYeBha6oYJYziSGIHfAdY3MiJUI1C9g/OQB4TTvKdrlDArPiY8THJi
2856
+ bzLLMbVQYJ6ixSldwkdKD75vtikyamx+1LSyVBSg8maVyPvLHtLZJuT71rln
2857
+ WON3Ious9PIbd+izbcCzaoqh5UnTfDCjOuAYliXalBxamIIwNzSV1sdR8/qf
2858
+ t22zpYK4J8lgCBV2gKfrOWSi9MAs6JhCeOb8wNLMmAUTbc0WrFJxoCwAPX0z
2859
+ MAjsNjA8BgkqhkiG9w0BBwEwHQYJYIZIAWUDBAEqBBC4v4bNE4gFlbLmVY+9
2860
+ BtSLgBBm7U0wu6d6s9wF9Ek9IHPe]
2861
+ # ref_a: "A resolved = '%{hiera('a')}'"
2862
+ ref_a: >
2863
+ ENC[PKCS7,MIIBiQYJKoZIhvcNAQcDoIIBejCCAXYCAQAxggEhMIIBHQIBADAFMAACAQEw
2864
+ DQYJKoZIhvcNAQEBBQAEggEAFSuUp+yk+oaA7b5ekT0u360CQ9Q2sIQ/bTcM
2865
+ jT3XLjm8HIGYPcysOEnuo8WcAxJFY5iya4yQ7Y/UhMWXaTi7Vzv/6BmyPDwz
2866
+ +7Z2Mf0r0PvS5+ylue6aem/3bXPOmXTKTf68OCehTRXlDUs8/av9gnsDzojp
2867
+ yiUTBZvKxhIP2n//GyoHgyATveHT0lxPVpdMycB347DtWS7IduCxx0+KiOOw
2868
+ DXYFlYbIVxVInwgERxtsfYSr+Fu0/mkjtRsQm+dPzMQOATE9Val2gGKsV6bi
2869
+ kdm1OM9HrwVsFj6Lma6FYmr89Bcm/1uEc8fiOMtNK3z2+nwunWBMNCGneMYD
2870
+ C5IJejBMBgkqhkiG9w0BBwEwHQYJYIZIAWUDBAEqBBAeiZDGQyXHkZlV5ceT
2871
+ iCxpgCDDatuVvbPEEi8rKOC7xhPHZ22zLEEV//l7C9jxq+DZcA==]
2872
+ YAML
2873
+ }
2874
+ end
2875
+
2876
+ let(:env_data) { data_files }
2877
+
2878
+ it 'finds data in the environment' do
2879
+ expect(lookup('a')).to eql("Encrypted value 'a' (from environment)")
2880
+ end
2881
+
2882
+ it 'evaluates interpolated keys' do
2883
+ expect(lookup('hash_a')).to include('hash_aa')
2884
+ end
2885
+
2886
+ it 'evaluates interpolations in encrypted values' do
2887
+ expect(lookup('ref_a')).to eql("A resolved = 'Encrypted value 'a' (from environment)'")
2888
+ end
2889
+
2890
+ it 'can read encrypted values inside a hash' do
2891
+ expect(lookup('hash_a.hash_aa.aaa')).to eql('Encrypted value hash_a.hash_aa.aaa (from environment)')
2892
+ end
2893
+
2894
+ it 'can read encrypted values inside an array' do
2895
+ expect(lookup('array_a')).to eql(['array_a[0]', 'array_a[1]'])
2896
+ end
2897
+
2898
+ context 'declared in global scope as a Hiera v3 backend' do
2899
+ let(:environment_files) { {} }
2900
+ let(:data_file_content) { <<-YAML.unindent }
2901
+ a: >
2902
+ ENC[PKCS7,MIIBmQYJKoZIhvcNAQcDoIIBijCCAYYCAQAxggEhMIIBHQIBADAFMAACAQEw
2903
+ DQYJKoZIhvcNAQEBBQAEggEAH457bsfL8kYw9O50roE3dcE21nCnmPnQ2XSX
2904
+ LYRJ2C78LarbfFonKz0gvDW7tyhsLWASFCFaiU8T1QPBd2b3hoQK8E4B2Ual
2905
+ xga/K7r9y3OSgRomTm9tpTltC6re0Ubh3Dy71H61obwxEdNVTqjPe95+m2b8
2906
+ 6zWZVnzZzXXsTG1S17yJn1zaB/LXHbWNy4KyLLKCGAml+Gfl6ZMjmaplTmUA
2907
+ QIC5rI8abzbPP3TDMmbLOGNkrmLqI+3uS8tSueTMoJmWaMF6c+H/cA7oRxmV
2908
+ QCeEUVXjyFvCHcmbA+keS/RK9XF+vc07/XS4XkYSPs/I5hLQji1y9bkkGAs0
2909
+ tehxQjBcBgkqhkiG9w0BBwEwHQYJYIZIAWUDBAEqBBDHpA6Fcl/R16aIYcow
2910
+ oiO4gDAvfFH6jLUwXkcYtagnwdmhkd9TQJtxNWcIwMpvmk036MqIoGwwhQdg
2911
+ gV4beiCFtLU=]
2912
+ YAML
2913
+
2914
+ let(:hiera_yaml) do
2915
+ <<-YAML.unindent
2916
+ :backends: eyaml
2917
+ :eyaml:
2918
+ :datadir: #{code_dir}/hieradata
2919
+ :pkcs7_private_key: #{private_key_path}
2920
+ :pkcs7_public_key: #{public_key_path}
2921
+ :hierarchy:
2922
+ - common
2923
+ YAML
2924
+ end
2925
+
2926
+ let(:data_files) do
2927
+ {
2928
+ 'common.eyaml' => data_file_content
2929
+ }
2930
+ end
2931
+
2932
+ let(:code_dir_files) do
2933
+ {
2934
+ 'hiera.yaml' => hiera_yaml,
2935
+ 'hieradata' => data_files
2936
+ }
2937
+ end
2938
+
2939
+ before(:each) do
2940
+ Puppet.settings[:hiera_config] = File.join(code_dir, 'hiera.yaml')
2941
+ end
2942
+
2943
+ it 'finds data in the global layer' do
2944
+ expect(lookup('a')).to eql("Encrypted value 'a' (from global)")
2945
+ end
2946
+
2947
+ it 'delegates configured eyaml backend to eyaml_lookup_key function' do
2948
+ expect(explain('a')).to match(/Hierarchy entry "eyaml"\n.*\n.*\n.*"common"\n\s*Found key: "a"/m)
2949
+ end
2950
+
2951
+ context 'using intepolated paths to the key pair' do
2952
+ let(:scope_additions) { { 'priv_path' => private_key_path, 'pub_path' => public_key_path } }
2953
+
2954
+ let(:hiera_yaml) do
2955
+ <<-YAML.unindent
2956
+ :backends: eyaml
2957
+ :eyaml:
2958
+ :datadir: #{code_dir}/hieradata
2959
+ :pkcs7_private_key: "%{priv_path}"
2960
+ :pkcs7_public_key: "%{pub_path}"
2961
+ :hierarchy:
2962
+ - common
2963
+ YAML
2964
+ end
2965
+
2966
+ it 'finds data in the global layer' do
2967
+ expect(lookup('a')).to eql("Encrypted value 'a' (from global)")
2968
+ end
2969
+ end
2970
+
2971
+ context 'with special extension declared in options' do
2972
+ let(:environment_files) { {} }
2973
+ let(:hiera_yaml) do
2974
+ <<-YAML.unindent
2975
+ :backends: eyaml
2976
+ :eyaml:
2977
+ :extension: xyaml
2978
+ :datadir: #{code_dir}/hieradata
2979
+ :pkcs7_private_key: #{private_key_path}
2980
+ :pkcs7_public_key: #{public_key_path}
2981
+ :hierarchy:
2982
+ - common
2983
+ YAML
2984
+ end
2985
+
2986
+ let(:data_files) do
2987
+ {
2988
+ 'common.xyaml' => data_file_content
2989
+ }
2990
+ end
2991
+
2992
+ it 'finds data in the global layer' do
2993
+ expect(lookup('a')).to eql("Encrypted value 'a' (from global)")
2994
+ end
2995
+
2996
+ it 'delegates configured eyaml backend to eyaml_lookup_key function' do
2997
+ expect(explain('a')).to match(/Hierarchy entry "eyaml"\n.*\n.*\n.*"common"\n\s*Found key: "a"/m)
2998
+ end
2999
+ end
3000
+ end
362
3001
  end
363
3002
  end
364
3003
  end