puppet 4.8.2-universal-darwin → 4.9.0-universal-darwin

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (348) hide show
  1. checksums.yaml +15 -0
  2. data/CONTRIBUTING.md +25 -1
  3. data/Gemfile +6 -0
  4. data/Rakefile +1 -0
  5. data/ext/project_data.yaml +5 -1
  6. data/ext/windows/service/daemon.rb +2 -1
  7. data/install.rb +43 -6
  8. data/lib/hiera/puppet_function.rb +15 -17
  9. data/lib/hiera/scope.rb +12 -14
  10. data/lib/puppet/application/face_base.rb +4 -0
  11. data/lib/puppet/application/lookup.rb +4 -2
  12. data/lib/puppet/application/resource.rb +1 -1
  13. data/lib/puppet/data_providers/data_adapter.rb +6 -0
  14. data/lib/puppet/data_providers/data_function_support.rb +7 -0
  15. data/lib/puppet/data_providers/function_env_data_provider.rb +7 -0
  16. data/lib/puppet/data_providers/function_module_data_provider.rb +6 -0
  17. data/lib/puppet/data_providers/hiera_config.rb +31 -10
  18. data/lib/puppet/data_providers/hiera_env_data_provider.rb +6 -0
  19. data/lib/puppet/data_providers/hiera_interpolate.rb +2 -1
  20. data/lib/puppet/data_providers/hiera_module_data_provider.rb +6 -0
  21. data/lib/puppet/data_providers/hiera_support.rb +6 -0
  22. data/lib/puppet/data_providers/json_data_provider_factory.rb +12 -0
  23. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +12 -0
  24. data/lib/puppet/data_providers.rb +6 -3
  25. data/lib/puppet/defaults.rb +25 -4
  26. data/lib/puppet/face/ca.rb +2 -0
  27. data/lib/puppet/face/certificate_request.rb +2 -0
  28. data/lib/puppet/face/certificate_revocation_list.rb +2 -0
  29. data/lib/puppet/face/file.rb +3 -0
  30. data/lib/puppet/face/help/face.erb +3 -0
  31. data/lib/puppet/face/help.rb +19 -17
  32. data/lib/puppet/face/key.rb +1 -0
  33. data/lib/puppet/face/man.rb +4 -2
  34. data/lib/puppet/face/module/generate.rb +1 -1
  35. data/lib/puppet/face/status.rb +2 -0
  36. data/lib/puppet/feature/base.rb +9 -2
  37. data/lib/puppet/feature/hocon.rb +3 -0
  38. data/lib/puppet/file_system/windows.rb +8 -0
  39. data/lib/puppet/file_system.rb +15 -3
  40. data/lib/puppet/forge/repository.rb +1 -2
  41. data/lib/puppet/forge.rb +6 -6
  42. data/lib/puppet/functions/binary_file.rb +4 -10
  43. data/lib/puppet/functions/hiera_array.rb +1 -1
  44. data/lib/puppet/functions/hiera_include.rb +1 -1
  45. data/lib/puppet/functions/hocon_data.rb +24 -0
  46. data/lib/puppet/functions/json_data.rb +18 -0
  47. data/lib/puppet/functions/yaml_data.rb +21 -0
  48. data/lib/puppet/generate/type.rb +1 -1
  49. data/lib/puppet/graph/simple_graph.rb +4 -2
  50. data/lib/puppet/indirector/file_bucket_file/file.rb +10 -2
  51. data/lib/puppet/indirector/request.rb +5 -1
  52. data/lib/puppet/interface/face_collection.rb +1 -1
  53. data/lib/puppet/interface.rb +14 -2
  54. data/lib/puppet/module.rb +14 -2
  55. data/lib/puppet/module_tool/applications/builder.rb +3 -2
  56. data/lib/puppet/module_tool/applications/installer.rb +14 -14
  57. data/lib/puppet/module_tool/applications/upgrader.rb +13 -13
  58. data/lib/puppet/module_tool/installed_modules.rb +7 -7
  59. data/lib/puppet/module_tool/local_tarball.rb +3 -3
  60. data/lib/puppet/module_tool/metadata.rb +1 -1
  61. data/lib/puppet/module_tool.rb +4 -4
  62. data/lib/puppet/network/http/connection.rb +2 -0
  63. data/lib/puppet/network/http/webrick.rb +2 -1
  64. data/lib/puppet/parser/functions/hiera.rb +14 -0
  65. data/lib/puppet/parser/functions/hiera_array.rb +14 -0
  66. data/lib/puppet/parser/functions/hiera_hash.rb +14 -0
  67. data/lib/puppet/parser/functions/hiera_include.rb +14 -0
  68. data/lib/puppet/parser/scope.rb +14 -20
  69. data/lib/puppet/plugins/data_providers/data_provider.rb +108 -17
  70. data/lib/puppet/plugins/data_providers/registry.rb +2 -36
  71. data/lib/puppet/plugins/data_providers.rb +2 -0
  72. data/lib/puppet/pops/adaptable.rb +0 -3
  73. data/lib/puppet/pops/binder/producers.rb +3 -3
  74. data/lib/puppet/pops/evaluator/access_operator.rb +4 -4
  75. data/lib/puppet/pops/evaluator/closure.rb +1 -1
  76. data/lib/puppet/pops/evaluator/compare_operator.rb +4 -4
  77. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
  78. data/lib/puppet/pops/issues.rb +4 -0
  79. data/lib/puppet/pops/label_provider.rb +14 -0
  80. data/lib/puppet/pops/loader/loader_paths.rb +3 -1
  81. data/lib/puppet/pops/loader/module_loaders.rb +21 -7
  82. data/lib/puppet/pops/loader/typed_name.rb +0 -2
  83. data/lib/puppet/pops/loaders.rb +31 -12
  84. data/lib/puppet/pops/lookup/configured_data_provider.rb +87 -0
  85. data/lib/puppet/pops/lookup/context.rb +121 -71
  86. data/lib/puppet/pops/lookup/data_adapter.rb +27 -0
  87. data/lib/puppet/pops/lookup/data_dig_function_provider.rb +55 -0
  88. data/lib/puppet/pops/lookup/data_hash_function_provider.rb +111 -0
  89. data/lib/puppet/pops/lookup/data_provider.rb +102 -0
  90. data/lib/puppet/pops/lookup/environment_data_provider.rb +27 -0
  91. data/lib/puppet/pops/lookup/explainer.rb +122 -82
  92. data/lib/puppet/pops/lookup/function_provider.rb +82 -0
  93. data/lib/puppet/pops/lookup/global_data_provider.rb +49 -0
  94. data/lib/puppet/pops/lookup/hiera_config.rb +601 -0
  95. data/lib/puppet/pops/lookup/interpolation.rb +56 -35
  96. data/lib/puppet/pops/lookup/invocation.rb +179 -101
  97. data/lib/puppet/pops/lookup/location_resolver.rb +72 -0
  98. data/lib/puppet/pops/lookup/lookup_adapter.rb +451 -0
  99. data/lib/puppet/pops/lookup/lookup_key.rb +99 -0
  100. data/lib/puppet/pops/lookup/lookup_key_function_provider.rb +119 -0
  101. data/lib/puppet/pops/lookup/module_data_provider.rb +58 -0
  102. data/lib/puppet/pops/lookup/sub_lookup.rb +8 -4
  103. data/lib/puppet/pops/lookup.rb +4 -3
  104. data/lib/puppet/pops/merge_strategy.rb +120 -39
  105. data/lib/puppet/pops/parser/egrammar.ra +2 -0
  106. data/lib/puppet/pops/parser/eparser.rb +816 -808
  107. data/lib/puppet/pops/parser/locator.rb +3 -3
  108. data/lib/puppet/pops/parser/slurp_support.rb +4 -3
  109. data/lib/puppet/pops/pcore.rb +21 -12
  110. data/lib/puppet/pops/serialization/abstract_reader.rb +17 -7
  111. data/lib/puppet/pops/serialization/abstract_writer.rb +27 -12
  112. data/lib/puppet/pops/serialization/deserializer.rb +17 -4
  113. data/lib/puppet/pops/serialization/extension.rb +37 -8
  114. data/lib/puppet/pops/serialization/object.rb +14 -6
  115. data/lib/puppet/pops/serialization/rgen.rb +2 -1
  116. data/lib/puppet/pops/serialization/serializer.rb +30 -7
  117. data/lib/puppet/pops/types/implementation_registry.rb +1 -1
  118. data/lib/puppet/pops/types/p_object_type.rb +55 -12
  119. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +27 -27
  120. data/lib/puppet/pops/types/p_sem_ver_type.rb +12 -12
  121. data/lib/puppet/pops/types/p_timespan_type.rb +6 -6
  122. data/lib/puppet/pops/types/p_timestamp_type.rb +2 -2
  123. data/lib/puppet/pops/types/p_type_set_type.rb +7 -16
  124. data/lib/puppet/pops/types/recursion_guard.rb +64 -20
  125. data/lib/puppet/pops/types/ruby_generator.rb +10 -0
  126. data/lib/puppet/pops/types/type_calculator.rb +23 -13
  127. data/lib/puppet/pops/types/type_factory.rb +20 -9
  128. data/lib/puppet/pops/types/type_formatter.rb +37 -17
  129. data/lib/puppet/pops/types/type_mismatch_describer.rb +7 -6
  130. data/lib/puppet/pops/types/type_parser.rb +6 -0
  131. data/lib/puppet/pops/types/types.rb +225 -132
  132. data/lib/puppet/pops/validation/checker4_0.rb +12 -2
  133. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  134. data/lib/puppet/pops/validation.rb +1 -1
  135. data/lib/puppet/pops/visitor.rb +4 -3
  136. data/lib/puppet/pops.rb +6 -9
  137. data/lib/puppet/provider/mcx/mcxcontent.rb +2 -1
  138. data/lib/puppet/provider/nameservice.rb +15 -0
  139. data/lib/puppet/provider/package/appdmg.rb +1 -1
  140. data/lib/puppet/provider/package/dnf.rb +1 -1
  141. data/lib/puppet/provider/package/pkg.rb +1 -1
  142. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  143. data/lib/puppet/provider/package/pkgng.rb +1 -1
  144. data/lib/puppet/provider/package/rpm.rb +2 -2
  145. data/lib/puppet/provider/service/smf.rb +3 -3
  146. data/lib/puppet/provider/service/systemd.rb +5 -1
  147. data/lib/puppet/provider/user/directoryservice.rb +1 -0
  148. data/lib/puppet/provider/user/user_role_add.rb +15 -0
  149. data/lib/puppet/provider/yumrepo/inifile.rb +2 -2
  150. data/lib/puppet/provider/zone/solaris.rb +4 -1
  151. data/lib/puppet/reference/indirection.rb +1 -1
  152. data/lib/puppet/resource/catalog.rb +12 -4
  153. data/lib/puppet/resource/type.rb +3 -3
  154. data/lib/puppet/resource.rb +2 -3
  155. data/lib/puppet/settings/config_file.rb +2 -1
  156. data/lib/puppet/settings/directory_setting.rb +6 -0
  157. data/lib/puppet/settings/environment_conf.rb +6 -2
  158. data/lib/puppet/settings/file_or_directory_setting.rb +6 -0
  159. data/lib/puppet/settings/file_setting.rb +10 -0
  160. data/lib/puppet/settings.rb +1 -1
  161. data/lib/puppet/ssl/certificate_authority.rb +13 -2
  162. data/lib/puppet/ssl/host.rb +23 -1
  163. data/lib/puppet/transaction/additional_resource_generator.rb +7 -0
  164. data/lib/puppet/type/user.rb +16 -3
  165. data/lib/puppet/util/execution.rb +3 -3
  166. data/lib/puppet/util/filetype.rb +11 -5
  167. data/lib/puppet/util/logging.rb +2 -1
  168. data/lib/puppet/util/network_device/config.rb +1 -1
  169. data/lib/puppet/util/plist.rb +6 -0
  170. data/lib/puppet/util/profiler/aggregate.rb +1 -1
  171. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +2 -2
  172. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +2 -1
  173. data/lib/puppet/util/windows/adsi.rb +15 -12
  174. data/lib/puppet/util.rb +1 -0
  175. data/lib/puppet/vendor/load_semantic_puppet.rb +1 -0
  176. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +2 -1
  177. data/lib/puppet/vendor/require_vendored.rb +0 -1
  178. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph.rb +2 -2
  179. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph_node.rb +2 -2
  180. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/module_release.rb +58 -0
  181. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/source.rb +2 -2
  182. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/unsatisfiable_graph.rb +2 -2
  183. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency.rb +7 -7
  184. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/gem_version.rb +3 -0
  185. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/locales/config.yaml +21 -0
  186. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version.rb +48 -21
  187. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version_range.rb +15 -17
  188. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet.rb +17 -0
  189. data/lib/puppet/version.rb +1 -1
  190. data/lib/puppet.rb +52 -0
  191. data/lib/semver.rb +19 -12
  192. data/locales/config.yaml +29 -0
  193. data/locales/puppet.pot +79 -0
  194. data/man/man5/puppet.conf.5 +1 -1
  195. data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/{data.pp → environment/data.pp} +0 -0
  196. data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +2 -0
  197. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +1 -1
  198. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/hiera.yaml +5 -0
  199. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/lib/puppet/bindings/backend/default.rb +9 -0
  200. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/lib/puppet_x/backend/special_data_provider_factory.rb +23 -0
  201. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/manifests/init.pp +5 -0
  202. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/metadata.json +9 -0
  203. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_env_data.rb +1 -0
  204. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/manifests/init.pp +1 -1
  205. data/spec/fixtures/unit/functions/lookup/data/common.yaml +19 -0
  206. data/spec/fixtures/unit/functions/lookup_fixture/data/common.yaml +19 -0
  207. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/environment.conf +0 -0
  208. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/lib/puppet/functions/environment/data.rb +0 -0
  209. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/bindings/abc/default.rb +0 -0
  210. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +0 -0
  211. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/manifests/init.pp +0 -0
  212. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/bindings/bad_data/default.rb +0 -0
  213. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +0 -0
  214. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/manifests/init.pp +0 -0
  215. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/bindings/bca/default.rb +0 -0
  216. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/functions/bca/data.rb +0 -0
  217. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/manifests/init.pp +0 -0
  218. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/data/empty.json +0 -0
  219. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/hiera.yaml +0 -0
  220. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/manifests/init.pp +0 -0
  221. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/metadata.json +0 -0
  222. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/data/empty_key.json +0 -0
  223. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/hiera.yaml +0 -0
  224. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/manifests/init.pp +0 -0
  225. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/metadata.json +0 -0
  226. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/data/empty_key.yaml +0 -0
  227. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/hiera.yaml +0 -0
  228. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/manifests/init.pp +0 -0
  229. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/metadata.json +0 -0
  230. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/data/empty.yaml +0 -0
  231. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/hiera.yaml +0 -0
  232. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/manifests/init.pp +0 -0
  233. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/metadata.json +0 -0
  234. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/data/first.json +0 -0
  235. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/hiera.yaml +0 -0
  236. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/manifests/init.pp +0 -0
  237. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/metadata.json +0 -0
  238. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +0 -0
  239. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/meta/manifests/init.pp +0 -0
  240. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/meta/metadata.json +0 -0
  241. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +0 -0
  242. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +0 -0
  243. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/manifests/init.pp +0 -0
  244. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/metadata.json +0 -0
  245. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/no_provider/manifests/init.pp +0 -0
  246. data/spec/integration/application/apply_spec.rb +88 -2
  247. data/spec/integration/application/lookup_spec.rb +155 -0
  248. data/spec/integration/data_binding_spec.rb +5 -5
  249. data/spec/integration/defaults_spec.rb +13 -0
  250. data/spec/integration/environments/default_manifest_spec.rb +16 -16
  251. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  252. data/spec/integration/test/test_helper_spec.rb +6 -2
  253. data/spec/integration/transaction_spec.rb +74 -0
  254. data/spec/integration/util/execution_spec.rb +8 -0
  255. data/spec/lib/puppet_spec/module_tool/shared_functions.rb +2 -2
  256. data/spec/lib/puppet_spec/module_tool/stub_source.rb +1 -1
  257. data/spec/lib/puppet_spec/unindent.rb +2 -2
  258. data/spec/unit/application/face_base_spec.rb +16 -0
  259. data/spec/unit/application/lookup_spec.rb +262 -227
  260. data/spec/unit/data_providers/{sample_data_provider_spec.rb → custom_data_provider_spec.rb} +14 -16
  261. data/spec/unit/data_providers/function_data_provider_spec.rb +2 -2
  262. data/spec/unit/data_providers/hiera_data_provider_spec.rb +60 -97
  263. data/spec/unit/defaults_spec.rb +1 -1
  264. data/spec/unit/face/ca_spec.rb +10 -0
  265. data/spec/unit/face/certificate_request_spec.rb +10 -0
  266. data/spec/unit/face/certificate_revocation_list_spec.rb +10 -0
  267. data/spec/unit/face/file_spec.rb +4 -0
  268. data/spec/unit/face/help_spec.rb +17 -0
  269. data/spec/unit/face/key_spec.rb +10 -0
  270. data/spec/unit/face/status_spec.rb +10 -0
  271. data/spec/unit/file_system_spec.rb +143 -6
  272. data/spec/unit/functions/binary_file_spec.rb +1 -1
  273. data/spec/unit/functions/hiera_spec.rb +257 -47
  274. data/spec/unit/functions/lookup_fixture_spec.rb +693 -0
  275. data/spec/unit/functions/lookup_spec.rb +1319 -608
  276. data/spec/unit/functions/new_spec.rb +3 -3
  277. data/spec/unit/graph/rb_tree_map_spec.rb +1 -1
  278. data/spec/unit/graph/simple_graph_spec.rb +1 -1
  279. data/spec/unit/hiera/scope_spec.rb +4 -4
  280. data/spec/unit/indirector/request_spec.rb +9 -0
  281. data/spec/unit/interface_spec.rb +27 -0
  282. data/spec/unit/man_spec.rb +1 -1
  283. data/spec/unit/module_spec.rb +1 -1
  284. data/spec/unit/module_tool/applications/builder_spec.rb +16 -1
  285. data/spec/unit/module_tool/applications/installer_spec.rb +1 -1
  286. data/spec/unit/module_tool/applications/upgrader_spec.rb +1 -1
  287. data/spec/unit/module_tool/installed_modules_spec.rb +6 -6
  288. data/spec/unit/module_tool_spec.rb +3 -3
  289. data/spec/unit/network/http/connection_spec.rb +10 -0
  290. data/spec/unit/network/http/webrick_spec.rb +1 -1
  291. data/spec/unit/pops/evaluator/access_ops_spec.rb +2 -2
  292. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +9 -9
  293. data/spec/unit/pops/loaders/environment_loader_spec.rb +172 -0
  294. data/spec/unit/pops/lookup/context_spec.rb +45 -16
  295. data/spec/unit/pops/lookup/interpolation_spec.rb +28 -20
  296. data/spec/unit/pops/lookup/lookup_spec.rb +197 -0
  297. data/spec/unit/pops/merge_strategy_spec.rb +18 -0
  298. data/spec/unit/pops/parser/lexer2_spec.rb +16 -1
  299. data/spec/unit/pops/parser/parse_site_spec.rb +4 -0
  300. data/spec/unit/pops/serialization/packer_spec.rb +4 -23
  301. data/spec/unit/pops/serialization/serialization_spec.rb +32 -8
  302. data/spec/unit/pops/types/p_object_type_spec.rb +68 -3
  303. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +4 -4
  304. data/spec/unit/pops/types/p_type_set_type_spec.rb +31 -2
  305. data/spec/unit/pops/types/type_acceptor_spec.rb +18 -17
  306. data/spec/unit/pops/types/type_calculator_spec.rb +39 -40
  307. data/spec/unit/pops/types/type_factory_spec.rb +3 -3
  308. data/spec/unit/pops/types/type_formatter_spec.rb +7 -3
  309. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +13 -2
  310. data/spec/unit/pops/types/types_spec.rb +25 -2
  311. data/spec/unit/pops/validator/validator_spec.rb +60 -4
  312. data/spec/unit/provider/nameservice_spec.rb +42 -0
  313. data/spec/unit/provider/package/aptrpm_spec.rb +1 -1
  314. data/spec/unit/provider/package/pkg_spec.rb +22 -0
  315. data/spec/unit/provider/package/pkgng_spec.rb +12 -0
  316. data/spec/unit/provider/package/rpm_spec.rb +8 -8
  317. data/spec/unit/provider/service/smf_spec.rb +13 -11
  318. data/spec/unit/provider/service/systemd_spec.rb +8 -1
  319. data/spec/unit/provider/user/useradd_spec.rb +1 -0
  320. data/spec/unit/puppet_spec.rb +14 -0
  321. data/spec/unit/resource/catalog_spec.rb +15 -9
  322. data/spec/unit/resource_spec.rb +20 -17
  323. data/spec/unit/semver_spec.rb +14 -0
  324. data/spec/unit/ssl/certificate_authority_spec.rb +12 -1
  325. data/spec/unit/transaction/additional_resource_generator_spec.rb +11 -0
  326. data/spec/unit/type/user_spec.rb +32 -6
  327. data/spec/unit/util/filetype_spec.rb +3 -3
  328. data/spec/unit/util/yaml_spec.rb +1 -1
  329. data/spec/unit/util_spec.rb +10 -2
  330. data/tasks/i18n.rake +20 -0
  331. metadata +2661 -2595
  332. data/lib/puppet/data_providers/lookup_adapter.rb +0 -254
  333. data/lib/puppet/vendor/load_semantic.rb +0 -1
  334. data/lib/puppet/vendor/semantic/Gemfile +0 -20
  335. data/lib/puppet/vendor/semantic/PUPPET_README.md +0 -6
  336. data/lib/puppet/vendor/semantic/Rakefile +0 -69
  337. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +0 -60
  338. data/lib/puppet/vendor/semantic/lib/semantic.rb +0 -7
  339. data/lib/puppet/vendor/semantic/spec/spec_helper.rb +0 -24
  340. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_node_spec.rb +0 -141
  341. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_spec.rb +0 -162
  342. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/module_release_spec.rb +0 -143
  343. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/source_spec.rb +0 -5
  344. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/unsatisfiable_graph_spec.rb +0 -44
  345. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency_spec.rb +0 -383
  346. data/lib/puppet/vendor/semantic/spec/unit/semantic/version_range_spec.rb +0 -307
  347. data/lib/puppet/vendor/semantic/spec/unit/semantic/version_spec.rb +0 -608
  348. data/spec/fixtures/unit/data_providers/environments/sample/manifests/site.pp +0 -6
