puppet 4.0.0 → 4.9.1

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 (1644) hide show
  1. data/COMMITTERS.md +2 -2
  2. data/CONTRIBUTING.md +34 -10
  3. data/Gemfile +25 -9
  4. data/LICENSE +3 -3
  5. data/MAINTAINERS +71 -0
  6. data/README.md +9 -11
  7. data/Rakefile +29 -0
  8. data/conf/auth.conf +2 -2
  9. data/conf/puppet.conf +1 -1
  10. data/ext/README.environment +1 -1
  11. data/ext/build_defaults.yaml +10 -37
  12. data/ext/debian/README.source +1 -1
  13. data/ext/debian/control +3 -5
  14. data/ext/debian/copyright +4 -4
  15. data/ext/debian/puppet.default +0 -5
  16. data/ext/debian/puppet.init +1 -16
  17. data/ext/debian/puppet.logrotate +14 -5
  18. data/ext/debian/puppetmaster.README.debian +11 -9
  19. data/ext/emacs/puppet-mode.el +1 -1
  20. data/ext/envpuppet +2 -2
  21. data/ext/ips/puppetagent.xml +1 -1
  22. data/ext/ips/puppetmaster.xml +1 -1
  23. data/ext/osx/puppet.plist +30 -0
  24. data/ext/project_data.yaml +29 -13
  25. data/ext/puppet-test +3 -3
  26. data/ext/rack/example-passenger-vhost.conf +1 -1
  27. data/ext/redhat/client.init +67 -17
  28. data/ext/redhat/client.sysconfig +1 -10
  29. data/ext/redhat/logrotate +15 -3
  30. data/ext/redhat/puppet.spec.erb +6 -11
  31. data/ext/redhat/server.init +1 -1
  32. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  33. data/ext/solaris/pkginfo +1 -1
  34. data/ext/solaris/smf/puppet +44 -0
  35. data/ext/solaris/smf/puppet.xml +44 -0
  36. data/ext/suse/client.init +30 -33
  37. data/ext/suse/puppet.spec +2 -2
  38. data/ext/suse/server.init +2 -2
  39. data/ext/systemd/puppet.service +13 -1
  40. data/ext/upload_facts.rb +1 -1
  41. data/ext/windows/puppet_interactive.bat +6 -0
  42. data/ext/windows/puppet_shell.bat +9 -0
  43. data/ext/windows/run_puppet_interactive.bat +9 -0
  44. data/ext/windows/service/daemon.rb +2 -1
  45. data/ext/yaml_nodes.rb +1 -1
  46. data/install.rb +98 -65
  47. data/lib/hiera/puppet_function.rb +27 -18
  48. data/lib/hiera/scope.rb +12 -14
  49. data/lib/hiera_puppet.rb +6 -14
  50. data/lib/puppet/agent/locker.rb +11 -2
  51. data/lib/puppet/agent.rb +12 -27
  52. data/lib/puppet/application/agent.rb +40 -19
  53. data/lib/puppet/application/apply.rb +69 -16
  54. data/lib/puppet/application/ca.rb +1 -0
  55. data/lib/puppet/application/cert.rb +52 -3
  56. data/lib/puppet/application/device.rb +10 -5
  57. data/lib/puppet/application/face_base.rb +4 -0
  58. data/lib/puppet/application/filebucket.rb +79 -5
  59. data/lib/puppet/application/generate.rb +5 -0
  60. data/lib/puppet/application/inspect.rb +2 -2
  61. data/lib/puppet/application/lookup.rb +344 -0
  62. data/lib/puppet/application/master.rb +22 -7
  63. data/lib/puppet/application/resource.rb +2 -6
  64. data/lib/puppet/application.rb +6 -4
  65. data/lib/puppet/application_support.rb +1 -1
  66. data/lib/puppet/compilable_resource_type.rb +15 -0
  67. data/lib/puppet/configurer/plugin_handler.rb +7 -5
  68. data/lib/puppet/configurer.rb +184 -42
  69. data/lib/puppet/context/trusted_information.rb +21 -1
  70. data/lib/puppet/context.rb +16 -1
  71. data/lib/puppet/daemon.rb +17 -13
  72. data/lib/puppet/data_binding.rb +4 -2
  73. data/lib/puppet/data_providers/data_adapter.rb +14 -68
  74. data/lib/puppet/data_providers/data_function_support.rb +13 -26
  75. data/lib/puppet/data_providers/function_env_data_provider.rb +7 -9
  76. data/lib/puppet/data_providers/function_module_data_provider.rb +7 -22
  77. data/lib/puppet/data_providers/hiera_config.rb +151 -0
  78. data/lib/puppet/data_providers/hiera_env_data_provider.rb +25 -0
  79. data/lib/puppet/data_providers/hiera_interpolate.rb +21 -0
  80. data/lib/puppet/data_providers/hiera_module_data_provider.rb +30 -0
  81. data/lib/puppet/data_providers/hiera_support.rb +42 -0
  82. data/lib/puppet/data_providers/json_data_provider_factory.rb +38 -0
  83. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +40 -0
  84. data/lib/puppet/data_providers.rb +17 -14
  85. data/lib/puppet/defaults.rb +279 -57
  86. data/lib/puppet/environments.rb +105 -10
  87. data/lib/puppet/error.rb +31 -1
  88. data/lib/puppet/external/dot.rb +1 -1
  89. data/lib/puppet/face/ca.rb +6 -1
  90. data/lib/puppet/face/catalog.rb +1 -1
  91. data/lib/puppet/face/certificate.rb +7 -1
  92. data/lib/puppet/face/certificate_request.rb +2 -0
  93. data/lib/puppet/face/certificate_revocation_list.rb +2 -0
  94. data/lib/puppet/face/config.rb +2 -2
  95. data/lib/puppet/face/epp.rb +63 -17
  96. data/lib/puppet/face/file.rb +3 -0
  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 +35 -27
  101. data/lib/puppet/face/key.rb +1 -0
  102. data/lib/puppet/face/man.rb +5 -3
  103. data/lib/puppet/face/module/changes.rb +2 -1
  104. data/lib/puppet/face/module/generate.rb +1 -1
  105. data/lib/puppet/face/module/install.rb +6 -6
  106. data/lib/puppet/face/parser.rb +12 -9
  107. data/lib/puppet/face/plugin.rb +7 -14
  108. data/lib/puppet/face/status.rb +4 -1
  109. data/lib/puppet/feature/base.rb +9 -2
  110. data/lib/puppet/feature/cfacter.rb +1 -0
  111. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  112. data/lib/puppet/feature/external_facts.rb +1 -1
  113. data/lib/puppet/feature/hocon.rb +3 -0
  114. data/lib/puppet/feature/telnet.rb +9 -0
  115. data/lib/puppet/file_bucket/dipper.rb +58 -2
  116. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  117. data/lib/puppet/file_serving/metadata.rb +30 -9
  118. data/lib/puppet/file_serving/terminus_helper.rb +7 -8
  119. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  120. data/lib/puppet/file_system/file_impl.rb +11 -2
  121. data/lib/puppet/file_system/memory_impl.rb +9 -1
  122. data/lib/puppet/file_system/path_pattern.rb +1 -0
  123. data/lib/puppet/file_system/uniquefile.rb +3 -3
  124. data/lib/puppet/file_system/windows.rb +36 -13
  125. data/lib/puppet/file_system.rb +46 -5
  126. data/lib/puppet/forge/repository.rb +2 -34
  127. data/lib/puppet/forge.rb +7 -7
  128. data/lib/puppet/functions/alert.rb +14 -0
  129. data/lib/puppet/functions/assert_type.rb +57 -21
  130. data/lib/puppet/functions/binary_file.rb +19 -0
  131. data/lib/puppet/functions/break.rb +22 -0
  132. data/lib/puppet/functions/contain.rb +33 -0
  133. data/lib/puppet/functions/crit.rb +14 -0
  134. data/lib/puppet/functions/debug.rb +14 -0
  135. data/lib/puppet/functions/defined.rb +160 -0
  136. data/lib/puppet/functions/dig.rb +23 -0
  137. data/lib/puppet/functions/each.rb +89 -39
  138. data/lib/puppet/functions/emerg.rb +14 -0
  139. data/lib/puppet/functions/epp.rb +29 -37
  140. data/lib/puppet/functions/err.rb +14 -0
  141. data/lib/puppet/functions/filter.rb +64 -38
  142. data/lib/puppet/functions/find_file.rb +31 -0
  143. data/lib/puppet/functions/hiera.rb +76 -3
  144. data/lib/puppet/functions/hiera_array.rb +66 -4
  145. data/lib/puppet/functions/hiera_hash.rb +74 -2
  146. data/lib/puppet/functions/hiera_include.rb +78 -5
  147. data/lib/puppet/functions/hocon_data.rb +24 -0
  148. data/lib/puppet/functions/include.rb +21 -0
  149. data/lib/puppet/functions/info.rb +14 -0
  150. data/lib/puppet/functions/inline_epp.rb +44 -71
  151. data/lib/puppet/functions/json_data.rb +18 -0
  152. data/lib/puppet/functions/lest.rb +17 -0
  153. data/lib/puppet/functions/lookup.rb +172 -184
  154. data/lib/puppet/functions/map.rb +60 -33
  155. data/lib/puppet/functions/match.rb +30 -12
  156. data/lib/puppet/functions/new.rb +31 -0
  157. data/lib/puppet/functions/next.rb +23 -0
  158. data/lib/puppet/functions/notice.rb +14 -0
  159. data/lib/puppet/functions/reduce.rb +99 -70
  160. data/lib/puppet/functions/regsubst.rb +23 -26
  161. data/lib/puppet/functions/require.rb +37 -0
  162. data/lib/puppet/functions/return.rb +22 -0
  163. data/lib/puppet/functions/reverse_each.rb +25 -0
  164. data/lib/puppet/functions/scanf.rb +15 -18
  165. data/lib/puppet/functions/slice.rb +22 -36
  166. data/lib/puppet/functions/split.rb +3 -3
  167. data/lib/puppet/functions/step.rb +26 -0
  168. data/lib/puppet/functions/strftime.rb +35 -0
  169. data/lib/puppet/functions/then.rb +14 -0
  170. data/lib/puppet/functions/type.rb +31 -0
  171. data/lib/puppet/functions/unwrap.rb +40 -0
  172. data/lib/puppet/functions/versioncmp.rb +36 -0
  173. data/lib/puppet/functions/warning.rb +14 -0
  174. data/lib/puppet/functions/with.rb +15 -7
  175. data/lib/puppet/functions/yaml_data.rb +21 -0
  176. data/lib/puppet/functions.rb +164 -31
  177. data/lib/puppet/generate/models/type/property.rb +70 -0
  178. data/lib/puppet/generate/models/type/type.rb +61 -0
  179. data/lib/puppet/generate/templates/type/pcore.erb +42 -0
  180. data/lib/puppet/generate/type.rb +239 -0
  181. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  182. data/lib/puppet/graph/simple_graph.rb +6 -8
  183. data/lib/puppet/indirector/catalog/compiler.rb +196 -9
  184. data/lib/puppet/indirector/catalog/static_compiler.rb +50 -31
  185. data/lib/puppet/indirector/data_binding/none.rb +4 -1
  186. data/lib/puppet/indirector/face.rb +6 -1
  187. data/lib/puppet/indirector/facts/facter.rb +9 -1
  188. data/lib/puppet/indirector/file_bucket_file/file.rb +68 -3
  189. data/lib/puppet/indirector/file_content/http.rb +15 -0
  190. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  191. data/lib/puppet/indirector/generic_http.rb +16 -0
  192. data/lib/puppet/indirector/hiera.rb +7 -1
  193. data/lib/puppet/indirector/indirection.rb +12 -3
  194. data/lib/puppet/indirector/json.rb +3 -3
  195. data/lib/puppet/indirector/key/ca.rb +2 -2
  196. data/lib/puppet/indirector/msgpack.rb +2 -2
  197. data/lib/puppet/indirector/node/exec.rb +1 -1
  198. data/lib/puppet/indirector/node/ldap.rb +1 -1
  199. data/lib/puppet/indirector/request.rb +36 -12
  200. data/lib/puppet/indirector/resource_type/parser.rb +10 -3
  201. data/lib/puppet/indirector/rest.rb +80 -5
  202. data/lib/puppet/indirector/terminus.rb +4 -4
  203. data/lib/puppet/info_service/class_information_service.rb +111 -0
  204. data/lib/puppet/info_service.rb +7 -0
  205. data/lib/puppet/interface/documentation.rb +1 -1
  206. data/lib/puppet/interface/face_collection.rb +1 -1
  207. data/lib/puppet/interface.rb +14 -2
  208. data/lib/puppet/loaders.rb +6 -0
  209. data/lib/puppet/metatype/manager.rb +25 -8
  210. data/lib/puppet/module.rb +48 -20
  211. data/lib/puppet/module_tool/applications/application.rb +1 -1
  212. data/lib/puppet/module_tool/applications/builder.rb +5 -4
  213. data/lib/puppet/module_tool/applications/installer.rb +14 -14
  214. data/lib/puppet/module_tool/applications/unpacker.rb +1 -1
  215. data/lib/puppet/module_tool/applications/upgrader.rb +13 -13
  216. data/lib/puppet/module_tool/checksums.rb +1 -1
  217. data/lib/puppet/module_tool/errors/installer.rb +2 -2
  218. data/lib/puppet/module_tool/installed_modules.rb +7 -7
  219. data/lib/puppet/module_tool/local_tarball.rb +3 -3
  220. data/lib/puppet/module_tool/metadata.rb +34 -11
  221. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +14 -3
  222. data/lib/puppet/module_tool/skeleton/templates/generator/README.md.erb +42 -38
  223. data/lib/puppet/module_tool/skeleton/templates/generator/Rakefile +19 -4
  224. data/lib/puppet/module_tool/skeleton/templates/generator/{tests → examples}/init.pp.erb +2 -2
  225. data/lib/puppet/module_tool/skeleton/templates/generator/manifests/init.pp.erb +25 -18
  226. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -2
  227. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  228. data/lib/puppet/module_tool.rb +5 -5
  229. data/lib/puppet/network/auth_config_parser.rb +1 -1
  230. data/lib/puppet/network/authconfig.rb +21 -1
  231. data/lib/puppet/network/authorization.rb +8 -1
  232. data/lib/puppet/network/http/api/indirected_routes.rb +23 -34
  233. data/lib/puppet/network/http/api/master/v3/environment.rb +63 -0
  234. data/lib/puppet/network/http/api/master/v3.rb +7 -1
  235. data/lib/puppet/network/http/connection.rb +2 -0
  236. data/lib/puppet/network/http/error.rb +1 -1
  237. data/lib/puppet/network/http/factory.rb +8 -4
  238. data/lib/puppet/network/http/handler.rb +3 -2
  239. data/lib/puppet/network/http/pool.rb +9 -0
  240. data/lib/puppet/network/http/rack/rest.rb +25 -2
  241. data/lib/puppet/network/http/webrick.rb +2 -1
  242. data/lib/puppet/network/rights.rb +1 -11
  243. data/lib/puppet/node/environment.rb +53 -14
  244. data/lib/puppet/node/facts.rb +1 -1
  245. data/lib/puppet/node.rb +39 -8
  246. data/lib/puppet/parameter/boolean.rb +1 -1
  247. data/lib/puppet/parameter/value.rb +1 -1
  248. data/lib/puppet/parameter.rb +23 -3
  249. data/lib/puppet/parser/ast/pops_bridge.rb +101 -27
  250. data/lib/puppet/parser/ast/resource.rb +5 -0
  251. data/lib/puppet/parser/ast/resource_instance.rb +5 -1
  252. data/lib/puppet/parser/ast/resourceparam.rb +5 -0
  253. data/lib/puppet/parser/ast.rb +5 -0
  254. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +64 -0
  255. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +60 -0
  256. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +20 -0
  257. data/lib/puppet/parser/compiler/catalog_validator.rb +33 -0
  258. data/lib/puppet/parser/compiler.rb +343 -28
  259. data/lib/puppet/parser/e4_parser_adapter.rb +13 -12
  260. data/lib/puppet/parser/environment_compiler.rb +201 -0
  261. data/lib/puppet/parser/functions/assert_type.rb +47 -17
  262. data/lib/puppet/parser/functions/binary_file.rb +24 -0
  263. data/lib/puppet/parser/functions/break.rb +39 -0
  264. data/lib/puppet/parser/functions/contain.rb +7 -15
  265. data/lib/puppet/parser/functions/create_resources.rb +39 -23
  266. data/lib/puppet/parser/functions/defined.rb +106 -69
  267. data/lib/puppet/parser/functions/dig.rb +29 -0
  268. data/lib/puppet/parser/functions/each.rb +86 -28
  269. data/lib/puppet/parser/functions/epp.rb +30 -38
  270. data/lib/puppet/parser/functions/file.rb +3 -1
  271. data/lib/puppet/parser/functions/filter.rb +60 -24
  272. data/lib/puppet/parser/functions/find_file.rb +28 -0
  273. data/lib/puppet/parser/functions/fqdn_rand.rb +3 -3
  274. data/lib/puppet/parser/functions/hiera.rb +98 -28
  275. data/lib/puppet/parser/functions/hiera_array.rb +86 -29
  276. data/lib/puppet/parser/functions/hiera_hash.rb +96 -31
  277. data/lib/puppet/parser/functions/hiera_include.rb +96 -41
  278. data/lib/puppet/parser/functions/include.rb +4 -8
  279. data/lib/puppet/parser/functions/inline_epp.rb +36 -61
  280. data/lib/puppet/parser/functions/inline_template.rb +2 -2
  281. data/lib/puppet/parser/functions/lest.rb +49 -0
  282. data/lib/puppet/parser/functions/lookup.rb +129 -151
  283. data/lib/puppet/parser/functions/map.rb +56 -21
  284. data/lib/puppet/parser/functions/match.rb +29 -13
  285. data/lib/puppet/parser/functions/new.rb +926 -0
  286. data/lib/puppet/parser/functions/next.rb +38 -0
  287. data/lib/puppet/parser/functions/reduce.rb +98 -61
  288. data/lib/puppet/parser/functions/regsubst.rb +4 -2
  289. data/lib/puppet/parser/functions/require.rb +4 -27
  290. data/lib/puppet/parser/functions/return.rb +71 -0
  291. data/lib/puppet/parser/functions/reverse_each.rb +83 -0
  292. data/lib/puppet/parser/functions/scanf.rb +25 -31
  293. data/lib/puppet/parser/functions/slice.rb +18 -25
  294. data/lib/puppet/parser/functions/split.rb +2 -2
  295. data/lib/puppet/parser/functions/step.rb +84 -0
  296. data/lib/puppet/parser/functions/strftime.rb +185 -0
  297. data/lib/puppet/parser/functions/then.rb +73 -0
  298. data/lib/puppet/parser/functions/type.rb +53 -0
  299. data/lib/puppet/parser/functions/with.rb +17 -9
  300. data/lib/puppet/parser/functions.rb +34 -16
  301. data/lib/puppet/parser/resource.rb +149 -35
  302. data/lib/puppet/parser/scope.rb +296 -73
  303. data/lib/puppet/parser/templatewrapper.rb +2 -1
  304. data/lib/puppet/parser/type_loader.rb +1 -1
  305. data/lib/puppet/parser.rb +3 -1
  306. data/lib/puppet/plugins/configuration.rb +11 -2
  307. data/lib/puppet/plugins/data_providers/data_provider.rb +406 -0
  308. data/lib/puppet/plugins/data_providers/registry.rb +51 -0
  309. data/lib/puppet/plugins/data_providers.rb +15 -60
  310. data/lib/puppet/pops/adaptable.rb +4 -4
  311. data/lib/puppet/pops/adapters.rb +115 -31
  312. data/lib/puppet/pops/binder/binder.rb +21 -17
  313. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  314. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  315. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  316. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  317. data/lib/puppet/pops/binder/bindings_label_provider.rb +3 -1
  318. data/lib/puppet/pops/binder/bindings_loader.rb +6 -2
  319. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  320. data/lib/puppet/pops/binder/bindings_model_meta.rb +2 -2
  321. data/lib/puppet/pops/binder/config/binder_config.rb +1 -1
  322. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  323. data/lib/puppet/pops/binder/injector.rb +55 -50
  324. data/lib/puppet/pops/binder/key_factory.rb +10 -12
  325. data/lib/puppet/pops/binder/producers.rb +70 -65
  326. data/lib/puppet/pops/binder/scheme_handler/confdir_scheme.rb +1 -1
  327. data/lib/puppet/pops/binder/scheme_handler/module_scheme.rb +68 -9
  328. data/lib/puppet/pops/evaluator/access_operator.rb +261 -142
  329. data/lib/puppet/pops/evaluator/closure.rb +251 -109
  330. data/lib/puppet/pops/evaluator/collector_transformer.rb +45 -26
  331. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -1
  332. data/lib/puppet/pops/evaluator/collectors/catalog_collector.rb +4 -0
  333. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +5 -2
  334. data/lib/puppet/pops/evaluator/compare_operator.rb +110 -10
  335. data/lib/puppet/pops/evaluator/epp_evaluator.rb +16 -10
  336. data/lib/puppet/pops/evaluator/evaluator_impl.rb +239 -117
  337. data/lib/puppet/pops/evaluator/external_syntax_support.rb +1 -1
  338. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +84 -0
  339. data/lib/puppet/pops/evaluator/literal_evaluator.rb +87 -0
  340. data/lib/puppet/pops/evaluator/relationship_operator.rb +18 -11
  341. data/lib/puppet/pops/evaluator/runtime3_converter.rb +60 -51
  342. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +119 -0
  343. data/lib/puppet/pops/evaluator/runtime3_support.rb +119 -82
  344. data/lib/puppet/pops/functions/dispatch.rb +15 -3
  345. data/lib/puppet/pops/functions/dispatcher.rb +13 -5
  346. data/lib/puppet/pops/functions/function.rb +30 -4
  347. data/lib/puppet/pops/issue_reporter.rb +48 -20
  348. data/lib/puppet/pops/issues.rb +208 -18
  349. data/lib/puppet/pops/label_provider.rb +18 -4
  350. data/lib/puppet/pops/loader/base_loader.rb +64 -18
  351. data/lib/puppet/pops/loader/dependency_loader.rb +27 -2
  352. data/lib/puppet/pops/loader/loader.rb +53 -48
  353. data/lib/puppet/pops/loader/loader_paths.rb +110 -6
  354. data/lib/puppet/pops/loader/module_loaders.rb +72 -28
  355. data/lib/puppet/pops/loader/null_loader.rb +17 -1
  356. data/lib/puppet/pops/loader/predefined_loader.rb +29 -0
  357. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +84 -0
  358. data/lib/puppet/pops/loader/puppet_resource_type_impl_instantiator.rb +80 -0
  359. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -4
  360. data/lib/puppet/pops/loader/runtime3_type_loader.rb +96 -0
  361. data/lib/puppet/pops/loader/static_loader.rb +139 -38
  362. data/lib/puppet/pops/loader/type_definition_instantiator.rb +93 -0
  363. data/lib/puppet/pops/loader/typed_name.rb +48 -0
  364. data/lib/puppet/pops/loaders.rb +207 -29
  365. data/lib/puppet/pops/lookup/configured_data_provider.rb +87 -0
  366. data/lib/puppet/pops/lookup/context.rb +136 -0
  367. data/lib/puppet/pops/lookup/data_adapter.rb +27 -0
  368. data/lib/puppet/pops/lookup/data_dig_function_provider.rb +55 -0
  369. data/lib/puppet/pops/lookup/data_hash_function_provider.rb +111 -0
  370. data/lib/puppet/pops/lookup/data_provider.rb +102 -0
  371. data/lib/puppet/pops/lookup/environment_data_provider.rb +27 -0
  372. data/lib/puppet/pops/lookup/explainer.rb +593 -0
  373. data/lib/puppet/pops/lookup/function_provider.rb +82 -0
  374. data/lib/puppet/pops/lookup/global_data_provider.rb +49 -0
  375. data/lib/puppet/pops/lookup/hiera_config.rb +601 -0
  376. data/lib/puppet/pops/lookup/interpolation.rb +136 -0
  377. data/lib/puppet/pops/lookup/invocation.rb +212 -0
  378. data/lib/puppet/pops/lookup/location_resolver.rb +72 -0
  379. data/lib/puppet/pops/lookup/lookup_adapter.rb +451 -0
  380. data/lib/puppet/pops/lookup/lookup_key.rb +99 -0
  381. data/lib/puppet/pops/lookup/lookup_key_function_provider.rb +119 -0
  382. data/lib/puppet/pops/lookup/module_data_provider.rb +58 -0
  383. data/lib/puppet/pops/lookup/sub_lookup.rb +90 -0
  384. data/lib/puppet/pops/lookup.rb +45 -49
  385. data/lib/puppet/pops/merge_strategy.rb +183 -47
  386. data/lib/puppet/pops/migration/migration_checker.rb +58 -0
  387. data/lib/puppet/pops/model/ast_transformer.rb +8 -1
  388. data/lib/puppet/pops/model/factory.rb +257 -161
  389. data/lib/puppet/pops/model/model.rb +25 -8
  390. data/lib/puppet/pops/model/model_label_provider.rb +30 -6
  391. data/lib/puppet/pops/model/model_meta.rb +50 -3
  392. data/lib/puppet/pops/model/model_tree_dumper.rb +44 -0
  393. data/lib/puppet/pops/parser/code_merger.rb +13 -1
  394. data/lib/puppet/pops/parser/egrammar.ra +155 -38
  395. data/lib/puppet/pops/parser/eparser.rb +1894 -1314
  396. data/lib/puppet/pops/parser/epp_support.rb +27 -12
  397. data/lib/puppet/pops/parser/evaluating_parser.rb +27 -13
  398. data/lib/puppet/pops/parser/heredoc_support.rb +20 -16
  399. data/lib/puppet/pops/parser/interpolation_support.rb +14 -1
  400. data/lib/puppet/pops/parser/lexer2.rb +465 -379
  401. data/lib/puppet/pops/parser/lexer_support.rb +132 -25
  402. data/lib/puppet/pops/parser/locator.rb +63 -9
  403. data/lib/puppet/pops/parser/parser_support.rb +49 -40
  404. data/lib/puppet/pops/parser/slurp_support.rb +37 -12
  405. data/lib/puppet/pops/patterns.rb +16 -1
  406. data/lib/puppet/pops/pcore.rb +96 -0
  407. data/lib/puppet/pops/puppet_stack.rb +43 -0
  408. data/lib/puppet/pops/resource/param.rb +55 -0
  409. data/lib/puppet/pops/resource/resource_type_impl.rb +314 -0
  410. data/lib/puppet/pops/resource/resource_type_set.pcore +22 -0
  411. data/lib/puppet/pops/serialization/abstract_reader.rb +176 -0
  412. data/lib/puppet/pops/serialization/abstract_writer.rb +207 -0
  413. data/lib/puppet/pops/serialization/deserializer.rb +77 -0
  414. data/lib/puppet/pops/serialization/extension.rb +157 -0
  415. data/lib/puppet/pops/serialization/instance_reader.rb +19 -0
  416. data/lib/puppet/pops/serialization/instance_writer.rb +14 -0
  417. data/lib/puppet/pops/serialization/json.rb +297 -0
  418. data/lib/puppet/pops/serialization/object.rb +71 -0
  419. data/lib/puppet/pops/serialization/rgen.rb +152 -0
  420. data/lib/puppet/pops/serialization/serializer.rb +118 -0
  421. data/lib/puppet/pops/serialization/time_factory.rb +67 -0
  422. data/lib/puppet/pops/serialization.rb +17 -0
  423. data/lib/puppet/pops/time/timespan.rb +718 -0
  424. data/lib/puppet/pops/time/timestamp.rb +148 -0
  425. data/lib/puppet/pops/types/annotatable.rb +36 -0
  426. data/lib/puppet/pops/types/class_loader.rb +25 -23
  427. data/lib/puppet/pops/types/enumeration.rb +9 -27
  428. data/lib/puppet/pops/types/implementation_registry.rb +141 -0
  429. data/lib/puppet/pops/types/iterable.rb +308 -0
  430. data/lib/puppet/pops/types/p_binary_type.rb +220 -0
  431. data/lib/puppet/pops/types/p_meta_type.rb +83 -0
  432. data/lib/puppet/pops/types/p_object_type.rb +888 -0
  433. data/lib/puppet/pops/types/p_runtime_type.rb +115 -0
  434. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +187 -0
  435. data/lib/puppet/pops/types/p_sem_ver_type.rb +141 -0
  436. data/lib/puppet/pops/types/p_sensitive_type.rb +73 -0
  437. data/lib/puppet/pops/types/p_timespan_type.rb +141 -0
  438. data/lib/puppet/pops/types/p_timestamp_type.rb +69 -0
  439. data/lib/puppet/pops/types/p_type_set_type.rb +352 -0
  440. data/lib/puppet/pops/types/puppet_object.rb +16 -0
  441. data/lib/puppet/pops/types/recursion_guard.rb +136 -0
  442. data/lib/puppet/pops/types/ruby_generator.rb +275 -0
  443. data/lib/puppet/pops/types/string_converter.rb +1033 -0
  444. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  445. data/lib/puppet/pops/types/type_asserter.rb +21 -19
  446. data/lib/puppet/pops/types/type_assertion_error.rb +1 -0
  447. data/lib/puppet/pops/types/type_calculator.rb +244 -1186
  448. data/lib/puppet/pops/types/type_conversion_error.rb +15 -0
  449. data/lib/puppet/pops/types/type_factory.rb +270 -164
  450. data/lib/puppet/pops/types/type_formatter.rb +686 -0
  451. data/lib/puppet/pops/types/type_mismatch_describer.rb +1087 -0
  452. data/lib/puppet/pops/types/type_parser.rb +376 -278
  453. data/lib/puppet/pops/types/type_set_reference.rb +59 -0
  454. data/lib/puppet/pops/types/types.rb +3247 -287
  455. data/lib/puppet/pops/utils.rb +11 -10
  456. data/lib/puppet/pops/validation/checker4_0.rb +289 -75
  457. data/lib/puppet/pops/validation/validator_factory_4_0.rb +13 -5
  458. data/lib/puppet/pops/validation.rb +56 -18
  459. data/lib/puppet/pops/visitor.rb +9 -6
  460. data/lib/puppet/pops.rb +44 -25
  461. data/lib/puppet/property/ensure.rb +1 -1
  462. data/lib/puppet/property.rb +67 -7
  463. data/lib/puppet/provider/aixobject.rb +4 -4
  464. data/lib/puppet/provider/augeas/augeas.rb +57 -2
  465. data/lib/puppet/provider/cron/crontab.rb +1 -1
  466. data/lib/puppet/provider/exec/windows.rb +1 -1
  467. data/lib/puppet/provider/exec.rb +6 -1
  468. data/lib/puppet/provider/group/aix.rb +4 -4
  469. data/lib/puppet/provider/group/directoryservice.rb +10 -0
  470. data/lib/puppet/provider/group/pw.rb +1 -0
  471. data/lib/puppet/provider/group/windows_adsi.rb +23 -7
  472. data/lib/puppet/provider/macauthorization/macauthorization.rb +11 -10
  473. data/lib/puppet/provider/mailalias/aliases.rb +1 -1
  474. data/lib/puppet/provider/mcx/mcxcontent.rb +5 -4
  475. data/lib/puppet/provider/mount/parsed.rb +159 -2
  476. data/lib/puppet/provider/nameservice/directoryservice.rb +55 -62
  477. data/lib/puppet/provider/nameservice.rb +15 -0
  478. data/lib/puppet/provider/package/appdmg.rb +7 -6
  479. data/lib/puppet/provider/package/apple.rb +1 -1
  480. data/lib/puppet/provider/package/apt.rb +1 -1
  481. data/lib/puppet/provider/package/dnf.rb +46 -0
  482. data/lib/puppet/provider/package/gem.rb +29 -3
  483. data/lib/puppet/provider/package/nim.rb +2 -2
  484. data/lib/puppet/provider/package/openbsd.rb +7 -7
  485. data/lib/puppet/provider/package/pacman.rb +11 -10
  486. data/lib/puppet/provider/package/pip.rb +83 -22
  487. data/lib/puppet/provider/package/pip3.rb +20 -0
  488. data/lib/puppet/provider/package/pkg.rb +12 -8
  489. data/lib/puppet/provider/package/pkgdmg.rb +11 -8
  490. data/lib/puppet/provider/package/pkgin.rb +4 -4
  491. data/lib/puppet/provider/package/pkgng.rb +143 -0
  492. data/lib/puppet/provider/package/pkgutil.rb +1 -1
  493. data/lib/puppet/provider/package/portage.rb +48 -8
  494. data/lib/puppet/provider/package/ports.rb +0 -3
  495. data/lib/puppet/provider/package/puppet_gem.rb +0 -0
  496. data/lib/puppet/provider/package/rpm.rb +122 -16
  497. data/lib/puppet/provider/package/sun.rb +1 -1
  498. data/lib/puppet/provider/package/tdnf.rb +28 -0
  499. data/lib/puppet/provider/package/windows/exe_package.rb +10 -9
  500. data/lib/puppet/provider/package/windows/msi_package.rb +4 -4
  501. data/lib/puppet/provider/package/windows/package.rb +9 -1
  502. data/lib/puppet/provider/package/windows.rb +1 -1
  503. data/lib/puppet/provider/package/yum.rb +62 -83
  504. data/lib/puppet/provider/package/zypper.rb +69 -15
  505. data/lib/puppet/provider/package.rb +6 -2
  506. data/lib/puppet/provider/parsedfile.rb +2 -2
  507. data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +39 -7
  508. data/lib/puppet/provider/service/base.rb +4 -3
  509. data/lib/puppet/provider/service/bsd.rb +9 -9
  510. data/lib/puppet/provider/service/daemontools.rb +5 -5
  511. data/lib/puppet/provider/service/debian.rb +14 -5
  512. data/lib/puppet/provider/service/freebsd.rb +1 -1
  513. data/lib/puppet/provider/service/init.rb +27 -3
  514. data/lib/puppet/provider/service/launchd.rb +57 -19
  515. data/lib/puppet/provider/service/rcng.rb +51 -0
  516. data/lib/puppet/provider/service/redhat.rb +2 -1
  517. data/lib/puppet/provider/service/runit.rb +4 -4
  518. data/lib/puppet/provider/service/smf.rb +59 -8
  519. data/lib/puppet/provider/service/src.rb +27 -0
  520. data/lib/puppet/provider/service/systemd.rb +141 -22
  521. data/lib/puppet/provider/service/upstart.rb +1 -1
  522. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +1 -1
  523. data/lib/puppet/provider/sshkey/parsed.rb +20 -10
  524. data/lib/puppet/provider/user/aix.rb +4 -3
  525. data/lib/puppet/provider/user/directoryservice.rb +43 -66
  526. data/lib/puppet/provider/user/hpux.rb +1 -1
  527. data/lib/puppet/provider/user/openbsd.rb +1 -0
  528. data/lib/puppet/provider/user/pw.rb +1 -0
  529. data/lib/puppet/provider/user/user_role_add.rb +19 -2
  530. data/lib/puppet/provider/user/windows_adsi.rb +51 -2
  531. data/lib/puppet/provider/yumrepo/inifile.rb +9 -6
  532. data/lib/puppet/provider/zfs/zfs.rb +2 -2
  533. data/lib/puppet/provider/zone/solaris.rb +6 -3
  534. data/lib/puppet/provider/zpool/zpool.rb +2 -2
  535. data/lib/puppet/provider.rb +9 -7
  536. data/lib/puppet/reference/configuration.rb +13 -5
  537. data/lib/puppet/reference/indirection.rb +2 -2
  538. data/lib/puppet/reference/providers.rb +2 -3
  539. data/lib/puppet/reference/report.rb +9 -12
  540. data/lib/puppet/reference/type.rb +1 -1
  541. data/lib/puppet/reports.rb +5 -1
  542. data/lib/puppet/resource/capability_finder.rb +128 -0
  543. data/lib/puppet/resource/catalog.rb +167 -40
  544. data/lib/puppet/resource/status.rb +30 -5
  545. data/lib/puppet/resource/type.rb +247 -50
  546. data/lib/puppet/resource/type_collection.rb +83 -10
  547. data/lib/puppet/resource.rb +212 -146
  548. data/lib/puppet/settings/base_setting.rb +9 -3
  549. data/lib/puppet/settings/config_file.rb +3 -2
  550. data/lib/puppet/settings/directory_setting.rb +6 -0
  551. data/lib/puppet/settings/environment_conf.rb +26 -6
  552. data/lib/puppet/settings/file_or_directory_setting.rb +6 -0
  553. data/lib/puppet/settings/file_setting.rb +20 -9
  554. data/lib/puppet/settings/ini_file.rb +2 -2
  555. data/lib/puppet/settings/server_list_setting.rb +20 -0
  556. data/lib/puppet/settings/symbolic_enum_setting.rb +17 -0
  557. data/lib/puppet/settings.rb +87 -28
  558. data/lib/puppet/ssl/certificate_authority/interface.rb +166 -26
  559. data/lib/puppet/ssl/certificate_authority.rb +45 -11
  560. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  561. data/lib/puppet/ssl/certificate_request.rb +4 -4
  562. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  563. data/lib/puppet/ssl/host.rb +26 -4
  564. data/lib/puppet/ssl/oids.rb +43 -3
  565. data/lib/puppet/ssl/validator/default_validator.rb +3 -3
  566. data/lib/puppet/syntax_checkers/base64.rb +41 -0
  567. data/lib/puppet/syntax_checkers/json.rb +0 -2
  568. data/lib/puppet/test/test_helper.rb +18 -7
  569. data/lib/puppet/transaction/additional_resource_generator.rb +101 -8
  570. data/lib/puppet/transaction/event.rb +29 -2
  571. data/lib/puppet/transaction/event_manager.rb +1 -1
  572. data/lib/puppet/transaction/persistence.rb +84 -0
  573. data/lib/puppet/transaction/report.rb +86 -4
  574. data/lib/puppet/transaction/resource_harness.rb +95 -35
  575. data/lib/puppet/transaction.rb +64 -36
  576. data/lib/puppet/type/augeas.rb +13 -4
  577. data/lib/puppet/type/component.rb +11 -0
  578. data/lib/puppet/type/cron.rb +13 -13
  579. data/lib/puppet/type/exec.rb +27 -18
  580. data/lib/puppet/type/file/checksum.rb +1 -0
  581. data/lib/puppet/type/file/checksum_value.rb +53 -0
  582. data/lib/puppet/type/file/content.rb +36 -121
  583. data/lib/puppet/type/file/data_sync.rb +92 -0
  584. data/lib/puppet/type/file/ensure.rb +22 -19
  585. data/lib/puppet/type/file/selcontext.rb +1 -1
  586. data/lib/puppet/type/file/source.rb +121 -34
  587. data/lib/puppet/type/file/target.rb +2 -2
  588. data/lib/puppet/type/file.rb +146 -46
  589. data/lib/puppet/type/filebucket.rb +1 -1
  590. data/lib/puppet/type/group.rb +15 -3
  591. data/lib/puppet/type/host.rb +1 -1
  592. data/lib/puppet/type/interface.rb +8 -3
  593. data/lib/puppet/type/macauthorization.rb +1 -1
  594. data/lib/puppet/type/mount.rb +25 -2
  595. data/lib/puppet/type/notify.rb +1 -1
  596. data/lib/puppet/type/package.rb +32 -12
  597. data/lib/puppet/type/resources.rb +1 -1
  598. data/lib/puppet/type/schedule.rb +5 -5
  599. data/lib/puppet/type/scheduled_task.rb +14 -1
  600. data/lib/puppet/type/service.rb +24 -0
  601. data/lib/puppet/type/ssh_authorized_key.rb +17 -11
  602. data/lib/puppet/type/sshkey.rb +5 -3
  603. data/lib/puppet/type/stage.rb +1 -1
  604. data/lib/puppet/type/tidy.rb +10 -5
  605. data/lib/puppet/type/user.rb +80 -25
  606. data/lib/puppet/type/yumrepo.rb +28 -8
  607. data/lib/puppet/type/zone.rb +6 -6
  608. data/lib/puppet/type.rb +162 -40
  609. data/lib/puppet/util/autoload.rb +16 -11
  610. data/lib/puppet/util/checksums.rb +74 -31
  611. data/lib/puppet/util/classgen.rb +1 -1
  612. data/lib/puppet/util/command_line/trollop.rb +1 -1
  613. data/lib/puppet/util/command_line.rb +10 -2
  614. data/lib/puppet/util/execution.rb +26 -10
  615. data/lib/puppet/util/feature.rb +1 -1
  616. data/lib/puppet/util/filetype.rb +11 -5
  617. data/lib/puppet/util/http_proxy.rb +132 -0
  618. data/lib/puppet/util/inifile.rb +1 -1
  619. data/lib/puppet/util/instance_loader.rb +1 -1
  620. data/lib/puppet/util/log/destinations.rb +23 -2
  621. data/lib/puppet/util/log.rb +78 -9
  622. data/lib/puppet/util/logging.rb +82 -3
  623. data/lib/puppet/util/monkey_patches.rb +20 -7
  624. data/lib/puppet/util/multi_match.rb +51 -0
  625. data/lib/puppet/util/network_device/cisco/device.rb +24 -6
  626. data/lib/puppet/util/network_device/cisco/interface.rb +21 -9
  627. data/lib/puppet/util/network_device/config.rb +1 -1
  628. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  629. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  630. data/lib/puppet/util/plist.rb +151 -0
  631. data/lib/puppet/util/profiler/aggregate.rb +1 -1
  632. data/lib/puppet/util/profiler/around_profiler.rb +1 -1
  633. data/lib/puppet/util/profiler.rb +1 -1
  634. data/lib/puppet/util/psych_support.rb +1 -1
  635. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +2 -2
  636. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +2 -1
  637. data/lib/puppet/util/rdoc.rb +2 -2
  638. data/lib/puppet/util/resource_template.rb +1 -1
  639. data/lib/puppet/util/rubygems.rb +1 -1
  640. data/lib/puppet/util/run_mode.rb +3 -16
  641. data/lib/puppet/util/skip_tags.rb +9 -0
  642. data/lib/puppet/util/splayer.rb +18 -0
  643. data/lib/puppet/util/tagging.rb +8 -2
  644. data/lib/puppet/util/watcher/periodic_watcher.rb +2 -2
  645. data/lib/puppet/util/windows/access_control_entry.rb +2 -2
  646. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  647. data/lib/puppet/util/windows/adsi.rb +212 -75
  648. data/lib/puppet/util/windows/api_types.rb +24 -18
  649. data/lib/puppet/util/windows/com.rb +3 -3
  650. data/lib/puppet/util/windows/error.rb +1 -1
  651. data/lib/puppet/util/windows/file.rb +107 -18
  652. data/lib/puppet/util/windows/principal.rb +190 -0
  653. data/lib/puppet/util/windows/process.rb +88 -11
  654. data/lib/puppet/util/windows/registry.rb +22 -16
  655. data/lib/puppet/util/windows/root_certs.rb +5 -5
  656. data/lib/puppet/util/windows/security.rb +38 -37
  657. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  658. data/lib/puppet/util/windows/sid.rb +84 -15
  659. data/lib/puppet/util/windows/taskscheduler.rb +99 -43
  660. data/lib/puppet/util/windows/user.rb +32 -14
  661. data/lib/puppet/util/windows.rb +5 -0
  662. data/lib/puppet/util/yaml.rb +15 -3
  663. data/lib/puppet/util.rb +124 -23
  664. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  665. data/lib/puppet/vendor/deep_merge/test/test_deep_merge.rb +1 -1
  666. data/lib/puppet/vendor/load_semantic_puppet.rb +1 -0
  667. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  668. data/lib/puppet/vendor/pathspec/README.md +1 -1
  669. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +2 -1
  670. data/lib/puppet/vendor/require_vendored.rb +0 -1
  671. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  672. data/lib/puppet/vendor/rgen_patch.rb +1 -1
  673. data/lib/puppet/vendor/semantic/lib/semantic.rb +4 -6
  674. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph.rb +2 -2
  675. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph_node.rb +2 -2
  676. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/module_release.rb +17 -5
  677. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/source.rb +2 -2
  678. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/unsatisfiable_graph.rb +2 -2
  679. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency.rb +7 -7
  680. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/gem_version.rb +3 -0
  681. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/locales/config.yaml +21 -0
  682. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version.rb +48 -21
  683. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version_range.rb +15 -17
  684. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet.rb +17 -0
  685. data/lib/puppet/version.rb +2 -2
  686. data/lib/puppet.rb +85 -2
  687. data/lib/puppet_x.rb +7 -1
  688. data/lib/semver.rb +36 -13
  689. data/locales/config.yaml +29 -0
  690. data/locales/puppet.pot +79 -0
  691. data/man/man5/puppet.conf.5 +61 -19
  692. data/man/man8/extlookup2hiera.8 +2 -2
  693. data/man/man8/puppet-agent.8 +6 -3
  694. data/man/man8/puppet-apply.8 +6 -3
  695. data/man/man8/puppet-ca.8 +3 -3
  696. data/man/man8/puppet-catalog.8 +3 -3
  697. data/man/man8/puppet-cert.8 +3 -3
  698. data/man/man8/puppet-certificate.8 +3 -3
  699. data/man/man8/puppet-certificate_request.8 +3 -3
  700. data/man/man8/puppet-certificate_revocation_list.8 +3 -3
  701. data/man/man8/puppet-config.8 +4 -4
  702. data/man/man8/puppet-describe.8 +2 -2
  703. data/man/man8/puppet-device.8 +7 -4
  704. data/man/man8/puppet-doc.8 +2 -2
  705. data/man/man8/puppet-epp.8 +3 -3
  706. data/man/man8/puppet-facts.8 +3 -3
  707. data/man/man8/puppet-file.8 +3 -3
  708. data/man/man8/puppet-filebucket.8 +3 -3
  709. data/man/man8/puppet-help.8 +3 -3
  710. data/man/man8/puppet-inspect.8 +3 -3
  711. data/man/man8/puppet-key.8 +3 -3
  712. data/man/man8/puppet-man.8 +3 -3
  713. data/man/man8/puppet-master.8 +6 -3
  714. data/man/man8/puppet-module.8 +10 -10
  715. data/man/man8/puppet-node.8 +3 -3
  716. data/man/man8/puppet-parser.8 +3 -3
  717. data/man/man8/puppet-plugin.8 +3 -3
  718. data/man/man8/puppet-report.8 +3 -3
  719. data/man/man8/puppet-resource.8 +3 -3
  720. data/man/man8/puppet-resource_type.8 +3 -3
  721. data/man/man8/puppet-status.8 +4 -4
  722. data/man/man8/puppet.8 +2 -2
  723. data/spec/fixtures/module.tar.gz +0 -0
  724. data/spec/fixtures/unit/application/environments/production/data/common.yaml +22 -0
  725. data/spec/fixtures/unit/application/environments/production/environment.conf +1 -0
  726. data/spec/fixtures/unit/application/environments/production/manifests/site.pp +1 -0
  727. data/spec/fixtures/unit/application/environments/puppet_func_provider/environment.conf +1 -0
  728. data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/environment/data.pp +10 -0
  729. data/spec/fixtures/unit/application/environments/puppet_func_provider/manifests/site.pp +1 -0
  730. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/data/bad.json +3 -0
  731. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/environment.conf +2 -0
  732. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/hiera.yaml +5 -0
  733. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/manifests/site.pp +5 -0
  734. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/data/bad.yaml +3 -0
  735. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/environment.conf +2 -0
  736. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/hiera.yaml +5 -0
  737. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/manifests/site.pp +5 -0
  738. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/data/common.yaml +2 -0
  739. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/environment.conf +2 -0
  740. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/manifests/site.pp +1 -0
  741. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/data/common.yaml +2 -0
  742. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/manifests/init.pp +5 -0
  743. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/metadata.json +9 -0
  744. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/first.json +3 -0
  745. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/name.yaml +2 -0
  746. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/second.json +3 -0
  747. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/single.yaml +2 -0
  748. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/third_utf8.json +3 -0
  749. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/utf8.yaml +3 -0
  750. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data2/single.yaml +2 -0
  751. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/environment.conf +2 -0
  752. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/hiera.yaml +22 -0
  753. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/manifests/site.pp +5 -0
  754. data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +48 -0
  755. data/spec/fixtures/unit/data_providers/environments/hiera_misc/environment.conf +2 -0
  756. data/spec/fixtures/unit/data_providers/environments/hiera_misc/manifests/site.pp +1 -0
  757. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/data/common.yaml +30 -0
  758. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/manifests/init.pp +13 -0
  759. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/metadata.json +9 -0
  760. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/common.yaml +4 -0
  761. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/specific.yaml +4 -0
  762. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/environment.conf +2 -0
  763. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/hiera.yaml +7 -0
  764. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/manifests/site.pp +1 -0
  765. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/first.json +3 -0
  766. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/name.yaml +2 -0
  767. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/second.json +3 -0
  768. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/server1.yaml +1 -0
  769. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/server2.yaml +1 -0
  770. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/single.yaml +2 -0
  771. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data2/single.yaml +2 -0
  772. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/hiera.yaml +20 -0
  773. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/manifests/init.pp +5 -0
  774. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/metadata.json +9 -0
  775. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/common.yaml +4 -0
  776. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/specific.yaml +4 -0
  777. data/spec/fixtures/unit/data_providers/environments/hiera_modules/environment.conf +2 -0
  778. data/spec/fixtures/unit/data_providers/environments/hiera_modules/hiera.yaml +7 -0
  779. data/spec/fixtures/unit/data_providers/environments/hiera_modules/manifests/site.pp +1 -0
  780. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/data/common.yaml +6 -0
  781. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/hiera.yaml +5 -0
  782. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/manifests/init.pp +2 -0
  783. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/metadata.json +9 -0
  784. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +4 -0
  785. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/hiera.yaml +5 -0
  786. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/manifests/init.pp +3 -0
  787. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/metadata.json +9 -0
  788. data/spec/fixtures/unit/data_providers/environments/production/lib/puppet/functions/environment/data.rb +3 -1
  789. data/spec/fixtures/unit/data_providers/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +2 -1
  790. data/spec/fixtures/unit/data_providers/environments/production/modules/abc/manifests/init.pp +2 -1
  791. data/spec/fixtures/unit/data_providers/environments/production/modules/xyz/functions/data.pp +6 -0
  792. data/spec/fixtures/unit/data_providers/environments/production/modules/xyz/lib/puppet/bindings/xyz/default.rb +9 -0
  793. data/spec/fixtures/unit/data_providers/environments/production/modules/xyz/manifests/init.pp +9 -0
  794. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/hiera.yaml +5 -0
  795. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/lib/puppet/bindings/backend/default.rb +9 -0
  796. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/lib/puppet_x/backend/special_data_provider_factory.rb +23 -0
  797. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/manifests/init.pp +5 -0
  798. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/metadata.json +9 -0
  799. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_env_data.rb +2 -0
  800. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_module_data.rb +1 -0
  801. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/manifests/init.pp +1 -1
  802. data/spec/fixtures/unit/functions/lookup/data/common.yaml +19 -0
  803. data/spec/fixtures/unit/functions/lookup_fixture/data/common.yaml +19 -0
  804. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  805. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/bad_data/manifests/init.pp +2 -0
  806. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_json/data/empty.json +0 -0
  807. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_json/hiera.yaml +5 -0
  808. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_json/manifests/init.pp +2 -0
  809. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_json/metadata.json +9 -0
  810. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_json/data/empty_key.json +1 -0
  811. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_json/hiera.yaml +5 -0
  812. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_json/manifests/init.pp +2 -0
  813. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_json/metadata.json +9 -0
  814. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_yaml/data/empty_key.yaml +1 -0
  815. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_yaml/hiera.yaml +5 -0
  816. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_yaml/manifests/init.pp +2 -0
  817. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_yaml/metadata.json +9 -0
  818. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_yaml/data/empty.yaml +2 -0
  819. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  820. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  821. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_yaml/metadata.json +9 -0
  822. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/hieraprovider/data/first.json +4 -0
  823. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/hieraprovider/hiera.yaml +8 -0
  824. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/hieraprovider/manifests/init.pp +5 -0
  825. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/hieraprovider/metadata.json +9 -0
  826. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +9 -0
  827. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/meta/manifests/init.pp +3 -0
  828. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/meta/metadata.json +9 -0
  829. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +10 -0
  830. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +23 -0
  831. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/metawcp/manifests/init.pp +3 -0
  832. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/metawcp/metadata.json +9 -0
  833. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  834. data/spec/fixtures/unit/parser/lexer/subclass_name_duplication.pp +0 -0
  835. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/functions/usee_puppet.pp +3 -0
  836. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/functions/usee/usee_ruby.rb +6 -0
  837. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/type/usee_type.rb +5 -0
  838. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +8 -0
  839. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  840. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee2/lib/puppet/functions/usee2/callee.rb +5 -0
  841. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet.pp +5 -0
  842. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet_init.pp +5 -0
  843. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_ruby.pp +5 -0
  844. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/caller2.rb +5 -0
  845. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet.rb +5 -0
  846. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet_init.rb +5 -0
  847. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_ruby.rb +5 -0
  848. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +87 -0
  849. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/metadata.json +2 -1
  850. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  851. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  852. data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/user/functions/puppetcalled.pp +3 -0
  853. data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/user/functions/puppetcaller.pp +3 -0
  854. data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/user/functions/puppetcaller4.pp +3 -0
  855. data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/user/lib/puppet/functions/user/callingpuppet.rb +5 -0
  856. data/spec/fixtures/unit/pops/loaders/loaders/module_no_lib/modules/modulea/functions/hello.pp +3 -0
  857. data/spec/fixtures/unit/pops/loaders/loaders/module_no_lib/modules/modulea/manifests/init.pp +3 -0
  858. data/spec/fixtures/unit/pops/loaders/loaders/module_no_lib/modules/modulea/metadata.json +10 -0
  859. data/spec/fixtures/unit/pops/loaders/loaders/no_modules/manifests/site.pp +10 -0
  860. data/spec/fixtures/unit/pops/loaders/loaders/single_module/modules/modulea/functions/hello.pp +3 -0
  861. data/spec/fixtures/unit/pops/loaders/loaders/single_module/modules/modulea/functions/subspace/hello.pp +3 -0
  862. data/spec/fixtures/unit/pops/loaders/loaders/single_module/modules/modulea/metadata.json +1 -10
  863. data/spec/fixtures/unit/pops/parser/lexer/subclass_name_duplication.pp +0 -0
  864. data/spec/fixtures/unit/provider/mount/parsed/aix.filesystems +93 -85
  865. data/spec/fixtures/unit/provider/mount/parsed/aix.mount +11 -7
  866. data/spec/fixtures/unit/provider/package/pkgng/pkg.info +8 -0
  867. data/spec/fixtures/unit/provider/package/pkgng/pkg.query +1 -0
  868. data/spec/fixtures/unit/provider/package/pkgng/pkg.query_absent +1 -0
  869. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +3 -0
  870. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  871. data/spec/fixtures/unit/provider/package/yum/yum-check-update-obsoletes.txt +195 -0
  872. data/spec/fixtures/unit/provider/package/yum/yum-check-update-security.txt +184 -0
  873. data/spec/fixtures/unit/provider/package/zypper/zypper-list-updates-empty.out +3 -0
  874. data/spec/fixtures/unit/provider/service/smf/svcs.out +4 -3
  875. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  876. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +24 -0
  877. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +24 -0
  878. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_post/should_yield_to_the_block.yml +24 -0
  879. 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
  880. 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
  881. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  882. 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
  883. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  884. 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
  885. 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
  886. data/spec/integration/agent/logging_spec.rb +15 -14
  887. data/spec/integration/application/apply_spec.rb +432 -29
  888. data/spec/integration/application/doc_spec.rb +0 -0
  889. data/spec/integration/application/lookup_spec.rb +155 -0
  890. data/spec/integration/configurer_spec.rb +0 -0
  891. data/spec/integration/data_binding_spec.rb +195 -0
  892. data/spec/integration/defaults_spec.rb +27 -2
  893. data/spec/integration/directory_environments_spec.rb +16 -0
  894. data/spec/integration/environments/default_manifest_spec.rb +16 -16
  895. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  896. data/spec/integration/environments/settings_spec.rb +32 -4
  897. data/spec/integration/faces/ca_spec.rb +0 -0
  898. data/spec/integration/faces/config_spec.rb +80 -0
  899. data/spec/integration/faces/documentation_spec.rb +1 -1
  900. data/spec/integration/faces/plugin_spec.rb +0 -4
  901. data/spec/integration/file_bucket/file_spec.rb +2 -2
  902. data/spec/integration/file_serving/fileset_spec.rb +0 -0
  903. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -0
  904. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  905. data/spec/integration/indirector/catalog/compiler_spec.rb +0 -0
  906. data/spec/integration/indirector/direct_file_server_spec.rb +0 -0
  907. data/spec/integration/indirector/facts/facter_spec.rb +97 -0
  908. data/spec/integration/indirector/file_content/file_server_spec.rb +0 -0
  909. data/spec/integration/indirector/file_metadata/file_server_spec.rb +0 -0
  910. data/spec/integration/indirector/node/ldap_spec.rb +0 -0
  911. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  912. data/spec/integration/network/formats_spec.rb +0 -0
  913. data/spec/integration/network/http/api/indirected_routes_spec.rb +33 -0
  914. data/spec/integration/node/environment_spec.rb +34 -0
  915. data/spec/integration/node/facts_spec.rb +0 -0
  916. data/spec/integration/node_spec.rb +0 -0
  917. data/spec/integration/parser/catalog_spec.rb +14 -2
  918. data/spec/integration/parser/collection_spec.rb +18 -0
  919. data/spec/integration/parser/compiler_spec.rb +877 -666
  920. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  921. data/spec/integration/parser/parameter_defaults_spec.rb +358 -0
  922. data/spec/integration/parser/pcore_resource_spec.rb +245 -0
  923. data/spec/integration/parser/resource_expressions_spec.rb +10 -5
  924. data/spec/integration/parser/scope_spec.rb +46 -7
  925. data/spec/integration/parser/undef_param_spec.rb +9 -1
  926. data/spec/integration/provider/mailalias/aliases_spec.rb +0 -0
  927. data/spec/integration/provider/mount_spec.rb +23 -36
  928. data/spec/integration/provider/service/init_spec.rb +0 -0
  929. data/spec/integration/provider/service/windows_spec.rb +3 -2
  930. data/spec/integration/provider/ssh_authorized_key_spec.rb +0 -0
  931. data/spec/integration/provider/yumrepo_spec.rb +4 -1
  932. data/spec/integration/reference/providers_spec.rb +0 -0
  933. data/spec/integration/reports_spec.rb +0 -0
  934. data/spec/integration/resource/catalog_spec.rb +1 -1
  935. data/spec/integration/resource/type_collection_spec.rb +8 -0
  936. data/spec/integration/ssl/certificate_authority_spec.rb +0 -1
  937. data/spec/integration/ssl/certificate_request_spec.rb +0 -1
  938. data/spec/integration/ssl/certificate_revocation_list_spec.rb +0 -1
  939. data/spec/integration/ssl/host_spec.rb +0 -1
  940. data/spec/integration/test/test_helper_spec.rb +32 -0
  941. data/spec/integration/transaction/report_spec.rb +682 -0
  942. data/spec/integration/transaction_spec.rb +126 -2
  943. data/spec/integration/type/exec_spec.rb +0 -0
  944. data/spec/integration/type/file_spec.rb +553 -51
  945. data/spec/integration/type/package_spec.rb +72 -1
  946. data/spec/integration/type/tidy_spec.rb +21 -9
  947. data/spec/integration/type_spec.rb +0 -0
  948. data/spec/integration/util/autoload_spec.rb +0 -0
  949. data/spec/integration/util/execution_spec.rb +30 -0
  950. data/spec/integration/util/rdoc/parser_spec.rb +1 -1
  951. data/spec/integration/util/settings_spec.rb +26 -0
  952. data/spec/integration/util/windows/adsi_spec.rb +99 -0
  953. data/spec/integration/util/windows/principal_spec.rb +250 -0
  954. data/spec/integration/util/windows/process_spec.rb +35 -2
  955. data/spec/{unit → integration}/util/windows/registry_spec.rb +92 -2
  956. data/spec/integration/util/windows/security_spec.rb +75 -21
  957. data/spec/integration/util/windows/user_spec.rb +27 -5
  958. data/spec/integration/util_spec.rb +49 -27
  959. data/spec/lib/matchers/include_in_order.rb +2 -3
  960. data/spec/lib/matchers/resource.rb +22 -1
  961. data/spec/lib/puppet/face/1.0.0/huzzah.rb +0 -0
  962. data/spec/lib/puppet/face/basetest.rb +0 -0
  963. data/spec/lib/puppet/face/huzzah.rb +0 -0
  964. data/spec/lib/puppet_spec/compiler.rb +32 -3
  965. data/spec/lib/puppet_spec/files.rb +16 -2
  966. data/spec/lib/puppet_spec/fixtures.rb +0 -0
  967. data/spec/lib/puppet_spec/matchers.rb +6 -4
  968. data/spec/lib/puppet_spec/module_tool/shared_functions.rb +2 -2
  969. data/spec/lib/puppet_spec/module_tool/stub_source.rb +1 -1
  970. data/spec/lib/puppet_spec/network.rb +12 -8
  971. data/spec/lib/puppet_spec/pops.rb +13 -0
  972. data/spec/lib/puppet_spec/unindent.rb +5 -0
  973. data/spec/lib/puppet_spec/verbose.rb +0 -0
  974. data/spec/shared_behaviours/all_parsedfile_providers.rb +0 -0
  975. data/spec/shared_behaviours/file_server_terminus.rb +0 -0
  976. data/spec/shared_behaviours/file_serving.rb +0 -0
  977. data/spec/shared_behaviours/iterative_functions.rb +9 -9
  978. data/spec/shared_behaviours/memory_terminus.rb +0 -0
  979. data/spec/shared_behaviours/path_parameters.rb +0 -0
  980. data/spec/shared_behaviours/things_that_declare_options.rb +0 -0
  981. data/spec/shared_contexts/types_setup.rb +106 -0
  982. data/spec/shared_examples/rhel_package_provider.rb +357 -0
  983. data/spec/spec_helper.rb +16 -2
  984. data/spec/unit/agent/locker_spec.rb +4 -4
  985. data/spec/unit/agent_spec.rb +12 -46
  986. data/spec/unit/application/agent_spec.rb +15 -0
  987. data/spec/unit/application/apply_spec.rb +31 -1
  988. data/spec/unit/application/cert_spec.rb +20 -0
  989. data/spec/unit/application/certificate_spec.rb +0 -0
  990. data/spec/unit/application/config_spec.rb +0 -0
  991. data/spec/unit/application/describe_spec.rb +0 -0
  992. data/spec/unit/application/device_spec.rb +0 -0
  993. data/spec/unit/application/doc_spec.rb +0 -0
  994. data/spec/unit/application/face_base_spec.rb +16 -0
  995. data/spec/unit/application/facts_spec.rb +0 -0
  996. data/spec/unit/application/filebucket_spec.rb +88 -2
  997. data/spec/unit/application/indirection_base_spec.rb +0 -0
  998. data/spec/unit/application/inspect_spec.rb +19 -8
  999. data/spec/unit/application/lookup_spec.rb +532 -0
  1000. data/spec/unit/application/master_spec.rb +33 -7
  1001. data/spec/unit/application/resource_spec.rb +0 -0
  1002. data/spec/unit/application_spec.rb +3 -3
  1003. data/spec/unit/capability_spec.rb +416 -0
  1004. data/spec/unit/configurer/downloader_factory_spec.rb +0 -0
  1005. data/spec/unit/configurer/downloader_spec.rb +5 -5
  1006. data/spec/unit/configurer/fact_handler_spec.rb +0 -0
  1007. data/spec/unit/configurer/plugin_handler_spec.rb +18 -15
  1008. data/spec/unit/configurer_spec.rb +336 -39
  1009. data/spec/unit/confine/exists_spec.rb +0 -0
  1010. data/spec/unit/confine/false_spec.rb +0 -0
  1011. data/spec/unit/confine/feature_spec.rb +0 -0
  1012. data/spec/unit/confine/true_spec.rb +0 -0
  1013. data/spec/unit/confine/variable_spec.rb +0 -0
  1014. data/spec/unit/confine_collection_spec.rb +0 -0
  1015. data/spec/unit/confine_spec.rb +0 -0
  1016. data/spec/unit/confiner_spec.rb +0 -0
  1017. data/spec/unit/context/trusted_information_spec.rb +24 -1
  1018. data/spec/unit/daemon_spec.rb +18 -8
  1019. data/spec/unit/data_providers/{sample_data_provider_spec.rb → custom_data_provider_spec.rb} +14 -16
  1020. data/spec/unit/data_providers/function_data_provider_spec.rb +30 -3
  1021. data/spec/unit/data_providers/hiera_data_provider_spec.rb +361 -0
  1022. data/spec/unit/defaults_spec.rb +47 -0
  1023. data/spec/unit/environments_spec.rb +26 -4
  1024. data/spec/unit/external/pson_spec.rb +0 -0
  1025. data/spec/unit/face/ca_spec.rb +10 -0
  1026. data/spec/unit/face/catalog_spec.rb +0 -0
  1027. data/spec/unit/face/certificate_request_spec.rb +10 -0
  1028. data/spec/unit/face/certificate_revocation_list_spec.rb +10 -0
  1029. data/spec/unit/face/certificate_spec.rb +0 -0
  1030. data/spec/unit/face/config_spec.rb +47 -0
  1031. data/spec/unit/face/epp_face_spec.rb +24 -5
  1032. data/spec/unit/face/facts_spec.rb +0 -0
  1033. data/spec/unit/face/file_spec.rb +4 -0
  1034. data/spec/unit/face/generate_spec.rb +230 -0
  1035. data/spec/unit/face/help_spec.rb +70 -0
  1036. data/spec/unit/face/key_spec.rb +10 -0
  1037. data/spec/unit/face/node_spec.rb +1 -1
  1038. data/spec/unit/face/parser_spec.rb +49 -2
  1039. data/spec/unit/face/plugin_spec.rb +29 -4
  1040. data/spec/unit/face/status_spec.rb +10 -0
  1041. data/spec/unit/face_spec.rb +0 -0
  1042. data/spec/unit/file_bucket/dipper_spec.rb +210 -1
  1043. data/spec/unit/file_bucket/file_spec.rb +0 -0
  1044. data/spec/unit/file_serving/base_spec.rb +0 -0
  1045. data/spec/unit/file_serving/configuration/parser_spec.rb +25 -30
  1046. data/spec/unit/file_serving/configuration_spec.rb +1 -1
  1047. data/spec/unit/file_serving/content_spec.rb +0 -0
  1048. data/spec/unit/file_serving/fileset_spec.rb +0 -0
  1049. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  1050. data/spec/unit/file_serving/metadata_spec.rb +51 -1
  1051. data/spec/unit/file_serving/mount/file_spec.rb +0 -0
  1052. data/spec/unit/file_serving/mount/modules_spec.rb +0 -0
  1053. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +0 -0
  1054. data/spec/unit/file_serving/mount/plugins_spec.rb +0 -0
  1055. data/spec/unit/file_serving/mount_spec.rb +0 -0
  1056. data/spec/unit/file_serving/terminus_helper_spec.rb +2 -3
  1057. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  1058. data/spec/unit/file_system/uniquefile_spec.rb +20 -0
  1059. data/spec/unit/file_system_spec.rb +373 -6
  1060. data/spec/unit/functions/assert_type_spec.rb +48 -8
  1061. data/spec/unit/functions/binary_file_spec.rb +46 -0
  1062. data/spec/unit/functions/break_spec.rb +89 -0
  1063. data/spec/unit/{parser/functions → functions}/contain_spec.rb +68 -3
  1064. data/spec/unit/functions/defined_spec.rb +289 -0
  1065. data/spec/unit/functions/dig_spec.rb +58 -0
  1066. data/spec/unit/functions/epp_spec.rb +17 -9
  1067. data/spec/unit/functions/filter_spec.rb +18 -0
  1068. data/spec/unit/functions/find_file_spec.rb +69 -0
  1069. data/spec/unit/functions/hiera_spec.rb +261 -49
  1070. data/spec/unit/functions/include_spec.rb +175 -0
  1071. data/spec/unit/functions/inline_epp_spec.rb +4 -4
  1072. data/spec/unit/functions/lest_spec.rb +34 -0
  1073. data/spec/unit/functions/logging_spec.rb +54 -0
  1074. data/spec/unit/functions/lookup_fixture_spec.rb +693 -0
  1075. data/spec/unit/functions/lookup_spec.rb +1352 -272
  1076. data/spec/unit/functions/match_spec.rb +2 -2
  1077. data/spec/unit/functions/new_spec.rb +694 -0
  1078. data/spec/unit/functions/next_spec.rb +93 -0
  1079. data/spec/unit/functions/regsubst_spec.rb +30 -9
  1080. data/spec/unit/functions/require_spec.rb +83 -0
  1081. data/spec/unit/functions/return_spec.rb +105 -0
  1082. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  1083. data/spec/unit/functions/scanf_spec.rb +1 -1
  1084. data/spec/unit/{parser/functions → functions}/shared.rb +15 -12
  1085. data/spec/unit/functions/split_spec.rb +11 -3
  1086. data/spec/unit/functions/step_spec.rb +113 -0
  1087. data/spec/unit/functions/strftime_spec.rb +152 -0
  1088. data/spec/unit/functions/then_spec.rb +40 -0
  1089. data/spec/unit/functions/type_spec.rb +35 -0
  1090. data/spec/unit/functions/unwrap_spec.rb +29 -0
  1091. data/spec/unit/functions/versioncmp_spec.rb +36 -0
  1092. data/spec/unit/functions4_spec.rb +321 -71
  1093. data/spec/unit/graph/rb_tree_map_spec.rb +1 -1
  1094. data/spec/unit/graph/relationship_graph_spec.rb +0 -0
  1095. data/spec/unit/graph/sequential_prioritizer_spec.rb +1 -1
  1096. data/spec/unit/graph/simple_graph_spec.rb +1 -1
  1097. data/spec/unit/hiera/scope_spec.rb +6 -3
  1098. data/spec/unit/hiera_puppet_spec.rb +49 -8
  1099. data/spec/unit/indirector/catalog/compiler_spec.rb +752 -8
  1100. data/spec/unit/indirector/catalog/json_spec.rb +0 -0
  1101. data/spec/unit/indirector/catalog/msgpack_spec.rb +0 -0
  1102. data/spec/unit/indirector/catalog/rest_spec.rb +0 -0
  1103. data/spec/unit/indirector/catalog/static_compiler_spec.rb +38 -20
  1104. data/spec/unit/indirector/catalog/store_configs_spec.rb +0 -0
  1105. data/spec/unit/indirector/catalog/yaml_spec.rb +0 -0
  1106. data/spec/unit/indirector/certificate/ca_spec.rb +0 -0
  1107. data/spec/unit/indirector/certificate/disabled_ca_spec.rb +0 -0
  1108. data/spec/unit/indirector/certificate/file_spec.rb +0 -0
  1109. data/spec/unit/indirector/certificate/rest_spec.rb +0 -0
  1110. data/spec/unit/indirector/certificate_request/ca_spec.rb +0 -0
  1111. data/spec/unit/indirector/certificate_request/disabled_ca_spec.rb +0 -0
  1112. data/spec/unit/indirector/certificate_request/file_spec.rb +0 -0
  1113. data/spec/unit/indirector/certificate_request/rest_spec.rb +0 -0
  1114. data/spec/unit/indirector/certificate_revocation_list/ca_spec.rb +0 -0
  1115. data/spec/unit/indirector/certificate_revocation_list/disabled_ca_spec.rb +0 -0
  1116. data/spec/unit/indirector/certificate_revocation_list/file_spec.rb +0 -0
  1117. data/spec/unit/indirector/certificate_revocation_list/rest_spec.rb +0 -0
  1118. data/spec/unit/indirector/certificate_status/file_spec.rb +0 -0
  1119. data/spec/unit/indirector/certificate_status/rest_spec.rb +0 -0
  1120. data/spec/unit/indirector/code_spec.rb +0 -0
  1121. data/spec/unit/indirector/data_binding/none_spec.rb +2 -2
  1122. data/spec/unit/indirector/direct_file_server_spec.rb +0 -0
  1123. data/spec/unit/indirector/envelope_spec.rb +0 -0
  1124. data/spec/unit/indirector/exec_spec.rb +0 -0
  1125. data/spec/unit/indirector/face_spec.rb +10 -2
  1126. data/spec/unit/indirector/facts/facter_spec.rb +7 -7
  1127. data/spec/unit/indirector/facts/network_device_spec.rb +0 -0
  1128. data/spec/unit/indirector/facts/store_configs_spec.rb +0 -0
  1129. data/spec/unit/indirector/facts/yaml_spec.rb +0 -0
  1130. data/spec/unit/indirector/file_bucket_file/file_spec.rb +53 -2
  1131. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +0 -0
  1132. data/spec/unit/indirector/file_content/file_server_spec.rb +0 -0
  1133. data/spec/unit/indirector/file_content/file_spec.rb +0 -0
  1134. data/spec/unit/indirector/file_content/rest_spec.rb +0 -0
  1135. data/spec/unit/indirector/file_metadata/file_server_spec.rb +0 -0
  1136. data/spec/unit/indirector/file_metadata/file_spec.rb +0 -0
  1137. data/spec/unit/indirector/file_metadata/rest_spec.rb +0 -0
  1138. data/spec/unit/indirector/file_server_spec.rb +0 -0
  1139. data/spec/unit/indirector/indirection_spec.rb +13 -2
  1140. data/spec/unit/indirector/json_spec.rb +1 -1
  1141. data/spec/unit/indirector/key/ca_spec.rb +0 -0
  1142. data/spec/unit/indirector/key/disabled_ca_spec.rb +0 -0
  1143. data/spec/unit/indirector/key/file_spec.rb +0 -0
  1144. data/spec/unit/indirector/ldap_spec.rb +0 -0
  1145. data/spec/unit/indirector/memory_spec.rb +0 -0
  1146. data/spec/unit/indirector/msgpack_spec.rb +11 -1
  1147. data/spec/unit/indirector/node/exec_spec.rb +0 -0
  1148. data/spec/unit/indirector/node/ldap_spec.rb +0 -0
  1149. data/spec/unit/indirector/node/memory_spec.rb +0 -0
  1150. data/spec/unit/indirector/node/msgpack_spec.rb +0 -0
  1151. data/spec/unit/indirector/node/plain_spec.rb +0 -0
  1152. data/spec/unit/indirector/node/rest_spec.rb +0 -0
  1153. data/spec/unit/indirector/node/store_configs_spec.rb +0 -0
  1154. data/spec/unit/indirector/node/yaml_spec.rb +0 -0
  1155. data/spec/unit/indirector/plain_spec.rb +0 -0
  1156. data/spec/unit/indirector/report/msgpack_spec.rb +0 -0
  1157. data/spec/unit/indirector/report/processor_spec.rb +0 -0
  1158. data/spec/unit/indirector/report/rest_spec.rb +0 -0
  1159. data/spec/unit/indirector/report/yaml_spec.rb +0 -0
  1160. data/spec/unit/indirector/request_spec.rb +17 -8
  1161. data/spec/unit/indirector/resource/ral_spec.rb +0 -0
  1162. data/spec/unit/indirector/resource/store_configs_spec.rb +0 -0
  1163. data/spec/unit/indirector/resource_type/parser_spec.rb +5 -0
  1164. data/spec/unit/indirector/resource_type/rest_spec.rb +0 -0
  1165. data/spec/unit/indirector/rest_spec.rb +107 -9
  1166. data/spec/unit/indirector/ssl_file_spec.rb +1 -1
  1167. data/spec/unit/indirector/status/rest_spec.rb +0 -0
  1168. data/spec/unit/indirector/store_configs_spec.rb +0 -0
  1169. data/spec/unit/indirector/terminus_spec.rb +0 -0
  1170. data/spec/unit/indirector/yaml_spec.rb +1 -1
  1171. data/spec/unit/indirector_spec.rb +0 -0
  1172. data/spec/unit/info_service_spec.rb +298 -0
  1173. data/spec/unit/interface/action_builder_spec.rb +0 -0
  1174. data/spec/unit/interface/action_manager_spec.rb +0 -0
  1175. data/spec/unit/interface/action_spec.rb +0 -0
  1176. data/spec/unit/interface/documentation_spec.rb +0 -0
  1177. data/spec/unit/interface/face_collection_spec.rb +0 -0
  1178. data/spec/unit/interface/option_builder_spec.rb +0 -0
  1179. data/spec/unit/interface/option_spec.rb +0 -0
  1180. data/spec/unit/interface_spec.rb +27 -0
  1181. data/spec/unit/man_spec.rb +1 -1
  1182. data/spec/unit/module_spec.rb +84 -33
  1183. data/spec/unit/module_tool/application_spec.rb +1 -1
  1184. data/spec/unit/module_tool/applications/builder_spec.rb +44 -9
  1185. data/spec/unit/module_tool/applications/installer_spec.rb +11 -2
  1186. data/spec/unit/module_tool/applications/unpacker_spec.rb +2 -1
  1187. data/spec/unit/module_tool/applications/upgrader_spec.rb +9 -1
  1188. data/spec/unit/module_tool/installed_modules_spec.rb +6 -6
  1189. data/spec/unit/module_tool/metadata_spec.rb +31 -2
  1190. data/spec/unit/module_tool/tar/mini_spec.rb +3 -3
  1191. data/spec/unit/module_tool_spec.rb +3 -3
  1192. data/spec/unit/network/auth_config_parser_spec.rb +16 -0
  1193. data/spec/unit/network/authconfig_spec.rb +62 -32
  1194. data/spec/unit/network/authorization_spec.rb +30 -2
  1195. data/spec/unit/network/authstore_spec.rb +2 -2
  1196. data/spec/unit/network/format_handler_spec.rb +0 -0
  1197. data/spec/unit/network/format_spec.rb +0 -0
  1198. data/spec/unit/network/formats_spec.rb +0 -0
  1199. data/spec/unit/network/http/api/indirected_routes_spec.rb +70 -71
  1200. data/spec/unit/network/http/api/master/v3/environment_spec.rb +60 -0
  1201. data/spec/unit/network/http/api/master/v3_spec.rb +22 -4
  1202. data/spec/unit/network/http/compression_spec.rb +1 -1
  1203. data/spec/unit/network/http/connection_spec.rb +25 -19
  1204. data/spec/unit/network/http/error_spec.rb +2 -1
  1205. data/spec/unit/network/http/factory_spec.rb +14 -0
  1206. data/spec/unit/network/http/handler_spec.rb +11 -8
  1207. data/spec/unit/network/http/nocache_pool_spec.rb +0 -0
  1208. data/spec/unit/network/http/pool_spec.rb +30 -0
  1209. data/spec/unit/network/http/rack/rest_spec.rb +7 -0
  1210. data/spec/unit/network/http/rack_spec.rb +0 -0
  1211. data/spec/unit/network/http/session_spec.rb +0 -0
  1212. data/spec/unit/network/http/site_spec.rb +0 -0
  1213. data/spec/unit/network/http/webrick/rest_spec.rb +0 -0
  1214. data/spec/unit/network/http/webrick_spec.rb +1 -1
  1215. data/spec/unit/network/http_pool_spec.rb +0 -0
  1216. data/spec/unit/network/http_spec.rb +0 -0
  1217. data/spec/unit/network/resolver_spec.rb +0 -0
  1218. data/spec/unit/network/rights_spec.rb +4 -4
  1219. data/spec/unit/network/server_spec.rb +0 -0
  1220. data/spec/unit/node/environment_spec.rb +10 -0
  1221. data/spec/unit/node/facts_spec.rb +0 -0
  1222. data/spec/unit/node_spec.rb +41 -0
  1223. data/spec/unit/other/selinux_spec.rb +0 -0
  1224. data/spec/unit/parameter/path_spec.rb +0 -0
  1225. data/spec/unit/parameter/value_collection_spec.rb +0 -0
  1226. data/spec/unit/parameter/value_spec.rb +0 -0
  1227. data/spec/unit/parameter_spec.rb +11 -0
  1228. data/spec/unit/parser/ast/leaf_spec.rb +1 -1
  1229. data/spec/unit/parser/compiler_spec.rb +120 -33
  1230. data/spec/unit/parser/environment_compiler_spec.rb +688 -0
  1231. data/spec/unit/parser/files_spec.rb +0 -0
  1232. data/spec/unit/parser/functions/create_resources_spec.rb +86 -5
  1233. data/spec/unit/parser/functions/digest_spec.rb +0 -0
  1234. data/spec/unit/parser/functions/fail_spec.rb +0 -0
  1235. data/spec/unit/parser/functions/file_spec.rb +7 -1
  1236. data/spec/unit/parser/functions/fqdn_rand_spec.rb +6 -2
  1237. data/spec/unit/parser/functions/generate_spec.rb +3 -12
  1238. data/spec/unit/parser/functions/hiera_array_spec.rb +1 -1
  1239. data/spec/unit/parser/functions/hiera_hash_spec.rb +1 -1
  1240. data/spec/unit/parser/functions/hiera_include_spec.rb +1 -1
  1241. data/spec/unit/parser/functions/hiera_spec.rb +1 -1
  1242. data/spec/unit/parser/functions/inline_template_spec.rb +0 -0
  1243. data/spec/unit/parser/functions/lookup_spec.rb +1 -1
  1244. data/spec/unit/parser/functions/realize_spec.rb +0 -0
  1245. data/spec/unit/parser/functions/regsubst_spec.rb +1 -1
  1246. data/spec/unit/parser/functions/scanf_spec.rb +0 -0
  1247. data/spec/unit/parser/functions/shellquote_spec.rb +0 -0
  1248. data/spec/unit/parser/functions/split_spec.rb +1 -1
  1249. data/spec/unit/parser/functions/sprintf_spec.rb +0 -0
  1250. data/spec/unit/parser/functions/tag_spec.rb +0 -0
  1251. data/spec/unit/parser/functions/template_spec.rb +1 -1
  1252. data/spec/unit/parser/functions/versioncmp_spec.rb +0 -0
  1253. data/spec/unit/parser/functions_spec.rb +0 -0
  1254. data/spec/unit/parser/relationship_spec.rb +0 -0
  1255. data/spec/unit/parser/resource/param_spec.rb +0 -0
  1256. data/spec/unit/parser/resource_spec.rb +31 -32
  1257. data/spec/unit/parser/scope_spec.rb +85 -18
  1258. data/spec/unit/parser/templatewrapper_spec.rb +1 -1
  1259. data/spec/unit/parser/type_loader_spec.rb +0 -0
  1260. data/spec/unit/pops/binder/config/binder_config_spec.rb +1 -1
  1261. data/spec/unit/pops/binder/injector_spec.rb +3 -3
  1262. data/spec/unit/pops/evaluator/access_ops_spec.rb +133 -18
  1263. data/spec/unit/pops/evaluator/arithmetic_ops_spec.rb +170 -0
  1264. data/spec/unit/pops/evaluator/basic_expressions_spec.rb +1 -2
  1265. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  1266. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +155 -41
  1267. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
  1268. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  1269. data/spec/unit/pops/evaluator/literal_evaluator_spec.rb +43 -0
  1270. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +133 -0
  1271. data/spec/unit/pops/evaluator/variables_spec.rb +2 -2
  1272. data/spec/unit/pops/issues_spec.rb +16 -16
  1273. data/spec/unit/pops/label_provider_spec.rb +5 -1
  1274. data/spec/unit/pops/loaders/dependency_loader_spec.rb +66 -1
  1275. data/spec/unit/pops/loaders/environment_loader_spec.rb +172 -0
  1276. data/spec/unit/pops/loaders/loader_paths_spec.rb +1 -1
  1277. data/spec/unit/pops/loaders/loaders_spec.rb +292 -51
  1278. data/spec/unit/pops/loaders/module_loaders_spec.rb +2 -2
  1279. data/spec/unit/pops/loaders/static_loader_spec.rb +83 -18
  1280. data/spec/unit/pops/lookup/context_spec.rb +178 -0
  1281. data/spec/unit/pops/lookup/interpolation_spec.rb +333 -0
  1282. data/spec/unit/pops/lookup/lookup_spec.rb +197 -0
  1283. data/spec/unit/pops/merge_strategy_spec.rb +18 -0
  1284. data/spec/unit/pops/migration_spec.rb +53 -0
  1285. data/spec/unit/pops/parser/lexer2_spec.rb +369 -10
  1286. data/spec/unit/pops/parser/parse_application_spec.rb +35 -0
  1287. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +31 -0
  1288. data/spec/unit/pops/parser/parse_calls_spec.rb +25 -0
  1289. data/spec/unit/pops/parser/parse_capabilities_spec.rb +40 -0
  1290. data/spec/unit/pops/parser/parse_functions_spec.rb +19 -0
  1291. data/spec/unit/pops/parser/parse_heredoc_spec.rb +26 -0
  1292. data/spec/unit/pops/parser/parse_lambda_spec.rb +19 -0
  1293. data/spec/unit/pops/parser/parse_site_spec.rb +51 -0
  1294. data/spec/unit/pops/parser/parser_rspec_helper.rb +6 -0
  1295. data/spec/unit/pops/parser/parser_spec.rb +28 -0
  1296. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  1297. data/spec/unit/pops/puppet_stack_spec.rb +79 -0
  1298. data/spec/unit/pops/resource/resource_type_impl_spec.rb +111 -0
  1299. data/spec/unit/pops/serialization/packer_spec.rb +154 -0
  1300. data/spec/unit/pops/serialization/rgen_spec.rb +88 -0
  1301. data/spec/unit/pops/serialization/serialization_spec.rb +314 -0
  1302. data/spec/unit/pops/time/timespan_spec.rb +121 -0
  1303. data/spec/unit/pops/types/enumeration_spec.rb +13 -12
  1304. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  1305. data/spec/unit/pops/types/p_binary_type_spec.rb +243 -0
  1306. data/spec/unit/pops/types/p_object_type_spec.rb +1167 -0
  1307. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +327 -0
  1308. data/spec/unit/pops/types/p_sensitive_type_spec.rb +169 -0
  1309. data/spec/unit/pops/types/p_timespan_type_spec.rb +273 -0
  1310. data/spec/unit/pops/types/p_timestamp_type_spec.rb +311 -0
  1311. data/spec/unit/pops/types/p_type_set_type_spec.rb +453 -0
  1312. data/spec/unit/pops/types/recursion_guard_spec.rb +93 -0
  1313. data/spec/unit/pops/types/ruby_generator_spec.rb +577 -0
  1314. data/spec/unit/pops/types/string_converter_spec.rb +1029 -0
  1315. data/spec/unit/pops/types/type_acceptor_spec.rb +106 -0
  1316. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  1317. data/spec/unit/pops/types/type_calculator_spec.rb +1107 -871
  1318. data/spec/unit/pops/types/type_factory_spec.rb +132 -91
  1319. data/spec/unit/pops/types/type_formatter_spec.rb +396 -0
  1320. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +219 -0
  1321. data/spec/unit/pops/types/type_parser_spec.rb +206 -36
  1322. data/spec/unit/pops/types/types_spec.rb +600 -0
  1323. data/spec/unit/pops/validation_spec.rb +66 -0
  1324. data/spec/unit/pops/validator/validator_spec.rb +400 -18
  1325. data/spec/unit/property/ensure_spec.rb +0 -0
  1326. data/spec/unit/property/keyvalue_spec.rb +0 -0
  1327. data/spec/unit/property/list_spec.rb +0 -0
  1328. data/spec/unit/property/ordered_list_spec.rb +0 -0
  1329. data/spec/unit/property_spec.rb +49 -12
  1330. data/spec/unit/provider/augeas/augeas_spec.rb +59 -0
  1331. data/spec/unit/provider/cisco_spec.rb +0 -0
  1332. data/spec/unit/provider/command_spec.rb +0 -0
  1333. data/spec/unit/provider/cron/crontab_spec.rb +0 -0
  1334. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  1335. data/spec/unit/provider/exec/posix_spec.rb +0 -0
  1336. data/spec/unit/provider/exec/shell_spec.rb +0 -0
  1337. data/spec/unit/provider/exec/windows_spec.rb +0 -0
  1338. data/spec/unit/provider/exec_spec.rb +0 -0
  1339. data/spec/unit/provider/file/posix_spec.rb +0 -0
  1340. data/spec/unit/provider/file/windows_spec.rb +0 -0
  1341. data/spec/unit/provider/group/directoryservice_spec.rb +33 -0
  1342. data/spec/unit/provider/group/groupadd_spec.rb +0 -0
  1343. data/spec/unit/provider/group/ldap_spec.rb +0 -0
  1344. data/spec/unit/provider/group/pw_spec.rb +0 -0
  1345. data/spec/unit/provider/group/windows_adsi_spec.rb +88 -18
  1346. data/spec/unit/provider/host/parsed_spec.rb +0 -0
  1347. data/spec/unit/provider/interface/cisco_spec.rb +0 -0
  1348. data/spec/unit/provider/ldap_spec.rb +0 -0
  1349. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  1350. data/spec/unit/provider/mcx/mcxcontent_spec.rb +0 -0
  1351. data/spec/unit/provider/mount/parsed_spec.rb +31 -5
  1352. data/spec/unit/provider/mount_spec.rb +0 -0
  1353. data/spec/unit/provider/naginator_spec.rb +0 -0
  1354. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  1355. data/spec/unit/provider/nameservice_spec.rb +42 -0
  1356. data/spec/unit/provider/network_device_spec.rb +0 -0
  1357. data/spec/unit/provider/package/aix_spec.rb +0 -0
  1358. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  1359. data/spec/unit/provider/package/apt_spec.rb +5 -0
  1360. data/spec/unit/provider/package/aptitude_spec.rb +0 -0
  1361. data/spec/unit/provider/package/aptrpm_spec.rb +3 -3
  1362. data/spec/unit/provider/package/base_spec.rb +18 -0
  1363. data/spec/unit/provider/package/dnf_spec.rb +30 -0
  1364. data/spec/unit/provider/package/dpkg_spec.rb +0 -0
  1365. data/spec/unit/provider/package/freebsd_spec.rb +0 -0
  1366. data/spec/unit/provider/package/gem_spec.rb +77 -0
  1367. data/spec/unit/provider/package/hpux_spec.rb +0 -0
  1368. data/spec/unit/provider/package/macports_spec.rb +0 -0
  1369. data/spec/unit/provider/package/nim_spec.rb +6 -6
  1370. data/spec/unit/provider/package/openbsd_spec.rb +0 -0
  1371. data/spec/unit/provider/package/opkg_spec.rb +0 -0
  1372. data/spec/unit/provider/package/pacman_spec.rb +55 -0
  1373. data/spec/unit/provider/package/pip3_spec.rb +22 -0
  1374. data/spec/unit/provider/package/pip_spec.rb +173 -46
  1375. data/spec/unit/provider/package/pkg_spec.rb +137 -99
  1376. data/spec/unit/provider/package/pkgdmg_spec.rb +32 -8
  1377. data/spec/unit/provider/package/pkgin_spec.rb +23 -13
  1378. data/spec/unit/provider/package/pkgng_spec.rb +186 -0
  1379. data/spec/unit/provider/package/pkgutil_spec.rb +0 -0
  1380. data/spec/unit/provider/package/portage_spec.rb +64 -8
  1381. data/spec/unit/provider/package/puppet_gem_spec.rb +0 -0
  1382. data/spec/unit/provider/package/rpm_spec.rb +168 -11
  1383. data/spec/unit/provider/package/sun_spec.rb +0 -0
  1384. data/spec/unit/provider/package/tdnf_spec.rb +18 -0
  1385. data/spec/unit/provider/package/windows/exe_package_spec.rb +0 -1
  1386. data/spec/unit/provider/package/windows/msi_package_spec.rb +0 -1
  1387. data/spec/unit/provider/package/windows/package_spec.rb +45 -1
  1388. data/spec/unit/provider/package/windows_spec.rb +8 -2
  1389. data/spec/unit/provider/package/yum_spec.rb +29 -466
  1390. data/spec/unit/provider/package/zypper_spec.rb +64 -19
  1391. data/spec/unit/provider/parsedfile_spec.rb +0 -0
  1392. data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +523 -70
  1393. data/spec/unit/provider/selboolean_spec.rb +0 -0
  1394. data/spec/unit/provider/selmodule_spec.rb +0 -0
  1395. data/spec/unit/provider/service/base_spec.rb +44 -27
  1396. data/spec/unit/provider/service/bsd_spec.rb +130 -0
  1397. data/spec/unit/provider/service/daemontools_spec.rb +0 -0
  1398. data/spec/unit/provider/service/debian_spec.rb +38 -0
  1399. data/spec/unit/provider/service/freebsd_spec.rb +17 -0
  1400. data/spec/unit/provider/service/gentoo_spec.rb +8 -0
  1401. data/spec/unit/provider/service/init_spec.rb +42 -1
  1402. data/spec/unit/provider/service/launchd_spec.rb +124 -25
  1403. data/spec/unit/provider/service/openbsd_spec.rb +1 -0
  1404. data/spec/unit/provider/service/openrc_spec.rb +7 -0
  1405. data/spec/unit/provider/service/openwrt_spec.rb +0 -0
  1406. data/spec/unit/provider/service/rcng_spec.rb +41 -0
  1407. data/spec/unit/provider/service/redhat_spec.rb +9 -1
  1408. data/spec/unit/provider/service/runit_spec.rb +0 -0
  1409. data/spec/unit/provider/service/smf_spec.rb +77 -13
  1410. data/spec/unit/provider/service/src_spec.rb +26 -4
  1411. data/spec/unit/provider/service/systemd_spec.rb +228 -39
  1412. data/spec/unit/provider/service/upstart_spec.rb +64 -0
  1413. data/spec/unit/provider/service/windows_spec.rb +0 -0
  1414. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +2 -1
  1415. data/spec/unit/provider/sshkey/parsed_spec.rb +42 -18
  1416. data/spec/unit/provider/user/aix_spec.rb +7 -0
  1417. data/spec/unit/provider/user/directoryservice_spec.rb +164 -83
  1418. data/spec/unit/provider/user/hpux_spec.rb +0 -0
  1419. data/spec/unit/provider/user/ldap_spec.rb +0 -0
  1420. data/spec/unit/provider/user/openbsd_spec.rb +0 -0
  1421. data/spec/unit/provider/user/pw_spec.rb +0 -0
  1422. data/spec/unit/provider/user/user_role_add_spec.rb +0 -0
  1423. data/spec/unit/provider/user/useradd_spec.rb +1 -0
  1424. data/spec/unit/provider/user/windows_adsi_spec.rb +160 -7
  1425. data/spec/unit/provider/vlan/cisco_spec.rb +0 -0
  1426. data/spec/unit/provider/yumrepo/inifile_spec.rb +16 -0
  1427. data/spec/unit/provider/zfs/zfs_spec.rb +0 -0
  1428. data/spec/unit/provider/zone/solaris_spec.rb +64 -12
  1429. data/spec/unit/provider/zpool/zpool_spec.rb +0 -0
  1430. data/spec/unit/provider_spec.rb +0 -0
  1431. data/spec/unit/puppet_spec.rb +15 -1
  1432. data/spec/unit/relationship_spec.rb +0 -0
  1433. data/spec/unit/reports/http_spec.rb +0 -0
  1434. data/spec/unit/reports/store_spec.rb +0 -0
  1435. data/spec/unit/reports_spec.rb +10 -0
  1436. data/spec/unit/resource/capability_finder_spec.rb +147 -0
  1437. data/spec/unit/resource/catalog_spec.rb +235 -10
  1438. data/spec/unit/resource/status_spec.rb +0 -0
  1439. data/spec/unit/resource/type_collection_spec.rb +23 -2
  1440. data/spec/unit/resource/type_spec.rb +161 -10
  1441. data/spec/unit/resource_spec.rb +137 -48
  1442. data/spec/unit/semver_spec.rb +14 -0
  1443. data/spec/unit/settings/directory_setting_spec.rb +0 -0
  1444. data/spec/unit/settings/duration_setting_spec.rb +0 -0
  1445. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  1446. data/spec/unit/settings/file_setting_spec.rb +37 -0
  1447. data/spec/unit/settings/ini_file_spec.rb +58 -1
  1448. data/spec/unit/settings/path_setting_spec.rb +0 -0
  1449. data/spec/unit/settings/priority_setting_spec.rb +0 -0
  1450. data/spec/unit/settings_spec.rb +116 -3
  1451. data/spec/unit/ssl/base_spec.rb +0 -0
  1452. data/spec/unit/ssl/certificate_authority/interface_spec.rb +180 -13
  1453. data/spec/unit/ssl/certificate_authority_spec.rb +80 -26
  1454. data/spec/unit/ssl/certificate_factory_spec.rb +0 -0
  1455. data/spec/unit/ssl/certificate_request_spec.rb +1 -1
  1456. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  1457. data/spec/unit/ssl/certificate_spec.rb +0 -0
  1458. data/spec/unit/ssl/configuration_spec.rb +0 -0
  1459. data/spec/unit/ssl/host_spec.rb +3 -3
  1460. data/spec/unit/ssl/inventory_spec.rb +0 -0
  1461. data/spec/unit/ssl/key_spec.rb +0 -0
  1462. data/spec/unit/ssl/oids_spec.rb +24 -13
  1463. data/spec/unit/status_spec.rb +0 -0
  1464. data/spec/unit/transaction/additional_resource_generator_spec.rb +160 -31
  1465. data/spec/unit/transaction/event_manager_spec.rb +0 -0
  1466. data/spec/unit/transaction/event_spec.rb +3 -1
  1467. data/spec/unit/transaction/persistence_spec.rb +178 -0
  1468. data/spec/unit/transaction/report_spec.rb +138 -2
  1469. data/spec/unit/transaction/resource_harness_spec.rb +81 -37
  1470. data/spec/unit/transaction_spec.rb +50 -0
  1471. data/spec/unit/type/augeas_spec.rb +0 -0
  1472. data/spec/unit/type/component_spec.rb +0 -0
  1473. data/spec/unit/type/computer_spec.rb +0 -0
  1474. data/spec/unit/type/cron_spec.rb +0 -0
  1475. data/spec/unit/type/exec_spec.rb +16 -8
  1476. data/spec/unit/type/file/checksum_spec.rb +6 -0
  1477. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  1478. data/spec/unit/type/file/content_spec.rb +59 -208
  1479. data/spec/unit/type/file/ctime_spec.rb +0 -0
  1480. data/spec/unit/type/file/ensure_spec.rb +0 -0
  1481. data/spec/unit/type/file/group_spec.rb +0 -0
  1482. data/spec/unit/type/file/mode_spec.rb +0 -0
  1483. data/spec/unit/type/file/mtime_spec.rb +0 -0
  1484. data/spec/unit/type/file/owner_spec.rb +0 -0
  1485. data/spec/unit/type/file/selinux_spec.rb +0 -0
  1486. data/spec/unit/type/file/source_spec.rb +211 -119
  1487. data/spec/unit/type/file/type_spec.rb +0 -0
  1488. data/spec/unit/type/file_spec.rb +161 -34
  1489. data/spec/unit/type/filebucket_spec.rb +0 -0
  1490. data/spec/unit/type/group_spec.rb +0 -0
  1491. data/spec/unit/type/host_spec.rb +4 -4
  1492. data/spec/unit/type/interface_spec.rb +32 -0
  1493. data/spec/unit/type/k5login_spec.rb +0 -0
  1494. data/spec/unit/type/macauthorization_spec.rb +4 -1
  1495. data/spec/unit/type/mailalias_spec.rb +0 -0
  1496. data/spec/unit/type/maillist_spec.rb +0 -0
  1497. data/spec/unit/type/mcx_spec.rb +0 -0
  1498. data/spec/unit/type/mount_spec.rb +50 -8
  1499. data/spec/unit/type/nagios_spec.rb +0 -0
  1500. data/spec/unit/type/noop_metaparam_spec.rb +0 -0
  1501. data/spec/unit/type/package/package_settings_spec.rb +0 -0
  1502. data/spec/unit/type/package_spec.rb +1 -0
  1503. data/spec/unit/type/resources_spec.rb +0 -0
  1504. data/spec/unit/type/schedule_spec.rb +0 -0
  1505. data/spec/unit/type/selboolean_spec.rb +0 -0
  1506. data/spec/unit/type/selmodule_spec.rb +0 -0
  1507. data/spec/unit/type/service_spec.rb +21 -0
  1508. data/spec/unit/type/ssh_authorized_key_spec.rb +0 -0
  1509. data/spec/unit/type/sshkey_spec.rb +0 -0
  1510. data/spec/unit/type/stage_spec.rb +0 -0
  1511. data/spec/unit/type/tidy_spec.rb +4 -4
  1512. data/spec/unit/type/user_spec.rb +40 -7
  1513. data/spec/unit/type/vlan_spec.rb +1 -1
  1514. data/spec/unit/type/whit_spec.rb +0 -0
  1515. data/spec/unit/type/yumrepo_spec.rb +3 -7
  1516. data/spec/unit/type/zfs_spec.rb +0 -0
  1517. data/spec/unit/type/zone_spec.rb +0 -0
  1518. data/spec/unit/type/zpool_spec.rb +0 -0
  1519. data/spec/unit/type_spec.rb +119 -1
  1520. data/spec/unit/util/autoload_spec.rb +0 -0
  1521. data/spec/unit/util/backups_spec.rb +0 -0
  1522. data/spec/unit/util/checksums_spec.rb +0 -0
  1523. data/spec/unit/util/colors_spec.rb +0 -0
  1524. data/spec/unit/util/command_line_spec.rb +11 -0
  1525. data/spec/unit/util/constant_inflector_spec.rb +0 -0
  1526. data/spec/unit/util/diff_spec.rb +0 -0
  1527. data/spec/unit/util/errors_spec.rb +0 -0
  1528. data/spec/unit/util/execution_spec.rb +1 -1
  1529. data/spec/unit/util/execution_stub_spec.rb +0 -0
  1530. data/spec/unit/util/feature_spec.rb +1 -1
  1531. data/spec/unit/util/filetype_spec.rb +4 -4
  1532. data/spec/unit/util/http_proxy_spec.rb +87 -0
  1533. data/spec/unit/util/ldap/connection_spec.rb +0 -0
  1534. data/spec/unit/util/ldap/generator_spec.rb +1 -1
  1535. data/spec/unit/util/ldap/manager_spec.rb +0 -0
  1536. data/spec/unit/util/log/destinations_spec.rb +0 -2
  1537. data/spec/unit/util/log_spec.rb +125 -1
  1538. data/spec/unit/util/logging_spec.rb +69 -0
  1539. data/spec/unit/util/metric_spec.rb +0 -0
  1540. data/spec/unit/util/monkey_patches_spec.rb +95 -3
  1541. data/spec/unit/util/multi_match_spec.rb +39 -0
  1542. data/spec/unit/util/nagios_maker_spec.rb +0 -0
  1543. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  1544. data/spec/unit/util/network_device/cisco/facts_spec.rb +0 -0
  1545. data/spec/unit/util/network_device/cisco/interface_spec.rb +0 -0
  1546. data/spec/unit/util/network_device/config_spec.rb +0 -0
  1547. data/spec/unit/util/network_device/ipcalc_spec.rb +0 -0
  1548. data/spec/unit/util/network_device/transport/base_spec.rb +0 -0
  1549. data/spec/unit/util/network_device/transport/ssh_spec.rb +1 -1
  1550. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  1551. data/spec/unit/util/network_device_spec.rb +1 -1
  1552. data/spec/unit/util/package_spec.rb +0 -0
  1553. data/spec/unit/util/plist_spec.rb +135 -0
  1554. data/spec/unit/util/posix_spec.rb +0 -0
  1555. data/spec/unit/util/rdoc_spec.rb +0 -0
  1556. data/spec/unit/util/resource_template_spec.rb +2 -2
  1557. data/spec/unit/util/retry_action_spec.rb +0 -0
  1558. data/spec/unit/util/run_mode_spec.rb +27 -3
  1559. data/spec/unit/util/selinux_spec.rb +0 -0
  1560. data/spec/unit/util/splayer_spec.rb +45 -0
  1561. data/spec/unit/util/storage_spec.rb +8 -1
  1562. data/spec/unit/util/suidmanager_spec.rb +0 -0
  1563. data/spec/unit/util/symbolic_file_mode_spec.rb +0 -0
  1564. data/spec/unit/util/tagging_spec.rb +4 -0
  1565. data/spec/unit/util/user_attr_spec.rb +0 -0
  1566. data/spec/unit/util/warnings_spec.rb +0 -0
  1567. data/spec/unit/util/windows/adsi_spec.rb +196 -60
  1568. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  1569. data/spec/unit/util/windows/file_spec.rb +89 -0
  1570. data/spec/unit/util/windows/root_certs_spec.rb +0 -0
  1571. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  1572. data/spec/unit/util/windows/sid_spec.rb +76 -24
  1573. data/spec/unit/util/yaml_spec.rb +13 -1
  1574. data/spec/unit/util_spec.rb +219 -15
  1575. data/spec/unit/version_spec.rb +15 -0
  1576. data/spec/watchr.rb +0 -0
  1577. data/tasks/cfpropertylist.rake +15 -0
  1578. data/tasks/i18n.rake +20 -0
  1579. metadata +3701 -3043
  1580. checksums.yaml +0 -7
  1581. data/ext/puppet-nm-dispatcher +0 -13
  1582. data/ext/puppetlisten/puppetlisten.rb +0 -77
  1583. data/ext/puppetlisten/puppetrun.rb +0 -38
  1584. data/ext/systemd/puppetmaster.service +0 -11
  1585. data/lib/puppet/pops/evaluator/callable_mismatch_describer.rb +0 -175
  1586. data/lib/puppet/pops/types/types_meta.rb +0 -223
  1587. data/lib/puppet/resource/type_collection_helper.rb +0 -7
  1588. data/lib/puppet/vendor/load_plist.rb +0 -1
  1589. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  1590. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  1591. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  1592. data/lib/puppet/vendor/plist/README +0 -36
  1593. data/lib/puppet/vendor/plist/Rakefile +0 -144
  1594. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  1595. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  1596. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  1597. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  1598. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  1599. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  1600. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  1601. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  1602. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  1603. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  1604. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  1605. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  1606. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  1607. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  1608. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  1609. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  1610. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  1611. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
  1612. data/lib/puppet/vendor/semantic/Gemfile +0 -20
  1613. data/lib/puppet/vendor/semantic/PUPPET_README.md +0 -6
  1614. data/lib/puppet/vendor/semantic/Rakefile +0 -69
  1615. data/lib/puppet/vendor/semantic/spec/spec_helper.rb +0 -24
  1616. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_node_spec.rb +0 -141
  1617. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_spec.rb +0 -162
  1618. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/module_release_spec.rb +0 -143
  1619. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/source_spec.rb +0 -5
  1620. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/unsatisfiable_graph_spec.rb +0 -44
  1621. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency_spec.rb +0 -383
  1622. data/lib/puppet/vendor/semantic/spec/unit/semantic/version_range_spec.rb +0 -307
  1623. data/lib/puppet/vendor/semantic/spec/unit/semantic/version_spec.rb +0 -608
  1624. data/spec/fixtures/unit/data_providers/environments/sample/manifests/site.pp +0 -6
  1625. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -3
  1626. data/spec/integration/data_binding.rb +0 -104
  1627. data/spec/integration/parser/functions/require_spec.rb +0 -43
  1628. data/spec/integration/provider/package_spec.rb +0 -33
  1629. data/spec/unit/parser/functions/defined_spec.rb +0 -120
  1630. data/spec/unit/parser/functions/include_spec.rb +0 -55
  1631. data/spec/unit/parser/functions/require_spec.rb +0 -68
  1632. data/spec/unit/resource/type_collection_helper_spec.rb +0 -24
  1633. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/environment.conf +0 -0
  1634. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/lib/puppet/functions/environment/data.rb +0 -0
  1635. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/bindings/abc/default.rb +0 -0
  1636. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +0 -0
  1637. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/manifests/init.pp +0 -0
  1638. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/bindings/bad_data/default.rb +0 -0
  1639. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/bindings/bca/default.rb +0 -0
  1640. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/functions/bca/data.rb +0 -0
  1641. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/manifests/init.pp +0 -0
  1642. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/no_provider/manifests/init.pp +0 -0
  1643. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{usee → modules/usee}/lib/puppet/functions/usee/callee.rb +0 -0
  1644. /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,1444 @@
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)
32
- end
12
+ context 'with an environment' do
13
+ let(:env_name) { 'spec' }
14
+ let(:code_dir_files) { {} }
15
+ let(:code_dir) { tmpdir('code') }
16
+ let(:environment_files) do
17
+ {
18
+ env_name => {
19
+ 'modules' => {},
20
+ 'hiera.yaml' => <<-YAML.unindent,
21
+ ---
22
+ version: 5
23
+ hierarchy:
24
+ - name: "Common"
25
+ data_hash: yaml_data
26
+ path: "common.yaml"
27
+ YAML
28
+ 'data' => {
29
+ 'common.yaml' => <<-YAML.unindent
30
+ ---
31
+ a: value a
32
+ mod_a::a: value mod_a::a (from environment)
33
+ mod_a::hash_a:
34
+ a: value mod_a::hash_a.a (from environment)
35
+ mod_a::hash_b:
36
+ a: value mod_a::hash_b.a (from environment)
37
+ hash_b:
38
+ hash_ba:
39
+ bab: value hash_b.hash_ba.bab (from environment)
40
+ hash_c:
41
+ hash_ca:
42
+ caa: value hash_c.hash_ca.caa (from environment)
43
+ lookup_options:
44
+ mod_a::hash_b:
45
+ merge: hash
46
+ hash_c:
47
+ merge: hash
48
+ YAML
49
+ }
50
+ }
51
+ }
52
+ end
33
53
 
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] }
43
- end
54
+ let(:logs) { [] }
55
+ let(:notices) { logs.select { |log| log.level == :notice }.map { |log| log.message } }
56
+ let(:warnings) { logs.select { |log| log.level == :warning }.map { |log| log.message } }
57
+ let(:debugs) { logs.select { |log| log.level == :debug }.map { |log| log.message } }
58
+ let(:env) { Puppet::Node::Environment.create(env_name.to_sym, [File.join(populated_env_dir, env_name, 'modules')]) }
59
+ let(:environments) { Puppet::Environments::Directories.new(populated_env_dir, []) }
60
+ let(:node) { Puppet::Node.new('test_lookup', :environment => env) }
61
+ let(:compiler) { Puppet::Parser::Compiler.new(node) }
62
+ let(:lookup_func) { Puppet.lookup(:loaders).puppet_system_loader.load(:function, 'lookup') }
63
+ let(:defaults) {
64
+ {
65
+ 'mod_a::xd' => 'value mod_a::xd (from default)',
66
+ 'mod_a::xd_found' => 'value mod_a::xd_found (from default)',
67
+ 'scope_xd' => 'value scope_xd (from default)'
68
+ }}
69
+ let(:overrides) {
70
+ {
71
+ 'mod_a::xo' => 'value mod_a::xo (from override)',
72
+ 'scope_xo' => 'value scope_xo (from override)'
73
+ }}
74
+ let(:invocation_with_explain) { Puppet::Pops::Lookup::Invocation.new(compiler.topscope, {}, {}, true) }
75
+ let(:explanation) { invocation_with_explain.explainer.explain }
44
76
 
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') }
48
- let(:compiler) { Puppet::Parser::Compiler.new(node) }
49
-
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
77
+ let(:populated_code_dir) do
78
+ dir_contained_in(code_dir, code_dir_files)
79
+ code_dir
65
80
  end
