puppet 4.2.0 → 4.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CONTRIBUTING.md +1 -1
- data/Gemfile +5 -7
- data/README.md +1 -1
- data/Rakefile +20 -0
- data/ext/debian/puppet.init +0 -1
- data/ext/debian/puppet.logrotate +14 -5
- data/ext/osx/puppet.plist +2 -4
- data/ext/project_data.yaml +1 -1
- data/ext/redhat/client.init +65 -12
- data/ext/redhat/logrotate +15 -3
- data/ext/redhat/puppet.spec.erb +5 -1
- data/ext/redhat/server.init +1 -1
- data/ext/solaris/smf/puppet +44 -0
- data/ext/solaris/smf/puppet.xml +44 -0
- data/ext/suse/client.init +27 -27
- data/ext/suse/server.init +2 -2
- data/ext/systemd/puppet.service +1 -0
- data/install.rb +21 -39
- data/lib/hiera/puppet_function.rb +5 -5
- data/lib/puppet/agent/locker.rb +11 -2
- data/lib/puppet/agent.rb +4 -4
- data/lib/puppet/application/agent.rb +28 -14
- data/lib/puppet/application/apply.rb +17 -4
- data/lib/puppet/application/cert.rb +16 -0
- data/lib/puppet/application/filebucket.rb +78 -4
- data/lib/puppet/application/lookup.rb +356 -0
- data/lib/puppet/application/master.rb +5 -1
- data/lib/puppet/configurer.rb +9 -5
- data/lib/puppet/context/trusted_information.rb +21 -1
- data/lib/puppet/context.rb +16 -1
- data/lib/puppet/daemon.rb +17 -13
- data/lib/puppet/data_binding.rb +4 -2
- data/lib/puppet/data_providers/data_adapter.rb +7 -68
- data/lib/puppet/data_providers/data_function_support.rb +5 -26
- data/lib/puppet/data_providers/function_env_data_provider.rb +0 -10
- data/lib/puppet/data_providers/function_module_data_provider.rb +0 -22
- data/lib/puppet/data_providers/hiera_config.rb +106 -0
- data/lib/puppet/data_providers/hiera_env_data_provider.rb +18 -0
- data/lib/puppet/data_providers/hiera_interpolate.rb +97 -0
- data/lib/puppet/data_providers/hiera_module_data_provider.rb +23 -0
- data/lib/puppet/data_providers/hiera_support.rb +37 -0
- data/lib/puppet/data_providers/json_data_provider_factory.rb +31 -0
- data/lib/puppet/data_providers/lookup_adapter.rb +200 -0
- data/lib/puppet/data_providers/yaml_data_provider_factory.rb +32 -0
- data/lib/puppet/data_providers.rb +12 -13
- data/lib/puppet/defaults.rb +14 -3
- data/lib/puppet/environments.rb +94 -6
- data/lib/puppet/error.rb +4 -0
- data/lib/puppet/face/module/changes.rb +2 -1
- data/lib/puppet/feature/cfacter.rb +1 -0
- data/lib/puppet/file_bucket/dipper.rb +58 -2
- data/lib/puppet/file_system/windows.rb +3 -1
- data/lib/puppet/functions/assert_type.rb +48 -12
- data/lib/puppet/functions/defined.rb +79 -48
- data/lib/puppet/functions/each.rb +85 -27
- data/lib/puppet/functions/epp.rb +29 -37
- data/lib/puppet/functions/filter.rb +60 -25
- data/lib/puppet/functions/hiera.rb +76 -3
- data/lib/puppet/functions/hiera_array.rb +65 -3
- data/lib/puppet/functions/hiera_hash.rb +74 -2
- data/lib/puppet/functions/hiera_include.rb +77 -4
- data/lib/puppet/functions/inline_epp.rb +44 -71
- data/lib/puppet/functions/lookup.rb +19 -17
- data/lib/puppet/functions/map.rb +56 -21
- data/lib/puppet/functions/match.rb +29 -12
- data/lib/puppet/functions/reduce.rb +95 -58
- data/lib/puppet/functions/versioncmp.rb +36 -0
- data/lib/puppet/functions/with.rb +15 -7
- data/lib/puppet/functions.rb +2 -4
- data/lib/puppet/indirector/catalog/compiler.rb +3 -3
- data/lib/puppet/indirector/catalog/static_compiler.rb +46 -30
- data/lib/puppet/indirector/data_binding/none.rb +4 -1
- data/lib/puppet/indirector/file_bucket_file/file.rb +58 -1
- data/lib/puppet/indirector/hiera.rb +4 -0
- data/lib/puppet/indirector/indirection.rb +6 -1
- data/lib/puppet/indirector/json.rb +1 -1
- data/lib/puppet/indirector/msgpack.rb +1 -1
- data/lib/puppet/indirector/request.rb +7 -8
- data/lib/puppet/indirector/resource_type/parser.rb +5 -3
- data/lib/puppet/info_service/class_information_service.rb +111 -0
- data/lib/puppet/info_service.rb +7 -0
- data/lib/puppet/module_tool/applications/unpacker.rb +1 -1
- data/lib/puppet/module_tool/metadata.rb +32 -9
- data/lib/puppet/module_tool/skeleton/templates/generator/README.md.erb +42 -38
- data/lib/puppet/module_tool/skeleton/templates/generator/manifests/init.pp.erb +25 -18
- data/lib/puppet/network/authconfig.rb +21 -1
- data/lib/puppet/network/authorization.rb +8 -1
- data/lib/puppet/network/http/api/master/v3/environment.rb +59 -0
- data/lib/puppet/network/http/api/master/v3.rb +7 -1
- data/lib/puppet/node/environment.rb +9 -2
- data/lib/puppet/node.rb +11 -5
- data/lib/puppet/parser/ast/pops_bridge.rb +39 -1
- data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +64 -0
- data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +38 -0
- data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +20 -0
- data/lib/puppet/parser/compiler/catalog_validator.rb +33 -0
- data/lib/puppet/parser/compiler.rb +300 -12
- data/lib/puppet/parser/environment_compiler.rb +165 -0
- data/lib/puppet/parser/functions/assert_type.rb +46 -16
- data/lib/puppet/parser/functions/defined.rb +105 -68
- data/lib/puppet/parser/functions/each.rb +85 -27
- data/lib/puppet/parser/functions/epp.rb +29 -37
- data/lib/puppet/parser/functions/filter.rb +59 -23
- data/lib/puppet/parser/functions/hiera.rb +83 -27
- data/lib/puppet/parser/functions/hiera_array.rb +71 -28
- data/lib/puppet/parser/functions/hiera_hash.rb +81 -30
- data/lib/puppet/parser/functions/hiera_include.rb +81 -40
- data/lib/puppet/parser/functions/inline_epp.rb +35 -60
- data/lib/puppet/parser/functions/inline_template.rb +2 -2
- data/lib/puppet/parser/functions/map.rb +55 -20
- data/lib/puppet/parser/functions/match.rb +27 -12
- data/lib/puppet/parser/functions/reduce.rb +97 -60
- data/lib/puppet/parser/functions/with.rb +16 -8
- data/lib/puppet/parser/resource.rb +103 -21
- data/lib/puppet/parser.rb +3 -0
- data/lib/puppet/plugins/configuration.rb +3 -2
- data/lib/puppet/plugins/data_providers/data_provider.rb +283 -0
- data/lib/puppet/plugins/data_providers/registry.rb +84 -0
- data/lib/puppet/plugins/data_providers.rb +12 -60
- data/lib/puppet/pops/adapters.rb +12 -0
- data/lib/puppet/pops/binder/binder.rb +2 -2
- data/lib/puppet/pops/binder/bindings_checker.rb +1 -1
- data/lib/puppet/pops/binder/bindings_label_provider.rb +3 -1
- data/lib/puppet/pops/binder/bindings_loader.rb +6 -2
- data/lib/puppet/pops/binder/bindings_model_meta.rb +2 -2
- data/lib/puppet/pops/binder/config/binder_config.rb +1 -1
- data/lib/puppet/pops/binder/injector.rb +4 -4
- data/lib/puppet/pops/binder/key_factory.rb +3 -9
- data/lib/puppet/pops/binder/scheme_handler/module_scheme.rb +68 -9
- data/lib/puppet/pops/evaluator/access_operator.rb +27 -60
- data/lib/puppet/pops/evaluator/closure.rb +8 -8
- data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -1
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +10 -6
- data/lib/puppet/pops/evaluator/literal_evaluator.rb +87 -0
- data/lib/puppet/pops/evaluator/relationship_operator.rb +7 -1
- data/lib/puppet/pops/functions/dispatcher.rb +3 -3
- data/lib/puppet/pops/issues.rb +11 -3
- data/lib/puppet/pops/label_provider.rb +1 -1
- data/lib/puppet/pops/lookup/explainer.rb +402 -0
- data/lib/puppet/pops/lookup/invocation.rb +117 -0
- data/lib/puppet/pops/lookup.rb +25 -47
- data/lib/puppet/pops/merge_strategy.rb +73 -5
- data/lib/puppet/pops/model/factory.rb +38 -3
- data/lib/puppet/pops/model/model_label_provider.rb +10 -1
- data/lib/puppet/pops/model/model_meta.rb +19 -1
- data/lib/puppet/pops/model/model_tree_dumper.rb +18 -0
- data/lib/puppet/pops/parser/code_merger.rb +13 -1
- data/lib/puppet/pops/parser/egrammar.ra +65 -2
- data/lib/puppet/pops/parser/eparser.rb +1569 -1241
- data/lib/puppet/pops/parser/lexer2.rb +32 -1
- data/lib/puppet/pops/parser/locator.rb +1 -1
- data/lib/puppet/pops/parser/parser_support.rb +25 -13
- data/lib/puppet/pops/patterns.rb +3 -0
- data/lib/puppet/pops/types/enumeration.rb +1 -2
- data/lib/puppet/pops/types/type_asserter.rb +16 -15
- data/lib/puppet/pops/types/type_assertion_error.rb +1 -0
- data/lib/puppet/pops/types/type_calculator.rb +171 -1020
- data/lib/puppet/pops/types/type_factory.rb +87 -148
- data/lib/puppet/pops/types/type_mismatch_describer.rb +743 -0
- data/lib/puppet/pops/types/type_parser.rb +118 -129
- data/lib/puppet/pops/types/types.rb +1394 -255
- data/lib/puppet/pops/types/types_meta.rb +0 -234
- data/lib/puppet/pops/validation/checker4_0.rb +49 -1
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +3 -1
- data/lib/puppet/pops/validation.rb +7 -2
- data/lib/puppet/pops.rb +19 -17
- data/lib/puppet/provider/augeas/augeas.rb +50 -0
- data/lib/puppet/provider/exec.rb +6 -1
- data/lib/puppet/provider/group/directoryservice.rb +10 -0
- data/lib/puppet/provider/package/dnf.rb +41 -0
- data/lib/puppet/provider/package/gem.rb +7 -2
- data/lib/puppet/provider/package/nim.rb +1 -1
- data/lib/puppet/provider/package/rpm.rb +1 -0
- data/lib/puppet/provider/package/windows/exe_package.rb +10 -8
- data/lib/puppet/provider/package/windows/msi_package.rb +4 -3
- data/lib/puppet/provider/package/windows/package.rb +9 -1
- data/lib/puppet/provider/package/yum.rb +20 -9
- data/lib/puppet/provider/service/bsd.rb +1 -1
- data/lib/puppet/provider/service/debian.rb +21 -0
- data/lib/puppet/provider/service/init.rb +6 -0
- data/lib/puppet/provider/service/launchd.rb +36 -7
- data/lib/puppet/provider/service/rcng.rb +51 -0
- data/lib/puppet/provider/service/redhat.rb +2 -1
- data/lib/puppet/provider/service/smf.rb +43 -2
- data/lib/puppet/provider/service/src.rb +27 -0
- data/lib/puppet/provider/service/systemd.rb +25 -5
- data/lib/puppet/provider/sshkey/parsed.rb +19 -9
- data/lib/puppet/provider/zone/solaris.rb +2 -2
- data/lib/puppet/reference/configuration.rb +10 -4
- data/lib/puppet/reference/report.rb +9 -12
- data/lib/puppet/reports.rb +5 -1
- data/lib/puppet/resource/capability_finder.rb +95 -0
- data/lib/puppet/resource/catalog.rb +47 -7
- data/lib/puppet/resource/status.rb +0 -2
- data/lib/puppet/resource/type.rb +238 -44
- data/lib/puppet/resource/type_collection.rb +60 -2
- data/lib/puppet/resource.rb +50 -73
- data/lib/puppet/settings/file_setting.rb +10 -9
- data/lib/puppet/settings.rb +2 -2
- data/lib/puppet/ssl/certificate_authority/interface.rb +2 -2
- data/lib/puppet/ssl/oids.rb +9 -1
- data/lib/puppet/transaction/additional_resource_generator.rb +71 -8
- data/lib/puppet/transaction/resource_harness.rb +9 -4
- data/lib/puppet/transaction.rb +8 -1
- data/lib/puppet/type/augeas.rb +8 -0
- data/lib/puppet/type/file/source.rb +14 -12
- data/lib/puppet/type/package.rb +9 -6
- data/lib/puppet/type/user.rb +4 -2
- data/lib/puppet/type.rb +78 -7
- data/lib/puppet/util/command_line.rb +4 -0
- data/lib/puppet/util/execution.rb +18 -2
- data/lib/puppet/util/tagging.rb +7 -1
- data/lib/puppet/util/windows/adsi.rb +5 -2
- data/lib/puppet/util/windows/security.rb +4 -1
- data/lib/puppet/util/windows/taskscheduler.rb +1 -1
- data/lib/puppet/util.rb +9 -1
- data/lib/puppet/version.rb +1 -1
- data/lib/puppet.rb +12 -0
- data/spec/fixtures/unit/application/environments/production/data/common.yaml +3 -0
- data/spec/fixtures/unit/application/environments/production/environment.conf +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/data/bad.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/hiera.yaml +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/manifests/site.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/data/bad.yaml +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/hiera.yaml +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/manifests/site.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/data/common.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/manifests/site.pp +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/data/common.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/manifests/init.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/metadata.json +9 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/first.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/name.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/second.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/single.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data2/single.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/hiera.yaml +18 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/manifests/site.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +46 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/manifests/site.pp +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/data/common.yaml +30 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/manifests/init.pp +13 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/metadata.json +9 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/manifests/site.pp +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/first.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/name.yaml +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/second.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/single.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data2/single.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/hiera.yaml +18 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/manifests/init.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/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/lib/puppet_x/helindbe/sample_module_data.rb +1 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +3 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/hiera.yaml +8 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/manifests/init.pp +5 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/manifests/init.pp +3 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +10 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +23 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/manifests/init.pp +3 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/metadata.json +9 -0
- data/spec/fixtures/unit/provider/package/yum/yum-check-update-security.txt +184 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +24 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +24 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_post/should_yield_to_the_block.yml +24 -0
- data/spec/integration/data_binding_spec.rb +229 -0
- data/spec/integration/file_bucket/file_spec.rb +2 -2
- data/spec/integration/parser/compiler_spec.rb +30 -24
- data/spec/integration/parser/resource_expressions_spec.rb +4 -4
- data/spec/integration/parser/undef_param_spec.rb +1 -1
- data/spec/integration/provider/package_spec.rb +3 -1
- data/spec/integration/resource/catalog_spec.rb +1 -1
- data/spec/integration/ssl/certificate_authority_spec.rb +0 -1
- data/spec/integration/ssl/certificate_request_spec.rb +0 -1
- data/spec/integration/ssl/certificate_revocation_list_spec.rb +0 -1
- data/spec/integration/ssl/host_spec.rb +0 -1
- data/spec/integration/type/package_spec.rb +2 -0
- data/spec/integration/util/rdoc/parser_spec.rb +1 -1
- data/spec/integration/util/windows/security_spec.rb +18 -0
- data/spec/lib/matchers/include_in_order.rb +2 -2
- data/spec/shared_behaviours/iterative_functions.rb +8 -8
- data/spec/spec_helper.rb +7 -0
- data/spec/unit/agent/locker_spec.rb +4 -4
- data/spec/unit/agent_spec.rb +0 -8
- data/spec/unit/application/agent_spec.rb +5 -0
- data/spec/unit/application/apply_spec.rb +9 -1
- data/spec/unit/application/filebucket_spec.rb +88 -2
- data/spec/unit/application/lookup_spec.rb +195 -0
- data/spec/unit/application/master_spec.rb +2 -2
- data/spec/unit/application_spec.rb +3 -3
- data/spec/unit/appmgmt_spec.rb +657 -0
- data/spec/unit/capability_spec.rb +414 -0
- data/spec/unit/configurer_spec.rb +7 -1
- data/spec/unit/context/trusted_information_spec.rb +24 -1
- data/spec/unit/daemon_spec.rb +18 -8
- data/spec/unit/data_providers/hiera_data_provider_spec.rb +201 -0
- data/spec/unit/environments_spec.rb +2 -0
- data/spec/unit/face/node_spec.rb +1 -1
- data/spec/unit/file_bucket/dipper_spec.rb +210 -1
- data/spec/unit/file_serving/configuration_spec.rb +1 -1
- data/spec/unit/file_system_spec.rb +20 -0
- data/spec/unit/functions/assert_type_spec.rb +5 -7
- data/spec/unit/functions/defined_spec.rb +2 -2
- data/spec/unit/functions/epp_spec.rb +2 -2
- data/spec/unit/functions/filter_spec.rb +18 -0
- data/spec/unit/functions/hiera_spec.rb +2 -2
- data/spec/unit/functions/lookup_spec.rb +200 -9
- data/spec/unit/functions/regsubst_spec.rb +17 -8
- data/spec/unit/functions/scanf_spec.rb +1 -1
- data/spec/unit/functions/split_spec.rb +2 -2
- data/spec/unit/functions/versioncmp_spec.rb +36 -0
- data/spec/unit/functions4_spec.rb +58 -72
- data/spec/unit/graph/sequential_prioritizer_spec.rb +1 -1
- data/spec/unit/indirector/catalog/compiler_spec.rb +28 -8
- data/spec/unit/indirector/catalog/static_compiler_spec.rb +38 -20
- data/spec/unit/indirector/data_binding/none_spec.rb +2 -2
- data/spec/unit/indirector/file_bucket_file/file_spec.rb +52 -1
- data/spec/unit/indirector/indirection_spec.rb +13 -2
- data/spec/unit/indirector/request_spec.rb +8 -8
- data/spec/unit/indirector/ssl_file_spec.rb +1 -1
- data/spec/unit/indirector/yaml_spec.rb +1 -1
- data/spec/unit/info_service_spec.rb +236 -0
- data/spec/unit/module_tool/application_spec.rb +1 -1
- data/spec/unit/module_tool/applications/builder_spec.rb +1 -1
- data/spec/unit/module_tool/metadata_spec.rb +31 -2
- data/spec/unit/network/authconfig_spec.rb +62 -32
- data/spec/unit/network/authorization_spec.rb +30 -2
- data/spec/unit/network/authstore_spec.rb +1 -1
- data/spec/unit/network/http/compression_spec.rb +1 -1
- data/spec/unit/network/http/connection_spec.rb +14 -19
- data/spec/unit/network/http/handler_spec.rb +0 -5
- data/spec/unit/network/rights_spec.rb +3 -3
- data/spec/unit/node_spec.rb +27 -0
- data/spec/unit/parser/ast/leaf_spec.rb +1 -1
- data/spec/unit/parser/compiler_spec.rb +86 -2
- data/spec/unit/parser/functions/create_resources_spec.rb +1 -1
- data/spec/unit/parser/resource_spec.rb +2 -20
- data/spec/unit/pops/binder/config/binder_config_spec.rb +1 -1
- data/spec/unit/pops/binder/injector_spec.rb +3 -3
- data/spec/unit/pops/evaluator/access_ops_spec.rb +13 -11
- data/spec/unit/pops/evaluator/basic_expressions_spec.rb +1 -2
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +20 -11
- data/spec/unit/pops/evaluator/literal_evaluator_spec.rb +43 -0
- data/spec/unit/pops/label_provider_spec.rb +5 -1
- data/spec/unit/pops/parser/lexer2_spec.rb +39 -0
- data/spec/unit/pops/parser/parse_application_spec.rb +40 -0
- data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +4 -0
- data/spec/unit/pops/parser/parse_capabilities_spec.rb +47 -0
- data/spec/unit/pops/parser/parse_site_spec.rb +38 -0
- data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
- data/spec/unit/pops/parser/parser_spec.rb +18 -0
- data/spec/unit/pops/types/type_calculator_spec.rb +427 -444
- data/spec/unit/pops/types/type_factory_spec.rb +12 -12
- data/spec/unit/pops/types/type_parser_spec.rb +15 -12
- data/spec/unit/pops/validator/validator_spec.rb +68 -0
- data/spec/unit/property_spec.rb +1 -1
- data/spec/unit/provider/augeas/augeas_spec.rb +50 -0
- data/spec/unit/provider/group/directoryservice_spec.rb +33 -0
- data/spec/unit/provider/group/windows_adsi_spec.rb +3 -0
- data/spec/unit/provider/package/dnf_spec.rb +92 -0
- data/spec/unit/provider/package/gem_spec.rb +7 -0
- data/spec/unit/provider/package/nim_spec.rb +6 -6
- data/spec/unit/provider/package/rpm_spec.rb +25 -2
- data/spec/unit/provider/package/windows/package_spec.rb +41 -0
- data/spec/unit/provider/package/yum_spec.rb +35 -12
- data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +10 -0
- data/spec/unit/provider/service/debian_spec.rb +28 -0
- data/spec/unit/provider/service/gentoo_spec.rb +1 -0
- data/spec/unit/provider/service/init_spec.rb +6 -0
- data/spec/unit/provider/service/launchd_spec.rb +85 -10
- data/spec/unit/provider/service/openrc_spec.rb +1 -0
- data/spec/unit/provider/service/rcng_spec.rb +41 -0
- data/spec/unit/provider/service/redhat_spec.rb +8 -1
- data/spec/unit/provider/service/smf_spec.rb +30 -5
- data/spec/unit/provider/service/src_spec.rb +20 -4
- data/spec/unit/provider/service/systemd_spec.rb +79 -29
- data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +1 -1
- data/spec/unit/provider/sshkey/parsed_spec.rb +23 -0
- data/spec/unit/provider/user/windows_adsi_spec.rb +2 -1
- data/spec/unit/provider/zone/solaris_spec.rb +19 -0
- data/spec/unit/reports_spec.rb +10 -0
- data/spec/unit/resource/capability_finder_spec.rb +56 -0
- data/spec/unit/resource/catalog_spec.rb +31 -8
- data/spec/unit/resource/type_collection_spec.rb +23 -2
- data/spec/unit/resource/type_spec.rb +1 -1
- data/spec/unit/resource_spec.rb +23 -5
- data/spec/unit/settings/file_setting_spec.rb +31 -0
- data/spec/unit/settings_spec.rb +91 -2
- data/spec/unit/ssl/certificate_authority/interface_spec.rb +4 -3
- data/spec/unit/ssl/certificate_authority_spec.rb +5 -3
- data/spec/unit/ssl/host_spec.rb +2 -2
- data/spec/unit/ssl/oids_spec.rb +8 -0
- data/spec/unit/transaction/additional_resource_generator_spec.rb +78 -5
- data/spec/unit/transaction/report_spec.rb +24 -1
- data/spec/unit/transaction_spec.rb +7 -0
- data/spec/unit/type/exec_spec.rb +16 -8
- data/spec/unit/type/host_spec.rb +4 -4
- data/spec/unit/type/package_spec.rb +1 -0
- data/spec/unit/type/tidy_spec.rb +4 -4
- data/spec/unit/type/user_spec.rb +14 -7
- data/spec/unit/type/vlan_spec.rb +1 -1
- data/spec/unit/type_spec.rb +1 -1
- data/spec/unit/util/ldap/generator_spec.rb +1 -1
- data/spec/unit/util/network_device/cisco/device_spec.rb +1 -1
- data/spec/unit/util/network_device/transport/ssh_spec.rb +1 -1
- data/spec/unit/util/network_device_spec.rb +1 -1
- data/spec/unit/util/storage_spec.rb +5 -1
- data/spec/unit/util/windows/adsi_spec.rb +13 -0
- data/spec/unit/util_spec.rb +21 -2
- metadata +173 -7
- data/lib/puppet/pops/evaluator/callable_mismatch_describer.rb +0 -175
- data/spec/integration/data_binding.rb +0 -104
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
module Puppet::Pops::Lookup
|
|
2
|
+
|
|
3
|
+
# The ExplainNode contains information of a specific node in a tree traversed during
|
|
4
|
+
# lookup. The tree can be traversed using the `parent` and `branches` attributes of
|
|
5
|
+
# each node.
|
|
6
|
+
#
|
|
7
|
+
# Each leaf node contains information about what happened when the leaf of the branch
|
|
8
|
+
# was traversed.
|
|
9
|
+
class ExplainNode
|
|
10
|
+
def branches
|
|
11
|
+
@branches ||= []
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def to_hash
|
|
15
|
+
hash = {}
|
|
16
|
+
hash[:branches] = @branches.map {|b| b.to_hash} unless @branches.nil? || @branches.empty?
|
|
17
|
+
hash
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def to_s
|
|
21
|
+
io = StringIO.new
|
|
22
|
+
dump_on(io, '', '')
|
|
23
|
+
io.string
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def dump_on(io, indent, first_indent)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
class ExplainTreeNode < ExplainNode
|
|
31
|
+
attr_reader :parent, :event, :key, :value
|
|
32
|
+
|
|
33
|
+
def initialize(parent)
|
|
34
|
+
@parent = parent
|
|
35
|
+
@event = nil
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def found_in_overrides(key, value)
|
|
39
|
+
@key = key
|
|
40
|
+
@value = value
|
|
41
|
+
@event = :found_in_overrides
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def found_in_defaults(key, value)
|
|
45
|
+
@key = key
|
|
46
|
+
@value = value
|
|
47
|
+
@event = :found_in_defaults
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def found(key, value)
|
|
51
|
+
@key = key
|
|
52
|
+
@value = value
|
|
53
|
+
@event = :found
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def result(value)
|
|
57
|
+
@value = value
|
|
58
|
+
@event = :result
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def not_found(key)
|
|
62
|
+
@key = key
|
|
63
|
+
@event = :not_found
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def path_not_found
|
|
67
|
+
@event = :path_not_found
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def module_not_found
|
|
71
|
+
@event = :module_not_found
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def increase_indent(indent)
|
|
75
|
+
indent + ' '
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def to_hash
|
|
79
|
+
hash = super
|
|
80
|
+
hash[:key] = @key unless @key.nil?
|
|
81
|
+
hash[:value] = @value if [:found, :found_in_defaults, :found_in_overrides, :result].include?(@event)
|
|
82
|
+
hash[:event] = @event unless @event.nil?
|
|
83
|
+
hash[:type] = type
|
|
84
|
+
hash
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def type
|
|
88
|
+
:root
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def dump_outcome(io, indent)
|
|
92
|
+
io << indent << 'No such key: "' << @key << "\"\n" if @event == :not_found
|
|
93
|
+
if [:found, :found_in_overrides, :found_in_defaults].include?(@event)
|
|
94
|
+
io << indent << 'Found key: "' << @key << '" value: '
|
|
95
|
+
dump_value(io, indent, @value)
|
|
96
|
+
io << ' in overrides' if @event == :found_in_overrides
|
|
97
|
+
io << ' in defaults' if @event == :found_in_defaults
|
|
98
|
+
io << "\n"
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def dump_value(io, indent, value)
|
|
103
|
+
case value
|
|
104
|
+
when Hash
|
|
105
|
+
io << '{'
|
|
106
|
+
unless value.empty?
|
|
107
|
+
inner_indent = increase_indent(indent)
|
|
108
|
+
value.reduce("\n") do |sep, (k, v)|
|
|
109
|
+
io << sep << inner_indent
|
|
110
|
+
dump_value(io, inner_indent, k)
|
|
111
|
+
io << ' => '
|
|
112
|
+
dump_value(io, inner_indent, v)
|
|
113
|
+
",\n"
|
|
114
|
+
end
|
|
115
|
+
io << "\n" << indent
|
|
116
|
+
end
|
|
117
|
+
io << '}'
|
|
118
|
+
when Array
|
|
119
|
+
io << '['
|
|
120
|
+
unless value.empty?
|
|
121
|
+
inner_indent = increase_indent(indent)
|
|
122
|
+
value.reduce("\n") do |sep, v|
|
|
123
|
+
io << sep << inner_indent
|
|
124
|
+
dump_value(io, inner_indent, v)
|
|
125
|
+
",\n"
|
|
126
|
+
end
|
|
127
|
+
io << "\n" << indent
|
|
128
|
+
end
|
|
129
|
+
io << ']'
|
|
130
|
+
else
|
|
131
|
+
io << value.inspect
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
class ExplainInterpolate < ExplainTreeNode
|
|
137
|
+
def initialize(parent, expression)
|
|
138
|
+
super(parent)
|
|
139
|
+
@expression = expression
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def dump_on(io, indent, first_indent)
|
|
143
|
+
io << first_indent << 'Interpolation on "' << @expression << "\"\n"
|
|
144
|
+
indent = increase_indent(indent)
|
|
145
|
+
branches.each {|b| b.dump_on(io, indent, indent)}
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def to_hash
|
|
149
|
+
hash = super
|
|
150
|
+
hash[:expression] = @expression
|
|
151
|
+
hash
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def type
|
|
155
|
+
:interpolate
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
class ExplainMerge < ExplainTreeNode
|
|
160
|
+
def initialize(parent, merge)
|
|
161
|
+
super(parent)
|
|
162
|
+
@merge = merge
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def dump_on(io, indent, first_indent)
|
|
166
|
+
# It's pointless to report a merge where there's only one branch
|
|
167
|
+
return branches[0].dump_on(io, indent, first_indent) if branches.size == 1
|
|
168
|
+
|
|
169
|
+
io << first_indent << 'Merge strategy ' << @merge.class.key << "\n"
|
|
170
|
+
indent = increase_indent(indent)
|
|
171
|
+
options = options_wo_strategy
|
|
172
|
+
unless options.nil?
|
|
173
|
+
io << indent << 'Options: '
|
|
174
|
+
dump_value(io, indent, options)
|
|
175
|
+
io << "\n"
|
|
176
|
+
end
|
|
177
|
+
branches.each {|b| b.dump_on(io, indent, indent)}
|
|
178
|
+
if @event == :result
|
|
179
|
+
io << indent << 'Merged result: '
|
|
180
|
+
dump_value(io, indent, @value)
|
|
181
|
+
io << "\n"
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def to_hash
|
|
186
|
+
return branches[0].to_hash if branches.size == 1
|
|
187
|
+
hash = super
|
|
188
|
+
hash[:merge] = @merge.class.key
|
|
189
|
+
options = options_wo_strategy
|
|
190
|
+
hash[:options] = options unless options.nil?
|
|
191
|
+
hash
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def type
|
|
195
|
+
:merge
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def options_wo_strategy
|
|
199
|
+
options = @merge.options
|
|
200
|
+
if !options.nil? && options.include?('strategy')
|
|
201
|
+
options = options.dup
|
|
202
|
+
options.delete('strategy')
|
|
203
|
+
end
|
|
204
|
+
options.empty? ? nil : options
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
class ExplainModule < ExplainTreeNode
|
|
209
|
+
def initialize(parent, mod)
|
|
210
|
+
super(parent)
|
|
211
|
+
@module = mod
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def dump_on(io, indent, first_indent)
|
|
215
|
+
io << indent << 'Module "' << @module << '"'
|
|
216
|
+
if branches.size == 1
|
|
217
|
+
branches[0].dump_on(io, indent, ' using ')
|
|
218
|
+
else
|
|
219
|
+
io << "\n"
|
|
220
|
+
indent = increase_indent(indent)
|
|
221
|
+
branches.each {|b| b.dump_on(io, indent, indent)}
|
|
222
|
+
end
|
|
223
|
+
io << indent << "Module not found\n" if @event == :module_not_found
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def to_hash
|
|
227
|
+
if branches.size == 1
|
|
228
|
+
branches[0].to_hash.merge(:module => @module)
|
|
229
|
+
else
|
|
230
|
+
hash = super
|
|
231
|
+
hash[:module] = @module
|
|
232
|
+
hash
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
def type
|
|
237
|
+
:module
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
class ExplainGlobal < ExplainTreeNode
|
|
242
|
+
def initialize(parent, binding_terminus)
|
|
243
|
+
super(parent)
|
|
244
|
+
@binding_terminus = binding_terminus
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
def dump_on(io, indent, first_indent)
|
|
248
|
+
io << first_indent << 'Data Binding "' << @binding_terminus << "\"\n"
|
|
249
|
+
indent = increase_indent(indent)
|
|
250
|
+
branches.each {|b| b.dump_on(io, indent, indent)}
|
|
251
|
+
dump_outcome(io, indent)
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
def to_hash
|
|
255
|
+
hash = super
|
|
256
|
+
hash[:name] = @binding_terminus
|
|
257
|
+
hash
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
def type
|
|
261
|
+
:global
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
class ExplainDataProvider < ExplainTreeNode
|
|
266
|
+
def initialize(parent, provider)
|
|
267
|
+
super(parent)
|
|
268
|
+
@provider = provider
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
def dump_on(io, indent, first_indent)
|
|
272
|
+
io << first_indent << 'Data Provider "' << @provider.name << "\"\n"
|
|
273
|
+
indent = increase_indent(indent)
|
|
274
|
+
io << indent << 'ConfigurationPath "' << @provider.config_path << "\"\n" if @provider.respond_to?(:config_path)
|
|
275
|
+
branches.each {|b| b.dump_on(io, indent, indent)}
|
|
276
|
+
dump_outcome(io, indent)
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
def to_hash
|
|
280
|
+
hash = super
|
|
281
|
+
hash[:name] = @provider.name
|
|
282
|
+
hash[:configuration_path] = @provider.config_path.to_s if @provider.respond_to?(:config_path)
|
|
283
|
+
hash
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
def type
|
|
287
|
+
:data_provider
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
class ExplainPath < ExplainTreeNode
|
|
292
|
+
def initialize(parent, path)
|
|
293
|
+
super(parent)
|
|
294
|
+
@path = path
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
def dump_on(io, indent, first_indent)
|
|
298
|
+
io << indent << 'Path "' << @path.path << "\"\n"
|
|
299
|
+
indent = increase_indent(indent)
|
|
300
|
+
io << indent << 'Original path: ' << @path.original_path << "\n"
|
|
301
|
+
branches.each {|b| b.dump_on(io, indent, indent)}
|
|
302
|
+
io << indent << "Path not found\n" if @event == :path_not_found
|
|
303
|
+
dump_outcome(io, indent)
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
def to_hash
|
|
307
|
+
hash = super
|
|
308
|
+
hash[:original_path] = @path.original_path
|
|
309
|
+
hash[:path] = @path.path.to_s
|
|
310
|
+
hash
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
def type
|
|
314
|
+
:path
|
|
315
|
+
end
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
class ExplainScope < ExplainTreeNode
|
|
319
|
+
def initialize(parent)
|
|
320
|
+
super(parent)
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
def dump_on(io, indent, first_indent)
|
|
324
|
+
io << indent << 'Global Scope' << "\"\n"
|
|
325
|
+
indent = increase_indent(indent)
|
|
326
|
+
dump_outcome(io, indent)
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
def type
|
|
330
|
+
:scope
|
|
331
|
+
end
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
class Explainer < ExplainNode
|
|
335
|
+
def initialize
|
|
336
|
+
@current = self
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
def push(qualifier_type, qualifier)
|
|
340
|
+
node = case (qualifier_type)
|
|
341
|
+
when :global
|
|
342
|
+
ExplainGlobal.new(@current, qualifier)
|
|
343
|
+
when :path
|
|
344
|
+
ExplainPath.new(@current, qualifier)
|
|
345
|
+
when :module
|
|
346
|
+
ExplainModule.new(@current, qualifier)
|
|
347
|
+
when :interpolate
|
|
348
|
+
ExplainInterpolate.new(@current, qualifier)
|
|
349
|
+
when :data_provider
|
|
350
|
+
ExplainDataProvider.new(@current, qualifier)
|
|
351
|
+
when :merge
|
|
352
|
+
ExplainMerge.new(@current, qualifier)
|
|
353
|
+
when :scope
|
|
354
|
+
ExplainScope.new(@current)
|
|
355
|
+
else
|
|
356
|
+
raise ArgumentError, "Unknown Explain type #{qualifier_type}"
|
|
357
|
+
end
|
|
358
|
+
@current.branches << node
|
|
359
|
+
@current = node
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
def pop
|
|
363
|
+
@current = @current.parent unless @current.parent.nil?
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
def accept_found_in_overrides(key, value)
|
|
367
|
+
@current.found_in_overrides(key, value)
|
|
368
|
+
end
|
|
369
|
+
|
|
370
|
+
def accept_found_in_defaults(key, value)
|
|
371
|
+
@current.found_in_defaults(key, value)
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
def accept_found(key, value)
|
|
375
|
+
@current.found(key, value)
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
def accept_not_found(key)
|
|
379
|
+
@current.not_found(key)
|
|
380
|
+
end
|
|
381
|
+
|
|
382
|
+
def accept_path_not_found
|
|
383
|
+
@current.path_not_found
|
|
384
|
+
end
|
|
385
|
+
|
|
386
|
+
def accept_module_not_found
|
|
387
|
+
@current.module_not_found
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
def accept_result(result)
|
|
391
|
+
@current.result(result)
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
def dump_on(io, indent, first_indent)
|
|
395
|
+
branches.each { |b| b.dump_on(io, indent, first_indent) }
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
def to_hash
|
|
399
|
+
branches.size == 1 ? branches[0].to_hash : super
|
|
400
|
+
end
|
|
401
|
+
end
|
|
402
|
+
end
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
module Puppet::Pops::Lookup
|
|
2
|
+
class Invocation
|
|
3
|
+
attr_reader :scope, :override_values, :default_values, :explainer, :module_name
|
|
4
|
+
|
|
5
|
+
# Creates a context object for a lookup invocation. The object contains the current scope, overrides, and default
|
|
6
|
+
# values and may optionally contain an {ExplanationAcceptor} instance that will receive book-keeping information
|
|
7
|
+
# about the progress of the lookup.
|
|
8
|
+
#
|
|
9
|
+
# If the _explain_ argument is a boolean, then _false_ means that no explanation is needed and _true_ means that
|
|
10
|
+
# the default explanation acceptor should be used. The _explain_ argument may also be an instance of the
|
|
11
|
+
# `ExplanationAcceptor` class.
|
|
12
|
+
#
|
|
13
|
+
# @param scope [Puppet::Parser::Scope] The scope to use for the lookup
|
|
14
|
+
# @param override_values [Hash<String,Object>|nil] A map to use as override. Values found here are returned immediately (no merge)
|
|
15
|
+
# @param default_values [Hash<String,Object>] A map to use as the last resort (but before default)
|
|
16
|
+
# @param explainer [boolean,Explanainer] An boolean true to use the default explanation acceptor or an explainer instance that will receive information about the lookup
|
|
17
|
+
def initialize(scope, override_values = {}, default_values = {}, explainer = nil)
|
|
18
|
+
@name_stack = []
|
|
19
|
+
@scope = scope
|
|
20
|
+
@override_values = override_values
|
|
21
|
+
@default_values = default_values
|
|
22
|
+
unless explainer.is_a?(Explainer)
|
|
23
|
+
explainer = explainer == true ? Explainer.new : nil
|
|
24
|
+
end
|
|
25
|
+
@explainer = explainer
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def check(name)
|
|
29
|
+
if @name_stack.include?(name)
|
|
30
|
+
raise Puppet::DataBinding::RecursiveLookupError, "Recursive lookup detected in [#{@name_stack.join(', ')}]"
|
|
31
|
+
end
|
|
32
|
+
return unless block_given?
|
|
33
|
+
|
|
34
|
+
@name_stack.push(name)
|
|
35
|
+
begin
|
|
36
|
+
yield
|
|
37
|
+
rescue Puppet::DataBinding::LookupError
|
|
38
|
+
raise
|
|
39
|
+
rescue Puppet::Error => detail
|
|
40
|
+
raise Puppet::DataBinding::LookupError.new(detail.message, detail)
|
|
41
|
+
ensure
|
|
42
|
+
@name_stack.pop
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# The qualifier_type can be one of:
|
|
47
|
+
# :global - qualifier is the data binding terminus name
|
|
48
|
+
# :data_provider - qualifier a DataProvider instance
|
|
49
|
+
# :path - qualifier is a ResolvedPath instance
|
|
50
|
+
# :merge - qualifier is a MergeStrategy instance
|
|
51
|
+
# :module - qualifier is the name of a module
|
|
52
|
+
# :interpolation - qualifier is the unresolved interpolation expression
|
|
53
|
+
# :meta - qualifier is the name of a module or nil if that's not applicable
|
|
54
|
+
#
|
|
55
|
+
# @param qualifier [Object] A branch, a provider, or a path
|
|
56
|
+
def with(qualifier_type, qualifier)
|
|
57
|
+
is_meta = qualifier_type == :meta
|
|
58
|
+
@module_name = qualifier if is_meta
|
|
59
|
+
if @explainer.nil?
|
|
60
|
+
yield
|
|
61
|
+
else
|
|
62
|
+
if is_meta
|
|
63
|
+
save_explainer = @explainer
|
|
64
|
+
@explainer = nil
|
|
65
|
+
begin
|
|
66
|
+
yield
|
|
67
|
+
ensure
|
|
68
|
+
@explainer = save_explainer
|
|
69
|
+
end
|
|
70
|
+
else
|
|
71
|
+
@explainer.push(qualifier_type, qualifier)
|
|
72
|
+
begin
|
|
73
|
+
yield
|
|
74
|
+
ensure
|
|
75
|
+
@explainer.pop
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def report_found_in_overrides(key, value)
|
|
82
|
+
@explainer.accept_found_in_overrides(key, value) unless @explainer.nil?
|
|
83
|
+
value
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def report_found_in_defaults(key, value)
|
|
87
|
+
@explainer.accept_found_in_defaults(key, value) unless @explainer.nil?
|
|
88
|
+
value
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def report_found(key, value)
|
|
92
|
+
@explainer.accept_found(key, value) unless @explainer.nil?
|
|
93
|
+
value
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Report the result of a merge or fully resolved interpolated string
|
|
97
|
+
# @param value [Object] The result to report
|
|
98
|
+
# @return [Object] the given value
|
|
99
|
+
def report_result(value)
|
|
100
|
+
@explainer.accept_result(value) unless @explainer.nil?
|
|
101
|
+
value
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def report_not_found(key)
|
|
105
|
+
@explainer.accept_not_found(key) unless @explainer.nil?
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def report_path_not_found
|
|
109
|
+
@explainer.accept_path_not_found unless @explainer.nil?
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def report_module_not_found
|
|
113
|
+
@explainer.accept_module_not_found unless @explainer.nil?
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
data/lib/puppet/pops/lookup.rb
CHANGED
|
@@ -1,43 +1,45 @@
|
|
|
1
1
|
# This class is the backing implementation of the Puppet function 'lookup'.
|
|
2
2
|
# See puppet/functions/lookup.rb for documentation.
|
|
3
3
|
#
|
|
4
|
-
|
|
4
|
+
module Puppet::Pops::Lookup
|
|
5
5
|
# Performs a lookup in the configured scopes and optionally merges the default.
|
|
6
6
|
#
|
|
7
7
|
# This is a backing function and all parameters are assumed to have been type checked.
|
|
8
8
|
# See puppet/functions/lookup.rb for full documentation and all parameter combinations.
|
|
9
9
|
#
|
|
10
|
-
# @param scope [Puppet::Parser::Scope] The scope to use for the lookup
|
|
11
10
|
# @param name [String|Array<String>] The name or names to lookup
|
|
12
11
|
# @param type [Puppet::Pops::Types::PAnyType|nil] The expected type of the found value
|
|
13
12
|
# @param default_value [Object] The value to use as default when no value is found
|
|
14
13
|
# @param has_default [Boolean] Set to _true_ if _default_value_ is included (_nil_ is a valid _default_value_)
|
|
15
|
-
# @param
|
|
16
|
-
# @param
|
|
17
|
-
# @param merge [String|Hash<String,Object>|nil] Merge strategy or hash with strategy and options
|
|
14
|
+
# @param merge [Puppet::Pops::MergeStrategy,String,Hash<String,Object>,nil] Merge strategy or hash with strategy and options
|
|
15
|
+
# @param lookup_invocation [Puppet::Pops::Lookup::Invocation] Invocation data containing scope, overrides, and defaults
|
|
18
16
|
# @return [Object] The found value
|
|
19
17
|
#
|
|
20
|
-
def self.lookup(
|
|
21
|
-
value_type = Puppet::Pops::Types::PDataType
|
|
18
|
+
def self.lookup(name, value_type, default_value, has_default, merge, lookup_invocation)
|
|
19
|
+
value_type = Puppet::Pops::Types::PDataType::DEFAULT if value_type.nil?
|
|
22
20
|
names = name.is_a?(Array) ? name : [name]
|
|
23
21
|
|
|
24
22
|
# find first name that yields a non-nil result and wrap it in a two element array
|
|
25
23
|
# with name and value.
|
|
26
|
-
not_found =
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
value =
|
|
24
|
+
not_found = Puppet::Pops::MergeStrategy::NOT_FOUND
|
|
25
|
+
override_values = lookup_invocation.override_values
|
|
26
|
+
result_with_name = names.reduce([nil, not_found]) do |memo, key|
|
|
27
|
+
value = override_values.include?(key) ? assert_type('override', value_type, override_values[key]) : not_found
|
|
28
|
+
catch(:no_such_key) { value = search_and_merge(key, lookup_invocation, merge) } if value.equal?(not_found)
|
|
30
29
|
break [key, assert_type('found', value_type, value)] unless value.equal?(not_found)
|
|
31
30
|
memo
|
|
32
31
|
end
|
|
33
32
|
|
|
34
|
-
# Use the '
|
|
35
|
-
if result_with_name[1].equal?(not_found)
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
33
|
+
# Use the 'default_values' hash as a last resort if nothing is found
|
|
34
|
+
if result_with_name[1].equal?(not_found)
|
|
35
|
+
default_values = lookup_invocation.default_values
|
|
36
|
+
unless default_values.empty?
|
|
37
|
+
result_with_name = names.reduce(result_with_name) do |memo, key|
|
|
38
|
+
value = default_values.include?(key) ? assert_type('default_values_hash', value_type, default_values[key]) : not_found
|
|
39
|
+
memo = [key, value]
|
|
40
|
+
break memo unless value.equal?(not_found)
|
|
41
|
+
memo
|
|
42
|
+
end
|
|
41
43
|
end
|
|
42
44
|
end
|
|
43
45
|
|
|
@@ -54,34 +56,10 @@ class Puppet::Pops::Lookup
|
|
|
54
56
|
answer
|
|
55
57
|
end
|
|
56
58
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
in_module = lambda { Puppet::DataProviders.lookup_in_module(name, scope, merge) }
|
|
61
|
-
|
|
62
|
-
[in_global, in_env, in_module].reduce(not_found) do |memo, f|
|
|
63
|
-
found = false # can't trust catch return value since nil is valid
|
|
64
|
-
value = catch (:no_such_key) do
|
|
65
|
-
answer = f.call
|
|
66
|
-
found = true
|
|
67
|
-
answer
|
|
68
|
-
end
|
|
69
|
-
next memo unless found
|
|
70
|
-
break value if merge.nil? # value found and no merge
|
|
71
|
-
strategy = Puppet::Pops::MergeStrategy.strategy(merge)
|
|
72
|
-
memo.equal?(not_found) ? strategy.convert_value(value) : strategy.merge(memo, value)
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
private_class_method :search_and_merge
|
|
76
|
-
|
|
77
|
-
def self.lookup_with_databinding(key, scope, merge)
|
|
78
|
-
begin
|
|
79
|
-
Puppet::DataBinding.indirection.find(key, { :environment => scope.environment.to_s, :variables => scope, :merge => merge })
|
|
80
|
-
rescue Puppet::DataBinding::LookupError => e
|
|
81
|
-
raise Puppet::Error, "Error from DataBinding '#{Puppet[:data_binding_terminus]}' while looking up '#{name}': #{e.message}", e
|
|
82
|
-
end
|
|
59
|
+
# @api private
|
|
60
|
+
def self.search_and_merge(name, lookup_invocation, merge)
|
|
61
|
+
return Puppet::DataProviders.lookup_adapter(lookup_invocation).lookup(name, lookup_invocation, merge)
|
|
83
62
|
end
|
|
84
|
-
private_class_method :lookup_with_databinding
|
|
85
63
|
|
|
86
64
|
def self.assert_type(subject, type, value)
|
|
87
65
|
Puppet::Pops::Types::TypeAsserter.assert_instance_of(subject, type, value)
|
|
@@ -89,8 +67,8 @@ class Puppet::Pops::Lookup
|
|
|
89
67
|
private_class_method :assert_type
|
|
90
68
|
|
|
91
69
|
def self.fail_lookup(names)
|
|
92
|
-
name_part = names.size == 1 ? "the name '#{names[0]}'" : 'any of the names [' + names.map {|n| "'#{n}'"}
|
|
93
|
-
raise Puppet::
|
|
70
|
+
name_part = names.size == 1 ? "the name '#{names[0]}'" : 'any of the names [' + names.map { |n| "'#{n}'" }.join(', ') + ']'
|
|
71
|
+
raise Puppet::DataBinding::LookupError, "Function lookup() did not find a value for #{name_part}"
|
|
94
72
|
end
|
|
95
73
|
private_class_method :fail_lookup
|
|
96
74
|
end
|