@@ -17,16 +17,16 @@ class Loaders
17
17
  attr_reader :private_environment_loader
18
18
  attr_reader :implementation_registry
19
19
 
20
- def self.new(environment)
20
+ def self.new(environment, for_agent = false)
21
21
  obj = environment.loaders
22
22
  if obj.nil?
23
23
  obj = self.allocate
24
- obj.send(:initialize, environment)
24
+ obj.send(:initialize, environment, for_agent)
25
25
  end
26
26
  obj
27
27
  end
28
28
 
29
- def initialize(environment)
29
+ def initialize(environment, for_agent)
30
30
  # Protect against environment havoc
31
31
  raise ArgumentError.new("Attempt to redefine already initialized loaders for environment") unless environment.loaders.nil?
32
32
  environment.loaders = self
@@ -47,12 +47,16 @@ class Loaders
47
47
  # concept of environment the same way as when running as a master (except when doing apply).
48
48
  # The creation mechanisms should probably differ between the two.
49
49
  #
50
- @private_environment_loader = create_environment_loader(environment)
50
+ @private_environment_loader = if for_agent
51
+ add_loader_by_name(Loader::SimpleEnvironmentLoader.new(@puppet_system_loader, 'agent environment'))
52
+ else
53
+ create_environment_loader(environment)
54
+ end
51
55
 