66
- end
67
81
 
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')
82
+ let(:env_dir) do
83
+ d = File.join(populated_code_dir, 'environments')
84
+ Dir.mkdir(d)
85
+ d
72
86
  end
73
87
 
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')
88
+ let(:populated_env_dir) do
89
+ dir_contained_in(env_dir, environment_files)
90
+ env_dir
77
91
  end
78
92
 
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')
93
+ before(:each) do
94
+ Puppet.settings[:codedir] = code_dir
95
+ Puppet.push_context(:environments => environments, :current_environment => env)
83
96
  end
84
97
 
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')
98
+ after(:each) do
99
+ Puppet.pop_context
100
+ if Object.const_defined?(:Hiera)
101
+ Hiera.send(:remove_instance_variable, :@config) if Hiera.instance_variable_defined?(:@config)
102
+ Hiera.send(:remove_instance_variable, :@logger) if Hiera.instance_variable_defined?(:@logger)
103
+ if Hiera.const_defined?(:Config)
104
+ Hiera::Config.send(:remove_instance_variable, :@config) if Hiera::Config.instance_variable_defined?(:@config)
105
+ end
106
+ if Hiera.const_defined?(:Backend)
107
+ Hiera::Backend.clear!
108
+ end
109
+ end
88
110
  end
89
111
 
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')
112
+ def collect_notices(code, explain = false, &block)
113
+ Puppet[:code] = code
114
+ Puppet::Util::Log.with_destination(Puppet::Test::LogCollector.new(logs)) do
115
+ scope = compiler.topscope
116
+ scope['environment'] = env_name
117
+ scope['domain'] = 'example.com'
118
+ scope['scope_scalar'] = 'scope scalar value'
119
+ scope['scope_hash'] = { 'a' => 'scope hash a', 'b' => 'scope hash b' }
120
+ if explain
121
+ begin
122
+ invocation_with_explain.lookup('dummy', nil) do
123
+ if block_given?
124
+ compiler.compile { |catalog| block.call(compiler.topscope); catalog }
125
+ else
126
+ compiler.compile
127
+ end
128
+ end
129
+ rescue Puppet::DataBinding::LookupError => e
130
+ invocation_with_explain.report_text { e.message }
131
+ end
132
+ else
133
+ if block_given?
134
+ compiler.compile { |catalog| block.call(compiler.topscope); catalog }
135
+ else
136
+ compiler.compile
137
+ end
138
+ end
139
+ end
140
+ nil
93
141
  end
