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