52
56
  # 3. The implementation registry maintains mappings between Puppet types and Runtime types for
53
57
  # the current environment
54
58
  @implementation_registry = Types::ImplementationRegistry.new(@private_environment_loader)
55
- Pcore.init(@puppet_system_loader, @implementation_registry)
59
+ Pcore.init(@puppet_system_loader, @implementation_registry, for_agent)
56
60
 
57
61
  # 4. module loaders are set up from the create_environment_loader, they register themselves
58
62
  end
@@ -106,15 +110,30 @@ class Loaders
106
110
  # @api private
107
111
  def self.register_runtime3_type(name, origin)
108
112
  loaders = Puppet.lookup(:loaders) { nil }
109
- unless loaders.nil?
110
- name = name.to_s
111
- caps_name = Types::TypeFormatter.singleton.capitalize_segments(name)
112
- typed_name = Loader::TypedName.new(:type, name.downcase)
113
- loaders.runtime3_type_loader.set_entry(typed_name, Types::PResourceType.new(caps_name), origin)
114
- end
113
+ return nil if loaders.nil?
114
+
115
+ rt3_loader = loaders.runtime3_type_loader
116
+ return nil if rt3_loader.nil?
117
+
118
+ name = name.to_s
119
+ caps_name = Types::TypeFormatter.singleton.capitalize_segments(name)
120
+ typed_name = Loader::TypedName.new(:type, name.downcase)
121
+ rt3_loader.set_entry(typed_name, Types::PResourceType.new(caps_name), origin)
115
122
  nil