94
142
 
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')
143
+ def lookup(key, options = {}, explain = false)
144
+ nc_opts = options.empty? ? '' : ", #{Puppet::Pops::Types::TypeFormatter.string(options)}"
145
+ keys = key.is_a?(Array) ? key : [key]
146
+ collect_notices(keys.map { |k| "notice(String(lookup('#{k}'#{nc_opts}), '%p'))" }.join("\n"), explain)
147
+ if explain
148
+ explanation
149
+ else
150
+ result = notices.map { |n| Puppet::Pops::Types::TypeParser.singleton.parse_literal(n) }
151
+ key.is_a?(Array) ? result : result[0]
152
+ end
98
153
  end
99
154
 
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')
155
+ def explain(key, options = {})
156
+ lookup(key, options, true)[1]
157
+ explanation
103
158
  end
104
159
 
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')
160
+ it 'finds data in the environment' do
161
+ expect(lookup('a')).to eql('value a')
108
162
  end
109
163
 
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
164
+ context 'that has no lookup configured' do
165
+ let(:environment_files) do
166
+ {
167
+ env_name => {
168
+ 'modules' => {},
169
+ 'data' => {
170
+ 'common.yaml' => <<-YAML.unindent
171
+ ---
172
+ a: value a
173
+ YAML
174
+ }
175
+ }
176
+ }
177
+ end
115
178
 
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
179
+ it 'does not find data in the environment' do
180
+ expect { lookup('a') }.to raise_error(Puppet::DataBinding::LookupError, /did not find a value for the name 'a'/)
181
+ end
120
182
 
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
183
+ context "but an environment.conf with 'environment_data_provider=hiera'" do
184
+ let(:environment_files_1) do
185
+ DeepMerge.deep_merge!(environment_files, 'environment.conf' => "environment_data_provider=hiera\n")
186
+ end
125
187
 
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
188
+ let(:populated_env_dir) do
189
+ dir_contained_in(env_dir, DeepMerge.deep_merge!(environment_files, env_name => environment_files_1))
190
+ env_dir
191
+ end
130
192
 
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
193
+ it 'finds data in the environment and reports deprecation warning for environment.conf' do
194
+ expect(lookup('a')).to eql('value a')
195
+ expect(warnings).to include(/Defining environment_data_provider='hiera' in environment.conf is deprecated. A 'hiera.yaml' file should be used instead/)
196
+ end
136
197
 
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
198
+ context 'and a hiera.yaml file' do
199
+ let(:environment_files_2) { DeepMerge.deep_merge!(environment_files_1,'hiera.yaml' => <<-YAML.unindent) }
200
+ ---
201
+ version: 4
202
+ hierarchy:
203
+ - name: common
204
+ backend: yaml
205
+ YAML
142
206
 
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
207
+ let(:populated_env_dir) do
208
+ dir_contained_in(env_dir, DeepMerge.deep_merge!(environment_files, env_name => environment_files_2))
209
+ env_dir
210
+ end
147
211
 
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
212
+ it 'finds data in the environment and reports deprecation warnings for both environment.conf and hiera.yaml' do
213
+ expect(lookup('a')).to eql('value a')
214
+ expect(warnings).to include(/Defining environment_data_provider='hiera' in environment.conf is deprecated/)
215
+ expect(warnings).to include(/Use of 'hiera.yaml' version 4 is deprecated. It should be converted to version 5/)
216
+ end
217
+ end
218
+ end
152
219
 
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
220
+ context "but an environment.conf with 'environment_data_provider=function'" do
221
+ let(:environment_files) do
222
+ {
223
+ env_name => {
224
+ 'environment.conf' => "environment_data_provider=function\n",
225
+ 'functions' => {
226
+ 'environment' => { 'data.pp' => <<-PUPPET.unindent }
227
+ function environment::data() {
228
+ { 'a' => 'value a' }
229
+ }
230
+ PUPPET
231
+ }
232
+ }
233
+ }
234
+ end
158
235
 
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'\]/)
236
+ it 'finds data in the environment and reports deprecation warning for environment.conf' do
237
+ expect(lookup('a')).to eql('value a')
238
+ expect(warnings).to include(/Defining environment_data_provider='function' in environment.conf is deprecated. A 'hiera.yaml' file should be used instead/)
239
+ expect(warnings).to include(/Using of legacy data provider function 'environment::data'. Please convert to a 'data_hash' function/)
240
+ end
241
+ end
163
242
  end
