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
@@ -0,0 +1,451 @@
1
+ require_relative 'data_adapter'
2
+ require_relative 'lookup_key'
3
+
4
+ module Puppet::Pops
5
+ module Lookup
6
+ # A LookupAdapter is a specialized DataAdapter that uses its hash to store data providers. It also remembers the compiler
7
+ # that it is attached to and maintains a cache of _lookup options_ retrieved from the data providers associated with the
8
+ # compiler's environment.
9
+ #
10
+ # @api private
11
+ class LookupAdapter < DataAdapter
12
+
13
+ LOOKUP_OPTIONS_PREFIX = LOOKUP_OPTIONS + '.'
14
+ LOOKUP_OPTIONS_PREFIX.freeze
15
+ LOOKUP_OPTIONS_PATTERN_START = '^'.freeze
16
+
17
+ HASH = 'hash'.freeze
18
+ MERGE = 'merge'.freeze
19
+
20
+ def self.create_adapter(compiler)
21
+ new(compiler)
22
+ end
23
+
24
+ def initialize(compiler)
25
+ super()
26
+ @compiler = compiler
27
+ @lookup_options = {}
28
+ end
29
+
30
+ # Performs a lookup using global, environment, and module data providers. Merge the result using the given
31
+ # _merge_ strategy. If the merge strategy is nil, then an attempt is made to find merge options in the
32
+ # `lookup_options` hash for an entry associated with the key. If no options are found, the no merge is performed
33
+ # and the first found entry is returned.
34
+ #
35
+ # @param key [String] The key to lookup
36
+ # @param lookup_invocation [Invocation] the lookup invocation
37
+ # @param merge [MergeStrategy,String,Hash{String => Object},nil] Merge strategy, merge strategy name, strategy and options hash, or nil (implies "first found")
38
+ # @return [Object] the found object
39
+ # @throw :no_such_key when the object is not found
40
+ #
41
+ def lookup(key, lookup_invocation, merge)
42
+ # The 'lookup_options' key is reserved and not found as normal data
43
+ if key == LOOKUP_OPTIONS || key.start_with?(LOOKUP_OPTIONS_PREFIX)
44
+ lookup_invocation.with(:invalid_key, LOOKUP_OPTIONS) do
45
+ throw :no_such_key
46
+ end
47
+ end
48
+
49
+ key = LookupKey.new(key)
50
+ lookup_invocation.lookup(key, key.module_name) do
51
+ merge_explained = false
52
+ if lookup_invocation.only_explain_options?
53
+ catch(:no_such_key) { do_lookup(LookupKey::LOOKUP_OPTIONS, lookup_invocation, HASH) }
54
+ nil
55
+ else
56
+ if merge.nil?
57
+ # Used cached lookup_options
58
+ merge = lookup_merge_options(key, lookup_invocation)
59
+ lookup_invocation.report_merge_source(LOOKUP_OPTIONS) unless merge.nil?
60
+ end
61
+ lookup_invocation.with(:data, key.to_s) { do_lookup(key, lookup_invocation, merge) }
62
+ end
63
+ end
64
+ end
65
+
66
+ def lookup_global(key, lookup_invocation, merge_strategy)
67
+ terminus = Puppet[:data_binding_terminus]
68
+ case terminus
69
+ when :hiera, 'hiera'
70
+ provider = global_provider(lookup_invocation)
71
+ throw :no_such_key if provider.nil?
72
+ provider.key_lookup(key, lookup_invocation, merge_strategy)
73
+ when :none, 'none', '', nil
74
+ # If global lookup is disabled, immediately report as not found
75
+ lookup_invocation.report_not_found(key)
76
+ throw :no_such_key
77
+ else
78
+ lookup_invocation.with(:global, terminus) do
79
+ catch(:no_such_key) do
80
+ return lookup_invocation.report_found(key, Puppet::DataBinding.indirection.find(key.root_key,
81
+ {:environment => environment, :variables => lookup_invocation.scope, :merge => merge_strategy}))
82
+ end
83
+ lookup_invocation.report_not_found(key)
84
+ throw :no_such_key
85
+ end
86
+ end
87
+ rescue Puppet::DataBinding::LookupError => detail
88
+ error = Puppet::Error.new("Lookup of key '#{lookup_invocation.top_key}' failed: #{detail.message}")
89
+ error.set_backtrace(detail.backtrace)
90
+ raise error
91
+ end
92
+
93
+ def lookup_in_environment(key, lookup_invocation, merge_strategy)
94
+ provider = env_provider(lookup_invocation)
95
+ throw :no_such_key if provider.nil?
96
+ provider.key_lookup(key, lookup_invocation, merge_strategy)
97
+ end
98
+
99
+ def lookup_in_module(key, lookup_invocation, merge_strategy)
100
+ module_name = lookup_invocation.module_name
101
+
102
+ # Do not attempt to do a lookup in a module unless the name is qualified.
103
+ throw :no_such_key if module_name.nil?
104
+
105
+ provider = module_provider(lookup_invocation, module_name)
106
+ if provider.nil?
107
+ if environment.module(module_name).nil?
108
+ lookup_invocation.report_module_not_found(module_name)
109
+ else
110
+ lookup_invocation.report_module_provider_not_found(module_name)
111
+ end
112
+ throw :no_such_key
113
+ end
114
+ provider.key_lookup(key, lookup_invocation, merge_strategy)
115
+ end
116
+
117
+ # Retrieve the merge options that match the given `name`.
118
+ #
119
+ # @param key [LookupKey] The key for which we want merge options
120
+ # @param lookup_invocation [Invocation] the lookup invocation
121
+ # @return [String,Hash,nil] The found merge options or nil
122
+ #
123
+ def lookup_merge_options(key, lookup_invocation)
124
+ lookup_options = lookup_lookup_options(key, lookup_invocation)
125
+ lookup_options.nil? ? nil : lookup_options[MERGE]
126
+ end
127
+
128
+ # Retrieve the lookup options that match the given `name`.
129
+ #
130
+ # @param key [LookupKey] The key for which we want lookup options
131
+ # @param lookup_invocation [Puppet::Pops::Lookup::Invocation] the lookup invocation
132
+ # @return [String,Hash,nil] The found lookup options or nil
133
+ #
134
+ def lookup_lookup_options(key, lookup_invocation)
135
+ module_name = key.module_name
136
+
137
+ # Retrieve the options for the module. We use nil as a key in case we have no module
138
+ if !@lookup_options.include?(module_name)
139
+ options = retrieve_lookup_options(module_name, lookup_invocation, MergeStrategy.strategy(HASH))
140
+ @lookup_options[module_name] = options
141
+ else
142
+ options = @lookup_options[module_name]
143
+ end
144
+ return nil if options.nil?
145
+
146
+ rk = key.root_key
147
+ key_opts = options[0][rk]
148
+ return key_opts unless key_opts.nil?
149
+
150
+ patterns = options[1]
151
+ patterns.each_pair { |pattern, value| return value if pattern =~ rk } unless patterns.nil?
152
+ nil
153
+ end
154
+
155
+ # @param lookup_invocation [Puppet::Pops::Lookup::Invocation] the lookup invocation
156
+ # @return [Boolean] `true` if an environment data provider version 5 is configured
157
+ def has_environment_data_provider?(lookup_invocation)
158
+ ep = env_provider(lookup_invocation)
159
+ ep.nil? ? false : ep.config(lookup_invocation).version >= 5
160
+ end
161
+
162
+ # @return [Pathname] the full path of the hiera.yaml config file
163
+ def global_hiera_config_path
164
+ @global_hiera_config_path ||= Pathname.new(Puppet.settings[:hiera_config])
165
+ end
166
+
167
+ # @param path [String] the absolute path name of the global hiera.yaml file.
168
+ # @return [LookupAdapter] self
169
+ def set_global_hiera_config_path(path)
170
+ @global_hiera_config_path = Pathname.new(path)
171
+ self
172
+ end
173
+
174
+ def global_only?
175
+ instance_variable_defined?(:@global_only) ? @global_only : false
176
+ end
177
+
178
+ # Instructs the lookup framework to only perform lookups in the global layer
179
+ # @return [LookupAdapter] self
180
+ def set_global_only
181
+ @global_only = true
182
+ self
183
+ end
184
+
185
+ private
186
+
187
+ PROVIDER_STACK = [:lookup_global, :lookup_in_environment, :lookup_in_module].freeze
188
+
189
+ def validate_lookup_options(options, module_name)
190
+ raise Puppet::DataBinding::LookupError.new("value of #{LOOKUP_OPTIONS} must be a hash") unless options.is_a?(Hash) unless options.nil?
191
+ return options if module_name.nil?
192
+
193
+ pfx = "#{module_name}::"
194
+ options.each_pair do |key, value|
195
+ if key.start_with?(LOOKUP_OPTIONS_PATTERN_START)
196
+ unless key[1..pfx.length] == pfx
197
+ raise Puppet::DataBinding::LookupError.new("all #{LOOKUP_OPTIONS} patterns must match a key starting with module name '#{module_name}'")
198
+ end
199
+ else
200
+ unless key.start_with?(pfx)
201
+ raise Puppet::DataBinding::LookupError.new("all #{LOOKUP_OPTIONS} keys must start with module name '#{module_name}'")
202
+ end
203
+ end
204
+ end
205
+ end
206
+
207
+ def compile_patterns(options)
208
+ return nil if options.nil?
209
+ key_options = {}
210
+ pattern_options = {}
211
+ options.each_pair do |key, value|
212
+ if key.start_with?(LOOKUP_OPTIONS_PATTERN_START)
213
+ pattern_options[Regexp.compile(key)] = value
214
+ else
215
+ key_options[key] = value
216
+ end
217
+ end
218
+ [key_options.empty? ? nil : key_options, pattern_options.empty? ? nil : pattern_options]
219
+ end
220
+
221
+ def do_lookup(key, lookup_invocation, merge)
222
+ if lookup_invocation.global_only?
223
+ key.dig(lookup_invocation, lookup_global(key, lookup_invocation, merge))
224
+ else
225
+ merge_strategy = Puppet::Pops::MergeStrategy.strategy(merge)
226
+ key.dig(lookup_invocation,
227
+ merge_strategy.lookup(PROVIDER_STACK, lookup_invocation) { |m| send(m, key, lookup_invocation, merge_strategy) })
228
+ end
229
+ end
230
+
231
+ GLOBAL_ENV_MERGE = 'Global and Environment'.freeze
232
+
233
+ # Retrieve lookup options that applies when using a specific module (i.e. a merge of the pre-cached
234
+ # `env_lookup_options` and the module specific data)
235
+ def retrieve_lookup_options(module_name, lookup_invocation, merge_strategy)
236
+ meta_invocation = Invocation.new(lookup_invocation.scope)
237
+ meta_invocation.lookup(LookupKey::LOOKUP_OPTIONS, lookup_invocation.module_name) do
238
+ meta_invocation.with(:meta, LOOKUP_OPTIONS) do
239
+ if meta_invocation.global_only?
240
+ global_lookup_options(meta_invocation, merge_strategy)
241
+ else
242
+ opts = env_lookup_options(meta_invocation, merge_strategy)
243
+ catch(:no_such_key) do
244
+ module_opts = validate_lookup_options(lookup_in_module(LookupKey::LOOKUP_OPTIONS, meta_invocation, merge_strategy), module_name)
245
+ opts = if opts.nil?
246
+ module_opts
247
+ else
248
+ merge_strategy.lookup([GLOBAL_ENV_MERGE, "Module #{lookup_invocation.module_name}"], meta_invocation) do |n|
249
+ meta_invocation.with(:scope, n) { meta_invocation.report_found(LOOKUP_OPTIONS, n == GLOBAL_ENV_MERGE ? opts : module_opts) }
250
+ end
251
+ end
252
+ end
253
+ compile_patterns(opts)
254
+ end
255
+ end
256
+ end
257
+ end
258
+
259
+ # Retrieve and cache the global lookup options
260
+ def global_lookup_options(lookup_invocation, merge_strategy)
261
+ if !instance_variable_defined?(:@global_lookup_options)
262
+ @global_lookup_options = nil
263
+ catch(:no_such_key) { @global_lookup_options = validate_lookup_options(lookup_global(LookupKey::LOOKUP_OPTIONS, lookup_invocation, merge_strategy), nil) }
264
+ end
265
+ @global_lookup_options
266
+ end
267
+
268
+ # Retrieve and cache lookup options specific to the environment of the compiler that this adapter is attached to (i.e. a merge
269
+ # of global and environment lookup options).
270
+ def env_lookup_options(lookup_invocation, merge_strategy)
271
+ if !instance_variable_defined?(:@env_lookup_options)
272
+ global_options = global_lookup_options(lookup_invocation, merge_strategy)
273
+ @env_only_lookup_options = nil
274
+ catch(:no_such_key) { @env_only_lookup_options = validate_lookup_options(lookup_in_environment(LookupKey::LOOKUP_OPTIONS, lookup_invocation, merge_strategy), nil) }
275
+ if global_options.nil?
276
+ @env_lookup_options = @env_only_lookup_options
277
+ elsif @env_only_lookup_options.nil?
278
+ @env_lookup_options = global_options
279
+ else
280
+ @env_lookup_options = merge_strategy.merge(global_options, @env_only_lookup_options)
281
+ end
282
+ end
283
+ @env_lookup_options
284
+ end
285
+
286
+ def global_provider(lookup_invocation)
287
+ @global_provider = GlobalDataProvider.new unless instance_variable_defined?(:@global_provider)
288
+ @global_provider
289
+ end
290
+
291
+ def env_provider(lookup_invocation)
292
+ @env_provider = initialize_env_provider(lookup_invocation) unless instance_variable_defined?(:@env_provider)
293
+ @env_provider
294
+ end
295
+
296
+ def module_provider(lookup_invocation, module_name)
297
+ # Test if the key is present for the given module_name. It might be there even if the
298
+ # value is nil (which indicates that no module provider is configured for the given name)
299
+ unless self.include?(module_name)
300
+ self[module_name] = initialize_module_provider(lookup_invocation, module_name)
301
+ end
302
+ self[module_name]
303
+ end
304
+
305
+ def initialize_module_provider(lookup_invocation, module_name)
306
+ mod = environment.module(module_name)
307
+ return nil if mod.nil?
308
+
309
+ metadata = mod.metadata
310
+ binding = false
311
+ provider_name = metadata.nil? ? nil : metadata['data_provider']
312
+ if provider_name.nil?
313
+ provider_name = bound_module_provider_name(module_name)
314
+ binding = !provider_name.nil?
315
+ end
316
+
317
+ mp = nil
318
+ if mod.has_hiera_conf?
319
+ mp = ModuleDataProvider.new(module_name)
320
+ # A version 5 hiera.yaml trumps a data provider setting or binding in the module
321
+ if mp.config(lookup_invocation).version >= 5
322
+ unless provider_name.nil? || Puppet[:strict] == :off
323
+ if binding
324
+ Puppet.warn_once(:deprecation, "ModuleBinding#data_provider-#{module_name}",
325
+ "Defining data_provider '#{provider_name}' as a Puppet::Binding is deprecated. The binding is ignored since a '#{HieraConfig::CONFIG_FILE_NAME}' with version >= 5 is present")
326
+ else
327
+ Puppet.warn_once(:deprecation, "metadata.json#data_provider-#{module_name}",
328
+ "Defining \"data_provider\": \"#{provider_name}\" in metadata.json is deprecated. It is ignored since a '#{HieraConfig::CONFIG_FILE_NAME}' with version >= 5 is present", mod.metadata_file)
329
+ end
330
+ end
331
+ provider_name = nil
332
+ end
333
+ end
334
+
335
+ if provider_name.nil?
336
+ mp
337
+ else
338
+ unless Puppet[:strict] == :off
339
+ if binding
340
+ msg = "Defining data_provider '#{provider_name}' as a Puppet::Binding is deprecated"
341
+ msg += ". A '#{HieraConfig::CONFIG_FILE_NAME}' file should be used instead" if mp.nil?
342
+ Puppet.warn_once(:deprecation, "ModuleBinding#data_provider-#{module_name}", msg)
343
+ else
344
+ msg = "Defining \"data_provider\": \"#{provider_name}\" in metadata.json is deprecated"
345
+ msg += ". A '#{HieraConfig::CONFIG_FILE_NAME}' file should be used instead" if mp.nil?
346
+ Puppet.warn_once(:deprecation, "metadata.json#data_provider-#{module_name}", msg, mod.metadata_file)
347
+ end
348
+ end
349
+
350
+ case provider_name
351
+ when 'none'
352
+ nil
353
+ when 'hiera'
354
+ mp || ModuleDataProvider.new(module_name)
355
+ when 'function'
356
+ ModuleDataProvider.new(module_name, HieraConfig.v4_function_config(Pathname(mod.path), "#{module_name}::data"))
357
+ else
358
+ injector = Puppet.lookup(:injector) { nil }
359
+ provider = injector.lookup(nil,
360
+ Puppet::Plugins::DataProviders::Registry.hash_of_module_data_providers,
361
+ Puppet::Plugins::DataProviders::MODULE_DATA_PROVIDERS_KEY)[provider_name]
362
+ unless provider
363
+ raise Puppet::Error.new("Environment '#{environment.name}', cannot find module_data_provider '#{provider_name}'")
364
+ end
365
+ # Provider is configured per module but cached using compiler life cycle so it must be cloned
366
+ provider.clone
367
+ end
368
+ end
369
+ end
370
+
371
+ def bound_module_provider_name(module_name)
372
+ injector = Puppet.lookup(:injector) { nil }
373
+ injector.nil? ? nil : injector.lookup(nil,
374
+ Puppet::Plugins::DataProviders::Registry.hash_of_per_module_data_provider,
375
+ Puppet::Plugins::DataProviders::PER_MODULE_DATA_PROVIDER_KEY)[module_name]
376
+ end
377
+
378
+ def initialize_env_provider(lookup_invocation)
379
+ env_conf = environment.configuration
380
+ return nil if env_conf.nil? || env_conf.path_to_env.nil?
381
+
382
+ # Get the name of the data provider from the environment's configuration
383
+ provider_name = env_conf.environment_data_provider
384
+ env_path = Pathname(env_conf.path_to_env)
385
+ config_path = env_path + HieraConfig::CONFIG_FILE_NAME
386
+
387
+ ep = nil
388
+ if config_path.exist?
389
+ ep = EnvironmentDataProvider.new
390
+ # A version 5 hiera.yaml trumps any data provider setting in the environment.conf
391
+ if ep.config(lookup_invocation).version >= 5
392
+ unless provider_name.nil? || Puppet[:strict] == :off
393
+ Puppet.warn_once(:deprecation, 'environment.conf#data_provider',
394
+ "Defining environment_data_provider='#{provider_name}' in environment.conf is deprecated", env_path + 'environment.conf')
395
+
396
+ unless provider_name == 'hiera'
397
+ Puppet.warn_once(:deprecation, 'environment.conf#data_provider_overridden',
398
+ "The environment_data_provider='#{provider_name}' setting is ignored since '#{config_path}' version >= 5", env_path + 'environment.conf')
399
+ end
400
+ end
401
+ provider_name = nil
402
+ end
403
+ end
404
+
405
+ if provider_name.nil?
406
+ ep
407
+ else
408
+ unless Puppet[:strict] == :off
409
+ msg = "Defining environment_data_provider='#{provider_name}' in environment.conf is deprecated"
410
+ msg += ". A '#{HieraConfig::CONFIG_FILE_NAME}' file should be used instead" if ep.nil?
411
+ Puppet.warn_once(:deprecation, 'environment.conf#data_provider', msg, env_path + 'environment.conf')
412
+ end
413
+
414
+ case provider_name
415
+ when 'none'
416
+ nil
417
+ when 'hiera'
418
+ # Use hiera.yaml or default settings if it is missing
419
+ ep || EnvironmentDataProvider.new
420
+ when 'function'
421
+ EnvironmentDataProvider.new(HieraConfigV5.v4_function_config(env_path, 'environment::data'))
422
+ else
423
+ injector = Puppet.lookup(:injector) { nil }
424
+
425
+ # Support running tests without an injector being configured == using a null implementation
426
+ return nil unless injector
427
+
428
+ # Get the service (registry of known implementations)
429
+ provider = injector.lookup(nil,
430
+ Puppet::Plugins::DataProviders::Registry.hash_of_environment_data_providers,
431
+ Puppet::Plugins::DataProviders::ENV_DATA_PROVIDERS_KEY)[provider_name]
432
+ unless provider
433
+ raise Puppet::Error.new("Environment '#{environment.name}', cannot find environment_data_provider '#{provider_name}'")
434
+ end
435
+ provider
436
+ end
437
+ end
438
+ end
439
+
440
+ # @return [Puppet::Node::Environment] the environment of the compiler that this adapter is associated with
441
+ def environment
442
+ @compiler.environment
443
+ end
444
+ end
445
+ end
446
+ end
447
+
448
+ require_relative 'invocation'
449
+ require_relative 'global_data_provider'
450
+ require_relative 'environment_data_provider'
451
+ require_relative 'module_data_provider'
@@ -0,0 +1,99 @@
1
+ require_relative 'sub_lookup'
2
+
3
+ module Puppet::Pops
4
+ module Lookup
5
+ # @api private
6
+ class LookupKey
7
+ include SubLookup
8
+
9
+ attr_reader :module_name, :root_key, :segments
10
+
11
+ def initialize(key)
12
+ segments = split_key(key) { |problem| Puppet::DataBinding::LookupError.new("#{problem} in key: '#{key}'") }
13
+ root_key = segments.shift.freeze
14
+ qual_index = root_key.index(DOUBLE_COLON)
15
+
16
+ @key = key
17
+ @module_name = qual_index.nil? ? nil : root_key[0..qual_index-1].freeze
18
+ @root_key = root_key
19
+ @segments = segments.empty? ? nil : segments.map { |segment| segment =~ /^[0-9]+$/ ? segment.to_i : segment }.freeze
20
+ end
21
+
22
+ def dig(lookup_invocation, value)
23
+ @segments.nil? ? value : sub_lookup(@key, lookup_invocation, @segments, value)
24
+ end
25
+
26
+ # Prunes a found root value with respect to subkeys in this key. The given _value_ is returned untouched
27
+ # if this key has no subkeys. Otherwise an attempt is made to create a Hash or Array that contains only the
28
+ # path to the appointed value and that value.
29
+ #
30
+ # If subkeys exists and no value is found, then this method will return `nil`, an empty `Array` or an empty `Hash`
31
+ # to enable further merges to be applied. The returned type depends on the given _value_.
32
+ #
33
+ # @param value [Object] the value to prune
34
+ # @return the possibly pruned value
35
+ def prune(value)
36
+ if @segments.nil?
37
+ value
38
+ else
39
+ pruned = @segments.reduce(value) do |memo, segment|
40
+ memo.is_a?(Hash) || memo.is_a?(Array) && segment.is_a?(Integer) ? memo[segment] : nil
41
+ end
42
+ if pruned.nil?
43
+ case value
44
+ when Hash
45
+ EMPTY_HASH
46
+ when Array
47
+ EMPTY_ARRAY
48
+ else
49
+ nil
50
+ end
51
+ else
52
+ undig(pruned)
53
+ end
54
+ end
55
+ end
56
+
57
+ # Create a structure that can be dug into using the subkeys of this key in order to find the
58
+ # given _value_. If this key has no subkeys, the _value_ is returned.
59
+ #
60
+ # @param value [Object] the value to wrap in a structure in case this value has subkeys
61
+ # @return [Object] the possibly wrapped value
62
+ def undig(value)
63
+ @segments.nil? ? value : segments.reverse.reduce(value) do |memo, segment|
64
+ if segment.is_a?(Integer)
65
+ x = []
66
+ x[segment] = memo
67
+ else
68
+ x = { segment => memo }
69
+ end
70
+ x
71
+ end
72
+ end
73
+
74
+ def to_a
75
+ unless instance_variable_defined?(:@all_segments)
76
+ a = [@root_key]
77
+ a += @segments unless @segments.nil?
78
+ @all_segments = a.freeze
79
+ end
80
+ @all_segments
81
+ end
82
+
83
+ def eql?(v)
84
+ v.is_a?(LookupKey) && @key == v.to_s
85
+ end
86
+ alias == eql?
87
+
88
+ def hash
89
+ @key.hash
90
+ end
91
+
92
+ def to_s
93
+ @key
94
+ end
95
+
96
+ LOOKUP_OPTIONS = LookupKey.new('lookup_options')
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,119 @@
1
+ require_relative 'function_provider'
2
+
3
+ module Puppet::Pops
4
+ module Lookup
5
+ # @api private
6
+ class LookupKeyFunctionProvider < FunctionProvider
7
+ TAG = 'lookup_key'.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
+ lookup_invocation.with(:data_provider, self) do
18
+ MergeStrategy.strategy(merge).lookup(locations, lookup_invocation) do |location|
19
+ if location.nil?
20
+ value = lookup_key(key.root_key, lookup_invocation, nil, merge)
21
+ lookup_invocation.report_found(key.root_key, validate_data_value(self, value))
22
+ else
23
+ lookup_invocation.with(:location, location) do
24
+ value = lookup_key(key.root_key, lookup_invocation, location.location, merge)
25
+ lookup_invocation.report_found(key.root_key, validate_data_value(self, value))
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ def label
33
+ 'Lookup Key'
34
+ end
35
+
36
+ private
37
+
38
+ def lookup_key(key, lookup_invocation, location, merge)
39
+ unless location.nil? || location.exist?
40
+ lookup_invocation.report_location_not_found
41
+ throw :no_such_key
42
+ end
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, key, 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
+
55
+ class V3BackendFunctionProvider < LookupKeyFunctionProvider
56
+ TAG = 'hiera3_backend'.freeze
57
+
58
+ def lookup_key(key, lookup_invocation, location, merge)
59
+ @backend ||= instantiate_backend(lookup_invocation)
60
+ @backend.lookup(key, lookup_invocation.scope, lookup_invocation.hiera_v3_location_overrides, convert_merge(merge), context = {:recurse_guard => nil})
61
+ end
62
+
63
+ private
64
+
65
+ def instantiate_backend(lookup_invocation)
66
+ backend_name = options[HieraConfig::KEY_BACKEND]
67
+ begin
68
+ require 'hiera/backend'
69
+ require "hiera/backend/#{backend_name.downcase}_backend"
70
+ backend = Hiera::Backend.const_get("#{backend_name.capitalize}_backend").new
71
+ return backend.method(:lookup).arity == 4 ? Hiera::Backend::Backend1xWrapper.new(backend) : backend
72
+ rescue LoadError => e
73
+ lookup_invocation.report_text { "Unable to load backend '#{backend_name}': #{e.message}" }
74
+ throw :no_such_key
75
+ rescue NameError => e
76
+ lookup_invocation.report_text { "Unable to instantiate backend '#{backend_name}': #{e.message}" }
77
+ throw :no_such_key
78
+ end
79
+ end
80
+
81
+ # Converts a lookup 'merge' parameter argument into a Hiera 'resolution_type' argument.
82
+ #
83
+ # @param merge [String,Hash,nil] The lookup 'merge' argument
84
+ # @return [Symbol,Hash,nil] The Hiera 'resolution_type'
85
+ def convert_merge(merge)
86
+ case merge
87
+ when nil
88
+ when 'first', 'default'
89
+ # Nil is OK. Defaults to Hiera :priority
90
+ nil
91
+ when Puppet::Pops::MergeStrategy
92
+ convert_merge(merge.configuration)
93
+ when 'unique'
94
+ # Equivalent to Hiera :array
95
+ :array
96
+ when 'hash'
97
+ # Equivalent to Hiera :hash with default :native merge behavior. A Hash must be passed here
98
+ # to override possible Hiera deep merge config settings.
99
+ { :behavior => :native }
100
+ when 'deep'
101
+ # Equivalent to Hiera :hash with :deeper merge behavior.
102
+ { :behavior => :deeper }
103
+ when Hash
104
+ strategy = merge['strategy']
105
+ if strategy == 'deep'
106
+ result = { :behavior => :deeper }
107
+ # Remaining entries must have symbolic keys
108
+ merge.each_pair { |k,v| result[k.to_sym] = v unless k == 'strategy' }
109
+ result
110
+ else
111
+ convert_merge(strategy)
112
+ end
113
+ else
114
+ raise Puppet::DataBinding::LookupError, "Unrecognized value for request 'merge' parameter: '#{merge}'"
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end