116
123
  end
117
124
 
125
+ # Finds a loader to use when deserializing a catalog and then subsequenlty use user
126
+ # defined types found in that catalog.
127
+ #
128
+ def self.catalog_loader
129
+ loaders = Puppet.lookup(:loaders) { nil }
130
+ if loaders.nil?
131
+ loaders = Loaders.new(Puppet.lookup(:current_environment), true)
132
+ Puppet.push_context(:loaders => loaders)
133
+ end
134
+ loaders.find_loader(nil)
135
+ end
136
+
118
137
  # Finds the `Loaders` instance by looking up the :loaders in the global Puppet context
119
138
  #
120
139
  # @return [Loaders] the loaders instance
@@ -241,7 +260,7 @@ class Loaders
241
260
  loader = add_loader_by_name(Loader::SimpleEnvironmentLoader.new(@runtime3_type_loader, loader_name))
242
261
  else
243
262
  # View the environment as a module to allow loading from it - this module is always called 'environment'
244
- loader = Loader::ModuleLoaders.module_loader_from(@runtime3_type_loader, self, 'environment', env_path)
263
+ loader = Loader::ModuleLoaders.environment_loader_from(@runtime3_type_loader, self, env_path)
245
264
  end
246
265
 
247
266
  # An environment has a module path even if it has a null loader