164
243
 
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')
168
- end
244
+ context 'that has interpolated paths configured' do
245
+ let(:environment_files) do
246
+ {
247
+ env_name => {
248
+ 'hiera.yaml' => <<-YAML.unindent,
249
+ ---
250
+ version: 5
251
+ hierarchy:
252
+ - name: "Varying"
253
+ data_hash: yaml_data
254
+ path: "x%{::var}.yaml"
255
+ YAML
256
+ 'modules' => {},
257
+ 'data' => {
258
+ 'x.yaml' => <<-YAML.unindent,
259
+ y: value y from x
260
+ YAML
261
+ 'x_d.yaml' => <<-YAML.unindent
262
+ y: value y from x_d
263
+ YAML
264
+ }
265
+ }
266
+ }
267
+ end
169
268
 
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')
269
+ it 'reloads the configuration if interpolated values change' do
270
+ Puppet[:log_level] = 'debug'
271
+ collect_notices("notice('success')") do |scope|
272
+ expect(lookup_func.call(scope, 'y')).to eql('value y from x')
273
+ scope['var'] = '_d'
274
+ expect(lookup_func.call(scope, 'y')).to eql('value y from x_d')
275
+ end
276
+ expect(notices).to eql(['success'])
277
+ expect(debugs.any? { |m| m =~ /Hiera configuration recreated due to change of scope variables used in interpolation expressions/ }).to be_truthy
278
+ end
173
279
  end
