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.
- checksums.yaml +15 -0
- data/CONTRIBUTING.md +25 -1
- data/Gemfile +6 -0
- data/Rakefile +1 -0
- data/ext/project_data.yaml +5 -1
- data/ext/windows/service/daemon.rb +2 -1
- data/install.rb +43 -6
- data/lib/hiera/puppet_function.rb +15 -17
- data/lib/hiera/scope.rb +12 -14
- data/lib/puppet/application/face_base.rb +4 -0
- data/lib/puppet/application/lookup.rb +4 -2
- data/lib/puppet/application/resource.rb +1 -1
- data/lib/puppet/data_providers/data_adapter.rb +6 -0
- data/lib/puppet/data_providers/data_function_support.rb +7 -0
- data/lib/puppet/data_providers/function_env_data_provider.rb +7 -0
- data/lib/puppet/data_providers/function_module_data_provider.rb +6 -0
- data/lib/puppet/data_providers/hiera_config.rb +31 -10
- data/lib/puppet/data_providers/hiera_env_data_provider.rb +6 -0
- data/lib/puppet/data_providers/hiera_interpolate.rb +2 -1
- data/lib/puppet/data_providers/hiera_module_data_provider.rb +6 -0
- data/lib/puppet/data_providers/hiera_support.rb +6 -0
- data/lib/puppet/data_providers/json_data_provider_factory.rb +12 -0
- data/lib/puppet/data_providers/yaml_data_provider_factory.rb +12 -0
- data/lib/puppet/data_providers.rb +6 -3
- data/lib/puppet/defaults.rb +25 -4
- data/lib/puppet/face/ca.rb +2 -0
- data/lib/puppet/face/certificate_request.rb +2 -0
- data/lib/puppet/face/certificate_revocation_list.rb +2 -0
- data/lib/puppet/face/file.rb +3 -0
- data/lib/puppet/face/help/face.erb +3 -0
- data/lib/puppet/face/help.rb +19 -17
- data/lib/puppet/face/key.rb +1 -0
- data/lib/puppet/face/man.rb +4 -2
- data/lib/puppet/face/module/generate.rb +1 -1
- data/lib/puppet/face/status.rb +2 -0
- data/lib/puppet/feature/base.rb +9 -2
- data/lib/puppet/feature/hocon.rb +3 -0
- data/lib/puppet/file_system/windows.rb +8 -0
- data/lib/puppet/file_system.rb +15 -3
- data/lib/puppet/forge/repository.rb +1 -2
- data/lib/puppet/forge.rb +6 -6
- data/lib/puppet/functions/binary_file.rb +4 -10
- data/lib/puppet/functions/hiera_array.rb +1 -1
- data/lib/puppet/functions/hiera_include.rb +1 -1
- data/lib/puppet/functions/hocon_data.rb +24 -0
- data/lib/puppet/functions/json_data.rb +18 -0
- data/lib/puppet/functions/yaml_data.rb +21 -0
- data/lib/puppet/generate/type.rb +1 -1
- data/lib/puppet/graph/simple_graph.rb +4 -2
- data/lib/puppet/indirector/file_bucket_file/file.rb +10 -2
- data/lib/puppet/indirector/request.rb +5 -1
- data/lib/puppet/interface/face_collection.rb +1 -1
- data/lib/puppet/interface.rb +14 -2
- data/lib/puppet/module.rb +14 -2
- data/lib/puppet/module_tool/applications/builder.rb +3 -2
- data/lib/puppet/module_tool/applications/installer.rb +14 -14
- data/lib/puppet/module_tool/applications/upgrader.rb +13 -13
- data/lib/puppet/module_tool/installed_modules.rb +7 -7
- data/lib/puppet/module_tool/local_tarball.rb +3 -3
- data/lib/puppet/module_tool/metadata.rb +1 -1
- data/lib/puppet/module_tool.rb +4 -4
- data/lib/puppet/network/http/connection.rb +2 -0
- data/lib/puppet/network/http/webrick.rb +2 -1
- data/lib/puppet/parser/functions/hiera.rb +14 -0
- data/lib/puppet/parser/functions/hiera_array.rb +14 -0
- data/lib/puppet/parser/functions/hiera_hash.rb +14 -0
- data/lib/puppet/parser/functions/hiera_include.rb +14 -0
- data/lib/puppet/parser/scope.rb +14 -20
- data/lib/puppet/plugins/data_providers/data_provider.rb +108 -17
- data/lib/puppet/plugins/data_providers/registry.rb +2 -36
- data/lib/puppet/plugins/data_providers.rb +2 -0
- data/lib/puppet/pops/adaptable.rb +0 -3
- data/lib/puppet/pops/binder/producers.rb +3 -3
- data/lib/puppet/pops/evaluator/access_operator.rb +4 -4
- data/lib/puppet/pops/evaluator/closure.rb +1 -1
- data/lib/puppet/pops/evaluator/compare_operator.rb +4 -4
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
- data/lib/puppet/pops/issues.rb +4 -0
- data/lib/puppet/pops/label_provider.rb +14 -0
- data/lib/puppet/pops/loader/loader_paths.rb +3 -1
- data/lib/puppet/pops/loader/module_loaders.rb +21 -7
- data/lib/puppet/pops/loader/typed_name.rb +0 -2
- data/lib/puppet/pops/loaders.rb +31 -12
- data/lib/puppet/pops/lookup/configured_data_provider.rb +87 -0
- data/lib/puppet/pops/lookup/context.rb +121 -71
- data/lib/puppet/pops/lookup/data_adapter.rb +27 -0
- data/lib/puppet/pops/lookup/data_dig_function_provider.rb +55 -0
- data/lib/puppet/pops/lookup/data_hash_function_provider.rb +111 -0
- data/lib/puppet/pops/lookup/data_provider.rb +102 -0
- data/lib/puppet/pops/lookup/environment_data_provider.rb +27 -0
- data/lib/puppet/pops/lookup/explainer.rb +122 -82
- data/lib/puppet/pops/lookup/function_provider.rb +82 -0
- data/lib/puppet/pops/lookup/global_data_provider.rb +49 -0
- data/lib/puppet/pops/lookup/hiera_config.rb +601 -0
- data/lib/puppet/pops/lookup/interpolation.rb +56 -35
- data/lib/puppet/pops/lookup/invocation.rb +179 -101
- data/lib/puppet/pops/lookup/location_resolver.rb +72 -0
- data/lib/puppet/pops/lookup/lookup_adapter.rb +451 -0
- data/lib/puppet/pops/lookup/lookup_key.rb +99 -0
- data/lib/puppet/pops/lookup/lookup_key_function_provider.rb +119 -0
- data/lib/puppet/pops/lookup/module_data_provider.rb +58 -0
- data/lib/puppet/pops/lookup/sub_lookup.rb +8 -4
- data/lib/puppet/pops/lookup.rb +4 -3
- data/lib/puppet/pops/merge_strategy.rb +120 -39
- data/lib/puppet/pops/parser/egrammar.ra +2 -0
- data/lib/puppet/pops/parser/eparser.rb +816 -808
- data/lib/puppet/pops/parser/locator.rb +3 -3
- data/lib/puppet/pops/parser/slurp_support.rb +4 -3
- data/lib/puppet/pops/pcore.rb +21 -12
- data/lib/puppet/pops/serialization/abstract_reader.rb +17 -7
- data/lib/puppet/pops/serialization/abstract_writer.rb +27 -12
- data/lib/puppet/pops/serialization/deserializer.rb +17 -4
- data/lib/puppet/pops/serialization/extension.rb +37 -8
- data/lib/puppet/pops/serialization/object.rb +14 -6
- data/lib/puppet/pops/serialization/rgen.rb +2 -1
- data/lib/puppet/pops/serialization/serializer.rb +30 -7
- data/lib/puppet/pops/types/implementation_registry.rb +1 -1
- data/lib/puppet/pops/types/p_object_type.rb +55 -12
- data/lib/puppet/pops/types/p_sem_ver_range_type.rb +27 -27
- data/lib/puppet/pops/types/p_sem_ver_type.rb +12 -12
- data/lib/puppet/pops/types/p_timespan_type.rb +6 -6
- data/lib/puppet/pops/types/p_timestamp_type.rb +2 -2
- data/lib/puppet/pops/types/p_type_set_type.rb +7 -16
- data/lib/puppet/pops/types/recursion_guard.rb +64 -20
- data/lib/puppet/pops/types/ruby_generator.rb +10 -0
- data/lib/puppet/pops/types/type_calculator.rb +23 -13
- data/lib/puppet/pops/types/type_factory.rb +20 -9
- data/lib/puppet/pops/types/type_formatter.rb +37 -17
- data/lib/puppet/pops/types/type_mismatch_describer.rb +7 -6
- data/lib/puppet/pops/types/type_parser.rb +6 -0
- data/lib/puppet/pops/types/types.rb +225 -132
- data/lib/puppet/pops/validation/checker4_0.rb +12 -2
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
- data/lib/puppet/pops/validation.rb +1 -1
- data/lib/puppet/pops/visitor.rb +4 -3
- data/lib/puppet/pops.rb +6 -9
- data/lib/puppet/provider/mcx/mcxcontent.rb +2 -1
- data/lib/puppet/provider/nameservice.rb +15 -0
- data/lib/puppet/provider/package/appdmg.rb +1 -1
- data/lib/puppet/provider/package/dnf.rb +1 -1
- data/lib/puppet/provider/package/pkg.rb +1 -1
- data/lib/puppet/provider/package/pkgdmg.rb +1 -1
- data/lib/puppet/provider/package/pkgng.rb +1 -1
- data/lib/puppet/provider/package/rpm.rb +2 -2
- data/lib/puppet/provider/service/smf.rb +3 -3
- data/lib/puppet/provider/service/systemd.rb +5 -1
- data/lib/puppet/provider/user/directoryservice.rb +1 -0
- data/lib/puppet/provider/user/user_role_add.rb +15 -0
- data/lib/puppet/provider/yumrepo/inifile.rb +2 -2
- data/lib/puppet/provider/zone/solaris.rb +4 -1
- data/lib/puppet/reference/indirection.rb +1 -1
- data/lib/puppet/resource/catalog.rb +12 -4
- data/lib/puppet/resource/type.rb +3 -3
- data/lib/puppet/resource.rb +2 -3
- data/lib/puppet/settings/config_file.rb +2 -1
- data/lib/puppet/settings/directory_setting.rb +6 -0
- data/lib/puppet/settings/environment_conf.rb +6 -2
- data/lib/puppet/settings/file_or_directory_setting.rb +6 -0
- data/lib/puppet/settings/file_setting.rb +10 -0
- data/lib/puppet/settings.rb +1 -1
- data/lib/puppet/ssl/certificate_authority.rb +13 -2
- data/lib/puppet/ssl/host.rb +23 -1
- data/lib/puppet/transaction/additional_resource_generator.rb +7 -0
- data/lib/puppet/type/user.rb +16 -3
- data/lib/puppet/util/execution.rb +3 -3
- data/lib/puppet/util/filetype.rb +11 -5
- data/lib/puppet/util/logging.rb +2 -1
- data/lib/puppet/util/network_device/config.rb +1 -1
- data/lib/puppet/util/plist.rb +6 -0
- data/lib/puppet/util/profiler/aggregate.rb +1 -1
- data/lib/puppet/util/rdoc/generators/puppet_generator.rb +2 -2
- data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +2 -1
- data/lib/puppet/util/windows/adsi.rb +15 -12
- data/lib/puppet/util.rb +1 -0
- data/lib/puppet/vendor/load_semantic_puppet.rb +1 -0
- data/lib/puppet/vendor/pathspec/lib/pathspec.rb +2 -1
- data/lib/puppet/vendor/require_vendored.rb +0 -1
- data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph.rb +2 -2
- data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph_node.rb +2 -2
- data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/module_release.rb +58 -0
- data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/source.rb +2 -2
- data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/unsatisfiable_graph.rb +2 -2
- data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency.rb +7 -7
- data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/gem_version.rb +3 -0
- data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/locales/config.yaml +21 -0
- data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version.rb +48 -21
- data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version_range.rb +15 -17
- data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet.rb +17 -0
- data/lib/puppet/version.rb +1 -1
- data/lib/puppet.rb +52 -0
- data/lib/semver.rb +19 -12
- data/locales/config.yaml +29 -0
- data/locales/puppet.pot +79 -0
- data/man/man5/puppet.conf.5 +1 -1
- data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/{data.pp → environment/data.pp} +0 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +1 -1
- data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/hiera.yaml +5 -0
- data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/lib/puppet/bindings/backend/default.rb +9 -0
- data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/lib/puppet_x/backend/special_data_provider_factory.rb +23 -0
- data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/manifests/init.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/metadata.json +9 -0
- data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_env_data.rb +1 -0
- data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/manifests/init.pp +1 -1
- data/spec/fixtures/unit/functions/lookup/data/common.yaml +19 -0
- data/spec/fixtures/unit/functions/lookup_fixture/data/common.yaml +19 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/environment.conf +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/lib/puppet/functions/environment/data.rb +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/bindings/abc/default.rb +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/manifests/init.pp +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/bindings/bad_data/default.rb +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/manifests/init.pp +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/bindings/bca/default.rb +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/functions/bca/data.rb +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/manifests/init.pp +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/data/empty.json +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/hiera.yaml +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/manifests/init.pp +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/metadata.json +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/data/empty_key.json +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/hiera.yaml +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/manifests/init.pp +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/metadata.json +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/data/empty_key.yaml +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/hiera.yaml +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/manifests/init.pp +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/metadata.json +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/data/empty.yaml +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/hiera.yaml +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/manifests/init.pp +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/metadata.json +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/data/first.json +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/hiera.yaml +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/manifests/init.pp +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/metadata.json +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/meta/manifests/init.pp +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/meta/metadata.json +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/manifests/init.pp +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/metadata.json +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/no_provider/manifests/init.pp +0 -0
- data/spec/integration/application/apply_spec.rb +88 -2
- data/spec/integration/application/lookup_spec.rb +155 -0
- data/spec/integration/data_binding_spec.rb +5 -5
- data/spec/integration/defaults_spec.rb +13 -0
- data/spec/integration/environments/default_manifest_spec.rb +16 -16
- data/spec/integration/environments/setting_hooks_spec.rb +1 -1
- data/spec/integration/test/test_helper_spec.rb +6 -2
- data/spec/integration/transaction_spec.rb +74 -0
- data/spec/integration/util/execution_spec.rb +8 -0
- data/spec/lib/puppet_spec/module_tool/shared_functions.rb +2 -2
- data/spec/lib/puppet_spec/module_tool/stub_source.rb +1 -1
- data/spec/lib/puppet_spec/unindent.rb +2 -2
- data/spec/unit/application/face_base_spec.rb +16 -0
- data/spec/unit/application/lookup_spec.rb +262 -227
- data/spec/unit/data_providers/{sample_data_provider_spec.rb → custom_data_provider_spec.rb} +14 -16
- data/spec/unit/data_providers/function_data_provider_spec.rb +2 -2
- data/spec/unit/data_providers/hiera_data_provider_spec.rb +60 -97
- data/spec/unit/defaults_spec.rb +1 -1
- data/spec/unit/face/ca_spec.rb +10 -0
- data/spec/unit/face/certificate_request_spec.rb +10 -0
- data/spec/unit/face/certificate_revocation_list_spec.rb +10 -0
- data/spec/unit/face/file_spec.rb +4 -0
- data/spec/unit/face/help_spec.rb +17 -0
- data/spec/unit/face/key_spec.rb +10 -0
- data/spec/unit/face/status_spec.rb +10 -0
- data/spec/unit/file_system_spec.rb +143 -6
- data/spec/unit/functions/binary_file_spec.rb +1 -1
- data/spec/unit/functions/hiera_spec.rb +257 -47
- data/spec/unit/functions/lookup_fixture_spec.rb +693 -0
- data/spec/unit/functions/lookup_spec.rb +1319 -608
- data/spec/unit/functions/new_spec.rb +3 -3
- data/spec/unit/graph/rb_tree_map_spec.rb +1 -1
- data/spec/unit/graph/simple_graph_spec.rb +1 -1
- data/spec/unit/hiera/scope_spec.rb +4 -4
- data/spec/unit/indirector/request_spec.rb +9 -0
- data/spec/unit/interface_spec.rb +27 -0
- data/spec/unit/man_spec.rb +1 -1
- data/spec/unit/module_spec.rb +1 -1
- data/spec/unit/module_tool/applications/builder_spec.rb +16 -1
- data/spec/unit/module_tool/applications/installer_spec.rb +1 -1
- data/spec/unit/module_tool/applications/upgrader_spec.rb +1 -1
- data/spec/unit/module_tool/installed_modules_spec.rb +6 -6
- data/spec/unit/module_tool_spec.rb +3 -3
- data/spec/unit/network/http/connection_spec.rb +10 -0
- data/spec/unit/network/http/webrick_spec.rb +1 -1
- data/spec/unit/pops/evaluator/access_ops_spec.rb +2 -2
- data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +9 -9
- data/spec/unit/pops/loaders/environment_loader_spec.rb +172 -0
- data/spec/unit/pops/lookup/context_spec.rb +45 -16
- data/spec/unit/pops/lookup/interpolation_spec.rb +28 -20
- data/spec/unit/pops/lookup/lookup_spec.rb +197 -0
- data/spec/unit/pops/merge_strategy_spec.rb +18 -0
- data/spec/unit/pops/parser/lexer2_spec.rb +16 -1
- data/spec/unit/pops/parser/parse_site_spec.rb +4 -0
- data/spec/unit/pops/serialization/packer_spec.rb +4 -23
- data/spec/unit/pops/serialization/serialization_spec.rb +32 -8
- data/spec/unit/pops/types/p_object_type_spec.rb +68 -3
- data/spec/unit/pops/types/p_sem_ver_type_spec.rb +4 -4
- data/spec/unit/pops/types/p_type_set_type_spec.rb +31 -2
- data/spec/unit/pops/types/type_acceptor_spec.rb +18 -17
- data/spec/unit/pops/types/type_calculator_spec.rb +39 -40
- data/spec/unit/pops/types/type_factory_spec.rb +3 -3
- data/spec/unit/pops/types/type_formatter_spec.rb +7 -3
- data/spec/unit/pops/types/type_mismatch_describer_spec.rb +13 -2
- data/spec/unit/pops/types/types_spec.rb +25 -2
- data/spec/unit/pops/validator/validator_spec.rb +60 -4
- data/spec/unit/provider/nameservice_spec.rb +42 -0
- data/spec/unit/provider/package/aptrpm_spec.rb +1 -1
- data/spec/unit/provider/package/pkg_spec.rb +22 -0
- data/spec/unit/provider/package/pkgng_spec.rb +12 -0
- data/spec/unit/provider/package/rpm_spec.rb +8 -8
- data/spec/unit/provider/service/smf_spec.rb +13 -11
- data/spec/unit/provider/service/systemd_spec.rb +8 -1
- data/spec/unit/provider/user/useradd_spec.rb +1 -0
- data/spec/unit/puppet_spec.rb +14 -0
- data/spec/unit/resource/catalog_spec.rb +15 -9
- data/spec/unit/resource_spec.rb +20 -17
- data/spec/unit/semver_spec.rb +14 -0
- data/spec/unit/ssl/certificate_authority_spec.rb +12 -1
- data/spec/unit/transaction/additional_resource_generator_spec.rb +11 -0
- data/spec/unit/type/user_spec.rb +32 -6
- data/spec/unit/util/filetype_spec.rb +3 -3
- data/spec/unit/util/yaml_spec.rb +1 -1
- data/spec/unit/util_spec.rb +10 -2
- data/tasks/i18n.rake +20 -0
- metadata +2661 -2595
- data/lib/puppet/data_providers/lookup_adapter.rb +0 -254
- data/lib/puppet/vendor/load_semantic.rb +0 -1
- data/lib/puppet/vendor/semantic/Gemfile +0 -20
- data/lib/puppet/vendor/semantic/PUPPET_README.md +0 -6
- data/lib/puppet/vendor/semantic/Rakefile +0 -69
- data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +0 -60
- data/lib/puppet/vendor/semantic/lib/semantic.rb +0 -7
- data/lib/puppet/vendor/semantic/spec/spec_helper.rb +0 -24
- data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_node_spec.rb +0 -141
- data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_spec.rb +0 -162
- data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/module_release_spec.rb +0 -143
- data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/source_spec.rb +0 -5
- data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/unsatisfiable_graph_spec.rb +0 -44
- data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency_spec.rb +0 -383
- data/lib/puppet/vendor/semantic/spec/unit/semantic/version_range_spec.rb +0 -307
- data/lib/puppet/vendor/semantic/spec/unit/semantic/version_spec.rb +0 -608
- 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
|