@@ -0,0 +1,87 @@
1
+ require_relative 'hiera_config'
2
+ require_relative 'data_provider'
3
+
4
+ module Puppet::Pops
5
+ module Lookup
6
+ # @api private
7
+ class ConfiguredDataProvider
8
+ include DataProvider
9
+
10
+ # @param config [HieraConfig,nil] the configuration
11
+ def initialize(config = nil)
12
+ @config = config.nil? ? nil : assert_config_version(config)
13
+ end
14
+
15
+ def config(lookup_invocation)
16
+ @config ||= assert_config_version(HieraConfig.create(configuration_path(lookup_invocation)))
17
+ end
18
+
19
+ # @return [Pathname] the path to the configuration
20
+ def config_path
21
+ @config.nil? ? nil : @config.config_path
22
+ end
23
+
24
+ # @return [String] the name of this provider
25
+ def name
26
+ n = "#{place} "
27
+ n << '"' << module_name << '" ' unless module_name.nil?
28
+ n << 'Data Provider'
29
+ n << " (#{@config.name})" unless @config.nil?
30
+ n
31
+ end
32
+
33
+ # Performs a lookup by searching all configured locations for the given _key_. A merge will be performed if
34
+ # the value is found in more than one location.
35
+ #
36
+ # @param key [String] The key to lookup
37
+ # @param lookup_invocation [Invocation] The current lookup invocation
38
+ # @param merge [MergeStrategy,String,Hash{String => Object},nil] Merge strategy, merge strategy name, strategy and options hash, or nil (implies "first found")
39
+ # @return [Object] the found object
40
+ # @throw :no_such_key when the object is not found
41
+ def unchecked_key_lookup(key, lookup_invocation, merge)
42
+ lookup_invocation.with(:data_provider, self) do
43
+ merge_strategy = MergeStrategy.strategy(merge)
44
+ dps = data_providers(lookup_invocation)
45
+ if dps.empty?
46
+ lookup_invocation.report_not_found(key)
47
+ throw :no_such_key
48
+ end
49
+ merge_strategy.lookup(data_providers(lookup_invocation), lookup_invocation) do |data_provider|
50
+ data_provider.unchecked_key_lookup(key, lookup_invocation, merge_strategy)
51
+ end
52
+ end
53
+ end
54
+
55
+ protected
56
+
57
+ # Assert that the given config version is accepted by this data provider.
58
+ #
59
+ # @param config [HieraConfig] the configuration to check
60
+ # @return [HieraConfig] the argument
61
+ # @raise [Puppet::DataBinding::LookupError] if the configuration version is unacceptable
62
+ def assert_config_version(config)
63
+ config
64
+ end
65
+
66
+ # Return the root of the configured entity
67
+ #
68
+ # @param lookup_invocation [Invocation] The current lookup invocation
69
+ # @return [Pathname] Path to root of the module
70
+ # @raise [Puppet::DataBinding::LookupError] if the given module is can not be found
71
+ #
72
+ def provider_root(lookup_invocation)
73
+ raise NotImplementedError, "#{self.class.name} must implement method '#provider_root'"
74
+ end
75
+
76
+ def configuration_path(lookup_invocation)
77
+ provider_root(lookup_invocation) + HieraConfig::CONFIG_FILE_NAME
78
+ end
79
+
80
+ private
81
+
82
+ def data_providers(lookup_invocation)
83
+ config(lookup_invocation).configured_data_providers(lookup_invocation, self)
84
+ end
85
+ end
86
+ end
87
+ end
@@ -1,86 +1,136 @@
1
+ require_relative 'interpolation'
2
+
1
3
  module Puppet::Pops
2
- module Lookup
3
- class Context
4
- include Types::PuppetObject
4
+ module Lookup
5
+ # A FunctionContext is created for each unique hierarchy entry and adapted to the Compiler (and hence shares
6
+ # the compiler's life-cycle).
7
+ # @api private
8
+ class FunctionContext
9
+ include Interpolation
5
10
 
