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
data/lib/puppet/pops/loaders.rb
CHANGED
@@ -17,16 +17,16 @@ class Loaders
|
|
17
17
|
attr_reader :private_environment_loader
|
18
18
|
attr_reader :implementation_registry
|
19
19
|
|
20
|
-
def self.new(environment)
|
20
|
+
def self.new(environment, for_agent = false)
|
21
21
|
obj = environment.loaders
|
22
22
|
if obj.nil?
|
23
23
|
obj = self.allocate
|
24
|
-
obj.send(:initialize, environment)
|
24
|
+
obj.send(:initialize, environment, for_agent)
|
25
25
|
end
|
26
26
|
obj
|
27
27
|
end
|
28
28
|
|
29
|
-
def initialize(environment)
|
29
|
+
def initialize(environment, for_agent)
|
30
30
|
# Protect against environment havoc
|
31
31
|
raise ArgumentError.new("Attempt to redefine already initialized loaders for environment") unless environment.loaders.nil?
|
32
32
|
environment.loaders = self
|
@@ -47,12 +47,16 @@ class Loaders
|
|
47
47
|
# concept of environment the same way as when running as a master (except when doing apply).
|
48
48
|
# The creation mechanisms should probably differ between the two.
|
49
49
|
#
|
50
|
-
@private_environment_loader =
|
50
|
+
@private_environment_loader = if for_agent
|
51
|
+
add_loader_by_name(Loader::SimpleEnvironmentLoader.new(@puppet_system_loader, 'agent environment'))
|
52
|
+
else
|
53
|
+
create_environment_loader(environment)
|
54
|
+
end
|
51
55
|
|
52
56
|
# 3. The implementation registry maintains mappings between Puppet types and Runtime types for
|
53
57
|
# the current environment
|
54
58
|
@implementation_registry = Types::ImplementationRegistry.new(@private_environment_loader)
|
55
|
-
Pcore.init(@puppet_system_loader, @implementation_registry)
|
59
|
+
Pcore.init(@puppet_system_loader, @implementation_registry, for_agent)
|
56
60
|
|
57
61
|
# 4. module loaders are set up from the create_environment_loader, they register themselves
|
58
62
|
end
|
@@ -106,15 +110,30 @@ class Loaders
|
|
106
110
|
# @api private
|
107
111
|
def self.register_runtime3_type(name, origin)
|
108
112
|
loaders = Puppet.lookup(:loaders) { nil }
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
113
|
+
return nil if loaders.nil?
|
114
|
+
|
115
|
+
rt3_loader = loaders.runtime3_type_loader
|
116
|
+
return nil if rt3_loader.nil?
|
117
|
+
|
118
|
+
name = name.to_s
|
119
|
+
caps_name = Types::TypeFormatter.singleton.capitalize_segments(name)
|
120
|
+
typed_name = Loader::TypedName.new(:type, name.downcase)
|
121
|
+
rt3_loader.set_entry(typed_name, Types::PResourceType.new(caps_name), origin)
|
115
122
|
nil
|
116
123
|
end
|
117
124
|
|
125
|
+
# Finds a loader to use when deserializing a catalog and then subsequenlty use user
|
126
|
+
# defined types found in that catalog.
|
127
|
+
#
|
128
|
+
def self.catalog_loader
|
129
|
+
loaders = Puppet.lookup(:loaders) { nil }
|
130
|
+
if loaders.nil?
|
131
|
+
loaders = Loaders.new(Puppet.lookup(:current_environment), true)
|
132
|
+
Puppet.push_context(:loaders => loaders)
|
133
|
+
end
|
134
|
+
loaders.find_loader(nil)
|
135
|
+
end
|
136
|
+
|
118
137
|
# Finds the `Loaders` instance by looking up the :loaders in the global Puppet context
|
119
138
|
#
|
120
139
|
# @return [Loaders] the loaders instance
|
@@ -241,7 +260,7 @@ class Loaders
|
|
241
260
|
loader = add_loader_by_name(Loader::SimpleEnvironmentLoader.new(@runtime3_type_loader, loader_name))
|
242
261
|
else
|
243
262
|
# View the environment as a module to allow loading from it - this module is always called 'environment'
|
244
|
-
loader = Loader::ModuleLoaders.
|
263
|
+
loader = Loader::ModuleLoaders.environment_loader_from(@runtime3_type_loader, self, env_path)
|
245
264
|
end
|
246
265
|
|
247
266
|
# An environment has a module path even if it has a null loader
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require_relative 'hiera_config'
|
2
|
+
require_relative 'data_provider'
|
3
|
+
|
4
|
+
module Puppet::Pops
|
5
|
+
module Lookup
|
6
|
+
# @api private
|
7
|
+
class ConfiguredDataProvider
|
8
|
+
include DataProvider
|
9
|
+
|
10
|
+
# @param config [HieraConfig,nil] the configuration
|
11
|
+
def initialize(config = nil)
|
12
|
+
@config = config.nil? ? nil : assert_config_version(config)
|
13
|
+
end
|
14
|
+
|
15
|
+
def config(lookup_invocation)
|
16
|
+
@config ||= assert_config_version(HieraConfig.create(configuration_path(lookup_invocation)))
|
17
|
+
end
|
18
|
+
|
19
|
+
# @return [Pathname] the path to the configuration
|
20
|
+
def config_path
|
21
|
+
@config.nil? ? nil : @config.config_path
|
22
|
+
end
|
23
|
+
|
24
|
+
# @return [String] the name of this provider
|
25
|
+
def name
|
26
|
+
n = "#{place} "
|
27
|
+
n << '"' << module_name << '" ' unless module_name.nil?
|
28
|
+
n << 'Data Provider'
|
29
|
+
n << " (#{@config.name})" unless @config.nil?
|
30
|
+
n
|
31
|
+
end
|
32
|
+
|
33
|
+
# Performs a lookup by searching all configured locations for the given _key_. A merge will be performed if
|
34
|
+
# the value is found in more than one location.
|
35
|
+
#
|
36
|
+
# @param key [String] The key to lookup
|
37
|
+
# @param lookup_invocation [Invocation] The current lookup invocation
|
38
|
+
# @param merge [MergeStrategy,String,Hash{String => Object},nil] Merge strategy, merge strategy name, strategy and options hash, or nil (implies "first found")
|
39
|
+
# @return [Object] the found object
|
40
|
+
# @throw :no_such_key when the object is not found
|
41
|
+
def unchecked_key_lookup(key, lookup_invocation, merge)
|
42
|
+
lookup_invocation.with(:data_provider, self) do
|
43
|
+
merge_strategy = MergeStrategy.strategy(merge)
|
44
|
+
dps = data_providers(lookup_invocation)
|
45
|
+
if dps.empty?
|
46
|
+
lookup_invocation.report_not_found(key)
|
47
|
+
throw :no_such_key
|
48
|
+
end
|
49
|
+
merge_strategy.lookup(data_providers(lookup_invocation), lookup_invocation) do |data_provider|
|
50
|
+
data_provider.unchecked_key_lookup(key, lookup_invocation, merge_strategy)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
protected
|
56
|
+
|
57
|
+
# Assert that the given config version is accepted by this data provider.
|
58
|
+
#
|
59
|
+
# @param config [HieraConfig] the configuration to check
|
60
|
+
# @return [HieraConfig] the argument
|
61
|
+
# @raise [Puppet::DataBinding::LookupError] if the configuration version is unacceptable
|
62
|
+
def assert_config_version(config)
|
63
|
+
config
|
64
|
+
end
|
65
|
+
|
66
|
+
# Return the root of the configured entity
|
67
|
+
#
|
68
|
+
# @param lookup_invocation [Invocation] The current lookup invocation
|
69
|
+
# @return [Pathname] Path to root of the module
|
70
|
+
# @raise [Puppet::DataBinding::LookupError] if the given module is can not be found
|
71
|
+
#
|
72
|
+
def provider_root(lookup_invocation)
|
73
|
+
raise NotImplementedError, "#{self.class.name} must implement method '#provider_root'"
|
74
|
+
end
|
75
|
+
|
76
|
+
def configuration_path(lookup_invocation)
|
77
|
+
provider_root(lookup_invocation) + HieraConfig::CONFIG_FILE_NAME
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
def data_providers(lookup_invocation)
|
83
|
+
config(lookup_invocation).configured_data_providers(lookup_invocation, self)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -1,86 +1,136 @@
|
|
1
|
+
require_relative 'interpolation'
|
2
|
+
|
1
3
|
module Puppet::Pops
|
2
|
-
|
3
|
-
|
4
|
-
|
4
|
+
module Lookup
|
5
|
+
# A FunctionContext is created for each unique hierarchy entry and adapted to the Compiler (and hence shares
|
6
|
+
# the compiler's life-cycle).
|
7
|
+
# @api private
|
8
|
+
class FunctionContext
|
9
|
+
include Interpolation
|
5
10
|
|
6
|
-
|
7
|
-
|
8
|
-
end
|
11
|
+
attr_reader :environment_name, :module_name, :function
|
12
|
+
attr_accessor :data_hash
|
9
13
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
Types::KEY_VALUE => nil
|
18
|
-
}
|
19
|
-
},
|
20
|
-
{
|
21
|
-
'not_found' => tf.callable([0, 0], tf.undef),
|
22
|
-
'explain' => tf.callable([0, 0, tf.callable(0,0)], tf.undef),
|
23
|
-
'cache' => tf.callable([tf.scalar, tf.any], tf.undef),
|
24
|
-
'cache_all' => tf.callable([tf.hash_kv(tf.scalar, tf.any)], tf.undef),
|
25
|
-
'cached_value' => tf.callable([tf.scalar], tf.any),
|
26
|
-
'cached_entries' => tf.variant(
|
27
|
-
tf.callable([0, 0, tf.callable(1,1)], tf.undef),
|
28
|
-
tf.callable([0, 0, tf.callable(2,2)], tf.undef),
|
29
|
-
tf.callable([0, 0], tf.iterable(tf.tuple([tf.scalar, tf.any])))
|
30
|
-
)
|
31
|
-
}
|
32
|
-
).resolve(Types::TypeParser.singleton, loader)
|
33
|
-
end
|
34
|
-
|
35
|
-
attr_reader :environment_name
|
36
|
-
attr_reader :module_name
|
14
|
+
def initialize(environment_name, module_name, function)
|
15
|
+
@data_hash = nil
|
16
|
+
@cache = {}
|
17
|
+
@environment_name = environment_name
|
18
|
+
@module_name = module_name
|
19
|
+
@function = function
|
20
|
+
end
|
37
21
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
@module_name = module_name
|
42
|
-
@cache = {}
|
43
|
-
end
|
22
|
+
def cache(key, value)
|
23
|
+
@cache[key] = value
|
24
|
+
end
|
44
25
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
26
|
+
def cache_all(hash)
|
27
|
+
@cache.merge!(hash)
|
28
|
+
nil
|
29
|
+
end
|
49
30
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
end
|
31
|
+
def cache_has_key(key)
|
32
|
+
@cache.include?(key)
|
33
|
+
end
|
54
34
|
|
55
|
-
|
56
|
-
|
57
|
-
|
35
|
+
def cached_value(key)
|
36
|
+
@cache[key]
|
37
|
+
end
|
58
38
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
yield(*enumerator.next)
|
66
|
-
else
|
67
|
-
yield(enumerator.next)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
nil
|
39
|
+
def cached_entries(&block)
|
40
|
+
if block_given?
|
41
|
+
enumerator = @cache.each_pair
|
42
|
+
@cache.size.times do
|
43
|
+
if block.arity == 2
|
44
|
+
yield(*enumerator.next)
|
71
45
|
else
|
72
|
-
|
46
|
+
yield(enumerator.next)
|
73
47
|
end
|
74
48
|
end
|
49
|
+
nil
|
50
|
+
else
|
51
|
+
Types::Iterable.on(@cache)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
75
55
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
56
|
+
# The Context is created once for each call to a function. It provides a combination of the {Invocation} object needed
|
57
|
+
# to provide explanation support and the {FunctionContext} object needed to provide the private cache.
|
58
|
+
# The {Context} is part of the public API. It will be passed to a _data_hash_, _data_dig_, or _lookup_key_ function and its
|
59
|
+
# attributes and methods can be used in a Puppet function as well as in a Ruby function.
|
60
|
+
# The {Context} is maps to the Pcore type 'Puppet::LookupContext'
|
61
|
+
#
|
62
|
+
# @api public
|
63
|
+
class Context
|
64
|
+
include Types::PuppetObject
|
65
|
+
extend Forwardable
|
80
66
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
67
|
+
def self._ptype
|
68
|
+
@type
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.register_ptype(loader, ir)
|
72
|
+
tf = Types::TypeFactory
|
73
|
+
key_type = tf.optional(tf.scalar)
|
74
|
+
@type = Pcore::create_object_type(loader, ir, self, 'Puppet::LookupContext', 'Any',
|
75
|
+
{
|
76
|
+
'environment_name' => Types::PStringType::NON_EMPTY,
|
77
|
+
'module_name' => {
|
78
|
+
Types::KEY_TYPE => tf.optional(Types::PStringType::NON_EMPTY),
|
79
|
+
Types::KEY_VALUE => nil
|
80
|
+
}
|
81
|
+
},
|
82
|
+
{
|
83
|
+
'not_found' => tf.callable([0, 0], tf.undef),
|
84
|
+
'explain' => tf.callable([0, 0, tf.callable(0,0)], tf.undef),
|
85
|
+
'interpolate' => tf.callable(1, 1),
|
86
|
+
'cache' => tf.callable([key_type, tf.any], tf.any),
|
87
|
+
'cache_all' => tf.callable([tf.hash_kv(key_type, tf.any)], tf.undef),
|
88
|
+
'cache_has_key' => tf.callable([key_type], tf.boolean),
|
89
|
+
'cached_value' => tf.callable([key_type], tf.any),
|
90
|
+
'cached_entries' => tf.variant(
|
91
|
+
tf.callable([0, 0, tf.callable(1,1)], tf.undef),
|
92
|
+
tf.callable([0, 0, tf.callable(2,2)], tf.undef),
|
93
|
+
tf.callable([0, 0], tf.iterable(tf.tuple([key_type, tf.any])))
|
94
|
+
)
|
95
|
+
}
|
96
|
+
).resolve(Types::TypeParser.singleton, loader)
|
97
|
+
end
|
98
|
+
|
99
|
+
# Mainly for test purposes. Makes it possible to create a {Context} in Puppet code provided that a current {Invocation} exists.
|
100
|
+
def self.from_asserted_args(environment_name, module_name)
|
101
|
+
new(FunctionContext.new(environment_name, module_name, nil), Invocation.current)
|
102
|
+
end
|
103
|
+
|
104
|
+
# Public methods delegated to the {FunctionContext}
|
105
|
+
def_delegators :@function_context, :cache, :cache_all, :cache_has_key, :cached_value, :cached_entries, :environment_name, :module_name
|
106
|
+
|
107
|
+
def initialize(function_context, lookup_invocation)
|
108
|
+
@lookup_invocation = lookup_invocation
|
109
|
+
@function_context = function_context
|
110
|
+
end
|
111
|
+
|
112
|
+
# Will call the given block to obtain a textual explanation if explanation support is active.
|
113
|
+
#
|
114
|
+
def explain(&block)
|
115
|
+
@lookup_invocation.report_text(&block)
|
116
|
+
nil
|
117
|
+
end
|
118
|
+
|
119
|
+
# Resolve interpolation expressions in the given value
|
120
|
+
# @param [Object] value
|
121
|
+
# @return [Object] the value with all interpolation expressions resolved
|
122
|
+
def interpolate(value)
|
123
|
+
@function_context.interpolate(value, @lookup_invocation, true)
|
124
|
+
end
|
125
|
+
|
126
|
+
def not_found
|
127
|
+
throw :no_such_key
|
85
128
|
end
|
129
|
+
|
130
|
+
# @api private
|
131
|
+
def invocation
|
132
|
+
@lookup_invocation
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
86
136
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Puppet::Pops
|
2
|
+
module Lookup
|
3
|
+
# A class that adapts a Hash
|
4
|
+
# @api private
|
5
|
+
class DataAdapter < Adaptable::Adapter
|
6
|
+
def self.create_adapter(o)
|
7
|
+
new
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@data = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def [](name)
|
15
|
+
@data[name]
|
16
|
+
end
|
17
|
+
|
18
|
+
def include?(name)
|
19
|
+
@data.include? name
|
20
|
+
end
|
21
|
+
|
22
|
+
def []=(name, value)
|
23
|
+
@data[name] = value
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require_relative 'function_provider'
|
2
|
+
|
3
|
+
module Puppet::Pops
|
4
|
+
module Lookup
|
5
|
+
# @api private
|
6
|
+
class DataDigFunctionProvider < FunctionProvider
|
7
|
+
TAG = 'data_dig'.freeze
|
8
|
+
|
9
|
+
# Performs a lookup with the assumption that a recursive check has been made.
|
10
|
+
#
|
11
|
+
# @param key [LookupKey] The key to lookup
|
12
|
+
# @param lookup_invocation [Invocation] The current lookup invocation
|
13
|
+
# @param merge [MergeStrategy,String,Hash{String => Object},nil] Merge strategy, merge strategy name, strategy and options hash, or nil (implies "first found")
|
14
|
+
# @return [Object] the found object
|
15
|
+
# @throw :no_such_key when the object is not found
|
16
|
+
def unchecked_key_lookup(key, lookup_invocation, merge)
|
17
|
+
segments = key.to_a
|
18
|
+
lookup_invocation.with(:data_provider, self) do
|
19
|
+
MergeStrategy.strategy(merge).lookup(locations, lookup_invocation) do |location|
|
20
|
+
if location.nil?
|
21
|
+
value = data_dig(key, segments, lookup_invocation, nil)
|
22
|
+
lookup_invocation.report_found(key, validate_data_value(self, value))
|
23
|
+
key.undig(value)
|
24
|
+
else
|
25
|
+
lookup_invocation.with(:location, location) do
|
26
|
+
if location.exist?
|
27
|
+
value = data_dig(key, segments, lookup_invocation, location.location)
|
28
|
+
lookup_invocation.report_found(key, validate_data_value(self, value))
|
29
|
+
key.undig(value)
|
30
|
+
else
|
31
|
+
lookup_invocation.report_path_not_found
|
32
|
+
throw :no_such_key
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def data_dig(key, segments, lookup_invocation, location)
|
43
|
+
ctx = function_context(lookup_invocation, location)
|
44
|
+
ctx.data_hash ||= {}
|
45
|
+
catch(:no_such_key) do
|
46
|
+
hash = ctx.data_hash
|
47
|
+
hash[key] = ctx.function.call(lookup_invocation.scope, segments, options(location), Context.new(ctx, lookup_invocation)) unless hash.include?(key)
|
48
|
+
return hash[key]
|
49
|
+
end
|
50
|
+
lookup_invocation.report_not_found(key)
|
51
|
+
throw :no_such_key
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require_relative 'function_provider'
|
2
|
+
require_relative 'interpolation'
|
3
|
+
|
4
|
+
module Puppet::Pops
|
5
|
+
module Lookup
|
6
|
+
# @api private
|
7
|
+
class DataHashFunctionProvider < FunctionProvider
|
8
|
+
include SubLookup
|
9
|
+
include Interpolation
|
10
|
+
|
11
|
+
TAG = 'data_hash'.freeze
|
12
|
+
|
13
|
+
# Performs a lookup with the assumption that a recursive check has been made.
|
14
|
+
#
|
15
|
+
# @param key [LookupKey] The key to lookup
|
16
|
+
# @param lookup_invocation [Invocation] The current lookup invocation
|
17
|
+
# @param merge [MergeStrategy,String,Hash{String => Object},nil] Merge strategy, merge strategy name, strategy and options hash, or nil (implies "first found")
|
18
|
+
# @return [Object] the found object
|
19
|
+
# @throw :no_such_key when the object is not found
|
20
|
+
def unchecked_key_lookup(key, lookup_invocation, merge)
|
21
|
+
root_key = key.root_key
|
22
|
+
lookup_invocation.with(:data_provider, self) do
|
23
|
+
MergeStrategy.strategy(merge).lookup(locations, lookup_invocation) do |location|
|
24
|
+
invoke_with_location(lookup_invocation, location, root_key)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def invoke_with_location(lookup_invocation, location, root_key)
|
32
|
+
if location.nil?
|
33
|
+
lookup_key(lookup_invocation, nil, root_key)
|
34
|
+
else
|
35
|
+
lookup_invocation.with(:location, location) do
|
36
|
+
if location.exist?
|
37
|
+
lookup_key(lookup_invocation, location.location, root_key)
|
38
|
+
else
|
39
|
+
lookup_invocation.report_location_not_found
|
40
|
+
throw :no_such_key
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def lookup_key(lookup_invocation, location, root_key)
|
47
|
+
lookup_invocation.report_found(root_key, data_value(lookup_invocation, location, root_key))
|
48
|
+
end
|
49
|
+
|
50
|
+
def data_value(lookup_invocation, location, root_key)
|
51
|
+
hash = data_hash(lookup_invocation, location)
|
52
|
+
value = hash[root_key]
|
53
|
+
if value.nil? && !hash.include?(root_key)
|
54
|
+
lookup_invocation.report_not_found(root_key)
|
55
|
+
throw :no_such_key
|
56
|
+
end
|
57
|
+
interpolate(value, lookup_invocation, true)
|
58
|
+
end
|
59
|
+
|
60
|
+
def data_hash(lookup_invocation, location)
|
61
|
+
ctx = function_context(lookup_invocation, location)
|
62
|
+
ctx.data_hash ||= parent_data_provider.validate_data_hash(self, call_data_hash_function(ctx, lookup_invocation, location))
|
63
|
+
end
|
64
|
+
|
65
|
+
def call_data_hash_function(ctx, lookup_invocation, location)
|
66
|
+
ctx.function.call(lookup_invocation.scope, options(location), Context.new(ctx, lookup_invocation))
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# @api private
|
71
|
+
class V3DataHashFunctionProvider < DataHashFunctionProvider
|
72
|
+
TAG = 'v3_data_hash'.freeze
|
73
|
+
|
74
|
+
def initialize(name, parent_data_provider, function_name, options, locations)
|
75
|
+
@datadir = options.delete(HieraConfig::KEY_DATADIR)
|
76
|
+
super
|
77
|
+
end
|
78
|
+
|
79
|
+
def unchecked_key_lookup(key, lookup_invocation, merge)
|
80
|
+
extra_paths = lookup_invocation.hiera_v3_location_overrides
|
81
|
+
if extra_paths.nil? || extra_paths.empty?
|
82
|
+
super
|
83
|
+
else
|
84
|
+
# Extra paths provided. Must be resolved and placed in front of known paths
|
85
|
+
paths = parent_data_provider.config(lookup_invocation).resolve_paths(@datadir, extra_paths, lookup_invocation, false, ".#{@name}")
|
86
|
+
all_locations = paths + locations
|
87
|
+
root_key = key.root_key
|
88
|
+
lookup_invocation.with(:data_provider, self) do
|
89
|
+
MergeStrategy.strategy(merge).lookup(all_locations, lookup_invocation) do |location|
|
90
|
+
invoke_with_location(lookup_invocation, location, root_key)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# TODO: API 5.0, remove this class
|
98
|
+
# @api private
|
99
|
+
class V4DataHashFunctionProvider < DataHashFunctionProvider
|
100
|
+
TAG = 'v4_data_hash'.freeze
|
101
|
+
|
102
|
+
def name
|
103
|
+
"deprecated API function \"#{function_name}\""
|
104
|
+
end
|
105
|
+
|
106
|
+
def call_data_hash_function(ctx, lookup_invocation, location)
|
107
|
+
ctx.function.call(lookup_invocation.scope)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
module Puppet::Pops
|
2
|
+
module Lookup
|
3
|
+
# @api private
|
4
|
+
module DataProvider
|
5
|
+
def self.key_type
|
6
|
+
ensure_types_initialized
|
7
|
+
@key_type
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.value_type
|
11
|
+
ensure_types_initialized
|
12
|
+
@value_type
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.ensure_types_initialized
|
16
|
+
if @key_type.nil?
|
17
|
+
(@key_type, @value_type) = Pcore::register_aliases(
|
18
|
+
# The Pcore type for all keys and subkeys in a data hash.
|
19
|
+
'Puppet::LookupKey' => 'Variant[String,Numeric]',
|
20
|
+
|
21
|
+
# The Pcore type for all values and sub-values in a data hash. The
|
22
|
+
# type is self-recursive to enforce the same constraint on values contained
|
23
|
+
# in arrays and hashes
|
24
|
+
'Puppet::LookupValue' => <<-PUPPET
|
25
|
+
Variant[
|
26
|
+
Scalar,
|
27
|
+
Undef,
|
28
|
+
Sensitive,
|
29
|
+
Type,
|
30
|
+
Hash[Puppet::LookupKey, Puppet::LookupValue],
|
31
|
+
Array[Puppet::LookupValue]
|
32
|
+
]
|
33
|
+
PUPPET
|
34
|
+
)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Performs a lookup with an endless recursion check.
|
39
|
+
#
|
40
|
+
# @param key [LookupKey] The key to lookup
|
41
|
+
# @param lookup_invocation [Invocation] The current lookup invocation
|
42
|
+
# @param merge [MergeStrategy,String,Hash{String=>Object},nil] Merge strategy or hash with strategy and options
|
43
|
+
#
|
44
|
+
def key_lookup(key, lookup_invocation, merge)
|
45
|
+
lookup_invocation.check(key.to_s) { unchecked_key_lookup(key, lookup_invocation, merge) }
|
46
|
+
end
|
47
|
+
|
48
|
+
def lookup(key, lookup_invocation, merge)
|
49
|
+
lookup_invocation.check(key.to_s) { unchecked_key_lookup(key, lookup_invocation, merge) }
|
50
|
+
end
|
51
|
+
|
52
|
+
# Performs a lookup with the assumption that a recursive check has been made.
|
53
|
+
#
|
54
|
+
# @param key [LookupKey] The key to lookup
|
55
|
+
# @param lookup_invocation [Invocation] The current lookup invocation
|
56
|
+
# @param merge [MergeStrategy,String,Hash{String => Object},nil] Merge strategy, merge strategy name, strategy and options hash, or nil (implies "first found")
|
57
|
+
# @return [Object] the found object
|
58
|
+
# @throw :no_such_key when the object is not found
|
59
|
+
def unchecked_key_lookup(key, lookup_invocation, merge)
|
60
|
+
raise NotImplementedError, "Subclass of #{DataProvider.name} must implement 'unchecked_lookup' method"
|
61
|
+
end
|
62
|
+
|
63
|
+
# @return [String,nil] the name of the module that this provider belongs to nor `nil` if it doesn't belong to a module
|
64
|
+
def module_name
|
65
|
+
nil
|
66
|
+
end
|
67
|
+
|
68
|
+
# @return [String] the name of the this data provider
|
69
|
+
def name
|
70
|
+
raise NotImplementedError, "Subclass of #{DataProvider.name} must implement 'name' method"
|
71
|
+
end
|
72
|
+
|
73
|
+
# Asserts that _data_hash_ is a valid hash.
|
74
|
+
#
|
75
|
+
# @param data_provider [DataProvider] The data provider that produced the hash
|
76
|
+
# @param data_hash [Hash{String=>Object}] The data hash
|
77
|
+
# @return [Hash{String=>Object}] The data hash
|
78
|
+
def validate_data_hash(data_provider, data_hash)
|
79
|
+
Types::TypeAsserter.assert_instance_of(nil, Types::PHashType::DEFAULT, data_hash) { "Value returned from #{data_provider.name}" }
|
80
|
+
data_hash.each_pair { |k, v| validate_data_entry(data_provider, k, v) }
|
81
|
+
data_hash
|
82
|
+
end
|
83
|
+
|
84
|
+
def validate_data_value(data_provider, value, where = '')
|
85
|
+
Types::TypeAsserter.assert_instance_of(nil, DataProvider.value_type, value) { "Value #{where}returned from #{data_provider.name}" }
|
86
|
+
case value
|
87
|
+
when Hash
|
88
|
+
value.each_pair { |k, v| validate_data_entry(data_provider, k, v) }
|
89
|
+
when Array
|
90
|
+
value.each {|v| validate_data_value(data_provider, v, 'in array ') }
|
91
|
+
end
|
92
|
+
value
|
93
|
+
end
|
94
|
+
|
95
|
+
def validate_data_entry(data_provider, key, value)
|
96
|
+
Types::TypeAsserter.assert_instance_of(nil, DataProvider.key_type, key) { "Key in hash returned from #{data_provider.name}" }
|
97
|
+
validate_data_value(data_provider, value, 'in hash ')
|
98
|
+
nil
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|