174
280
 
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')
179
- end
281
+ context 'that uses reserved option' do
282
+ let(:environment_files) do
283
+ {
284
+ env_name => {
285
+ 'hiera.yaml' => <<-YAML.unindent,
286
+ ---
287
+ version: 5
288
+ hierarchy:
289
+ - name: "Illegal"
290
+ options:
291
+ #{opt_spec}
292
+ data_hash: yaml_data
293
+ YAML
294
+ 'data' => {
295
+ 'foo.yaml' => "a: The value a\n"
296
+ }
297
+ }
298
+ }
299
+ end
180
300
 
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')
301
+ context 'path' do
302
+ let(:opt_spec) { 'path: data/foo.yaml' }
303
+
304
+ it 'fails and reports the reserved option key' do
305
+ expect { lookup('a') }.to raise_error do |e|
306
+ expect(e.message).to match(/Option key 'path' used in hierarchy 'Illegal' is reserved by Puppet/)
307
+ end
308
+ end
309
+ end
310
+
311
+ context 'uri' do
312
+ let(:opt_spec) { 'uri: file:///data/foo.yaml' }
313
+
314
+ it 'fails and reports the reserved option key' do
315
+ expect { lookup('a') }.to raise_error do |e|
316
+ expect(e.message).to match(/Option key 'uri' used in hierarchy 'Illegal' is reserved by Puppet/)
317
+ end
318
+ end
319
+ end
185
320
  end