6
- def self._ptype
7
- @type
8
- end
11
+ attr_reader :environment_name, :module_name, :function
12
+ attr_accessor :data_hash
9
13
 
10
- def self.register_ptype(loader, ir)
11
- tf = Types::TypeFactory
12
- @type = Pcore::create_object_type(loader, ir, self, 'Puppet::LookupContext', 'Any',
13
- {
14
- 'environment_name' => Types::PStringType::NON_EMPTY,
15
- 'module_name' => {
16
- Types::KEY_TYPE => tf.optional(Types::PStringType::NON_EMPTY),
17
- Types::KEY_VALUE => nil
18
- }
19
- },
20
- {
21
- 'not_found' => tf.callable([0, 0], tf.undef),
22
- 'explain' => tf.callable([0, 0, tf.callable(0,0)], tf.undef),
23
- 'cache' => tf.callable([tf.scalar, tf.any], tf.undef),
24
- 'cache_all' => tf.callable([tf.hash_kv(tf.scalar, tf.any)], tf.undef),
25
- 'cached_value' => tf.callable([tf.scalar], tf.any),
26
- 'cached_entries' => tf.variant(
27
- tf.callable([0, 0, tf.callable(1,1)], tf.undef),
28
- tf.callable([0, 0, tf.callable(2,2)], tf.undef),
29
- tf.callable([0, 0], tf.iterable(tf.tuple([tf.scalar, tf.any])))
30
- )
31
- }
32
- ).resolve(Types::TypeParser.singleton, loader)
33
- end
34
-
35
- attr_reader :environment_name
36
- attr_reader :module_name
14
+ def initialize(environment_name, module_name, function)
15
+ @data_hash = nil
16
+ @cache = {}
17
+ @environment_name = environment_name
18
+ @module_name = module_name
19
+ @function = function
20
+ end
37
21
 
38
- def initialize(environment_name, module_name, lookup_invocation = Invocation.current)
39
- @lookup_invocation = lookup_invocation
40
- @environment_name = environment_name
41
- @module_name = module_name
42
- @cache = {}
43
- end
22
+ def cache(key, value)
23
+ @cache[key] = value
24
+ end
44
25
 
45
- def cache(key, value)
46
- @cache[key] = value
47
- nil
48
- end
26
+ def cache_all(hash)
27
+ @cache.merge!(hash)
28
+ nil
29
+ end
49
30
 
50
- def cache_all(hash)
51
- @cache.merge!(hash)
52
- nil
53
- end
31
+ def cache_has_key(key)
32
+ @cache.include?(key)
33
+ end
54
34
 
55
- def cached_value(key)
56
- @cache[key]
57
- end
35
+ def cached_value(key)
36
+ @cache[key]
37
+ end
58
38
 
59
- def cached_entries(&block)
60
- @cache
61
- if block_given?
62
- enumerator = @cache.each_pair
63
- @cache.size.times do
64
- if block.arity == 2
65
- yield(*enumerator.next)
66
- else
67
- yield(enumerator.next)
68
- end
69
- end
70
- nil
39
+ def cached_entries(&block)
40
+ if block_given?
41
+ enumerator = @cache.each_pair
42
+ @cache.size.times do
43
+ if block.arity == 2
44
+ yield(*enumerator.next)
71
45
  else
72
- Types::Iterable.on(@cache)
46
+ yield(enumerator.next)
73
47
  end
74
48
  end
49
+ nil
50
+ else
51
+ Types::Iterable.on(@cache)
52
+ end
53
+ end
54
+ end
75
55
 
76
- def explain(&block)
77
- @lookup_invocation.report_text(&block) unless @lookup_invocation.nil?
78
- nil
79
- end
56
+ # The Context is created once for each call to a function. It provides a combination of the {Invocation} object needed
57
+ # to provide explanation support and the {FunctionContext} object needed to provide the private cache.
58
+ # The {Context} is part of the public API. It will be passed to a _data_hash_, _data_dig_, or _lookup_key_ function and its
59
+ # attributes and methods can be used in a Puppet function as well as in a Ruby function.
60
+ # The {Context} is maps to the Pcore type 'Puppet::LookupContext'
61
+ #
62
+ # @api public
63
+ class Context
64
+ include Types::PuppetObject
65
+ extend Forwardable
80
66
 
81
- def not_found
82
- throw :no_such_key
83
- end
84
- end
67
+ def self._ptype
68
+ @type
69
+ end
70
+
71
+ def self.register_ptype(loader, ir)
72
+ tf = Types::TypeFactory
73
+ key_type = tf.optional(tf.scalar)
74
+ @type = Pcore::create_object_type(loader, ir, self, 'Puppet::LookupContext', 'Any',
75
+ {
76
+ 'environment_name' => Types::PStringType::NON_EMPTY,
77
+ 'module_name' => {
78
+ Types::KEY_TYPE => tf.optional(Types::PStringType::NON_EMPTY),
79
+ Types::KEY_VALUE => nil
80
+ }
81
+ },
82
+ {
83
+ 'not_found' => tf.callable([0, 0], tf.undef),
84
+ 'explain' => tf.callable([0, 0, tf.callable(0,0)], tf.undef),
85
+ 'interpolate' => tf.callable(1, 1),
86
+ 'cache' => tf.callable([key_type, tf.any], tf.any),
87
+ 'cache_all' => tf.callable([tf.hash_kv(key_type, tf.any)], tf.undef),
88
+ 'cache_has_key' => tf.callable([key_type], tf.boolean),
89
+ 'cached_value' => tf.callable([key_type], tf.any),
90
+ 'cached_entries' => tf.variant(
91
+ tf.callable([0, 0, tf.callable(1,1)], tf.undef),
92
+ tf.callable([0, 0, tf.callable(2,2)], tf.undef),
93
+ tf.callable([0, 0], tf.iterable(tf.tuple([key_type, tf.any])))
94
+ )
95
+ }
96
+ ).resolve(Types::TypeParser.singleton, loader)
97
+ end
98
+
99
+ # Mainly for test purposes. Makes it possible to create a {Context} in Puppet code provided that a current {Invocation} exists.
100
+ def self.from_asserted_args(environment_name, module_name)
101
+ new(FunctionContext.new(environment_name, module_name, nil), Invocation.current)
102
+ end
103
+
104
+ # Public methods delegated to the {FunctionContext}
105
+ def_delegators :@function_context, :cache, :cache_all, :cache_has_key, :cached_value, :cached_entries, :environment_name, :module_name
106
+
107
+ def initialize(function_context, lookup_invocation)
108
+ @lookup_invocation = lookup_invocation
109
+ @function_context = function_context
110
+ end
111
+
112
+ # Will call the given block to obtain a textual explanation if explanation support is active.
113
+ #
114
+ def explain(&block)
115
+ @lookup_invocation.report_text(&block)
116
+ nil
117
+ end
118
+
119
+ # Resolve interpolation expressions in the given value
120
+ # @param [Object] value
121
+ # @return [Object] the value with all interpolation expressions resolved
122
+ def interpolate(value)
123
+ @function_context.interpolate(value, @lookup_invocation, true)
124
+ end
125
+
126
+ def not_found
127
+ throw :no_such_key
85
128
  end
