puppet 4.2.3 → 4.3.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- data/Gemfile +3 -0
- data/README.md +1 -1
- data/ext/debian/puppet.init +0 -1
- data/ext/debian/puppet.logrotate +14 -5
- data/ext/osx/puppet.plist +0 -2
- data/ext/redhat/client.init +13 -5
- data/ext/redhat/logrotate +15 -3
- data/ext/redhat/puppet.spec.erb +5 -1
- data/ext/redhat/server.init +1 -1
- data/ext/systemd/puppet.service +1 -0
- data/lib/puppet.rb +12 -0
- data/lib/puppet/agent.rb +4 -4
- data/lib/puppet/agent/locker.rb +11 -2
- data/lib/puppet/application/agent.rb +5 -1
- data/lib/puppet/application/apply.rb +4 -0
- data/lib/puppet/application/filebucket.rb +78 -4
- data/lib/puppet/application/lookup.rb +356 -0
- data/lib/puppet/application/master.rb +3 -0
- data/lib/puppet/configurer.rb +9 -5
- data/lib/puppet/context.rb +16 -1
- data/lib/puppet/context/trusted_information.rb +21 -1
- data/lib/puppet/daemon.rb +17 -13
- data/lib/puppet/data_binding.rb +4 -2
- data/lib/puppet/data_providers.rb +12 -13
- 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/defaults.rb +12 -2
- 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/functions.rb +2 -4
- 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/filter.rb +58 -23
- 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 +75 -2
- 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/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/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.rb +7 -0
- data/lib/puppet/info_service/class_information_service.rb +111 -0
- 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/network/authconfig.rb +21 -1
- data/lib/puppet/network/authorization.rb +8 -1
- data/lib/puppet/network/http/api/master/v3.rb +7 -1
- data/lib/puppet/network/http/api/master/v3/environment.rb +59 -0
- data/lib/puppet/node/environment.rb +9 -2
- data/lib/puppet/parser.rb +3 -0
- data/lib/puppet/parser/ast/pops_bridge.rb +39 -1
- data/lib/puppet/parser/compiler.rb +302 -12
- data/lib/puppet/parser/compiler/catalog_validator.rb +33 -0
- 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/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/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/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 +98 -19
- data/lib/puppet/plugins/configuration.rb +3 -2
- data/lib/puppet/plugins/data_providers.rb +12 -60
- data/lib/puppet/plugins/data_providers/data_provider.rb +283 -0
- data/lib/puppet/plugins/data_providers/registry.rb +84 -0
- data/lib/puppet/pops.rb +19 -17
- 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 +5 -5
- 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 +1 -1
- data/lib/puppet/pops/label_provider.rb +1 -1
- data/lib/puppet/pops/lookup.rb +25 -47
- data/lib/puppet/pops/lookup/explainer.rb +402 -0
- data/lib/puppet/pops/lookup/invocation.rb +117 -0
- data/lib/puppet/pops/merge_strategy.rb +73 -5
- data/lib/puppet/pops/model/factory.rb +34 -0
- data/lib/puppet/pops/model/model_label_provider.rb +10 -1
- data/lib/puppet/pops/model/model_meta.rb +15 -0
- 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 +56 -3
- data/lib/puppet/pops/parser/eparser.rb +1549 -1352
- data/lib/puppet/pops/parser/lexer2.rb +31 -6
- data/lib/puppet/pops/parser/locator.rb +1 -1
- data/lib/puppet/pops/parser/parser_support.rb +25 -13
- 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 +116 -127
- data/lib/puppet/pops/types/types.rb +1394 -255
- data/lib/puppet/pops/types/types_meta.rb +0 -234
- data/lib/puppet/pops/validation.rb +7 -2
- data/lib/puppet/pops/validation/checker4_0.rb +28 -0
- data/lib/puppet/provider/augeas/augeas.rb +50 -0
- 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/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 +14 -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/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 +15 -3
- data/lib/puppet/provider/sshkey/parsed.rb +19 -9
- data/lib/puppet/reference/report.rb +9 -12
- data/lib/puppet/reports.rb +5 -1
- data/lib/puppet/resource.rb +50 -73
- 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/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.rb +4 -1
- data/lib/puppet/transaction/additional_resource_generator.rb +71 -8
- data/lib/puppet/transaction/resource_harness.rb +9 -4
- data/lib/puppet/type.rb +74 -3
- data/lib/puppet/type/augeas.rb +8 -0
- data/lib/puppet/type/file/source.rb +14 -12
- data/lib/puppet/type/user.rb +4 -2
- data/lib/puppet/util/windows/security.rb +4 -1
- data/lib/puppet/util/windows/taskscheduler.rb +1 -1
- data/lib/puppet/version.rb +1 -1
- 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 +23 -19
- data/spec/integration/parser/resource_expressions_spec.rb +4 -4
- data/spec/integration/parser/undef_param_spec.rb +1 -1
- data/spec/integration/resource/catalog_spec.rb +1 -1
- data/spec/integration/type/package_spec.rb +2 -0
- 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 +8 -0
- data/spec/unit/application/filebucket_spec.rb +87 -1
- data/spec/unit/application/lookup_spec.rb +195 -0
- 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/file_bucket/dipper_spec.rb +210 -1
- 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/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/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/request_spec.rb +8 -8
- data/spec/unit/info_service_spec.rb +236 -0
- 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/http/connection_spec.rb +14 -19
- 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 +19 -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 +33 -7
- 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 +7 -12
- data/spec/unit/pops/validator/validator_spec.rb +25 -0
- 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/rpm_spec.rb +25 -2
- data/spec/unit/provider/package/windows/package_spec.rb +41 -0
- data/spec/unit/provider/package/yum_spec.rb +21 -13
- data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +10 -0
- data/spec/unit/provider/service/debian_spec.rb +27 -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 +19 -4
- data/spec/unit/provider/service/systemd_spec.rb +78 -29
- data/spec/unit/provider/sshkey/parsed_spec.rb +23 -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 +22 -4
- data/spec/unit/settings_spec.rb +90 -1
- data/spec/unit/ssl/certificate_authority/interface_spec.rb +4 -3
- 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/type/package_spec.rb +1 -0
- data/spec/unit/type/user_spec.rb +14 -7
- data/spec/unit/type_spec.rb +1 -1
- metadata +169 -5
- data/lib/puppet/pops/evaluator/callable_mismatch_describer.rb +0 -175
- data/spec/integration/data_binding.rb +0 -104
@@ -3,7 +3,7 @@ require 'puppet/network/http'
|
|
3
3
|
|
4
4
|
module Puppet
|
5
5
|
class ConfigurationError < Puppet::Error; end
|
6
|
-
class Network::
|
6
|
+
class Network::DefaultAuthProvider
|
7
7
|
attr_accessor :rights
|
8
8
|
|
9
9
|
def self.master_url_prefix
|
@@ -89,4 +89,24 @@ module Puppet
|
|
89
89
|
insert_default_acl
|
90
90
|
end
|
91
91
|
end
|
92
|
+
|
93
|
+
class Network::AuthConfig
|
94
|
+
@@authprovider_class = nil
|
95
|
+
|
96
|
+
def self.authprovider_class=(klass)
|
97
|
+
@@authprovider_class = klass
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.authprovider_class
|
101
|
+
@@authprovider_class || Puppet::Network::DefaultAuthProvider
|
102
|
+
end
|
103
|
+
|
104
|
+
def initialize(rights=nil)
|
105
|
+
@authprovider = self.class.authprovider_class.new(rights)
|
106
|
+
end
|
107
|
+
|
108
|
+
def check_authorization(method, path, params)
|
109
|
+
@authprovider.check_authorization(method, path, params)
|
110
|
+
end
|
111
|
+
end
|
92
112
|
end
|
@@ -21,8 +21,15 @@ module Puppet::Network
|
|
21
21
|
end
|
22
22
|
|
23
23
|
module Authorization
|
24
|
+
@@authconfigloader_class = nil
|
25
|
+
|
26
|
+
def self.authconfigloader_class=(klass)
|
27
|
+
@@authconfigloader_class = klass
|
28
|
+
end
|
29
|
+
|
24
30
|
def authconfig
|
25
|
-
AuthConfigLoader
|
31
|
+
authconfigloader = @@authconfigloader_class || AuthConfigLoader
|
32
|
+
authconfigloader.authconfig
|
26
33
|
end
|
27
34
|
|
28
35
|
# Verify that our client has access.
|
@@ -1,6 +1,7 @@
|
|
1
1
|
class Puppet::Network::HTTP::API::Master::V3
|
2
2
|
require 'puppet/network/http/api/master/v3/authorization'
|
3
3
|
require 'puppet/network/http/api/master/v3/environments'
|
4
|
+
require 'puppet/network/http/api/master/v3/environment'
|
4
5
|
require 'puppet/network/http/api/indirected_routes'
|
5
6
|
|
6
7
|
AUTHZ = Authorization.new
|
@@ -14,9 +15,14 @@ class Puppet::Network::HTTP::API::Master::V3
|
|
14
15
|
Environments.new(Puppet.lookup(:environments))
|
15
16
|
end)
|
16
17
|
|
18
|
+
ENVIRONMENT = Puppet::Network::HTTP::Route.
|
19
|
+
path(%r{/environment/[^/]+$}).get(AUTHZ.wrap do
|
20
|
+
Environment.new
|
21
|
+
end)
|
22
|
+
|
17
23
|
def self.routes
|
18
24
|
Puppet::Network::HTTP::Route.path(%r{v3}).
|
19
25
|
any.
|
20
|
-
chain(ENVIRONMENTS, INDIRECTED)
|
26
|
+
chain(ENVIRONMENTS, ENVIRONMENT, INDIRECTED)
|
21
27
|
end
|
22
28
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'puppet/parser/environment_compiler'
|
3
|
+
|
4
|
+
class Puppet::Network::HTTP::API::Master::V3::Environment
|
5
|
+
def call(request, response)
|
6
|
+
env_name = request.routing_path.split('/').last
|
7
|
+
env = Puppet.lookup(:environments).get(env_name)
|
8
|
+
|
9
|
+
if env.nil?
|
10
|
+
raise Puppet::Network::HTTP::Error::HTTPNotFoundError.new("#{env_name} is not a known environment", Puppet::Network::HTTP::Issues::RESOURCE_NOT_FOUND)
|
11
|
+
end
|
12
|
+
|
13
|
+
catalog = Puppet::Parser::EnvironmentCompiler.compile(env).to_resource
|
14
|
+
|
15
|
+
env_graph = {:environment => env.name, :applications => {}}
|
16
|
+
applications = catalog.resources.select do |res|
|
17
|
+
type = res.resource_type
|
18
|
+
type.is_a?(Puppet::Resource::Type) && type.application?
|
19
|
+
end
|
20
|
+
applications.each do |app|
|
21
|
+
app_components = {}
|
22
|
+
# Turn the 'nodes' hash into a map component ref => node name
|
23
|
+
node_mapping = {}
|
24
|
+
app['nodes'].each do |node, comps|
|
25
|
+
comps = [comps] unless comps.is_a?(Array)
|
26
|
+
comps.each do |comp|
|
27
|
+
raise Puppet::ParseError, "Application #{app} maps component #{comp} to multiple nodes" if node_mapping.include?(comp.ref)
|
28
|
+
node_mapping[comp.ref] = node.title
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
catalog.direct_dependents_of(app).each do |comp|
|
33
|
+
mapped_node = node_mapping[comp.ref]
|
34
|
+
if mapped_node.nil?
|
35
|
+
raise Puppet::ParseError, "Component #{comp} is not mapped to any node"
|
36
|
+
end
|
37
|
+
app_components[comp.ref] = {
|
38
|
+
:produces => comp.export.map(&:ref),
|
39
|
+
:consumes => prerequisites(comp).map(&:ref),
|
40
|
+
:node => mapped_node
|
41
|
+
}
|
42
|
+
end
|
43
|
+
env_graph[:applications][app.ref] = app_components
|
44
|
+
end
|
45
|
+
response.respond_with(200, "application/json", JSON.dump(env_graph))
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
# Finds all the prerequisites of component +comp+. They are all the
|
51
|
+
# capability resources that +comp+ depends on; this includes resources
|
52
|
+
# that +comp+ consumes but also resources it merely requires
|
53
|
+
def prerequisites(comp)
|
54
|
+
params = Puppet::Type.relationship_params.select { |p| p.direction == :in }.map(&:name)
|
55
|
+
params.map { |rel| comp[rel] }.flatten.compact.select do |rel|
|
56
|
+
rel.resource_type && rel.resource_type.is_capability?
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -182,11 +182,18 @@ class Puppet::Node::Environment
|
|
182
182
|
# @api private
|
183
183
|
def conflicting_manifest_settings?
|
184
184
|
return false if !Puppet[:disable_per_environment_manifest]
|
185
|
-
|
186
|
-
original_manifest = environment_conf.raw_setting(:manifest)
|
185
|
+
original_manifest = configuration.raw_setting(:manifest)
|
187
186
|
!original_manifest.nil? && !original_manifest.empty? && original_manifest != Puppet[:default_manifest]
|
188
187
|
end
|
189
188
|
|
189
|
+
# Return the environment configuration
|
190
|
+
# @return [Puppet::Settings::EnvironmentConf] The configuration
|
191
|
+
#
|
192
|
+
# @api private
|
193
|
+
def configuration
|
194
|
+
Puppet.lookup(:environments).get_conf(name)
|
195
|
+
end
|
196
|
+
|
190
197
|
# Checks the environment and settings for any conflicts
|
191
198
|
# @return [Array<String>] an array of validation errors
|
192
199
|
# @api public
|
data/lib/puppet/parser.rb
CHANGED
@@ -3,6 +3,7 @@ module Puppet::Parser; end
|
|
3
3
|
|
4
4
|
require 'puppet/parser/ast'
|
5
5
|
require 'puppet/parser/compiler'
|
6
|
+
require 'puppet/parser/compiler/catalog_validator'
|
6
7
|
require 'puppet/resource/type_collection'
|
7
8
|
|
8
9
|
require 'puppet/parser/functions'
|
@@ -13,5 +14,7 @@ require 'puppet/resource/type_collection_helper'
|
|
13
14
|
require 'puppet/resource/type'
|
14
15
|
require 'monitor'
|
15
16
|
|
17
|
+
Dir[File.dirname(__FILE__) + '/parser/compiler/catalog_validator/*.rb'].each { |f| require f }
|
18
|
+
|
16
19
|
# PUP-3274 This should probably go someplace else
|
17
20
|
class Puppet::LexError < RuntimeError; end
|
@@ -88,12 +88,18 @@ class Puppet::Parser::AST::PopsBridge
|
|
88
88
|
instantiate_HostClassDefinition(d, modname)
|
89
89
|
when Puppet::Pops::Model::ResourceTypeDefinition
|
90
90
|
instantiate_ResourceTypeDefinition(d, modname)
|
91
|
+
when Puppet::Pops::Model::CapabilityMapping
|
92
|
+
instantiate_CapabilityMapping(d, modname)
|
91
93
|
when Puppet::Pops::Model::NodeDefinition
|
92
94
|
instantiate_NodeDefinition(d, modname)
|
95
|
+
when Puppet::Pops::Model::SiteDefinition
|
96
|
+
instantiate_SiteDefinition(d, modname)
|
93
97
|
when Puppet::Pops::Model::FunctionDefinition
|
94
98
|
instantiate_FunctionDefinition(d, modname)
|
95
99
|
# The 3x logic calling this will not know what to do with the result, it is compacted away at the end
|
96
100
|
next
|
101
|
+
when Puppet::Pops::Model::Application
|
102
|
+
instantiate_ApplicationDefinition(d, modname)
|
97
103
|
else
|
98
104
|
raise Puppet::ParseError, "Internal Error: Unknown type of definition - got '#{d.class}'"
|
99
105
|
end
|
@@ -182,6 +188,27 @@ class Puppet::Parser::AST::PopsBridge
|
|
182
188
|
Puppet::Resource::Type.new(:definition, o.name, @context.merge(args_from_definition(o, modname)))
|
183
189
|
end
|
184
190
|
|
191
|
+
def instantiate_CapabilityMapping(o, modname)
|
192
|
+
# Use an intermediate 'capability_mapping' type to pass this info to the compiler where the
|
193
|
+
# actual mapping takes place
|
194
|
+
Puppet::Resource::Type.new(:capability_mapping, "#{o.component} #{o.kind} #{o.capability}", { :arguments => {
|
195
|
+
'component' => o.component,
|
196
|
+
'kind' => o.kind,
|
197
|
+
'blueprint' => {
|
198
|
+
:capability => o.capability,
|
199
|
+
:mappings => o.mappings.reduce({}) do |memo, mapping|
|
200
|
+
memo[mapping.attribute_name] =
|
201
|
+
Expression.new(:value => mapping.value_expr)
|
202
|
+
memo
|
203
|
+
end
|
204
|
+
}}})
|
205
|
+
end
|
206
|
+
|
207
|
+
def instantiate_ApplicationDefinition(o, modname)
|
208
|
+
args = args_from_definition(o, modname)
|
209
|
+
Puppet::Resource::Type.new(:application, o.name, @context.merge(args))
|
210
|
+
end
|
211
|
+
|
185
212
|
def instantiate_NodeDefinition(o, modname)
|
186
213
|
args = { :module_name => modname }
|
187
214
|
|
@@ -192,14 +219,25 @@ class Puppet::Parser::AST::PopsBridge
|
|
192
219
|
unless is_nop?(o.parent)
|
193
220
|
args[:parent] = @ast_transformer.hostname(o.parent)
|
194
221
|
end
|
222
|
+
args = @ast_transformer.merge_location(args, o)
|
195
223
|
|
196
224
|
host_matches = @ast_transformer.hostname(o.host_matches)
|
197
|
-
@ast_transformer.merge_location(args, o)
|
198
225
|
host_matches.collect do |name|
|
199
226
|
Puppet::Resource::Type.new(:node, name, @context.merge(args))
|
200
227
|
end
|
201
228
|
end
|
202
229
|
|
230
|
+
def instantiate_SiteDefinition(o, modname)
|
231
|
+
args = { :module_name => modname }
|
232
|
+
|
233
|
+
unless is_nop?(o.body)
|
234
|
+
args[:code] = Expression.new(:value => o.body)
|
235
|
+
end
|
236
|
+
|
237
|
+
args = @ast_transformer.merge_location(args, o)
|
238
|
+
Puppet::Resource::Type.new(:site, 'site', @context.merge(args))
|
239
|
+
end
|
240
|
+
|
203
241
|
# Propagates a found Function to the appropriate loader.
|
204
242
|
# This is for 4x evaluator/loader
|
205
243
|
#
|
@@ -6,6 +6,7 @@ require 'puppet/util/errors'
|
|
6
6
|
|
7
7
|
require 'puppet/resource/type_collection_helper'
|
8
8
|
require 'puppet/loaders'
|
9
|
+
require 'puppet/pops'
|
9
10
|
|
10
11
|
# Maintain a graph of scopes, along with a bunch of data
|
11
12
|
# about the individual catalog we're compiling.
|
@@ -16,8 +17,9 @@ class Puppet::Parser::Compiler
|
|
16
17
|
include Puppet::Util::Errors
|
17
18
|
include Puppet::Util::MethodHelper
|
18
19
|
include Puppet::Resource::TypeCollectionHelper
|
20
|
+
include Puppet::Pops::Evaluator::Runtime3Support
|
19
21
|
|
20
|
-
def self.compile(node)
|
22
|
+
def self.compile(node, code_id = nil)
|
21
23
|
$env_module_directories = nil
|
22
24
|
node.environment.check_for_reparse
|
23
25
|
|
@@ -31,7 +33,7 @@ class Puppet::Parser::Compiler
|
|
31
33
|
raise(Puppet::Error, errmsg.join(' '))
|
32
34
|
end
|
33
35
|
|
34
|
-
new(node).compile {|resulting_catalog| resulting_catalog.to_resource }
|
36
|
+
new(node, :code_id => code_id).compile {|resulting_catalog| resulting_catalog.to_resource }
|
35
37
|
rescue Puppet::ParseErrorWithIssue => detail
|
36
38
|
detail.node = node.name
|
37
39
|
Puppet.log_exception(detail)
|
@@ -65,6 +67,10 @@ class Puppet::Parser::Compiler
|
|
65
67
|
#
|
66
68
|
attr_accessor :boot_injector
|
67
69
|
|
70
|
+
# The id of code input to the compiler.
|
71
|
+
# @api private
|
72
|
+
attr_accessor :code_id
|
73
|
+
|
68
74
|
# Add a collection to the global list.
|
69
75
|
def_delegator :@collections, :<<, :add_collection
|
70
76
|
def_delegator :@relationships, :<<, :add_relationship
|
@@ -82,6 +88,22 @@ class Puppet::Parser::Compiler
|
|
82
88
|
end
|
83
89
|
|
84
90
|
def add_resource(scope, resource)
|
91
|
+
type = resource.resource_type
|
92
|
+
if type.is_a?(Puppet::Resource::Type) && type.application?
|
93
|
+
@applications << resource
|
94
|
+
assert_app_in_site(scope, resource)
|
95
|
+
return
|
96
|
+
end
|
97
|
+
|
98
|
+
if @current_app
|
99
|
+
# We are in the process of pulling application components out that
|
100
|
+
# apply to this node
|
101
|
+
Puppet.notice "Check #{resource}"
|
102
|
+
return unless @current_components.any? do |comp|
|
103
|
+
comp.type == resource.type && comp.title == resource.title
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
85
107
|
@resources << resource
|
86
108
|
|
87
109
|
# Note that this will fail if the resource is not unique.
|
@@ -99,7 +121,22 @@ class Puppet::Parser::Compiler
|
|
99
121
|
# This adds a resource to the class it lexically appears in in the
|
100
122
|
# manifest.
|
101
123
|
unless resource.class?
|
102
|
-
|
124
|
+
@catalog.add_edge(scope.resource, resource)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def assert_app_in_site(scope, resource)
|
129
|
+
if resource.type == 'App'
|
130
|
+
if scope.resource
|
131
|
+
# directly contained in a Site
|
132
|
+
return if scope.resource.type == 'Site'
|
133
|
+
# contained in something that may be contained in Site
|
134
|
+
upstream = @catalog.upstream_from_vertex(scope.resource)
|
135
|
+
if upstream
|
136
|
+
return if upstream.keys.map(&:type).include?('Site')
|
137
|
+
end
|
138
|
+
end
|
139
|
+
raise ArgumentError, "Application instances like '#{resource}' can only be contained within a Site"
|
103
140
|
end
|
104
141
|
end
|
105
142
|
|
@@ -111,6 +148,16 @@ class Puppet::Parser::Compiler
|
|
111
148
|
@catalog.add_class(name) unless name == ""
|
112
149
|
end
|
113
150
|
|
151
|
+
# Add a catalog validator that will run at some stage to this compiler
|
152
|
+
# @param catalog_validators [Class<CatalogValidator>] The catalog validator class to add
|
153
|
+
def add_catalog_validator(catalog_validators)
|
154
|
+
@catalog_validators << catalog_validators
|
155
|
+
nil
|
156
|
+
end
|
157
|
+
|
158
|
+
def add_catalog_validators
|
159
|
+
add_catalog_validator(CatalogValidator::RelationshipValidator)
|
160
|
+
end
|
114
161
|
|
115
162
|
# Return a list of all of the defined classes.
|
116
163
|
def_delegator :@catalog, :classes, :classlist
|
@@ -128,18 +175,37 @@ class Puppet::Parser::Compiler
|
|
128
175
|
|
129
176
|
activate_binder
|
130
177
|
|
178
|
+
Puppet::Util::Profiler.profile("Compile: Evaluated capability mappings", [:compiler, :evaluate_capability_mappings]) { evaluate_capability_mappings }
|
179
|
+
|
131
180
|
Puppet::Util::Profiler.profile("Compile: Evaluated main", [:compiler, :evaluate_main]) { evaluate_main }
|
132
181
|
|
182
|
+
Puppet::Util::Profiler.profile("Compile: Evaluated site", [:compiler, :evaluate_site]) { evaluate_site }
|
183
|
+
|
133
184
|
Puppet::Util::Profiler.profile("Compile: Evaluated AST node", [:compiler, :evaluate_ast_node]) { evaluate_ast_node }
|
134
185
|
|
135
186
|
Puppet::Util::Profiler.profile("Compile: Evaluated node classes", [:compiler, :evaluate_node_classes]) { evaluate_node_classes }
|
136
187
|
|
188
|
+
Puppet::Util::Profiler.profile("Compile: Evaluated application instances", [:compiler, :evaluate_applications]) { evaluate_applications }
|
189
|
+
|
190
|
+
# New capability mappings may have been defined when the site was evaluated
|
191
|
+
Puppet::Util::Profiler.profile("Compile: Evaluated site capability mappings", [:compiler, :evaluate_capability_mappings]) { evaluate_capability_mappings }
|
192
|
+
|
137
193
|
Puppet::Util::Profiler.profile("Compile: Evaluated generators", [:compiler, :evaluate_generators]) { evaluate_generators }
|
138
194
|
|
195
|
+
Puppet::Util::Profiler.profile("Compile: Validate Catalog pre-finish", [:compiler, :validate_pre_finish]) do
|
196
|
+
validate_catalog(CatalogValidator::PRE_FINISH)
|
197
|
+
end
|
198
|
+
|
139
199
|
Puppet::Util::Profiler.profile("Compile: Finished catalog", [:compiler, :finish_catalog]) { finish }
|
140
200
|
|
201
|
+
Puppet::Util::Profiler.profile("Compile: Prune", [:compiler, :prune_catalog]) { prune_catalog }
|
202
|
+
|
141
203
|
fail_on_unevaluated
|
142
204
|
|
205
|
+
Puppet::Util::Profiler.profile("Compile: Validate Catalog final", [:compiler, :validate_final]) do
|
206
|
+
validate_catalog(CatalogValidator::FINAL)
|
207
|
+
end
|
208
|
+
|
143
209
|
if block_given?
|
144
210
|
yield @catalog
|
145
211
|
else
|
@@ -148,6 +214,10 @@ class Puppet::Parser::Compiler
|
|
148
214
|
end
|
149
215
|
end
|
150
216
|
|
217
|
+
def validate_catalog(validation_stage)
|
218
|
+
@catalog_validators.select { |vclass| vclass.validation_stage?(validation_stage) }.each { |vclass| vclass.new(@catalog).validate }
|
219
|
+
end
|
220
|
+
|
151
221
|
# Constructs the overrides for the context
|
152
222
|
def context_overrides()
|
153
223
|
{
|
@@ -188,6 +258,111 @@ class Puppet::Parser::Compiler
|
|
188
258
|
evaluate_classes(classes_without_params, @node_scope || topscope)
|
189
259
|
end
|
190
260
|
|
261
|
+
# Evaluates the site - the top container for an environment catalog
|
262
|
+
# The site contain behaves analogous to a node - for the environment catalog, node expressions are ignored
|
263
|
+
# as the result is cross node. The site expression serves as a container for everything that is across
|
264
|
+
# all nodes.
|
265
|
+
#
|
266
|
+
# @api private
|
267
|
+
#
|
268
|
+
def evaluate_site
|
269
|
+
# Has a site been defined? If not, do nothing but issue a warning.
|
270
|
+
#
|
271
|
+
site = known_resource_types.find_site()
|
272
|
+
unless site
|
273
|
+
on_empty_site()
|
274
|
+
return
|
275
|
+
end
|
276
|
+
|
277
|
+
# Create a resource to model this site and add it to catalog
|
278
|
+
resource = site.ensure_in_catalog(topscope)
|
279
|
+
|
280
|
+
# The site sets node scope to be able to shadow what is in top scope
|
281
|
+
@node_scope = topscope.class_scope(site)
|
282
|
+
|
283
|
+
# Evaluates the logic contain in the site expression
|
284
|
+
resource.evaluate
|
285
|
+
end
|
286
|
+
|
287
|
+
# @api private
|
288
|
+
def on_empty_site
|
289
|
+
# do nothing
|
290
|
+
end
|
291
|
+
|
292
|
+
# Prunes the catalog by dropping all resources are contained under the Site (if a site expression is used).
|
293
|
+
# As a consequence all edges to/from dropped resources are also dropped.
|
294
|
+
# Once the pruning is performed, this compiler returns the pruned list when calling the #resources method.
|
295
|
+
# The pruning does not alter the order of resources in the resources list.
|
296
|
+
#
|
297
|
+
# @api private
|
298
|
+
def prune_catalog
|
299
|
+
prune_node_catalog
|
300
|
+
end
|
301
|
+
|
302
|
+
def prune_node_catalog
|
303
|
+
# Everything under Site[site] should be pruned as that is for the environment catalog, not a node
|
304
|
+
#
|
305
|
+
the_site_resource = @catalog.resource('Site', 'site')
|
306
|
+
|
307
|
+
if the_site_resource
|
308
|
+
# Get downstream vertexes returns a hash where the keys are the resources and values nesting level
|
309
|
+
to_be_removed = @catalog.downstream_from_vertex(the_site_resource).keys
|
310
|
+
|
311
|
+
# Drop the Site[site] resource if it has no content
|
312
|
+
if to_be_removed.empty?
|
313
|
+
to_be_removed << the_site_resource
|
314
|
+
end
|
315
|
+
else
|
316
|
+
to_be_removed = []
|
317
|
+
end
|
318
|
+
|
319
|
+
# keep_from_site is populated with any App resources.
|
320
|
+
application_resources = @resources.select {|r| r.type == 'App' }
|
321
|
+
# keep all applications plus what is directly referenced from applications
|
322
|
+
keep_from_site = application_resources
|
323
|
+
keep_from_site += application_resources.map {|app| @catalog.direct_dependents_of(app) }.flatten
|
324
|
+
|
325
|
+
to_be_removed -= keep_from_site
|
326
|
+
@catalog.remove_resource(*to_be_removed)
|
327
|
+
# set the pruned result
|
328
|
+
@resources = @catalog.resources
|
329
|
+
end
|
330
|
+
|
331
|
+
# @api private
|
332
|
+
def evaluate_applications
|
333
|
+
@applications.each do |app|
|
334
|
+
components = []
|
335
|
+
mapping = app.parameters[:nodes] ? app.parameters[:nodes].value : {}
|
336
|
+
raise Puppet::Error, "Invalid node mapping in #{app.ref}: Mapping must be a hash" unless mapping.is_a?(Hash)
|
337
|
+
all_mapped = Set.new
|
338
|
+
mapping.each do |k,v|
|
339
|
+
raise Puppet::Error, "Invalid node mapping in #{app.ref}: Key #{k} is not a Node" unless k.is_a?(Puppet::Resource) && k.type == 'Node'
|
340
|
+
v = [v] unless v.is_a?(Array)
|
341
|
+
v.each do |res|
|
342
|
+
raise Puppet::Error, "Invalid node mapping in #{app.ref}: Value #{res} is not a resource" unless res.is_a?(Puppet::Resource)
|
343
|
+
raise Puppet::Error, "Application #{app.ref} maps component #{res} to multiple nodes" if all_mapped.add?(res.ref).nil?
|
344
|
+
components << res if k.title == node.name
|
345
|
+
end
|
346
|
+
end
|
347
|
+
begin
|
348
|
+
@current_app = app
|
349
|
+
@current_components = components
|
350
|
+
unless @current_components.empty?
|
351
|
+
Puppet.notice "EVAL APP #{app} #{components.inspect}"
|
352
|
+
# Add the app itself since components mapped to the current node
|
353
|
+
# will have a containment edge for it
|
354
|
+
# @todo lutter 2015-01-28: the node mapping winds up in the
|
355
|
+
# catalog, but probably shouldn't
|
356
|
+
@catalog.add_resource(@current_app)
|
357
|
+
@current_app.evaluate
|
358
|
+
end
|
359
|
+
ensure
|
360
|
+
@current_app = nil
|
361
|
+
@current_components = nil
|
362
|
+
end
|
363
|
+
end
|
364
|
+
end
|
365
|
+
|
191
366
|
# Evaluates each specified class in turn. If there are any classes that
|
192
367
|
# can't be found, an error is raised. This method really just creates resource objects
|
193
368
|
# that point back to the classes, and then the resources are themselves
|
@@ -203,6 +378,12 @@ class Puppet::Parser::Compiler
|
|
203
378
|
classes = classes.keys
|
204
379
|
end
|
205
380
|
|
381
|
+
unless @current_components.nil?
|
382
|
+
classes = classes.select do |title|
|
383
|
+
@current_components.any? { |comp| comp.class? && comp.title == title }
|
384
|
+
end
|
385
|
+
end
|
386
|
+
|
206
387
|
hostclasses = classes.collect do |name|
|
207
388
|
scope.find_hostclass(name) or raise Puppet::Error, "Could not find class #{name} for #{node.name}"
|
208
389
|
end
|
@@ -232,9 +413,20 @@ class Puppet::Parser::Compiler
|
|
232
413
|
def_delegator :@catalog, :resource, :findresource
|
233
414
|
|
234
415
|
def initialize(node, options = {})
|
235
|
-
@node = node
|
416
|
+
@node = sanitize_node(node)
|
417
|
+
# Array of resources representing all application instances we've found
|
418
|
+
@applications = []
|
419
|
+
# We use @current_app and @current_components to signal to the
|
420
|
+
# evaluator that we are in the middle of evaluating an
|
421
|
+
# application. They are set in evaluate_applications to the application
|
422
|
+
# instance, resp. to an array of the components of that application
|
423
|
+
# that is mapped to the current node. They are only non-nil when we are
|
424
|
+
# in the middle of executing evaluate_applications
|
425
|
+
@current_app = nil
|
426
|
+
@current_components = nil
|
236
427
|
set_options(options)
|
237
428
|
initvars
|
429
|
+
add_catalog_validators
|
238
430
|
end
|
239
431
|
|
240
432
|
# Create a new scope, with either a specified parent scope or
|
@@ -315,6 +507,38 @@ class Puppet::Parser::Compiler
|
|
315
507
|
[already_included, newly_included]
|
316
508
|
end
|
317
509
|
|
510
|
+
def evaluate_capability_mappings
|
511
|
+
krt = known_resource_types
|
512
|
+
krt.capability_mappings.each_value do |capability_mapping|
|
513
|
+
args = capability_mapping.arguments
|
514
|
+
component_ref = args['component']
|
515
|
+
kind = args['kind']
|
516
|
+
|
517
|
+
# That component_ref is either a QNAME or a Class['literal'|QREF] is asserted during validation so no
|
518
|
+
# need to check that here
|
519
|
+
if component_ref.is_a?(Puppet::Pops::Model::QualifiedName)
|
520
|
+
component_name = component_ref.value
|
521
|
+
component_type = 'type'
|
522
|
+
component = krt.find_definition(component_name)
|
523
|
+
else
|
524
|
+
component_name = component_ref.keys[0].value
|
525
|
+
component_type = 'class'
|
526
|
+
component = krt.find_hostclass(component_name)
|
527
|
+
end
|
528
|
+
if component.nil?
|
529
|
+
raise Puppet::ParseError, "Capability mapping error: #{kind} clause references nonexistent #{component_type} #{component_name}"
|
530
|
+
end
|
531
|
+
|
532
|
+
blueprint = args['blueprint']
|
533
|
+
if kind == 'produces'
|
534
|
+
component.add_produces(blueprint)
|
535
|
+
else
|
536
|
+
component.add_consumes(blueprint)
|
537
|
+
end
|
538
|
+
end
|
539
|
+
krt.capability_mappings.clear # No longer needed
|
540
|
+
end
|
541
|
+
|
318
542
|
# If ast nodes are enabled, then see if we can find and evaluate one.
|
319
543
|
def evaluate_ast_node
|
320
544
|
return unless ast_nodes?
|
@@ -326,7 +550,7 @@ class Puppet::Parser::Compiler
|
|
326
550
|
end
|
327
551
|
|
328
552
|
unless (astnode ||= known_resource_types.node("default"))
|
329
|
-
raise Puppet::ParseError, "Could not find
|
553
|
+
raise Puppet::ParseError, "Could not find node statement with name 'default' or '#{node.names.join(", ")}'"
|
330
554
|
end
|
331
555
|
|
332
556
|
# Create a resource to model this node, and then add it to the list
|
@@ -363,9 +587,16 @@ class Puppet::Parser::Compiler
|
|
363
587
|
def evaluate_definitions
|
364
588
|
exceptwrap do
|
365
589
|
Puppet::Util::Profiler.profile("Evaluated definitions", [:compiler, :evaluate_definitions]) do
|
366
|
-
|
367
|
-
|
368
|
-
|
590
|
+
urs = unevaluated_resources.each do |resource|
|
591
|
+
begin
|
592
|
+
resource.evaluate
|
593
|
+
rescue Puppet::Error => e
|
594
|
+
# PuppetError has the ability to wrap an exception, if so, use the wrapped exception's
|
595
|
+
# call stack instead
|
596
|
+
fail(Puppet::Pops::Issues::RUNTIME_ERROR, resource, {:detail => e.message}, e.original || e)
|
597
|
+
end
|
598
|
+
end
|
599
|
+
!urs.empty?
|
369
600
|
end
|
370
601
|
end
|
371
602
|
end
|
@@ -420,8 +651,7 @@ class Puppet::Parser::Compiler
|
|
420
651
|
remaining = @resource_overrides.values.flatten.collect(&:ref)
|
421
652
|
|
422
653
|
if !remaining.empty?
|
423
|
-
|
424
|
-
"Could not find resource(s) #{remaining.join(', ')} for overriding"
|
654
|
+
raise Puppet::ParseError, "Could not find resource(s) #{remaining.join(', ')} for overriding"
|
425
655
|
end
|
426
656
|
end
|
427
657
|
|
@@ -515,7 +745,7 @@ class Puppet::Parser::Compiler
|
|
515
745
|
@relationships = []
|
516
746
|
|
517
747
|
# For maintaining the relationship between scopes and their resources.
|
518
|
-
@catalog = Puppet::Resource::Catalog.new(@node.name, @node.environment)
|
748
|
+
@catalog = Puppet::Resource::Catalog.new(@node.name, @node.environment, @code_id)
|
519
749
|
|
520
750
|
# MOVED HERE - SCOPE IS NEEDED (MOVE-SCOPE)
|
521
751
|
# Create the initial scope, it is needed early
|
@@ -547,6 +777,66 @@ class Puppet::Parser::Compiler
|
|
547
777
|
else
|
548
778
|
@catalog.add_class(*@node.classes)
|
549
779
|
end
|
780
|
+
|
781
|
+
@catalog_validators = []
|
782
|
+
end
|
783
|
+
|
784
|
+
def sanitize_node(node)
|
785
|
+
# Resurrect "trusted information" that comes from node/fact terminus.
|
786
|
+
# The current way this is done in puppet db (currently the only one)
|
787
|
+
# is to store the node parameter 'trusted' as a hash of the trusted information.
|
788
|
+
#
|
789
|
+
# Thus here there are two main cases:
|
790
|
+
# 1. This terminus was used in a real agent call (only meaningful if someone curls the request as it would
|
791
|
+
# fail since the result is a hash of two catalogs).
|
792
|
+
# 2 It is a command line call with a given node that use a terminus that:
|
793
|
+
# 2.1 does not include a 'trusted' fact - use local from node trusted information
|
794
|
+
# 2.2 has a 'trusted' fact - this in turn could be
|
795
|
+
# 2.2.1 puppet db having stored trusted node data as a fact (not a great design)
|
796
|
+
# 2.2.2 some other terminus having stored a fact called "trusted" (most likely that would have failed earlier, but could
|
797
|
+
# be spoofed).
|
798
|
+
#
|
799
|
+
# For the reasons above, the resurection of trusted node data with authenticated => true is only performed
|
800
|
+
# if user is running as root, else it is resurrected as unauthenticated.
|
801
|
+
#
|
802
|
+
trusted_param = node.parameters['trusted']
|
803
|
+
if trusted_param
|
804
|
+
# Blows up if it is a parameter as it will be set as $trusted by the compiler as if it was a variable
|
805
|
+
node.parameters.delete('trusted')
|
806
|
+
if trusted_param.is_a?(Hash) && %w{authenticated certname extensions}.all? {|key| trusted_param.has_key?(key) }
|
807
|
+
# looks like a hash of trusted data - resurrect it
|
808
|
+
# Allow root to trust the authenticated information if option --trusted is given
|
809
|
+
if !Puppet.features.root?
|
810
|
+
# Set as not trusted - but keep the information
|
811
|
+
trusted_param['authenticated'] = false
|
812
|
+
end
|
813
|
+
else
|
814
|
+
# trusted is some kind of garbage, do not resurrect
|
815
|
+
trusted_param = nil
|
816
|
+
end
|
817
|
+
else
|
818
|
+
# trusted may be boolean false if set as a fact by someone
|
819
|
+
trusted_param = nil
|
820
|
+
end
|
821
|
+
|
822
|
+
# The options for node.trusted_data in priority order are:
|
823
|
+
# 1) node came with trusted_data so use that
|
824
|
+
# 2) else if there is :trusted_information in the puppet context
|
825
|
+
# 3) else if the node provided a 'trusted' parameter (parsed out above)
|
826
|
+
# 4) last, fallback to local node trusted information
|
827
|
+
#
|
828
|
+
# Note that trusted_data should be a hash, but (2) and (4) are not
|
829
|
+
# hashes, so we to_h at the end
|
830
|
+
if !node.trusted_data
|
831
|
+
trusted = Puppet.lookup(:trusted_information) do
|
832
|
+
trusted_param || Puppet::Context::TrustedInformation.local(node)
|
833
|
+
end
|
834
|
+
|
835
|
+
# Ruby 1.9.3 can't apply to_h to a hash, so check first
|
836
|
+
node.trusted_data = trusted.is_a?(Hash) ? trusted : trusted.to_h
|
837
|
+
end
|
838
|
+
|
839
|
+
node
|
550
840
|
end
|
551
841
|
|
552
842
|
# Set the node's parameters into the top-scope as variables.
|
@@ -608,5 +898,5 @@ class Puppet::Parser::Compiler
|
|
608
898
|
unless activate_binder()
|
609
899
|
raise Puppet::DevError, "The Puppet Binder was not activated"
|
610
900
|
end
|
611
|
-
end
|
901
|
+
end # Creates a diagnostic producer
|
612
902
|
end
|