186
321
 
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')
322
+
323
+ context 'with lookup_options configured using patterns' do
324
+ let(:mod_common) {
325
+ <<-YAML.unindent
326
+ mod::hash_a:
327
+ aa:
328
+ aaa: aaa (from module)
329
+ ab:
330
+ aba: aba (from module)
331
+ mod::hash_b:
332
+ ba:
333
+ baa: baa (from module)
334
+ bb:
335
+ bba: bba (from module)
336
+ lookup_options:
337
+ '^mod::ha.*_a':
338
+ merge: deep
339
+ '^mod::ha.*_b':
340
+ merge: deep
341
+ YAML
342
+ }
343
+
344
+ let(:mod_base) do
345
+ {
346
+ 'hiera.yaml' => <<-YAML.unindent,
347
+ version: 5
348
+ YAML
349
+ 'data' => {
350
+ 'common.yaml' => mod_common
351
+ }
352
+ }
353
+ end
354
+
355
+ let(:environment_files) do
356
+ {
357
+ env_name => {
358
+ 'hiera.yaml' => <<-YAML.unindent,
359
+ ---
360
+ version: 5
361
+ hierarchy:
362
+ - name: X
363
+ paths:
364
+ - first.yaml
365
+ - second.yaml
366
+ YAML
367
+ 'data' => {
368
+ 'first.yaml' => <<-YAML.unindent,
369
+ a:
370
+ aa:
371
+ aaa: a.aa.aaa
372
+ b:
373
+ ba:
374
+ baa: b.ba.baa
375
+ bb:
376
+ bba: b.bb.bba
377
+ c:
378
+ ca:
379
+ caa: c.ca.caa
380
+ mod::hash_a:
381
+ aa:
382
+ aab: aab (from environment)
383
+ ab:
384
+ aba: aba (from environment)
385
+ abb: abb (from environment)
386
+ mod::hash_b:
387
+ ba:
388
+ bab: bab (from environment)
389
+ bc:
390
+ bca: bca (from environment)
391
+ lookup_options:
392
+ b:
393
+ merge: hash
394
+ '^[^b]$':
395
+ merge: deep
396
+ '^c':
397
+ merge: first
398
+ '^b':
399
+ merge: first
400
+ '^mod::ha.*_b':
401
+ merge: hash
402
+ YAML
403
+ 'second.yaml' => <<-YAML.unindent,
404
+ a:
405
+ aa:
406
+ aab: a.aa.aab
407
+ b:
408
+ ba:
409
+ bab: b.ba.bab
410
+ bb:
411
+ bbb: b.bb.bbb
412
+ c:
413
+ ca:
414
+ cab: c.ca.cab
415
+ YAML
416
+ },
417
+ 'modules' => {
418
+ 'mod' => mod_base
419
+ }
420
+ }
421
+ }
422
+ end
423
+
424
+ it 'finds lookup_options that matches a pattern' do
425
+ expect(lookup('a')).to eql({'aa' => { 'aaa' => 'a.aa.aaa', 'aab' => 'a.aa.aab' }})
426
+ end
427
+
428
+ it 'gives a direct key match higher priority than a matching pattern' do
429
+ expect(lookup('b')).to eql({'ba' => { 'baa' => 'b.ba.baa' }, 'bb' => { 'bba'=>'b.bb.bba' }})
430
+ end
431
+
432
+ it 'uses the first matching pattern' do
433
+ expect(lookup('c')).to eql({'ca' => { 'caa' => 'c.ca.caa', 'cab' => 'c.ca.cab' }})
434
+ end
435
+
436
+ it 'uses lookup_option found by pattern from module' do
437
+ expect(lookup('mod::hash_a')).to eql({
438
+ 'aa' => {
439
+ 'aaa' => 'aaa (from module)',
440
+ 'aab' => 'aab (from environment)'
441
+ },
442
+ 'ab' => {
443
+ 'aba' => 'aba (from environment)',
444
+ 'abb' => 'abb (from environment)'
445
+ }
446
+ })
447
+ end
448
+
449
+ it 'merges lookup_options found by pattern in environment and module (environment wins)' do
450
+ expect(lookup('mod::hash_b')).to eql({
451
+ 'ba' => {
452
+ 'bab' => 'bab (from environment)'
453
+ },
454
+ 'bb' => {
455
+ 'bba' => 'bba (from module)'
456
+ },
457
+ 'bc' => {
458
+ 'bca' => 'bca (from environment)'
459
+ }
460
+ })
461
+ end
462
+
463
+ context 'and patterns in module are not limited to module keys' do
464
+ let(:mod_common) {
465
+ <<-YAML.unindent
466
+ mod::hash_a:
467
+ aa:
468
+ aaa: aaa (from module)
469
+ ab:
470
+ aba: aba (from module)
471
+ lookup_options:
472
+ '^.*_a':
473
+ merge: deep
474
+ YAML
475
+ }
476
+
477
+ it 'fails with error' do
478
+ expect { lookup('mod::a') }.to raise_error(Puppet::DataBinding::LookupError, /all lookup_options patterns must match a key starting with module name/)
479
+ end
480
+ end
191
481
  end