129
+
130
+ # @api private
131
+ def invocation
132
+ @lookup_invocation
133
+ end
134
+ end
135
+ end
86
136
  end
@@ -0,0 +1,27 @@
1
+ module Puppet::Pops
2
+ module Lookup
3
+ # A class that adapts a Hash
4
+ # @api private
5
+ class DataAdapter < Adaptable::Adapter
6
+ def self.create_adapter(o)
7
+ new
8
+ end
9
+
10
+ def initialize
11
+ @data = {}
12
+ end
13
+
14
+ def [](name)
15
+ @data[name]
16
+ end
17
+
18
+ def include?(name)
19
+ @data.include? name
20
+ end
21
+
22
+ def []=(name, value)
23
+ @data[name] = value
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,55 @@
1
+ require_relative 'function_provider'
2
+
3
+ module Puppet::Pops
4
+ module Lookup
5
+ # @api private
6
+ class DataDigFunctionProvider < FunctionProvider
7
+ TAG = 'data_dig'.freeze
8
+
9
+ # Performs a lookup with the assumption that a recursive check has been made.
10
+ #
11
+ # @param key [LookupKey] The key to lookup
12
+ # @param lookup_invocation [Invocation] The current lookup invocation
13
+ # @param merge [MergeStrategy,String,Hash{String => Object},nil] Merge strategy, merge strategy name, strategy and options hash, or nil (implies "first found")
14
+ # @return [Object] the found object
15
+ # @throw :no_such_key when the object is not found
16
+ def unchecked_key_lookup(key, lookup_invocation, merge)
17
+ segments = key.to_a
18
+ lookup_invocation.with(:data_provider, self) do
19
+ MergeStrategy.strategy(merge).lookup(locations, lookup_invocation) do |location|
20
+ if location.nil?
21
+ value = data_dig(key, segments, lookup_invocation, nil)
22
+ lookup_invocation.report_found(key, validate_data_value(self, value))
23
+ key.undig(value)
24
+ else
25
+ lookup_invocation.with(:location, location) do
26
+ if location.exist?
27
+ value = data_dig(key, segments, lookup_invocation, location.location)
28
+ lookup_invocation.report_found(key, validate_data_value(self, value))
29
+ key.undig(value)
30
+ else
31
+ lookup_invocation.report_path_not_found
32
+ throw :no_such_key
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ def data_dig(key, segments, lookup_invocation, location)
43
+ ctx = function_context(lookup_invocation, location)
44
+ ctx.data_hash ||= {}
45
+ catch(:no_such_key) do
46
+ hash = ctx.data_hash
47
+ hash[key] = ctx.function.call(lookup_invocation.scope, segments, options(location), Context.new(ctx, lookup_invocation)) unless hash.include?(key)
48
+ return hash[key]
49
+ end
50
+ lookup_invocation.report_not_found(key)
51
+ throw :no_such_key
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,111 @@
1
+ require_relative 'function_provider'
2
+ require_relative 'interpolation'
3
+
4
+ module Puppet::Pops
5
+ module Lookup
6
+ # @api private
7
+ class DataHashFunctionProvider < FunctionProvider
8
+ include SubLookup
9
+ include Interpolation
10
+
11
+ TAG = 'data_hash'.freeze
12
+
13
+ # Performs a lookup with the assumption that a recursive check has been made.
14
+ #
15
+ # @param key [LookupKey] The key to lookup
16
+ # @param lookup_invocation [Invocation] The current lookup invocation
17
+ # @param merge [MergeStrategy,String,Hash{String => Object},nil] Merge strategy, merge strategy name, strategy and options hash, or nil (implies "first found")
18
+ # @return [Object] the found object
19
+ # @throw :no_such_key when the object is not found
20
+ def unchecked_key_lookup(key, lookup_invocation, merge)
21
+ root_key = key.root_key
22
+ lookup_invocation.with(:data_provider, self) do
23
+ MergeStrategy.strategy(merge).lookup(locations, lookup_invocation) do |location|
24
+ invoke_with_location(lookup_invocation, location, root_key)
25
+ end
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def invoke_with_location(lookup_invocation, location, root_key)
32
+ if location.nil?
33
+ lookup_key(lookup_invocation, nil, root_key)
34
+ else
35
+ lookup_invocation.with(:location, location) do
36
+ if location.exist?
37
+ lookup_key(lookup_invocation, location.location, root_key)
38
+ else
39
+ lookup_invocation.report_location_not_found
40
+ throw :no_such_key
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ def lookup_key(lookup_invocation, location, root_key)
47
+ lookup_invocation.report_found(root_key, data_value(lookup_invocation, location, root_key))
48
+ end
49
+
50
+ def data_value(lookup_invocation, location, root_key)
51
+ hash = data_hash(lookup_invocation, location)
52
+ value = hash[root_key]
53
+ if value.nil? && !hash.include?(root_key)
54
+ lookup_invocation.report_not_found(root_key)
55
+ throw :no_such_key
56
+ end
57
+ interpolate(value, lookup_invocation, true)
58
+ end
59
+
60
+ def data_hash(lookup_invocation, location)
61
+ ctx = function_context(lookup_invocation, location)
62
+ ctx.data_hash ||= parent_data_provider.validate_data_hash(self, call_data_hash_function(ctx, lookup_invocation, location))
63
+ end
64
+
65
+ def call_data_hash_function(ctx, lookup_invocation, location)
66
+ ctx.function.call(lookup_invocation.scope, options(location), Context.new(ctx, lookup_invocation))
67
+ end
68
+ end
69
+
70
+ # @api private
71
+ class V3DataHashFunctionProvider < DataHashFunctionProvider
72
+ TAG = 'v3_data_hash'.freeze
73
+
74
+ def initialize(name, parent_data_provider, function_name, options, locations)
75
+ @datadir = options.delete(HieraConfig::KEY_DATADIR)
76
+ super
77
+ end
78
+
79
+ def unchecked_key_lookup(key, lookup_invocation, merge)
80
+ extra_paths = lookup_invocation.hiera_v3_location_overrides
81
+ if extra_paths.nil? || extra_paths.empty?
82
+ super
83
+ else
84
+ # Extra paths provided. Must be resolved and placed in front of known paths
85
+ paths = parent_data_provider.config(lookup_invocation).resolve_paths(@datadir, extra_paths, lookup_invocation, false, ".#{@name}")
86
+ all_locations = paths + locations
87
+ root_key = key.root_key
88
+ lookup_invocation.with(:data_provider, self) do
89
+ MergeStrategy.strategy(merge).lookup(all_locations, lookup_invocation) do |location|
90
+ invoke_with_location(lookup_invocation, location, root_key)
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
96
+
97
+ # TODO: API 5.0, remove this class
98
+ # @api private
99
+ class V4DataHashFunctionProvider < DataHashFunctionProvider
100
+ TAG = 'v4_data_hash'.freeze
101
+
102
+ def name
103
+ "deprecated API function \"#{function_name}\""
104
+ end
105
+
106
+ def call_data_hash_function(ctx, lookup_invocation, location)
107
+ ctx.function.call(lookup_invocation.scope)
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,102 @@
1
+ module Puppet::Pops
2
+ module Lookup
3
+ # @api private
4
+ module DataProvider
5
+ def self.key_type
6
+ ensure_types_initialized
7
+ @key_type
8
+ end
9
+
10
+ def self.value_type
11
+ ensure_types_initialized
12
+ @value_type
13
+ end
14
+
15
+ def self.ensure_types_initialized
16
+ if @key_type.nil?
17
+ (@key_type, @value_type) = Pcore::register_aliases(
18
+ # The Pcore type for all keys and subkeys in a data hash.
19
+ 'Puppet::LookupKey' => 'Variant[String,Numeric]',
20
+
21
+ # The Pcore type for all values and sub-values in a data hash. The
22
+ # type is self-recursive to enforce the same constraint on values contained
23
+ # in arrays and hashes
24
+ 'Puppet::LookupValue' => <<-PUPPET
25
+ Variant[
26
+ Scalar,
27
+ Undef,
28
+ Sensitive,
29
+ Type,
30
+ Hash[Puppet::LookupKey, Puppet::LookupValue],
31
+ Array[Puppet::LookupValue]
32
+ ]
33
+ PUPPET
34
+ )
35
+ end
36
+ end
37
+
38
+ # Performs a lookup with an endless recursion check.
39
+ #
40
+ # @param key [LookupKey] The key to lookup
41
+ # @param lookup_invocation [Invocation] The current lookup invocation
42
+ # @param merge [MergeStrategy,String,Hash{String=>Object},nil] Merge strategy or hash with strategy and options
43
+ #
44
+ def key_lookup(key, lookup_invocation, merge)
45
+ lookup_invocation.check(key.to_s) { unchecked_key_lookup(key, lookup_invocation, merge) }
46
+ end
47
+
48
+ def lookup(key, lookup_invocation, merge)
49
+ lookup_invocation.check(key.to_s) { unchecked_key_lookup(key, lookup_invocation, merge) }
50
+ end
51
+
52
+ # Performs a lookup with the assumption that a recursive check has been made.
53
+ #
54
+ # @param key [LookupKey] The key to lookup
55
+ # @param lookup_invocation [Invocation] The current lookup invocation
56
+ # @param merge [MergeStrategy,String,Hash{String => Object},nil] Merge strategy, merge strategy name, strategy and options hash, or nil (implies "first found")
57
+ # @return [Object] the found object
58
+ # @throw :no_such_key when the object is not found
59
+ def unchecked_key_lookup(key, lookup_invocation, merge)
60
+ raise NotImplementedError, "Subclass of #{DataProvider.name} must implement 'unchecked_lookup' method"
61
+ end
62
+
63
+ # @return [String,nil] the name of the module that this provider belongs to nor `nil` if it doesn't belong to a module
64
+ def module_name
65
+ nil
66
+ end
67
+
68
+ # @return [String] the name of the this data provider
69
+ def name
70
+ raise NotImplementedError, "Subclass of #{DataProvider.name} must implement 'name' method"
71
+ end
72
+
73
+ # Asserts that _data_hash_ is a valid hash.
74
+ #
75
+ # @param data_provider [DataProvider] The data provider that produced the hash
76
+ # @param data_hash [Hash{String=>Object}] The data hash
77
+ # @return [Hash{String=>Object}] The data hash
78
+ def validate_data_hash(data_provider, data_hash)
79
+ Types::TypeAsserter.assert_instance_of(nil, Types::PHashType::DEFAULT, data_hash) { "Value returned from #{data_provider.name}" }
80
+ data_hash.each_pair { |k, v| validate_data_entry(data_provider, k, v) }
81
+ data_hash
82
+ end
83
+
84
+ def validate_data_value(data_provider, value, where = '')
85
+ Types::TypeAsserter.assert_instance_of(nil, DataProvider.value_type, value) { "Value #{where}returned from #{data_provider.name}" }
86
+ case value
87
+ when Hash
88
+ value.each_pair { |k, v| validate_data_entry(data_provider, k, v) }
89
+ when Array
90
+ value.each {|v| validate_data_value(data_provider, v, 'in array ') }
91
+ end
92
+ value
93
+ end
94
+
95
+ def validate_data_entry(data_provider, key, value)
96
+ Types::TypeAsserter.assert_instance_of(nil, DataProvider.key_type, key) { "Key in hash returned from #{data_provider.name}" }
97
+ validate_data_value(data_provider, value, 'in hash ')
98
+ nil
99
+ end
100
+ end
101
+ end
102
+ end