puppet 4.8.2 → 4.9.0

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.rb +52 -0
  11. data/lib/puppet/application/face_base.rb +4 -0
  12. data/lib/puppet/application/lookup.rb +4 -2
  13. data/lib/puppet/application/resource.rb +1 -1
  14. data/lib/puppet/data_providers.rb +6 -3
  15. data/lib/puppet/data_providers/data_adapter.rb +6 -0
  16. data/lib/puppet/data_providers/data_function_support.rb +7 -0
  17. data/lib/puppet/data_providers/function_env_data_provider.rb +7 -0
  18. data/lib/puppet/data_providers/function_module_data_provider.rb +6 -0
  19. data/lib/puppet/data_providers/hiera_config.rb +31 -10
  20. data/lib/puppet/data_providers/hiera_env_data_provider.rb +6 -0
  21. data/lib/puppet/data_providers/hiera_interpolate.rb +2 -1
  22. data/lib/puppet/data_providers/hiera_module_data_provider.rb +6 -0
  23. data/lib/puppet/data_providers/hiera_support.rb +6 -0
  24. data/lib/puppet/data_providers/json_data_provider_factory.rb +12 -0
  25. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +12 -0
  26. data/lib/puppet/defaults.rb +25 -4
  27. data/lib/puppet/face/ca.rb +2 -0
  28. data/lib/puppet/face/certificate_request.rb +2 -0
  29. data/lib/puppet/face/certificate_revocation_list.rb +2 -0
  30. data/lib/puppet/face/file.rb +3 -0
  31. data/lib/puppet/face/help.rb +19 -17
  32. data/lib/puppet/face/help/face.erb +3 -0
  33. data/lib/puppet/face/key.rb +1 -0
  34. data/lib/puppet/face/man.rb +4 -2
  35. data/lib/puppet/face/module/generate.rb +1 -1
  36. data/lib/puppet/face/status.rb +2 -0
  37. data/lib/puppet/feature/base.rb +9 -2
  38. data/lib/puppet/feature/hocon.rb +3 -0
  39. data/lib/puppet/file_system.rb +15 -3
  40. data/lib/puppet/file_system/windows.rb +8 -0
  41. data/lib/puppet/forge.rb +6 -6
  42. data/lib/puppet/forge/repository.rb +1 -2
  43. data/lib/puppet/functions/binary_file.rb +4 -10
  44. data/lib/puppet/functions/hiera_array.rb +1 -1
  45. data/lib/puppet/functions/hiera_include.rb +1 -1
  46. data/lib/puppet/functions/hocon_data.rb +24 -0
  47. data/lib/puppet/functions/json_data.rb +18 -0
  48. data/lib/puppet/functions/yaml_data.rb +21 -0
  49. data/lib/puppet/generate/type.rb +1 -1
  50. data/lib/puppet/graph/simple_graph.rb +4 -2
  51. data/lib/puppet/indirector/file_bucket_file/file.rb +10 -2
  52. data/lib/puppet/indirector/request.rb +5 -1
  53. data/lib/puppet/interface.rb +14 -2
  54. data/lib/puppet/interface/face_collection.rb +1 -1
  55. data/lib/puppet/module.rb +14 -2
  56. data/lib/puppet/module_tool.rb +4 -4
  57. data/lib/puppet/module_tool/applications/builder.rb +3 -2
  58. data/lib/puppet/module_tool/applications/installer.rb +14 -14
  59. data/lib/puppet/module_tool/applications/upgrader.rb +13 -13
  60. data/lib/puppet/module_tool/installed_modules.rb +7 -7
  61. data/lib/puppet/module_tool/local_tarball.rb +3 -3
  62. data/lib/puppet/module_tool/metadata.rb +1 -1
  63. data/lib/puppet/network/http/connection.rb +2 -0
  64. data/lib/puppet/network/http/webrick.rb +2 -1
  65. data/lib/puppet/parser/functions/hiera.rb +14 -0
  66. data/lib/puppet/parser/functions/hiera_array.rb +14 -0
  67. data/lib/puppet/parser/functions/hiera_hash.rb +14 -0
  68. data/lib/puppet/parser/functions/hiera_include.rb +14 -0
  69. data/lib/puppet/parser/scope.rb +14 -20
  70. data/lib/puppet/plugins/data_providers.rb +2 -0
  71. data/lib/puppet/plugins/data_providers/data_provider.rb +108 -17
  72. data/lib/puppet/plugins/data_providers/registry.rb +2 -36
  73. data/lib/puppet/pops.rb +6 -9
  74. data/lib/puppet/pops/adaptable.rb +0 -3
  75. data/lib/puppet/pops/binder/producers.rb +3 -3
  76. data/lib/puppet/pops/evaluator/access_operator.rb +4 -4
  77. data/lib/puppet/pops/evaluator/closure.rb +1 -1
  78. data/lib/puppet/pops/evaluator/compare_operator.rb +4 -4
  79. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
  80. data/lib/puppet/pops/issues.rb +4 -0
  81. data/lib/puppet/pops/label_provider.rb +14 -0
  82. data/lib/puppet/pops/loader/loader_paths.rb +3 -1
  83. data/lib/puppet/pops/loader/module_loaders.rb +21 -7
  84. data/lib/puppet/pops/loader/typed_name.rb +0 -2
  85. data/lib/puppet/pops/loaders.rb +31 -12
  86. data/lib/puppet/pops/lookup.rb +4 -3
  87. data/lib/puppet/pops/lookup/configured_data_provider.rb +87 -0
  88. data/lib/puppet/pops/lookup/context.rb +121 -71
  89. data/lib/puppet/pops/lookup/data_adapter.rb +27 -0
  90. data/lib/puppet/pops/lookup/data_dig_function_provider.rb +55 -0
  91. data/lib/puppet/pops/lookup/data_hash_function_provider.rb +111 -0
  92. data/lib/puppet/pops/lookup/data_provider.rb +102 -0
  93. data/lib/puppet/pops/lookup/environment_data_provider.rb +27 -0
  94. data/lib/puppet/pops/lookup/explainer.rb +122 -82
  95. data/lib/puppet/pops/lookup/function_provider.rb +82 -0
  96. data/lib/puppet/pops/lookup/global_data_provider.rb +49 -0
  97. data/lib/puppet/pops/lookup/hiera_config.rb +601 -0
  98. data/lib/puppet/pops/lookup/interpolation.rb +56 -35
  99. data/lib/puppet/pops/lookup/invocation.rb +179 -101
  100. data/lib/puppet/pops/lookup/location_resolver.rb +72 -0
  101. data/lib/puppet/pops/lookup/lookup_adapter.rb +451 -0
  102. data/lib/puppet/pops/lookup/lookup_key.rb +99 -0
  103. data/lib/puppet/pops/lookup/lookup_key_function_provider.rb +119 -0
  104. data/lib/puppet/pops/lookup/module_data_provider.rb +58 -0
  105. data/lib/puppet/pops/lookup/sub_lookup.rb +8 -4
  106. data/lib/puppet/pops/merge_strategy.rb +120 -39
  107. data/lib/puppet/pops/parser/egrammar.ra +2 -0
  108. data/lib/puppet/pops/parser/eparser.rb +816 -808
  109. data/lib/puppet/pops/parser/locator.rb +3 -3
  110. data/lib/puppet/pops/parser/slurp_support.rb +4 -3
  111. data/lib/puppet/pops/pcore.rb +21 -12
  112. data/lib/puppet/pops/serialization/abstract_reader.rb +17 -7
  113. data/lib/puppet/pops/serialization/abstract_writer.rb +27 -12
  114. data/lib/puppet/pops/serialization/deserializer.rb +17 -4
  115. data/lib/puppet/pops/serialization/extension.rb +37 -8
  116. data/lib/puppet/pops/serialization/object.rb +14 -6
  117. data/lib/puppet/pops/serialization/rgen.rb +2 -1
  118. data/lib/puppet/pops/serialization/serializer.rb +30 -7
  119. data/lib/puppet/pops/types/implementation_registry.rb +1 -1
  120. data/lib/puppet/pops/types/p_object_type.rb +55 -12
  121. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +27 -27
  122. data/lib/puppet/pops/types/p_sem_ver_type.rb +12 -12
  123. data/lib/puppet/pops/types/p_timespan_type.rb +6 -6
  124. data/lib/puppet/pops/types/p_timestamp_type.rb +2 -2
  125. data/lib/puppet/pops/types/p_type_set_type.rb +7 -16
  126. data/lib/puppet/pops/types/recursion_guard.rb +64 -20
  127. data/lib/puppet/pops/types/ruby_generator.rb +10 -0
  128. data/lib/puppet/pops/types/type_calculator.rb +23 -13
  129. data/lib/puppet/pops/types/type_factory.rb +20 -9
  130. data/lib/puppet/pops/types/type_formatter.rb +37 -17
  131. data/lib/puppet/pops/types/type_mismatch_describer.rb +7 -6
  132. data/lib/puppet/pops/types/type_parser.rb +6 -0
  133. data/lib/puppet/pops/types/types.rb +225 -132
  134. data/lib/puppet/pops/validation.rb +1 -1
  135. data/lib/puppet/pops/validation/checker4_0.rb +12 -2
  136. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  137. data/lib/puppet/pops/visitor.rb +4 -3
  138. data/lib/puppet/provider/mcx/mcxcontent.rb +2 -1
  139. data/lib/puppet/provider/nameservice.rb +15 -0
  140. data/lib/puppet/provider/package/appdmg.rb +1 -1
  141. data/lib/puppet/provider/package/dnf.rb +1 -1
  142. data/lib/puppet/provider/package/pkg.rb +1 -1
  143. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  144. data/lib/puppet/provider/package/pkgng.rb +1 -1
  145. data/lib/puppet/provider/package/rpm.rb +2 -2
  146. data/lib/puppet/provider/service/smf.rb +3 -3
  147. data/lib/puppet/provider/service/systemd.rb +5 -1
  148. data/lib/puppet/provider/user/directoryservice.rb +1 -0
  149. data/lib/puppet/provider/user/user_role_add.rb +15 -0
  150. data/lib/puppet/provider/yumrepo/inifile.rb +2 -2
  151. data/lib/puppet/provider/zone/solaris.rb +4 -1
  152. data/lib/puppet/reference/indirection.rb +1 -1
  153. data/lib/puppet/resource.rb +2 -3
  154. data/lib/puppet/resource/catalog.rb +12 -4
  155. data/lib/puppet/resource/type.rb +3 -3
  156. data/lib/puppet/settings.rb +1 -1
  157. data/lib/puppet/settings/config_file.rb +2 -1
  158. data/lib/puppet/settings/directory_setting.rb +6 -0
  159. data/lib/puppet/settings/environment_conf.rb +6 -2
  160. data/lib/puppet/settings/file_or_directory_setting.rb +6 -0
  161. data/lib/puppet/settings/file_setting.rb +10 -0
  162. data/lib/puppet/ssl/certificate_authority.rb +13 -2
  163. data/lib/puppet/ssl/host.rb +23 -1
  164. data/lib/puppet/transaction/additional_resource_generator.rb +7 -0
  165. data/lib/puppet/type/user.rb +16 -3
  166. data/lib/puppet/util.rb +1 -0
  167. data/lib/puppet/util/execution.rb +3 -3
  168. data/lib/puppet/util/filetype.rb +11 -5
  169. data/lib/puppet/util/logging.rb +2 -1
  170. data/lib/puppet/util/network_device/config.rb +1 -1
  171. data/lib/puppet/util/plist.rb +6 -0
  172. data/lib/puppet/util/profiler/aggregate.rb +1 -1
  173. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +2 -2
  174. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +2 -1
  175. data/lib/puppet/util/windows/adsi.rb +15 -12
  176. data/lib/puppet/vendor/load_semantic_puppet.rb +1 -0
  177. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +2 -1
  178. data/lib/puppet/vendor/require_vendored.rb +0 -1
  179. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet.rb +17 -0
  180. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency.rb +7 -7
  181. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph.rb +2 -2
  182. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph_node.rb +2 -2
  183. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/module_release.rb +58 -0
  184. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/source.rb +2 -2
  185. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/unsatisfiable_graph.rb +2 -2
  186. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/gem_version.rb +3 -0
  187. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/locales/config.yaml +21 -0
  188. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version.rb +48 -21
  189. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version_range.rb +15 -17
  190. data/lib/puppet/version.rb +1 -1
  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 -2593
  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.rb +0 -7
  338. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +0 -60
  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,72 @@