192
482
 
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')
483
+ context 'and a global Hiera v4 configuration' do
484
+ let(:code_dir_files) do
485
+ {
486
+ 'hiera.yaml' => <<-YAML.unindent,
487
+ ---
488
+ version: 4
489
+ YAML
490
+ }
491
+ end
492
+
493
+ before(:each) do
494
+ # Need to set here since spec_helper defines these settings in its "before each"
495
+ Puppet.settings[:codedir] = populated_code_dir
496
+ Puppet.settings[:hiera_config] = File.join(code_dir, 'hiera.yaml')
497
+ end
498
+
499
+ it 'raises an error' do
500
+ expect { lookup('a') }.to raise_error(Puppet::Error, /hiera configuration version 4 cannot be used in the global layer/)
501
+ end
197
502
  end
198
503
 
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')
504
+ context 'and an environment Hiera v3 configuration' do
505
+ let(:environment_files) do
506
+ {
507
+ env_name => {
508
+ 'hiera.yaml' => <<-YAML.unindent,
509
+ ---
510
+ :backends: yaml
511
+ YAML
512
+ }
513
+ }
514
+ end
515
+
516
+ it 'raises an error' do
517
+ expect { lookup('a') }.to raise_error(Puppet::Error, /hiera configuration version 3 cannot be used in an environment/)
518
+ end
203
519
  end
204
520
 
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')
521
+ context 'and a global empty Hiera configuration' do
522
+ let(:hiera_yaml_path) { File.join(code_dir, 'hiera.yaml') }
523
+ let(:code_dir_files) do
524
+ {
525
+ 'hiera.yaml' => '',
526
+ }
209
527
  end
210
528
 
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')
529
+ let(:environment_files) do
530
+ {
531
+ env_name => {
532
+ 'hieradata' => {
533
+ 'common.yaml' => <<-YAML.unindent,
534
+ x: value x (from environment)
535
+ YAML
536
+ }
537
+ }
538
+ }
214
539
  end
215
540
 
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')
541
+ before(:each) do
542
+ # Need to set here since spec_helper defines these settings in its "before each"
543
+ Puppet.settings[:hiera_config] = hiera_yaml_path
219
544
  end
220
545
 
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')
546
+ it 'uses a Hiera version 3 defaults' do
547
+ expect(lookup('x')).to eql('value x (from environment)')
224
548
  end
225
549
 
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/)
550
+ context 'obtained using /dev/null', :unless => Puppet.features.microsoft_windows? do
551
+ let(:code_dir_files) { {} }
552
+
553
+ it 'uses a Hiera version 3 defaults' do
554
+ Puppet[:hiera_config] = '/dev/null'
555
+ expect(lookup('x')).to eql('value x (from environment)')
556
+ end
230
557
  end
231
558
  end
232
559
 
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')
560
+ context 'and a global configuration' do
561
+ let(:hiera_yaml) do
562
+ <<-YAML.unindent
563
+ ---
564
+ :backends:
565
+ - yaml
566
+ - json
567
+ - custom
568
+ - hocon
569
+ :yaml:
570
+ :datadir: #{code_dir}/hieradata
571
+ :json:
572
+ :datadir: #{code_dir}/hieradata
573
+ :hocon:
574
+ :datadir: #{code_dir}/hieradata
575
+ :hierarchy:
576
+ - common
577
+ - "%{domain}"
578
+ :merge_behavior: deeper
579
+ YAML
237
580
  end
238
581
 
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')
582
+ let(:code_dir_files) do
583
+ {
584
+ 'hiera.yaml' => hiera_yaml,
585
+ 'ruby_stuff' => {
586
+ 'hiera' => {
587
+ 'backend' => {
588
+ 'custom_backend.rb' => <<-RUBY.unindent,
589
+ class Hiera::Backend::Custom_backend
590
+ def lookup(key, scope, order_override, resolution_type, context)
591
+ case key
592
+ when 'hash_c'
593
+ { 'hash_ca' => { 'cad' => 'value hash_c.hash_ca.cad (from global custom)' }}
594
+ when 'datasources'
595
+ Hiera::Backend.datasources(scope, order_override) { |source| source }
596
+ else
597
+ throw :no_such_key
598
+ end
599
+ end
600
+ end
601
+ RUBY
602
+ 'other_backend.rb' => <<-RUBY.unindent,
603
+ class Hiera::Backend::Other_backend
604
+ def lookup(key, scope, order_override, resolution_type, context)
605
+ value = Hiera::Config[:other][key.to_sym]
606
+ throw :no_such_key if value.nil?
607
+ value
608
+ end
609
+ end
610
+ RUBY
611
+ }
612
+ }
613
+ },
614
+ 'hieradata' => {
615
+ 'common.yaml' => <<-YAML.unindent,
616
+ a: value a (from global)
617
+ hash_b:
618
+ hash_ba:
619
+ bab: value hash_b.hash_ba.bab (from global)
620
+ hash_c:
621
+ hash_ca:
622
+ cab: value hash_c.hash_ca.cab (from global)
623
+ YAML
624
+ 'example.com.yaml' => <<-YAML.unindent,
625
+ x: value x (from global example.com.yaml)
626
+ YAML
627
+ 'common.json' => <<-JSON.unindent,
628
+ {
629
+ "hash_b": {
630
+ "hash_ba": {
631
+ "bac": "value hash_b.hash_ba.bac (from global json)"
632
+ }
633
+ },
634
+ "hash_c": {
635
+ "hash_ca": {
636
+ "cac": "value hash_c.hash_ca.cac (from global json)"
637
+ }
638
+ }
639
+ }
640
+ JSON
641
+ 'common.conf' => <<-HOCON.unindent,
642
+ // The 'xs' is a value used for testing
643
+ xs = { subkey = value xs.subkey (from global hocon) }
644
+ HOCON
645
+ }
646
+ }
242
647
  end
243
648
 
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')
649
+ before(:each) do
650
+ # Need to set here since spec_helper defines these settings in its "before each"
651
+ Puppet.settings[:codedir] = populated_code_dir
652
+ Puppet.settings[:hiera_config] = File.join(code_dir, 'hiera.yaml')
247
653
  end
248
654
 
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')
655
+ around(:each) do |example|
656
+ # Faking the load path to enable 'require' to load from 'ruby_stuff'. It removes the need for a static fixture
657
+ # for the custom backend
658
+ $LOAD_PATH.unshift(File.join(code_dir, 'ruby_stuff'))
659
+ begin
660
+ Puppet.override(:environments => environments, :current_environment => env) do
661
+ example.run
662
+ end
663
+ ensure
664
+ Hiera::Backend.send(:remove_const, :Custom_backend) if Hiera::Backend.const_defined?(:Custom_backend)
665
+ Hiera::Backend.send(:remove_const, :Other_backend) if Hiera::Backend.const_defined?(:Other_backend)
666
+ $LOAD_PATH.shift
667
+ end
252
668
  end
253
669
 
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')
257
- end
670
+ context 'version 3' do
671
+ it 'finds data in the environment and reports deprecation warnings for both environment.conf and hiera.yaml' do
672
+ expect(lookup('a')).to eql('value a (from global)')
673
+ expect(warnings).to include(/Use of 'hiera.yaml' version 3 is deprecated. It should be converted to version 5/)
674
+ end
675
+
676
+ it 'explain contains output from global layer' do
677
+ explanation = explain('a')
678
+ expect(explanation).to include('Global Data Provider (hiera configuration version 3)')
679
+ expect(explanation).to include('Hierarchy entry "yaml"')
680
+ expect(explanation).to include('Hierarchy entry "json"')
681
+ expect(explanation).to include('Found key: "a" value: "value a (from global)"')
682
+ end
258
683
 
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/)
684
+ it 'uses the merge behavior specified in global hiera.yaml to merge only global backends' do
685
+ expect(lookup('hash_b')).to eql(
686
+ { 'hash_ba' => { 'bab' => 'value hash_b.hash_ba.bab (from global)', 'bac' => 'value hash_b.hash_ba.bac (from global json)' } })
687
+ end
688
+
689
+ it 'uses the merge from lookup options to merge all layers and override merge_behavior specified in global hiera.yaml' do
690
+ expect(lookup('hash_c')).to eql(
691
+ { 'hash_ca' => { 'cab' => 'value hash_c.hash_ca.cab (from global)' } })
692
+ end
693
+
694
+ it 'uses the explicitly given merge to override lookup options and to merge all layers' do
695
+ expect(lookup('hash_c', 'merge' => 'deep')).to eql(
696
+ {
697
+ 'hash_ca' =>
698
+ {
699
+ 'caa' => 'value hash_c.hash_ca.caa (from environment)',
700
+ 'cab' => 'value hash_c.hash_ca.cab (from global)',
701
+ 'cac' => 'value hash_c.hash_ca.cac (from global json)',
702
+ 'cad' => 'value hash_c.hash_ca.cad (from global custom)'
703
+ }
704
+ })
705
+ end
706
+
707
+ it 'paths are interpolated' do
708
+ expect(lookup('x')).to eql('value x (from global example.com.yaml)')
709
+ end
710
+
711
+ it 'backend data sources are propagated to custom backend' do
712
+ expect(lookup('datasources')).to eql(['common', 'example.com'])
713
+ end
714
+
715
+ it 'delegates configured hocon backend to hocon_data function' do
716
+ expect(explain('xs')).to match(/Hierarchy entry "hocon"\n.*\n.*\n.*"common"\n\s*Found key: "xs"/m)
717
+ end
718
+
719
+ it 'can dig down into subkeys provided by hocon_data function' do
720
+ expect(lookup('xs.subkey')).to eql('value xs.subkey (from global hocon)')
721
+ end
722
+
723
+ context 'using deep_merge_options supported by deep_merge gem but not supported by Puppet' do
724
+
725
+ let(:hiera_yaml) do
726
+ <<-YAML.unindent
727
+ ---
728
+ :backends:
729
+ - yaml
730
+ :yaml:
731
+ :datadir: #{code_dir}/hieradata
732
+ :hierarchy:
733
+ - other
734
+ - common
735
+ :merge_behavior: deeper
736
+ :deep_merge_options:
737
+ :unpack_arrays: ','
738
+ YAML
739
+ end
740
+
741
+ let(:code_dir_files) do
742
+ {
743
+ 'hiera.yaml' => hiera_yaml,
744
+ 'hieradata' => {
745
+ 'common.yaml' => <<-YAML.unindent,
746
+ a:
747
+ - x1,x2
748
+ YAML
749
+ 'other.yaml' => <<-YAML.unindent,
750
+ a:
751
+ - x3
752
+ - x4
753
+ YAML
754
+ }
755
+ }
756
+ end
757
+
758
+ it 'honors option :unpack_arrays: (unsupported by puppet)' do
759
+ expect(lookup('a')).to eql(%w(x1 x2 x3 x4))
760
+ end
761
+ end
762
+
763
+ context 'using relative datadir paths' do
764
+ let(:hiera_yaml) do
765
+ <<-YAML.unindent
766
+ ---
767
+ :backends:
768
+ - yaml
769
+ :yaml:
770
+ :datadir: relative_data
771
+ :hierarchy:
772
+ - common
773
+ YAML
774
+ end
775
+
776
+ let(:populated_code_dir) do
777
+ dir_contained_in(code_dir, code_dir_files.merge({
778
+ 'fake_cwd' => {
779
+ 'relative_data' => {
780
+ 'common.yaml' => <<-YAML.unindent
781
+ a: value a (from fake_cwd/relative_data/common.yaml)
782
+ YAML
783
+ }
784
+ }
785
+ }))
786
+ code_dir
787
+ end
788
+
789
+ around(:each) do |example|
790
+ cwd = Dir.pwd
791
+ Dir.chdir(File.join(code_dir, 'fake_cwd'))
792
+ begin
793
+ example.run
794
+ ensure
795
+ Dir.chdir(cwd)
796
+ end
797
+ end
798
+
799
+ it 'finds data from data file beneath relative datadir' do
800
+ expect(lookup('a')).to eql('value a (from fake_cwd/relative_data/common.yaml)')
801
+ end
802
+ end
263
803
  end
264
804
 
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')
805
+ context 'version 5' do
806
+ let(:hiera_yaml) do
807
+ <<-YAML.unindent
808
+ ---
809
+ version: 5
810
+ defaults:
811
+ datadir: hieradata
812
+
813
+ hierarchy:
814
+ - name: Yaml
815
+ data_hash: yaml_data
816
+ paths:
817
+ - common.yaml
818
+ - "%{domain}.yaml"
819
+ - name: Json
820
+ data_hash: json_data
821
+ paths:
822
+ - common.json
823
+ - "%{domain}.json"
824
+ - name: Hocon
825
+ data_hash: hocon_data
826
+ paths:
827
+ - common.conf
828
+ - "%{domain}.conf"
829
+ - name: Custom
830
+ hiera3_backend: custom
831
+ paths:
832
+ - common.custom
833
+ - "%{domain}.custom"
834
+ - name: Other
835
+ hiera3_backend: other
836
+ options:
837
+ other_option: value of other_option
838
+ paths:
839
+ - common.other
840
+ - "%{domain}.other"
841
+ YAML
842
+ end
843
+
844
+ it 'finds data in the environment and reports no deprecation warnings' do
845
+ expect(lookup('a')).to eql('value a (from global)')
846
+ expect(warnings).to be_empty
847
+ end
848
+
849
+ it 'explain contains output from global layer' do
850
+ explanation = explain('a')
851
+ expect(explanation).to include('Global Data Provider (hiera configuration version 5)')
852
+ expect(explanation).to include('Hierarchy entry "Yaml"')
853
+ expect(explanation).to include('Hierarchy entry "Json"')
854
+ expect(explanation).to include('Hierarchy entry "Hocon"')
855
+ expect(explanation).to include('Hierarchy entry "Custom"')
856
+ expect(explanation).to include('Found key: "a" value: "value a (from global)"')
857
+ end
858
+
859
+ it 'uses the explicitly given merge to override lookup options and to merge all layers' do
860
+ expect(lookup('hash_c', 'merge' => 'deep')).to eql(
861
+ {
862
+ 'hash_ca' =>
863
+ {
864
+ 'caa' => 'value hash_c.hash_ca.caa (from environment)',
865
+ 'cab' => 'value hash_c.hash_ca.cab (from global)',
866
+ 'cac' => 'value hash_c.hash_ca.cac (from global json)',
867
+ 'cad' => 'value hash_c.hash_ca.cad (from global custom)'
868
+ }
869
+ })
870
+ end
871
+
872
+ it 'backend data sources are propagated to custom backend' do
873
+ expect(lookup('datasources')).to eql(['common', 'example.com'])
874
+ end
875
+
876
+ it 'backend specific options are propagated to custom backend' do
877
+ expect(lookup('other_option')).to eql('value of other_option')
878
+ end
879
+
880
+ it 'multiple hiera3_backend declarations can be used and are merged into the generated config' do
881
+ expect(lookup(['datasources', 'other_option'])).to eql([['common', 'example.com'], 'value of other_option'])
882
+ expect(Hiera::Config.instance_variable_get(:@config)).to eql(
883
+ {
884
+ :backends => ['custom', 'other'],
885
+ :hierarchy => ['common', '%{domain}'],
886
+ :custom => { :datadir => "#{code_dir}/hieradata" },
887
+ :other => { :other_option => 'value of other_option', :datadir=>"#{code_dir}/hieradata" },
888
+ :logger => 'puppet'
889
+ })
890
+ end
891
+
892
+ it 'provides a sensible error message when the hocon library is not loaded' do
893
+ Puppet.features.stubs(:hocon?).returns(false)
894
+
895
+ expect { lookup('a') }.to raise_error do |e|
896
+ expect(e.message).to match(/Lookup using Hocon data_hash function is not supported without hocon library/)
897
+ end
898
+ end
268
899
  end
269
900
 
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')
901
+ context 'with a hiera3_backend that has no paths' do
902
+ let(:hiera_yaml) do
903
+ <<-YAML.unindent
904
+ ---
905
+ version: 5
906
+ hierarchy:
907
+ - name: Custom
908
+ hiera3_backend: custom
909
+ YAML
910
+ end
911
+
912
+ it 'calls the backend' do
913
+ expect(lookup('hash_c')).to eql(
914
+ { 'hash_ca' => { 'cad' => 'value hash_c.hash_ca.cad (from global custom)' }})
915
+ end
273
916
  end
274
917
  end
