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
|
@@ -41,15 +41,17 @@ class Puppet::Resource::Catalog::StaticCompiler < Puppet::Resource::Catalog::Com
|
|
|
41
41
|
raise "Did not get catalog back" unless catalog.is_a?(model)
|
|
42
42
|
|
|
43
43
|
catalog.resources.find_all { |res| res.type == "File" }.each do |resource|
|
|
44
|
+
next if resource[:ensure] == 'absent'
|
|
45
|
+
|
|
44
46
|
next unless source = resource[:source]
|
|
45
47
|
next unless source =~ /^puppet:/
|
|
46
48
|
|
|
47
49
|
file = resource.to_ral
|
|
48
50
|
|
|
49
51
|
if file.recurse?
|
|
50
|
-
add_children(request
|
|
52
|
+
add_children(request, catalog, resource, file)
|
|
51
53
|
else
|
|
52
|
-
find_and_replace_metadata(request
|
|
54
|
+
find_and_replace_metadata(request, resource, file)
|
|
53
55
|
end
|
|
54
56
|
end
|
|
55
57
|
|
|
@@ -65,10 +67,10 @@ class Puppet::Resource::Catalog::StaticCompiler < Puppet::Resource::Catalog::Com
|
|
|
65
67
|
# from the resource, inserts the metadata into the file resource, and uploads
|
|
66
68
|
# the file contents of the source to the file bucket.
|
|
67
69
|
#
|
|
68
|
-
# @param
|
|
70
|
+
# @param request [Puppet::Indirector::Request] The request for the catalog
|
|
69
71
|
# @param resource [Puppet::Resource] The resource to replace the metadata in
|
|
70
72
|
# @param file [Puppet::Type::File] The file RAL associated with the resource
|
|
71
|
-
def find_and_replace_metadata(
|
|
73
|
+
def find_and_replace_metadata(request, resource, file)
|
|
72
74
|
# We remove URL info from it, so it forces a local copy
|
|
73
75
|
# rather than routing through the network.
|
|
74
76
|
# Weird, but true.
|
|
@@ -77,7 +79,7 @@ class Puppet::Resource::Catalog::StaticCompiler < Puppet::Resource::Catalog::Com
|
|
|
77
79
|
|
|
78
80
|
raise "Could not get metadata for #{resource[:source]}" unless metadata = file.parameter(:source).metadata
|
|
79
81
|
|
|
80
|
-
replace_metadata(
|
|
82
|
+
replace_metadata(request, resource, metadata)
|
|
81
83
|
end
|
|
82
84
|
|
|
83
85
|
# Rewrite a given file resource with the metadata from a fileserver based file
|
|
@@ -85,13 +87,14 @@ class Puppet::Resource::Catalog::StaticCompiler < Puppet::Resource::Catalog::Com
|
|
|
85
87
|
# This performs the actual metadata rewrite for the given file resource and
|
|
86
88
|
# uploads the content of the source file to the filebucket.
|
|
87
89
|
#
|
|
88
|
-
# @param
|
|
90
|
+
# @param request [Puppet::Indirector::Request] The request for the catalog
|
|
89
91
|
# @param resource [Puppet::Resource] The resource to add the metadata to
|
|
90
92
|
# @param metadata [Puppet::FileServing::Metadata] The metadata of the given fileserver based file
|
|
91
|
-
def replace_metadata(
|
|
92
|
-
[:
|
|
93
|
-
resource[param] ||= metadata.send(param)
|
|
93
|
+
def replace_metadata(request, resource, metadata)
|
|
94
|
+
[:owner, :group].each do |param|
|
|
95
|
+
resource[param] ||= metadata.send(param).to_s
|
|
94
96
|
end
|
|
97
|
+
resource[:mode] ||= metadata.send(:mode).to_s(8)
|
|
95
98
|
|
|
96
99
|
resource[:ensure] = metadata.ftype
|
|
97
100
|
if metadata.ftype == "file"
|
|
@@ -101,21 +104,26 @@ class Puppet::Resource::Catalog::StaticCompiler < Puppet::Resource::Catalog::Com
|
|
|
101
104
|
end
|
|
102
105
|
end
|
|
103
106
|
|
|
104
|
-
store_content(resource) if resource[:ensure] == "file"
|
|
107
|
+
store_content(request, resource) if resource[:ensure] == "file"
|
|
105
108
|
old_source = resource.delete(:source)
|
|
106
|
-
Puppet.info "Metadata for #{resource} in catalog for '#{
|
|
109
|
+
Puppet.info "Metadata for #{resource} in catalog for '#{request.key}' added from '#{old_source}'"
|
|
107
110
|
end
|
|
108
111
|
|
|
109
112
|
# Generate children resources for a recursive file and add them to the catalog.
|
|
110
113
|
#
|
|
111
|
-
# @param
|
|
114
|
+
# @param request [Puppet::Indirector::Request] The request for the catalog
|
|
112
115
|
# @param catalog [Puppet::Resource::Catalog]
|
|
113
116
|
# @param resource [Puppet::Resource]
|
|
114
117
|
# @param file [Puppet::Type::File] The file RAL associated with the resource
|
|
115
|
-
def add_children(
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
118
|
+
def add_children(request, catalog, resource, file)
|
|
119
|
+
children = get_child_resources(request, catalog, resource, file)
|
|
120
|
+
# get_child_resources() returned early because source is not
|
|
121
|
+
# a directory, but we still need to replace the metadata of the
|
|
122
|
+
# resource, so we do it here before returning.
|
|
123
|
+
if children.nil?
|
|
124
|
+
find_and_replace_metadata(request, resource, file)
|
|
125
|
+
return
|
|
126
|
+
end
|
|
119
127
|
|
|
120
128
|
remove_existing_resources(children, catalog)
|
|
121
129
|
|
|
@@ -127,13 +135,13 @@ class Puppet::Resource::Catalog::StaticCompiler < Puppet::Resource::Catalog::Com
|
|
|
127
135
|
|
|
128
136
|
# Given a recursive file resource, recursively generate its children resources
|
|
129
137
|
#
|
|
130
|
-
# @param
|
|
138
|
+
# @param request [Puppet::Indirector::Request] The request for the catalog
|
|
131
139
|
# @param catalog [Puppet::Resource::Catalog]
|
|
132
140
|
# @param resource [Puppet::Resource]
|
|
133
141
|
# @param file [Puppet::Type::File] The file RAL associated with the resource
|
|
134
142
|
#
|
|
135
143
|
# @return [Array<Puppet::Resource>] The recursively generated File resources for the given resource
|
|
136
|
-
def get_child_resources(
|
|
144
|
+
def get_child_resources(request, catalog, resource, file)
|
|
137
145
|
sourceselect = file[:sourceselect]
|
|
138
146
|
children = {}
|
|
139
147
|
|
|
@@ -158,44 +166,52 @@ class Puppet::Resource::Catalog::StaticCompiler < Puppet::Resource::Catalog::Com
|
|
|
158
166
|
end
|
|
159
167
|
end
|
|
160
168
|
|
|
169
|
+
parent_meta = nil
|
|
161
170
|
total.each do |meta|
|
|
162
171
|
# This is the top-level parent directory
|
|
163
172
|
if meta.relative_path == "."
|
|
164
|
-
|
|
173
|
+
parent_meta = meta
|
|
165
174
|
next
|
|
166
175
|
end
|
|
167
|
-
children[meta.relative_path] ||=
|
|
176
|
+
child = children[meta.relative_path] ||=
|
|
177
|
+
Puppet::Resource.new(:file, File.join(file[:path], meta.relative_path))
|
|
168
178
|
|
|
169
179
|
# I think this is safe since it's a URL, not an actual file
|
|
170
|
-
|
|
180
|
+
child[:source] = source + "/" + meta.relative_path
|
|
171
181
|
resource.each do |param, value|
|
|
172
182
|
# These should never be passed to our children.
|
|
173
183
|
unless [:parent, :ensure, :recurse, :recurselimit, :target, :alias, :source].include? param
|
|
174
|
-
|
|
184
|
+
child[param] = value
|
|
175
185
|
end
|
|
176
186
|
end
|
|
177
|
-
replace_metadata(
|
|
187
|
+
replace_metadata(request, child, meta)
|
|
178
188
|
end
|
|
189
|
+
replace_metadata(request, resource, parent_meta)
|
|
179
190
|
|
|
180
191
|
children
|
|
181
192
|
end
|
|
182
193
|
|
|
183
|
-
# Remove any file resources in the catalog
|
|
184
|
-
# given file resources.
|
|
194
|
+
# Remove any recursed file resources already in the catalog
|
|
185
195
|
#
|
|
186
196
|
# @param children [Array<Puppet::Resource>]
|
|
187
197
|
# @param catalog [Puppet::Resource::Catalog]
|
|
188
198
|
def remove_existing_resources(children, catalog)
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
199
|
+
relative_paths = children.keys
|
|
200
|
+
relative_paths.each do |relative_path|
|
|
201
|
+
child = children[relative_path]
|
|
202
|
+
if catalog.resource(child.ref)
|
|
203
|
+
Puppet.debug("Resource #{child.ref} already managed, removing from recursed children")
|
|
204
|
+
children.delete(relative_path)
|
|
205
|
+
end
|
|
206
|
+
end
|
|
192
207
|
end
|
|
193
208
|
|
|
194
209
|
# Retrieve the source of a file resource using a fileserver based source and
|
|
195
210
|
# upload it to the filebucket.
|
|
196
211
|
#
|
|
212
|
+
# @param request [Puppet::Indirector::Request] The request for the catalog
|
|
197
213
|
# @param resource [Puppet::Resource]
|
|
198
|
-
def store_content(resource)
|
|
214
|
+
def store_content(request, resource)
|
|
199
215
|
@summer ||= Puppet::Util::Checksums
|
|
200
216
|
|
|
201
217
|
type = @summer.sumtype(resource[:content])
|
|
@@ -205,7 +221,7 @@ class Puppet::Resource::Catalog::StaticCompiler < Puppet::Resource::Catalog::Com
|
|
|
205
221
|
Puppet.info "Content for '#{resource[:source]}' already exists"
|
|
206
222
|
else
|
|
207
223
|
Puppet.info "Storing content for source '#{resource[:source]}'"
|
|
208
|
-
content = Puppet::FileServing::Content.indirection.find(resource[:source])
|
|
224
|
+
content = Puppet::FileServing::Content.indirection.find(resource[:source], {:environment => request.environment})
|
|
209
225
|
file = Puppet::FileBucket::File.new(content.content)
|
|
210
226
|
Puppet::FileBucket::File.indirection.save(file)
|
|
211
227
|
end
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
require 'puppet/indirector/none'
|
|
2
2
|
|
|
3
3
|
class Puppet::DataBinding::None < Puppet::Indirector::None
|
|
4
|
-
desc "A Dummy terminus that always
|
|
4
|
+
desc "A Dummy terminus that always throws :no_such_key for data lookups."
|
|
5
|
+
def find(request)
|
|
6
|
+
throw :no_such_key
|
|
7
|
+
end
|
|
5
8
|
end
|
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
require 'puppet/indirector/code'
|
|
2
2
|
require 'puppet/file_bucket/file'
|
|
3
3
|
require 'puppet/util/checksums'
|
|
4
|
+
require 'puppet/util/diff'
|
|
4
5
|
require 'fileutils'
|
|
5
6
|
|
|
6
7
|
module Puppet::FileBucketFile
|
|
7
8
|
class File < Puppet::Indirector::Code
|
|
8
9
|
include Puppet::Util::Checksums
|
|
10
|
+
include Puppet::Util::Diff
|
|
9
11
|
|
|
10
12
|
desc "Store files in a directory set based on their checksums."
|
|
11
13
|
|
|
12
14
|
def find(request)
|
|
15
|
+
request.options[:bucket_path] ||= Puppet[:bucketdir]
|
|
16
|
+
# If filebucket mode is 'list'
|
|
17
|
+
if request.options[:list_all]
|
|
18
|
+
return nil unless ::File.exists?(request.options[:bucket_path])
|
|
19
|
+
return list(request)
|
|
20
|
+
end
|
|
13
21
|
checksum, files_original_path = request_to_checksum_and_path(request)
|
|
14
22
|
contents_file = path_for(request.options[:bucket_path], checksum, 'contents')
|
|
15
23
|
paths_file = path_for(request.options[:bucket_path], checksum, 'paths')
|
|
@@ -18,7 +26,8 @@ module Puppet::FileBucketFile
|
|
|
18
26
|
if request.options[:diff_with]
|
|
19
27
|
other_contents_file = path_for(request.options[:bucket_path], request.options[:diff_with], 'contents')
|
|
20
28
|
raise "could not find diff_with #{request.options[:diff_with]}" unless Puppet::FileSystem.exist?(other_contents_file)
|
|
21
|
-
|
|
29
|
+
raise "Unable to diff on this platform" unless Puppet[:diff] != ""
|
|
30
|
+
return diff(Puppet::FileSystem.path_string(contents_file), Puppet::FileSystem.path_string(other_contents_file))
|
|
22
31
|
else
|
|
23
32
|
Puppet.info "FileBucket read #{checksum}"
|
|
24
33
|
model.new(Puppet::FileSystem.binread(contents_file))
|
|
@@ -28,6 +37,54 @@ module Puppet::FileBucketFile
|
|
|
28
37
|
end
|
|
29
38
|
end
|
|
30
39
|
|
|
40
|
+
def list(request)
|
|
41
|
+
if request.remote?
|
|
42
|
+
raise Puppet::Error, "Listing remote file buckets is not allowed"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
fromdate = request.options[:fromdate] || "0:0:0 1-1-1970"
|
|
46
|
+
todate = request.options[:todate] || Time.now.strftime("%F %T")
|
|
47
|
+
begin
|
|
48
|
+
to = Time.parse(todate)
|
|
49
|
+
rescue ArgumentError
|
|
50
|
+
raise Puppet::Error, "Error while parsing 'todate'"
|
|
51
|
+
end
|
|
52
|
+
begin
|
|
53
|
+
from = Time.parse(fromdate)
|
|
54
|
+
rescue ArgumentError
|
|
55
|
+
raise Puppet::Error, "Error while parsing 'fromdate'"
|
|
56
|
+
end
|
|
57
|
+
# Setting hash's default value to [], needed by the following loop
|
|
58
|
+
bucket = Hash.new {[]}
|
|
59
|
+
msg = ""
|
|
60
|
+
# Get all files with mtime between 'from' and 'to'
|
|
61
|
+
Pathname.new(request.options[:bucket_path]).find { |item|
|
|
62
|
+
if item.file? and item.basename.to_s == "paths"
|
|
63
|
+
filenames = item.read.strip.split("\n")
|
|
64
|
+
filestat = Time.parse(item.stat.mtime.to_s)
|
|
65
|
+
if from <= filestat and filestat <= to
|
|
66
|
+
filenames.each do |filename|
|
|
67
|
+
bucket[filename] += [[ item.stat.mtime , item.parent.basename ]]
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
}
|
|
72
|
+
# Sort the results
|
|
73
|
+
bucket.each { |filename, contents|
|
|
74
|
+
contents.sort_by! do |item|
|
|
75
|
+
item[0]
|
|
76
|
+
end
|
|
77
|
+
}
|
|
78
|
+
# Build the output message. Sorted by names then by dates
|
|
79
|
+
bucket.sort.each { |filename,contents|
|
|
80
|
+
contents.each { |mtime, chksum|
|
|
81
|
+
date = mtime.strftime("%F %T")
|
|
82
|
+
msg += "#{chksum} #{date} #{filename}\n"
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return model.new(msg)
|
|
86
|
+
end
|
|
87
|
+
|
|
31
88
|
def head(request)
|
|
32
89
|
checksum, files_original_path = request_to_checksum_and_path(request)
|
|
33
90
|
contents_file = path_for(request.options[:bucket_path], checksum, 'contents')
|
|
@@ -18,6 +18,7 @@ class Puppet::Indirector::Hiera < Puppet::Indirector::Terminus
|
|
|
18
18
|
def find(request)
|
|
19
19
|
not_found = Object.new
|
|
20
20
|
options = request.options
|
|
21
|
+
Puppet.debug { "Performing a hiera indirector lookup of #{request.key} with options #{options.inspect}" }
|
|
21
22
|
value = hiera.lookup(request.key, not_found, Hiera::Scope.new(options[:variables]), nil, convert_merge(options[:merge]))
|
|
22
23
|
throw :no_such_key if value.equal?(not_found)
|
|
23
24
|
value
|
|
@@ -34,8 +35,11 @@ class Puppet::Indirector::Hiera < Puppet::Indirector::Terminus
|
|
|
34
35
|
def convert_merge(merge)
|
|
35
36
|
case merge
|
|
36
37
|
when nil
|
|
38
|
+
when 'first'
|
|
37
39
|
# Nil is OK. Defaults to Hiera :priority
|
|
38
40
|
nil
|
|
41
|
+
when Puppet::Pops::MergeStrategy
|
|
42
|
+
convert_merge(merge.configuration)
|
|
39
43
|
when 'unique'
|
|
40
44
|
# Equivalent to Hiera :array
|
|
41
45
|
:array
|
|
@@ -196,7 +196,12 @@ class Puppet::Indirector::Indirection
|
|
|
196
196
|
result.expiration ||= self.expiration if result.respond_to?(:expiration)
|
|
197
197
|
if cache?
|
|
198
198
|
Puppet.info "Caching #{self.name} for #{request.key}"
|
|
199
|
-
|
|
199
|
+
begin
|
|
200
|
+
cache.save request(:save, key, result, options)
|
|
201
|
+
rescue => detail
|
|
202
|
+
Puppet.log_exception(detail)
|
|
203
|
+
raise detail
|
|
204
|
+
end
|
|
200
205
|
end
|
|
201
206
|
|
|
202
207
|
filtered = result
|
|
@@ -17,7 +17,7 @@ class Puppet::Indirector::JSON < Puppet::Indirector::Terminus
|
|
|
17
17
|
|
|
18
18
|
Puppet::Util.replace_file(filename, 0660) {|f| f.print to_json(request.instance) }
|
|
19
19
|
rescue TypeError => detail
|
|
20
|
-
Puppet.log_exception "Could not save #{self.name} #{request.key}: #{detail}"
|
|
20
|
+
Puppet.log_exception(detail, "Could not save #{self.name} #{request.key}: #{detail}")
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
def destroy(request)
|
|
@@ -23,7 +23,7 @@ class Puppet::Indirector::Msgpack < Puppet::Indirector::Terminus
|
|
|
23
23
|
|
|
24
24
|
Puppet::Util.replace_file(filename, 0660) {|f| f.print to_msgpack(request.instance) }
|
|
25
25
|
rescue TypeError => detail
|
|
26
|
-
Puppet.log_exception "Could not save #{self.name} #{request.key}: #{detail}"
|
|
26
|
+
Puppet.log_exception(detail, "Could not save #{self.name} #{request.key}: #{detail}")
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
def destroy(request)
|
|
@@ -243,15 +243,14 @@ class Puppet::Indirector::Request
|
|
|
243
243
|
@port = uri.port.to_i
|
|
244
244
|
end
|
|
245
245
|
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
if uri.scheme == '
|
|
249
|
-
@
|
|
250
|
-
|
|
246
|
+
# filebucket:// is only used internally to pass request details
|
|
247
|
+
# from Dipper objects to the indirector. The wire always uses HTTPS.
|
|
248
|
+
if uri.scheme == 'filebucket'
|
|
249
|
+
@protocol = 'https'
|
|
250
|
+
else
|
|
251
|
+
@protocol = uri.scheme
|
|
251
252
|
end
|
|
252
253
|
|
|
253
|
-
|
|
254
|
-
@key ||= ''
|
|
255
|
-
self.environment = env unless env == ''
|
|
254
|
+
@key = URI.unescape(uri.path.sub(/^\//, ''))
|
|
256
255
|
end
|
|
257
256
|
end
|
|
@@ -27,7 +27,7 @@ class Puppet::Indirector::ResourceType::Parser < Puppet::Indirector::Code
|
|
|
27
27
|
krt = resource_types_in(request.environment)
|
|
28
28
|
|
|
29
29
|
# This is a bit ugly.
|
|
30
|
-
[:hostclass, :definition, :node].each do |type|
|
|
30
|
+
[:hostclass, :definition, :application, :node].each do |type|
|
|
31
31
|
# We have to us 'find_<type>' here because it will
|
|
32
32
|
# load any missing types from disk, whereas the plain
|
|
33
33
|
# '<type>' method only returns from memory.
|
|
@@ -66,14 +66,16 @@ class Puppet::Indirector::ResourceType::Parser < Puppet::Indirector::Code
|
|
|
66
66
|
krt.hostclasses.values
|
|
67
67
|
when "defined_type"
|
|
68
68
|
krt.definitions.values
|
|
69
|
+
when "application"
|
|
70
|
+
krt.applications.values
|
|
69
71
|
when "node"
|
|
70
72
|
krt.nodes.values
|
|
71
73
|
when nil
|
|
72
|
-
result_candidates = [krt.hostclasses.values, krt.definitions.values, krt.nodes.values]
|
|
74
|
+
result_candidates = [krt.hostclasses.values, krt.definitions.values, krt.applications.values, krt.nodes.values]
|
|
73
75
|
else
|
|
74
76
|
raise ArgumentError, "Unrecognized kind filter: " +
|
|
75
77
|
"'#{request.options[:kind]}', expected one " +
|
|
76
|
-
" of 'class', 'defined_type', or 'node'."
|
|
78
|
+
" of 'class', 'defined_type', 'application', or 'node'."
|
|
77
79
|
end
|
|
78
80
|
|
|
79
81
|
result = result_candidates.flatten.reject { |t| t.name == "" }
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
require 'puppet'
|
|
2
|
+
require 'puppet/pops'
|
|
3
|
+
require 'puppet/pops/evaluator/literal_evaluator'
|
|
4
|
+
|
|
5
|
+
class Puppet::InfoService::ClassInformationService
|
|
6
|
+
|
|
7
|
+
def initialize
|
|
8
|
+
@file_to_result = {}
|
|
9
|
+
@parser = Puppet::Pops::Parser::EvaluatingParser.new()
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def classes_per_environment(env_file_hash)
|
|
13
|
+
# In this version of puppet there is only one way to parse manifests, as feature switches per environment
|
|
14
|
+
# are added or removed, this logic needs to change to compute the result per environment with the correct
|
|
15
|
+
# feature flags in effect.
|
|
16
|
+
|
|
17
|
+
unless env_file_hash.is_a?(Hash)
|
|
18
|
+
raise ArgumentError, 'Given argument must be a Hash'
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
result = {}
|
|
22
|
+
|
|
23
|
+
# for each environment
|
|
24
|
+
# for each file
|
|
25
|
+
# if file already processed, use last result or error
|
|
26
|
+
#
|
|
27
|
+
env_file_hash.each do |env, files|
|
|
28
|
+
env_result = result[env] = {}
|
|
29
|
+
files.each do |f|
|
|
30
|
+
env_result[f] = result_of(f)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
result
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def type_parser
|
|
39
|
+
# Safe to cache this as it would otherwise constantly build up the visitor cache
|
|
40
|
+
@@type_parser ||= Puppet::Pops::Types::TypeParser.new
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def literal_evaluator
|
|
44
|
+
@@literal_evaluator ||= Puppet::Pops::Evaluator::LiteralEvaluator.new
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def result_of(f)
|
|
48
|
+
entry = @file_to_result[f]
|
|
49
|
+
if entry.nil?
|
|
50
|
+
@file_to_result[f] = entry = parse_file(f)
|
|
51
|
+
end
|
|
52
|
+
entry
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def parse_file(f)
|
|
56
|
+
begin
|
|
57
|
+
parse_result = @parser.parse_file(f)
|
|
58
|
+
parse_result.definitions.select {|d| d.is_a?(Puppet::Pops::Model::HostClassDefinition)}.map do |d|
|
|
59
|
+
{:name => d.name,
|
|
60
|
+
:params => params = d.parameters.map {|p| extract_param(p) }
|
|
61
|
+
}
|
|
62
|
+
end
|
|
63
|
+
rescue StandardError => e
|
|
64
|
+
{:error => e.message }
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def extract_param(p)
|
|
69
|
+
extract_default(extract_type({:name => p.name}, p), p)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def extract_type(structure, p)
|
|
73
|
+
return structure if p.type_expr.nil?
|
|
74
|
+
structure[:type] = typeexpr_to_string(p.type_expr)
|
|
75
|
+
structure
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def extract_default(structure, p)
|
|
79
|
+
value_expr = p.value
|
|
80
|
+
return structure if value_expr.nil?
|
|
81
|
+
default_value = value_as_literal(value_expr)
|
|
82
|
+
if !default_value.nil?
|
|
83
|
+
structure[:default_literal] = default_value
|
|
84
|
+
return structure
|
|
85
|
+
end
|
|
86
|
+
structure[:default_source] = extract_value_source(value_expr)
|
|
87
|
+
structure
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def typeexpr_to_string(type_expr)
|
|
91
|
+
begin
|
|
92
|
+
type_parser.interpret_any(type_expr).to_s
|
|
93
|
+
rescue Puppet::ParseError
|
|
94
|
+
# type is to complex - contains expressions that are not literal
|
|
95
|
+
nil
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def value_as_literal(value_expr)
|
|
100
|
+
catch(:not_literal) do
|
|
101
|
+
return literal_evaluator.literal(value_expr)
|
|
102
|
+
end
|
|
103
|
+
nil
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Extracts the source for the expression
|
|
107
|
+
def extract_value_source(value_expr)
|
|
108
|
+
position = Puppet::Pops::Adapters::SourcePosAdapter.adapt(value_expr)
|
|
109
|
+
position.extract_tree_text
|
|
110
|
+
end
|
|
111
|
+
end
|
|
@@ -93,7 +93,7 @@ module Puppet::ModuleTool
|
|
|
93
93
|
# @api private
|
|
94
94
|
# @return [String] path to temporary unpacking location
|
|
95
95
|
def tmpdir
|
|
96
|
-
@dir ||= Dir.mktmpdir('tmp
|
|
96
|
+
@dir ||= Dir.mktmpdir('tmp', Puppet::Forge::Cache.base_path)
|
|
97
97
|
end
|
|
98
98
|
end
|
|
99
99
|
end
|
|
@@ -15,15 +15,16 @@ module Puppet::ModuleTool
|
|
|
15
15
|
attr_accessor :module_name
|
|
16
16
|
|
|
17
17
|
DEFAULTS = {
|
|
18
|
-
'name'
|
|
19
|
-
'version'
|
|
20
|
-
'author'
|
|
21
|
-
'summary'
|
|
22
|
-
'license'
|
|
23
|
-
'source'
|
|
24
|
-
'project_page'
|
|
25
|
-
'issues_url'
|
|
26
|
-
'dependencies'
|
|
18
|
+
'name' => nil,
|
|
19
|
+
'version' => nil,
|
|
20
|
+
'author' => nil,
|
|
21
|
+
'summary' => nil,
|
|
22
|
+
'license' => 'Apache-2.0',
|
|
23
|
+
'source' => '',
|
|
24
|
+
'project_page' => nil,
|
|
25
|
+
'issues_url' => nil,
|
|
26
|
+
'dependencies' => Set.new.freeze,
|
|
27
|
+
'data_provider' => nil,
|
|
27
28
|
}
|
|
28
29
|
|
|
29
30
|
def initialize
|
|
@@ -52,6 +53,7 @@ module Puppet::ModuleTool
|
|
|
52
53
|
process_name(data) if data['name']
|
|
53
54
|
process_version(data) if data['version']
|
|
54
55
|
process_source(data) if data['source']
|
|
56
|
+
process_data_provider(data) if data['data_provider']
|
|
55
57
|
merge_dependencies(data) if data['dependencies']
|
|
56
58
|
|
|
57
59
|
@data.merge!(data)
|
|
@@ -128,6 +130,10 @@ module Puppet::ModuleTool
|
|
|
128
130
|
validate_version(data['version'])
|
|
129
131
|
end
|
|
130
132
|
|
|
133
|
+
def process_data_provider(data)
|
|
134
|
+
validate_data_provider(data['data_provider'])
|
|
135
|
+
end
|
|
136
|
+
|
|
131
137
|
# Do basic parsing of the source parameter. If the source is hosted on
|
|
132
138
|
# GitHub, we can predict sensible defaults for both project_page and
|
|
133
139
|
# issues_url.
|
|
@@ -188,6 +194,23 @@ module Puppet::ModuleTool
|
|
|
188
194
|
raise ArgumentError, "Invalid 'version' field in metadata.json: #{err}"
|
|
189
195
|
end
|
|
190
196
|
|
|
197
|
+
# Validates that the given _value_ is a symbolic name that starts with a letter
|
|
198
|
+
# and then contains only letters, digits, or underscore. Will raise an ArgumentError
|
|
199
|
+
# if that's not the case.
|
|
200
|
+
#
|
|
201
|
+
# @param value [Object] The value to be tested
|
|
202
|
+
def validate_data_provider(value)
|
|
203
|
+
err = nil
|
|
204
|
+
if value.is_a?(String)
|
|
205
|
+
unless value =~ /^[a-zA-Z][a-zA-Z0-9_]*$/
|
|
206
|
+
err = value =~ /^[a-zA-Z]/ ? 'contains non-alphanumeric characters' : 'must begin with a letter'
|
|
207
|
+
end
|
|
208
|
+
else
|
|
209
|
+
err = 'must be a string'
|
|
210
|
+
end
|
|
211
|
+
raise ArgumentError, "field 'data_provider' #{err}" if err
|
|
212
|
+
end
|
|
213
|
+
|
|
191
214
|
# Validates that the version range can be parsed by Semantic.
|
|
192
215
|
def validate_version_range(version_range)
|
|
193
216
|
Semantic::VersionRange.parse(version_range)
|