1
+ require 'pathname'
2
+ require_relative 'interpolation'
3
+
4
+ module Puppet::Pops
5
+ module Lookup
6
+ # Class that keeps track of the original location (as it appears in the declaration, before interpolation),
7
+ # and the fully resolved location, and whether or not the resolved location exists.
8
+ #
9
+ # @api private
10
+ class ResolvedLocation
11
+ attr_reader :original_location, :location
12
+
13
+ # @param original_location [String] location as found in declaration. May contain interpolation expressions
14
+ # @param location [Pathname,URI] the expanded location
15
+ # @param exist [Boolean] `true` if the location is assumed to exist
16
+ # @api public
17
+ def initialize(original_location, location, exist)
18
+ @original_location = original_location
19
+ @location = location
20
+ @exist = exist
21
+ end
22
+
23
+ # @return [Boolean] `true` if the location is assumed to exist
24
+ # @api public
25
+ def exist?
26
+ @exist
27
+ end
28
+ end
29
+
30
+ # Helper methods to resolve interpolated locations
31
+ #
32
+ # @api private
33
+ module LocationResolver
34
+ include Interpolation
35
+
36
+ def expand_globs(datadir, declared_globs, lookup_invocation)
37
+ declared_globs.map do |declared_glob|
38
+ glob = interpolate(declared_glob, lookup_invocation, false)
39
+ Pathname.glob(datadir, glob).reject { |path| path.directory? }.map { |path| ResolvedLocation.new(glob, path, true) }
40
+ end.flatten
41
+ end
42
+
43
+ # @param datadir [Pathname] The base when creating absolute paths
44
+ # @param declared_paths [Array<String>] paths as found in declaration. May contain interpolation expressions
45
+ # @param lookup_invocation [Puppet::Pops::Lookup::Invocation] The current lookup invocation
46
+ # @param is_default_config [Boolean] `true` if this is the default config and non-existent paths should be excluded
47
+ # @param extension [String] Required extension such as '.yaml' or '.json'. Use only if paths without extension can be expected
48
+ # @return [Array<ResolvedLocation>] Array of resolved paths
49
+ def resolve_paths(datadir, declared_paths, lookup_invocation, is_default_config, extension = nil)
50
+ result = []
51
+ declared_paths.each do |declared_path|
52
+ path = interpolate(declared_path, lookup_invocation, false)
53
+ path += extension unless extension.nil? || path.end_with?(extension)
54
+ path = datadir + path
55
+ path_exists = path.exist?
56
+ result << ResolvedLocation.new(declared_path, path, path_exists) unless is_default_config && !path_exists
57
+ end
58
+ result
59
+ end
60
+
61
+ # @param declared_uris [Array<String>] paths as found in declaration. May contain interpolation expressions
62
+ # @param lookup_invocation [Puppet::Pops::Lookup::Invocation] The current lookup invocation
63
+ # @return [Array<ResolvedLocation>] Array of resolved paths
64
+ def expand_uris(declared_uris, lookup_invocation)
65
+ declared_uris.map do |declared_uri|
66
+ uri = URI(interpolate(declared_uri, lookup_invocation, false))
67
+ ResolvedLocation.new(declared_uri, uri, true)
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -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'