275
- end
276
918
 
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
919
+ context 'and a module' do
920
+ let(:mod_a_files) { {} }
282
921
 
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
922
+ let(:populated_env_dir) do
923
+ dir_contained_in(env_dir, DeepMerge.deep_merge!(environment_files, env_name => { 'modules' => mod_a_files }))
924
+ env_dir
925
+ end
287
926
 
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
927
+ context 'that has no lookup configured' do
928
+ let(:mod_a_files) do
929
+ {
930
+ 'mod_a' => {
931
+ 'data' => {
932
+ 'common.yaml' => <<-YAML.unindent
933
+ ---
934
+ mod_a::b: value mod_a::b (from mod_a)
935
+ YAML
936
+ }
937
+ }
938
+ }
939
+ end
292
940
 
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
941
+ it 'does not find data in the module' do
942
+ expect { lookup('mod_a::b') }.to raise_error(Puppet::DataBinding::LookupError, /did not find a value for the name 'mod_a::b'/)
943
+ end
297
944
 
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
945
+ context 'with a Hiera v3 configuration' do
946
+ let(:mod_a_files) do
947
+ {
948
+ 'mod_a' => {
949
+ 'hiera.yaml' => <<-YAML.unindent
950
+ ---
951
+ :backends: yaml
952
+ YAML
953
+ }
954
+ }
955
+ end
302
956
 
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')
306
- end
957
+ it 'raises an error' do
958
+ expect { lookup('mod_a::a') }.to raise_error(Puppet::Error, /hiera configuration version 3 cannot be used in a module/)
959
+ end
960
+ end
307
961
 
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')
311
- end
962
+ context "but a metadata.json with 'module_data_provider=hiera'" do
963
+ let(:mod_a_files_1) { DeepMerge.deep_merge!(mod_a_files, 'mod_a' => { 'metadata.json' => <<-JSON.unindent }) }
964
+ {
965
+ "name": "example/mod_a",
966
+ "version": "0.0.2",
967
+ "source": "git@github.com/example/mod_a.git",
968
+ "dependencies": [],
969
+ "author": "Bob the Builder",
970
+ "license": "Apache-2.0",
971
+ "data_provider": "hiera"
972
+ }
973
+ JSON
312
974
 
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'/)
317
- end
975
+ let(:populated_env_dir) do
976
+ dir_contained_in(env_dir, DeepMerge.deep_merge!(environment_files, env_name => { 'modules' => mod_a_files_1 }))
977
+ env_dir
978
+ end
318
979
 
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')
322
- end
323
- end
980
+ it 'finds data in the module and reports deprecation warning for metadata.json' do
981
+ expect(lookup('mod_a::b')).to eql('value mod_a::b (from mod_a)')
982
+ expect(warnings).to include(/Defining "data_provider": "hiera" in metadata.json is deprecated. A 'hiera.yaml' file should be used instead/)
983
+ end
324
984
 
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/)
331
- end
985
+ context 'and a hiera.yaml file' do
986
+ let(:mod_a_files_2) { DeepMerge.deep_merge!(mod_a_files_1, 'mod_a' => { 'hiera.yaml' => <<-YAML.unindent }) }
987
+ ---
988
+ version: 4
989
+ hierarchy:
990
+ - name: common
991
+ backend: yaml
992
+ YAML
332
993
 
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')
342
- end
994
+ let(:populated_env_dir) do
995
+ dir_contained_in(env_dir, DeepMerge.deep_merge!(environment_files, env_name => { 'modules' => mod_a_files_2 }))
996
+ env_dir
997
+ end
343
998
 
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
353
- end
354
- end
999
+ it 'finds data in the module and reports deprecation warnings for both metadata.json and hiera.yaml' do
1000
+ expect(lookup('mod_a::b')).to eql('value mod_a::b (from mod_a)')
1001
+ expect(warnings).to include(/Defining "data_provider": "hiera" in metadata.json is deprecated/)
1002
+ expect(warnings).to include(/Use of 'hiera.yaml' version 4 is deprecated. It should be converted to version 5/)
1003
+ end
1004
+ end
1005
+ end
1006
+ end
1007
+
1008
+ context 'using a data_hash that reads a yaml file' do
1009
+ let(:mod_a_files) do
1010
+ {
1011
+ 'mod_a' => {
1012
+ 'data' => {
1013
+ 'common.yaml' => <<-YAML.unindent
1014
+ ---
1015
+ mod_a::a: value mod_a::a (from mod_a)
1016
+ mod_a::b: value mod_a::b (from mod_a)
1017
+ mod_a::xo: value mod_a::xo (from mod_a)
1018
+ mod_a::xd_found: value mod_a::xd_found (from mod_a)
1019
+ mod_a::interpolate_xo: "-- %{lookup('mod_a::xo')} --"
1020
+ mod_a::interpolate_xd: "-- %{lookup('mod_a::xd')} --"
1021
+ mod_a::interpolate_scope_xo: "-- %{scope_xo} --"
1022
+ mod_a::interpolate_scope_xd: "-- %{scope_xd} --"
1023
+ mod_a::hash_a:
1024
+ a: value mod_a::hash_a.a (from mod_a)
1025
+ b: value mod_a::hash_a.b (from mod_a)
1026
+ mod_a::hash_b:
1027
+ a: value mod_a::hash_b.a (from mod_a)
1028
+ b: value mod_a::hash_b.b (from mod_a)
1029
+ mod_a::interpolated: "-- %{lookup('mod_a::a')} --"
1030
+ mod_a::a_a: "-- %{lookup('mod_a::hash_a.a')} --"
1031
+ mod_a::a_b: "-- %{lookup('mod_a::hash_a.b')} --"
1032
+ mod_a::b_a: "-- %{lookup('mod_a::hash_b.a')} --"
1033
+ mod_a::b_b: "-- %{lookup('mod_a::hash_b.b')} --"
1034
+ mod_a::interpolate_array:
1035
+ - "-- %{lookup('mod_a::a')} --"
1036
+ - "-- %{lookup('mod_a::b')} --"
1037
+ mod_a::interpolate_literal: "-- %{literal('hello')} --"
1038
+ mod_a::interpolate_scope: "-- %{scope_scalar} --"
1039
+ mod_a::interpolate_scope_not_found: "-- %{scope_nope} --"
1040
+ mod_a::interpolate_scope_dig: "-- %{scope_hash.a} --"
1041
+ mod_a::interpolate_scope_dig_not_found: "-- %{scope_hash.nope} --"
1042
+ mod_a::quoted_interpolation: '-- %{lookup(''"mod_a::a.quoted.key"'')} --'
1043
+ "mod_a::a.quoted.key": "value mod_a::a.quoted.key (from mod_a)"
1044
+ YAML
1045
+ },
1046
+ 'hiera.yaml' => <<-YAML.unindent,
1047
+ ---
1048
+ version: 5
1049
+ hierarchy:
1050
+ - name: "Common"
1051
+ data_hash: yaml_data
1052
+ path: "common.yaml"
1053
+ YAML
1054
+ }
1055
+ }
1056
+ end
1057
+
1058
+ it 'finds data in the module' do
1059
+ expect(lookup('mod_a::b')).to eql('value mod_a::b (from mod_a)')
1060
+ end
1061
+
1062
+ it 'environment data has higher priority than module data' do
1063
+ expect(lookup('mod_a::a')).to eql('value mod_a::a (from environment)')
1064
+ end
1065
+
1066
+ it 'environment data has higher priority than module data in interpolated module data' do
1067
+ expect(lookup('mod_a::interpolated')).to eql('-- value mod_a::a (from environment) --')
1068
+ end
1069
+
1070
+ it 'overrides have higher priority than found data' do
1071
+ expect(lookup('mod_a::xo', { 'override' => overrides })).to eql('value mod_a::xo (from override)')
1072
+ end
1073
+
1074
+ it 'overrides have higher priority than found data in lookup interpolations' do
1075
+ expect(lookup('mod_a::interpolate_xo', { 'override' => overrides })).to eql('-- value mod_a::xo (from override) --')
1076
+ end
1077
+
1078
+ it 'overrides have higher priority than found data in scope interpolations' do
1079
+ expect(lookup('mod_a::interpolate_scope_xo', { 'override' => overrides })).to eql('-- value scope_xo (from override) --')
1080
+ end
1081
+
1082
+ it 'defaults have lower priority than found data' do
1083
+ expect(lookup('mod_a::xd_found', { 'default_values_hash' => defaults })).to eql('value mod_a::xd_found (from mod_a)')
1084
+ end
1085
+
1086
+ it 'defaults are used when data is not found' do
1087
+ expect(lookup('mod_a::xd', { 'default_values_hash' => defaults })).to eql('value mod_a::xd (from default)')
1088
+ end
1089
+
1090
+ it 'defaults are used when data is not found in lookup interpolations' do
1091
+ expect(lookup('mod_a::interpolate_xd', { 'default_values_hash' => defaults })).to eql('-- value mod_a::xd (from default) --')
1092
+ end
1093
+
1094
+ it 'defaults are used when data is not found in scope interpolations' do
1095
+ expect(lookup('mod_a::interpolate_scope_xd', { 'default_values_hash' => defaults })).to eql('-- value scope_xd (from default) --')
1096
+ end
1097
+
1098
+ it 'merges hashes from environment and module unless strategy hash is used' do
1099
+ expect(lookup('mod_a::hash_a')).to eql({'a' => 'value mod_a::hash_a.a (from environment)'})
1100
+ end
1101
+
1102
+ it 'merges hashes from environment and module when merge strategy hash is used' do
1103
+ expect(lookup('mod_a::hash_a', :merge => 'hash')).to eql(
1104
+ {'a' => 'value mod_a::hash_a.a (from environment)', 'b' => 'value mod_a::hash_a.b (from mod_a)'})
1105
+ end
1106
+
1107
+ it 'will not merge hashes from environment and module in interpolated expressions' do
1108
+ expect(lookup(['mod_a::a_a', 'mod_a::a_b'])).to eql(
1109
+ ['-- value mod_a::hash_a.a (from environment) --', '-- --']) # root key found in environment, no hash merge is performed
1110
+ end
1111
+
1112
+ it 'interpolates arrays' do
1113
+ expect(lookup('mod_a::interpolate_array')).to eql(['-- value mod_a::a (from environment) --', '-- value mod_a::b (from mod_a) --'])
1114
+ end
1115
+
1116
+ it 'can dig into arrays using subkeys' do
1117
+ expect(lookup('mod_a::interpolate_array.1')).to eql('-- value mod_a::b (from mod_a) --')
1118
+ end
1119
+
1120
+ it 'treats an out of range subkey as not found' do
1121
+ expect(explain('mod_a::interpolate_array.2')).to match(/No such key: "2"/)
1122
+ end
355
1123
 
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/)
1124
+ it 'interpolates a literal' do
1125
+ expect(lookup('mod_a::interpolate_literal')).to eql('-- hello --')
1126
+ end
1127
+
1128
+ it 'interpolates scalar from scope' do
1129
+ expect(lookup('mod_a::interpolate_scope')).to eql('-- scope scalar value --')
1130
+ end
1131
+
1132
+ it 'interpolates not found in scope as empty string' do
1133
+ expect(lookup('mod_a::interpolate_scope_not_found')).to eql('-- --')
1134
+ end
1135
+
1136
+ it 'interpolates dotted key from scope' do
1137
+ expect(lookup('mod_a::interpolate_scope_dig')).to eql('-- scope hash a --')
1138
+ end
1139
+
1140
+ it 'treates interpolated dotted key but not found in scope as empty string' do
1141
+ expect(lookup('mod_a::interpolate_scope_dig_not_found')).to eql('-- --')
1142
+ end
1143
+
1144
+ it 'can use quoted keys in interpolation' do
1145
+ 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
1146
+ end
1147
+
1148
+ it 'merges hashes from environment and module in interpolated expressions if hash merge is specified in lookup options' do
1149
+ expect(lookup(['mod_a::b_a', 'mod_a::b_b'])).to eql(
1150
+ ['-- value mod_a::hash_b.a (from environment) --', '-- value mod_a::hash_b.b (from mod_a) --'])
1151
+ end
1152
+ end
1153
+
1154
+ context 'using a lookup_key that uses a path' do
1155
+ let(:mod_a_files) do
1156
+ {
1157
+ 'mod_a' => {
1158
+ 'functions' => {
1159
+ 'pp_lookup_key.pp' => <<-PUPPET.unindent
1160
+ function mod_a::pp_lookup_key($key, $options, $context) {
1161
+ if !$context.cache_has_key(undef) {
1162
+ $context.cache_all(yaml_data($options, $context))
1163
+ $context.cache(undef, true)
1164
+ }
1165
+ if $context.cache_has_key($key) { $context.cached_value($key) } else { $context.not_found }
1166
+ }
1167
+ PUPPET
1168
+ },
1169
+ 'hiera.yaml' => <<-YAML.unindent,
1170
+ ---
1171
+ version: 5
1172
+ hierarchy:
1173
+ - name: "Common"
1174
+ lookup_key: mod_a::pp_lookup_key
1175
+ path: common.yaml
1176
+ YAML
1177
+ 'data' => {
1178
+ 'common.yaml' => <<-YAML.unindent
1179
+ mod_a::b: value mod_a::b (from mod_a)
1180
+ YAML
1181
+ }
1182
+ }
1183
+ }
1184
+ end
1185
+
1186
+ it 'finds data in the module' do
1187
+ expect(lookup('mod_a::b')).to eql('value mod_a::b (from mod_a)')
1188
+ end
1189
+ end
1190
+
1191
+ context 'using a lookup_key that is a puppet function' do
1192
+ let(:mod_a_files) do
1193
+ {
1194
+ 'mod_a' => {
1195
+ 'functions' => {
1196
+ 'pp_lookup_key.pp' => <<-PUPPET.unindent
1197
+ function mod_a::pp_lookup_key($key, $options, $context) {
1198
+ case $key {
1199
+ 'mod_a::really_interpolated': { $context.interpolate("-- %{lookup('mod_a::a')} --") }
1200
+ 'mod_a::recursive': { lookup($key) }
1201
+ default: {
1202
+ if $context.cache_has_key(mod_a::a) {
1203
+ $context.explain || { 'reusing cache' }
1204
+ } else {
1205
+ $context.explain || { 'initializing cache' }
1206
+ $context.cache_all({
1207
+ mod_a::a => 'value mod_a::a (from mod_a)',
1208
+ mod_a::b => 'value mod_a::b (from mod_a)',
1209
+ mod_a::c => 'value mod_a::c (from mod_a)',
1210
+ mod_a::hash_a => {
1211
+ a => 'value mod_a::hash_a.a (from mod_a)',
1212
+ b => 'value mod_a::hash_a.b (from mod_a)'
1213
+ },
1214
+ mod_a::hash_b => {
1215
+ a => 'value mod_a::hash_b.a (from mod_a)',
1216
+ b => 'value mod_a::hash_b.b (from mod_a)'
1217
+ },
1218
+ mod_a::interpolated => "-- %{lookup('mod_a::a')} --",
1219
+ mod_a::a_a => "-- %{lookup('mod_a::hash_a.a')} --",
1220
+ mod_a::a_b => "-- %{lookup('mod_a::hash_a.b')} --",
1221
+ mod_a::b_a => "-- %{lookup('mod_a::hash_b.a')} --",
1222
+ mod_a::b_b => "-- %{lookup('mod_a::hash_b.b')} --",
1223
+ 'mod_a::a.quoted.key' => 'value mod_a::a.quoted.key (from mod_a)',
1224
+ mod_a::sensitive => Sensitive('reduct me please'),
1225
+ mod_a::type => Object[{name => 'FindMe', 'attributes' => {'x' => String}}],
1226
+ mod_a::version => SemVer('3.4.1'),
1227
+ mod_a::version_range => SemVerRange('>=3.4.1'),
1228
+ mod_a::timestamp => Timestamp("1994-03-25T19:30:00"),
1229
+ mod_a::timespan => Timespan("3-10:00:00")
1230
+ })
1231
+ }
1232
+ if !$context.cache_has_key($key) {
1233
+ $context.not_found
1234
+ }
1235
+ $context.explain || { "returning value for $key" }
1236
+ $context.cached_value($key)
1237
+ }
1238
+ }
1239
+ }
1240
+ PUPPET
1241
+ },
1242
+ 'hiera.yaml' => <<-YAML.unindent,
1243
+ ---
1244
+ version: 5
1245
+ hierarchy:
1246
+ - name: "Common"
1247
+ lookup_key: mod_a::pp_lookup_key
1248
+ YAML
1249
+ }
1250
+ }
1251
+ end
1252
+
1253
+ it 'finds data in the module' do
1254
+ expect(lookup('mod_a::b')).to eql('value mod_a::b (from mod_a)')
1255
+ end
1256
+
1257
+ it 'environment data has higher priority than module data' do
1258
+ expect(lookup('mod_a::a')).to eql('value mod_a::a (from environment)')
1259
+ end
1260
+
1261
+ it 'finds quoted keys in the module' do
1262
+ expect(lookup('"mod_a::a.quoted.key"')).to eql('value mod_a::a.quoted.key (from mod_a)')
1263
+ end
1264
+
1265
+ it 'will not resolve interpolated expressions' do
1266
+ expect(lookup('mod_a::interpolated')).to eql("-- %{lookup('mod_a::a')} --")
1267
+ end
1268
+
1269
+ it 'resolves interpolated expressions using Context#interpolate' do
1270
+ expect(lookup('mod_a::really_interpolated')).to eql("-- value mod_a::a (from environment) --")
1271
+ end
1272
+
1273
+ it 'will not merge hashes from environment and module unless strategy hash is used' do
1274
+ expect(lookup('mod_a::hash_a')).to eql({ 'a' => 'value mod_a::hash_a.a (from environment)' })
1275
+ end
1276
+
1277
+ it 'merges hashes from environment and module when merge strategy hash is used' do
1278
+ 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)' })
1279
+ end
1280
+
1281
+ it 'traps recursive lookup trapped' do
1282
+ expect(explain('mod_a::recursive')).to include('Recursive lookup detected')
1283
+ end
1284
+
1285
+ it 'private cache is persisted over multiple calls' do
1286
+ collect_notices("notice(lookup('mod_a::b')) notice(lookup('mod_a::c'))", true)
1287
+ expect(notices).to eql(['value mod_a::b (from mod_a)', 'value mod_a::c (from mod_a)'])
1288
+ expect(explanation).to match(/initializing cache.*reusing cache/m)
1289
+ expect(explanation).not_to match(/initializing cache.*initializing cache/m)
1290
+ end
1291
+
1292
+ it 'the same key is requested only once' do
1293
+ collect_notices("notice(lookup('mod_a::b')) notice(lookup('mod_a::b'))", true)
1294
+ expect(notices).to eql(['value mod_a::b (from mod_a)', 'value mod_a::b (from mod_a)'])
1295
+ expect(explanation).to match(/Found key: "mod_a::b".*Found key: "mod_a::b"/m)
1296
+ expect(explanation).to match(/returning value for mod_a::b/m)
1297
+ expect(explanation).not_to match(/returning value for mod_a::b.*returning value for mod_a::b/m)
1298
+ end
1299
+
1300
+ context 'and calling function via API' do
1301
+ it 'finds and delivers rich data' do
1302
+ collect_notices("notice('success')") do |scope|
1303
+ expect(lookup_func.call(scope, 'mod_a::sensitive')).to be_a(Puppet::Pops::Types::PSensitiveType::Sensitive)
1304
+ expect(lookup_func.call(scope, 'mod_a::type')).to be_a(Puppet::Pops::Types::PObjectType)
1305
+ expect(lookup_func.call(scope, 'mod_a::version')).to eql(SemanticPuppet::Version.parse('3.4.1'))
1306
+ expect(lookup_func.call(scope, 'mod_a::version_range')).to eql(SemanticPuppet::VersionRange.parse('>=3.4.1'))
1307
+ expect(lookup_func.call(scope, 'mod_a::timestamp')).to eql(Puppet::Pops::Time::Timestamp.parse('1994-03-25T19:30:00'))
1308
+ expect(lookup_func.call(scope, 'mod_a::timespan')).to eql(Puppet::Pops::Time::Timespan.parse('3-10:00:00'))
1309
+ end
1310
+ expect(notices).to eql(['success'])
1311
+ end
1312
+ end
1313
+ end
1314
+
1315
+ context 'using a data_dig that is a ruby function' do
1316
+ let(:mod_a_files) do
1317
+ {
1318
+ 'mod_a' => {
1319
+ 'lib' => {
1320
+ 'puppet' => {
1321
+ 'functions' => {
1322
+ 'mod_a' => {
1323
+ 'ruby_dig.rb' => <<-RUBY.unindent
1324
+ Puppet::Functions.create_function(:'mod_a::ruby_dig') do
1325
+ dispatch :ruby_dig do
1326
+ param 'Array[String[1]]', :segments
1327
+ param 'Hash[String,Any]', :options
1328
+ param 'Puppet::LookupContext', :context
1329
+ end
1330
+
1331
+ def ruby_dig(segments, options, context)
1332
+ sub_segments = segments.dup
1333
+ root_key = sub_segments.shift
1334
+ case root_key
1335
+ when 'mod_a::options'
1336
+ hash = { 'mod_a::options' => options }
1337
+ when 'mod_a::lookup'
1338
+ return call_function('lookup', segments.join('.'))
1339
+ else
1340
+ hash = {
1341
+ 'mod_a::a' => 'value mod_a::a (from mod_a)',
1342
+ 'mod_a::b' => 'value mod_a::b (from mod_a)',
1343
+ 'mod_a::hash_a' => {
1344
+ 'a' => 'value mod_a::hash_a.a (from mod_a)',
1345
+ 'b' => 'value mod_a::hash_a.b (from mod_a)'
1346
+ },
1347
+ 'mod_a::hash_b' => {
1348
+ 'a' => 'value mod_a::hash_b.a (from mod_a)',
1349
+ 'b' => 'value mod_a::hash_b.b (from mod_a)'
1350
+ },
1351
+ 'mod_a::interpolated' => "-- %{lookup('mod_a::a')} --",
1352
+ 'mod_a::really_interpolated' => "-- %{lookup('mod_a::a')} --",
1353
+ 'mod_a::a_a' => "-- %{lookup('mod_a::hash_a.a')} --",
1354
+ 'mod_a::a_b' => "-- %{lookup('mod_a::hash_a.b')} --",
1355
+ 'mod_a::b_a' => "-- %{lookup('mod_a::hash_b.a')} --",
1356
+ 'mod_a::b_b' => "-- %{lookup('mod_a::hash_b.b')} --",
1357
+ 'mod_a::bad_type' => :oops,
1358
+ 'mod_a::bad_type_in_hash' => { 'a' => :oops },
1359
+ }
1360
+ end
1361
+ context.not_found unless hash.include?(root_key)
1362
+ value = sub_segments.reduce(hash[root_key]) do |memo, segment|
1363
+ context.not_found unless memo.is_a?(Hash) && memo.include?(segment)
1364
+ memo[segment]
1365
+ end
1366
+ root_key == 'mod_a::really_interpolated' ? context.interpolate(value) : value
1367
+ end
1368
+ end
1369
+ RUBY
1370
+ }
1371
+ }
1372
+ }
1373
+ },
1374
+ 'hiera.yaml' => <<-YAML.unindent,
1375
+ ---
1376
+ version: 5
1377
+ hierarchy:
1378
+ - name: "Common"
1379
+ data_dig: mod_a::ruby_dig
1380
+ uri: "http://www.example.com/passed/as/option"
1381
+ options:
1382
+ option_a: Option value a
1383
+ option_b:
1384
+ x: Option value b.x
1385
+ y: Option value b.y
1386
+ YAML
1387
+ }
1388
+ }
1389
+ end
1390
+
1391
+ it 'finds data in the module' do
1392
+ expect(lookup('mod_a::b')).to eql('value mod_a::b (from mod_a)')
1393
+ end
1394
+
1395
+ it 'environment data has higher priority than module data' do
1396
+ expect(lookup('mod_a::a')).to eql('value mod_a::a (from environment)')
1397
+ end
1398
+
1399
+ it 'will not resolve interpolated expressions' do
1400
+ expect(lookup('mod_a::interpolated')).to eql("-- %{lookup('mod_a::a')} --")
1401
+ end
1402
+
1403
+ it 'resolves interpolated expressions using Context#interpolate' do
1404
+ expect(lookup('mod_a::really_interpolated')).to eql("-- value mod_a::a (from environment) --")
1405
+ end
1406
+
1407
+ it 'does not accept return of runtime type from function' do
1408
+ expect(explain('mod_a::bad_type')).to include('Value returned from Hierarchy entry "Common" has wrong type')
1409
+ end
1410
+
1411
+ it 'does not accept return of runtime type embedded in hash from function' do
1412
+ expect(explain('mod_a::bad_type_in_hash')).to include('Value returned from Hierarchy entry "Common" has wrong type')
1413
+ end
1414
+
1415
+ it 'will not merge hashes from environment and module unless strategy hash is used' do
1416
+ expect(lookup('mod_a::hash_a')).to eql({'a' => 'value mod_a::hash_a.a (from environment)'})
1417
+ end
1418
+
1419
+ it 'hierarchy entry options are passed to the function' do
1420
+ expect(lookup('mod_a::options.option_b.x')).to eql('Option value b.x')
1421
+ end
1422
+
1423
+ it 'hierarchy entry "uri" is passed as location option to the function' do
1424
+ expect(lookup('mod_a::options.uri')).to eql('http://www.example.com/passed/as/option')
1425
+ end
1426
+
1427
+ it 'recursive lookup is trapped' do
1428
+ expect(explain('mod_a::lookup.mod_a::lookup')).to include('Recursive lookup detected')
1429
+ end
1430
+
1431
+ context 'with merge strategy hash' do
1432
+ it 'merges hashes from environment and module' do
1433
+ 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)'})
1434
+ end
1435
+
1436
+ it 'will "undig" value from data_dig function, merge root hashes, and then dig to get values by subkey' do
1437
+ expect(lookup(['mod_a::hash_a.a', 'mod_a::hash_a.b'], :merge => 'hash')).to eql(
1438
+ ['value mod_a::hash_a.a (from environment)', 'value mod_a::hash_a.b (from mod_a)'])
1439
+ end
1440
+ end
1441
+ end
362
1442
  end
363
1443
  end
364
1444
  end