puppet 3.2.4 → 3.3.0.rc2
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/COMMITTERS.md +101 -42
- data/Gemfile +15 -4
- data/README.md +5 -1
- data/README_DEVELOPER.md +117 -54
- data/Rakefile +4 -0
- data/ext/build_defaults.yaml +3 -2
- data/ext/debian/puppet-common.manpages +33 -1
- data/ext/gentoo/init.d/puppet +1 -1
- data/ext/gentoo/init.d/puppetmaster +1 -1
- data/ext/redhat/puppet.spec.erb +0 -1
- data/install.rb +2 -1
- data/lib/hiera/backend/puppet_backend.rb +1 -1
- data/lib/puppet/application.rb +10 -9
- data/lib/puppet/application/agent.rb +87 -93
- data/lib/puppet/application/apply.rb +0 -2
- data/lib/puppet/application/device.rb +3 -3
- data/lib/puppet/application/kick.rb +2 -2
- data/lib/puppet/application/master.rb +41 -19
- data/lib/puppet/application/queue.rb +5 -3
- data/lib/puppet/bindings.rb +147 -0
- data/lib/puppet/configurer.rb +25 -15
- data/lib/puppet/configurer/fact_handler.rb +2 -9
- data/lib/puppet/daemon.rb +44 -33
- data/lib/puppet/defaults.rb +57 -26
- data/lib/puppet/error.rb +1 -1
- data/lib/puppet/external/dot.rb +2 -2
- data/lib/puppet/external/nagios/base.rb +1 -6
- data/lib/puppet/external/pson/common.rb +2 -2
- data/lib/puppet/external/pson/pure/generator.rb +2 -2
- data/lib/puppet/external/pson/pure/parser.rb +1 -1
- data/lib/puppet/face/ca.rb +1 -1
- data/lib/puppet/face/config.rb +1 -1
- data/lib/puppet/face/help.rb +2 -2
- data/lib/puppet/face/module/list.rb +2 -2
- data/lib/puppet/feature/rails.rb +1 -1
- data/lib/puppet/file_bucket/dipper.rb +0 -1
- data/lib/puppet/file_serving/base.rb +1 -1
- data/lib/puppet/file_serving/configuration/parser.rb +20 -14
- data/lib/puppet/forge.rb +0 -32
- data/lib/puppet/forge/cache.rb +1 -1
- data/lib/puppet/forge/errors.rb +3 -3
- data/lib/puppet/forge/repository.rb +7 -42
- data/lib/puppet/graph.rb +11 -0
- data/lib/puppet/graph/key.rb +26 -0
- data/lib/puppet/graph/prioritizer.rb +29 -0
- data/lib/puppet/graph/random_prioritizer.rb +16 -0
- data/lib/puppet/{rb_tree_map.rb → graph/rb_tree_map.rb} +3 -3
- data/lib/puppet/graph/relationship_graph.rb +246 -0
- data/lib/puppet/graph/sequential_prioritizer.rb +31 -0
- data/lib/puppet/{simple_graph.rb → graph/simple_graph.rb} +22 -3
- data/lib/puppet/graph/title_hash_prioritizer.rb +16 -0
- data/lib/puppet/indirector.rb +2 -2
- data/lib/puppet/indirector/catalog/compiler.rb +10 -7
- data/lib/puppet/indirector/catalog/static_compiler.rb +50 -0
- data/lib/puppet/indirector/certificate/rest.rb +1 -1
- data/lib/puppet/indirector/exec.rb +1 -1
- data/lib/puppet/indirector/facts/facter.rb +2 -2
- data/lib/puppet/indirector/facts/inventory_active_record.rb +0 -1
- data/lib/puppet/indirector/facts/network_device.rb +1 -1
- data/lib/puppet/indirector/file_bucket_file/file.rb +0 -1
- data/lib/puppet/indirector/indirection.rb +2 -2
- data/lib/puppet/indirector/memory.rb +9 -0
- data/lib/puppet/indirector/node/ldap.rb +2 -4
- data/lib/puppet/indirector/report/processor.rb +1 -2
- data/lib/puppet/indirector/report/rest.rb +1 -1
- data/lib/puppet/indirector/request.rb +32 -10
- data/lib/puppet/indirector/resource/rest.rb +1 -1
- data/lib/puppet/indirector/resource_type/parser.rb +31 -12
- data/lib/puppet/interface.rb +1 -1
- data/lib/puppet/interface/documentation.rb +7 -11
- data/lib/puppet/interface/option.rb +1 -1
- data/lib/puppet/interface/option_builder.rb +1 -1
- data/lib/puppet/metatype/manager.rb +2 -2
- data/lib/puppet/module.rb +7 -1
- data/lib/puppet/module_tool.rb +1 -1
- data/lib/puppet/module_tool/applications/application.rb +10 -0
- data/lib/puppet/module_tool/applications/installer.rb +6 -3
- data/lib/puppet/module_tool/dependency.rb +2 -0
- data/lib/puppet/module_tool/errors/upgrader.rb +1 -1
- data/lib/puppet/module_tool/metadata.rb +25 -13
- data/lib/puppet/module_tool/modulefile.rb +7 -7
- data/lib/puppet/module_tool/shared_behaviors.rb +4 -2
- data/lib/puppet/module_tool/skeleton.rb +1 -1
- data/lib/puppet/module_tool/skeleton/templates/generator/manifests/init.pp.erb +5 -5
- data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +5 -4
- data/lib/puppet/network/auth_config_parser.rb +3 -0
- data/lib/puppet/network/authconfig.rb +0 -1
- data/lib/puppet/network/authorization.rb +1 -1
- data/lib/puppet/network/authstore.rb +2 -2
- data/lib/puppet/network/format_handler.rb +25 -114
- data/lib/puppet/network/format_support.rb +106 -0
- data/lib/puppet/network/formats.rb +10 -4
- data/lib/puppet/network/http/compression.rb +1 -1
- data/lib/puppet/network/http/connection.rb +76 -32
- data/lib/puppet/network/http/handler.rb +122 -61
- data/lib/puppet/network/http/rack/rest.rb +1 -1
- data/lib/puppet/network/http/webrick/rest.rb +9 -3
- data/lib/puppet/network/http_pool.rb +2 -2
- data/lib/puppet/network/resolver.rb +1 -0
- data/lib/puppet/network/server.rb +5 -81
- data/lib/puppet/node/environment.rb +256 -13
- data/lib/puppet/node/facts.rb +28 -2
- data/lib/puppet/parameter.rb +27 -18
- data/lib/puppet/parameter/boolean.rb +20 -0
- data/lib/puppet/parameter/path.rb +1 -1
- data/lib/puppet/parameter/value.rb +1 -1
- data/lib/puppet/parameter/value_collection.rb +1 -1
- data/lib/puppet/parser/ast/arithmetic_operator.rb +8 -0
- data/lib/puppet/parser/ast/casestatement.rb +0 -3
- data/lib/puppet/parser/ast/lambda.rb +25 -6
- data/lib/puppet/parser/ast/leaf.rb +10 -3
- data/lib/puppet/parser/ast/nop.rb +1 -1
- data/lib/puppet/parser/ast/resource_override.rb +0 -2
- data/lib/puppet/parser/compiler.rb +92 -34
- data/lib/puppet/parser/files.rb +0 -5
- data/lib/puppet/parser/functions/create_resources.rb +23 -46
- data/lib/puppet/parser/functions/each.rb +0 -2
- data/lib/puppet/parser/functions/extlookup.rb +2 -2
- data/lib/puppet/parser/functions/foreach.rb +0 -2
- data/lib/puppet/parser/functions/hiera_include.rb +1 -1
- data/lib/puppet/parser/functions/lookup.rb +44 -0
- data/lib/puppet/parser/functions/slice.rb +1 -1
- data/lib/puppet/parser/grammar.ra +0 -1
- data/lib/puppet/parser/lexer.rb +0 -1
- data/lib/puppet/parser/parser.rb +0 -1
- data/lib/puppet/parser/parser_factory.rb +3 -2
- data/lib/puppet/parser/parser_support.rb +1 -1
- data/lib/puppet/parser/relationship.rb +1 -1
- data/lib/puppet/parser/scope.rb +49 -24
- data/lib/puppet/parser/type_loader.rb +13 -18
- data/lib/puppet/pops.rb +45 -0
- data/lib/puppet/pops/adaptable.rb +2 -2
- data/lib/puppet/pops/adapters.rb +4 -0
- data/lib/puppet/pops/binder/binder.rb +421 -0
- data/lib/puppet/pops/binder/binder_issues.rb +142 -0
- data/lib/puppet/pops/binder/bindings_checker.rb +217 -0
- data/lib/puppet/pops/binder/bindings_composer.rb +241 -0
- data/lib/puppet/pops/binder/bindings_factory.rb +847 -0
- data/lib/puppet/pops/binder/bindings_label_provider.rb +46 -0
- data/lib/puppet/pops/binder/bindings_loader.rb +79 -0
- data/lib/puppet/pops/binder/bindings_model.rb +215 -0
- data/lib/puppet/pops/binder/bindings_model_dumper.rb +205 -0
- data/lib/puppet/pops/binder/bindings_validator_factory.rb +28 -0
- data/lib/puppet/pops/binder/config/binder_config.rb +139 -0
- data/lib/puppet/pops/binder/config/binder_config_checker.rb +183 -0
- data/lib/puppet/pops/binder/config/diagnostic_producer.rb +32 -0
- data/lib/puppet/pops/binder/config/issues.rb +106 -0
- data/lib/puppet/pops/binder/hiera2.rb +10 -0
- data/lib/puppet/pops/binder/hiera2/bindings_provider.rb +148 -0
- data/lib/puppet/pops/binder/hiera2/config.rb +69 -0
- data/lib/puppet/pops/binder/hiera2/config_checker.rb +68 -0
- data/lib/puppet/pops/binder/hiera2/diagnostic_producer.rb +36 -0
- data/lib/puppet/pops/binder/hiera2/issues.rb +67 -0
- data/lib/puppet/pops/binder/hiera2/json_backend.rb +18 -0
- data/lib/puppet/pops/binder/hiera2/yaml_backend.rb +21 -0
- data/lib/puppet/pops/binder/injector.rb +688 -0
- data/lib/puppet/pops/binder/injector_entry.rb +53 -0
- data/lib/puppet/pops/binder/key_factory.rb +61 -0
- data/lib/puppet/pops/binder/producers.rb +829 -0
- data/lib/puppet/pops/binder/scheme_handler/confdir_hiera_scheme.rb +67 -0
- data/lib/puppet/pops/binder/scheme_handler/confdir_scheme.rb +34 -0
- data/lib/puppet/pops/binder/scheme_handler/module_hiera_scheme.rb +92 -0
- data/lib/puppet/pops/binder/scheme_handler/module_scheme.rb +84 -0
- data/lib/puppet/pops/binder/scheme_handler/symbolic_scheme.rb +54 -0
- data/lib/puppet/pops/binder/system_bindings.rb +72 -0
- data/lib/puppet/pops/issue_reporter.rb +75 -0
- data/lib/puppet/pops/issues.rb +9 -5
- data/lib/puppet/pops/model/ast_transformer.rb +4 -4
- data/lib/puppet/pops/model/ast_tree_dumper.rb +1 -1
- data/lib/puppet/pops/model/factory.rb +25 -13
- data/lib/puppet/pops/model/model.rb +1 -1
- data/lib/puppet/pops/model/tree_dumper.rb +2 -2
- data/lib/puppet/pops/parser/egrammar.ra +0 -1
- data/lib/puppet/pops/parser/eparser.rb +1 -2
- data/lib/puppet/pops/parser/evaluating_parser.rb +162 -0
- data/lib/puppet/pops/parser/lexer.rb +8 -6
- data/lib/puppet/pops/types/class_loader.rb +118 -0
- data/lib/puppet/pops/types/type_calculator.rb +557 -0
- data/lib/puppet/pops/types/type_factory.rb +147 -0
- data/lib/puppet/pops/types/type_parser.rb +117 -0
- data/lib/puppet/pops/types/types.rb +132 -0
- data/lib/puppet/pops/validation.rb +146 -17
- data/lib/puppet/pops/validation/checker3_1.rb +1 -1
- data/lib/puppet/pops/validation/validator_factory_3_1.rb +6 -16
- data/lib/puppet/property.rb +3 -3
- data/lib/puppet/property/keyvalue.rb +1 -1
- data/lib/puppet/provider.rb +2 -2
- data/lib/puppet/provider/aixobject.rb +19 -21
- data/lib/puppet/provider/augeas/augeas.rb +3 -1
- data/lib/puppet/provider/command.rb +2 -2
- data/lib/puppet/provider/group/aix.rb +1 -1
- data/lib/puppet/provider/group/ldap.rb +1 -1
- data/lib/puppet/provider/macauthorization/macauthorization.rb +1 -1
- data/lib/puppet/provider/mailalias/aliases.rb +3 -8
- data/lib/puppet/provider/mcx/mcxcontent.rb +7 -1
- data/lib/puppet/provider/mount.rb +8 -3
- data/lib/puppet/provider/nameservice.rb +1 -1
- data/lib/puppet/provider/nameservice/directoryservice.rb +5 -5
- data/lib/puppet/provider/package/appdmg.rb +1 -1
- data/lib/puppet/provider/package/apt.rb +0 -1
- data/lib/puppet/provider/package/dpkg.rb +86 -32
- data/lib/puppet/provider/package/fink.rb +0 -2
- data/lib/puppet/provider/package/freebsd.rb +0 -2
- data/lib/puppet/provider/package/openbsd.rb +57 -10
- data/lib/puppet/provider/package/opkg.rb +0 -1
- data/lib/puppet/provider/package/pacman.rb +0 -1
- data/lib/puppet/provider/package/pip.rb +1 -1
- data/lib/puppet/provider/package/pkgdmg.rb +17 -6
- data/lib/puppet/provider/package/pkgutil.rb +1 -1
- data/lib/puppet/provider/package/portage.rb +9 -1
- data/lib/puppet/provider/package/ports.rb +2 -2
- data/lib/puppet/provider/package/rpm.rb +29 -12
- data/lib/puppet/provider/package/rug.rb +1 -1
- data/lib/puppet/provider/package/urpmi.rb +11 -15
- data/lib/puppet/provider/package/windows/exe_package.rb +1 -1
- data/lib/puppet/provider/package/windows/package.rb +1 -26
- data/lib/puppet/provider/package/yum.rb +1 -1
- data/lib/puppet/provider/package/zypper.rb +22 -3
- data/lib/puppet/provider/parsedfile.rb +1 -12
- data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +1 -1
- data/lib/puppet/provider/service/base.rb +1 -1
- data/lib/puppet/provider/service/daemontools.rb +3 -3
- data/lib/puppet/provider/service/debian.rb +1 -1
- data/lib/puppet/provider/service/init.rb +14 -20
- data/lib/puppet/provider/service/openrc.rb +3 -1
- data/lib/puppet/provider/service/redhat.rb +5 -8
- data/lib/puppet/provider/service/runit.rb +3 -2
- data/lib/puppet/provider/service/systemd.rb +1 -1
- data/lib/puppet/provider/ssh_authorized_key/parsed.rb +1 -1
- data/lib/puppet/provider/sshkey/parsed.rb +0 -2
- data/lib/puppet/provider/user/aix.rb +25 -12
- data/lib/puppet/provider/user/directoryservice.rb +4 -7
- data/lib/puppet/provider/user/ldap.rb +0 -1
- data/lib/puppet/provider/user/user_role_add.rb +2 -0
- data/lib/puppet/provider/user/useradd.rb +1 -1
- data/lib/puppet/provider/zone/solaris.rb +1 -2
- data/lib/puppet/reference/metaparameter.rb +1 -1
- data/lib/puppet/reference/type.rb +1 -1
- data/lib/puppet/reports/rrdgraph.rb +1 -1
- data/lib/puppet/reports/tagmail.rb +1 -1
- data/lib/puppet/resource.rb +16 -4
- data/lib/puppet/resource/catalog.rb +111 -173
- data/lib/puppet/resource/status.rb +42 -3
- data/lib/puppet/resource/type.rb +33 -46
- data/lib/puppet/resource/type_collection.rb +19 -15
- data/lib/puppet/run.rb +5 -1
- data/lib/puppet/scheduler/scheduler.rb +14 -15
- data/lib/puppet/settings.rb +78 -41
- data/lib/puppet/settings/boolean_setting.rb +0 -2
- data/lib/puppet/settings/config_file.rb +0 -2
- data/lib/puppet/settings/directory_setting.rb +0 -2
- data/lib/puppet/settings/duration_setting.rb +0 -2
- data/lib/puppet/settings/enum_setting.rb +16 -0
- data/lib/puppet/settings/file_setting.rb +0 -2
- data/lib/puppet/settings/path_setting.rb +0 -2
- data/lib/puppet/settings/string_setting.rb +0 -3
- data/lib/puppet/settings/terminus_setting.rb +0 -2
- data/lib/puppet/ssl/certificate_authority.rb +102 -9
- data/lib/puppet/test/test_helper.rb +1 -0
- data/lib/puppet/transaction.rb +130 -292
- data/lib/puppet/transaction/additional_resource_generator.rb +126 -0
- data/lib/puppet/transaction/event.rb +16 -1
- data/lib/puppet/transaction/report.rb +34 -14
- data/lib/puppet/transaction/resource_harness.rb +16 -19
- data/lib/puppet/type.rb +59 -53
- data/lib/puppet/type/component.rb +0 -2
- data/lib/puppet/type/cron.rb +13 -2
- data/lib/puppet/type/exec.rb +5 -7
- data/lib/puppet/type/file.rb +9 -32
- data/lib/puppet/type/file/content.rb +4 -1
- data/lib/puppet/type/file/ctime.rb +3 -1
- data/lib/puppet/type/file/ensure.rb +1 -1
- data/lib/puppet/type/file/mode.rb +0 -1
- data/lib/puppet/type/file/mtime.rb +2 -1
- data/lib/puppet/type/group.rb +7 -9
- data/lib/puppet/type/host.rb +1 -2
- data/lib/puppet/type/mcx.rb +0 -1
- data/lib/puppet/type/mount.rb +38 -6
- data/lib/puppet/type/package.rb +2 -2
- data/lib/puppet/type/resources.rb +5 -4
- data/lib/puppet/type/schedule.rb +1 -4
- data/lib/puppet/type/selmodule.rb +1 -1
- data/lib/puppet/type/service.rb +1 -3
- data/lib/puppet/type/tidy.rb +3 -3
- data/lib/puppet/type/user.rb +9 -13
- data/lib/puppet/type/yumrepo.rb +11 -7
- data/lib/puppet/util.rb +14 -7
- data/lib/puppet/util/autoload.rb +0 -1
- data/lib/puppet/util/backups.rb +1 -3
- data/lib/puppet/util/classgen.rb +1 -1
- data/lib/puppet/util/command_line/puppet_option_parser.rb +1 -3
- data/lib/puppet/util/command_line/trollop.rb +1 -1
- data/lib/puppet/util/constant_inflector.rb +1 -2
- data/lib/puppet/util/errors.rb +1 -0
- data/lib/puppet/util/file_watcher.rb +28 -0
- data/lib/puppet/util/fileparsing.rb +1 -3
- data/lib/puppet/util/filetype.rb +0 -1
- data/lib/puppet/util/http_proxy.rb +38 -0
- data/lib/puppet/util/ldap/manager.rb +1 -2
- data/lib/puppet/util/log.rb +31 -10
- data/lib/puppet/util/log/destinations.rb +0 -50
- data/lib/puppet/util/metric.rb +8 -1
- data/lib/puppet/util/monkey_patches.rb +14 -148
- data/lib/puppet/util/network_device/cisco/facts.rb +1 -1
- data/lib/puppet/util/network_device/config.rb +6 -9
- data/lib/puppet/util/network_device/transport/ssh.rb +1 -1
- data/lib/puppet/util/pidlock.rb +3 -0
- data/lib/puppet/util/posix.rb +1 -1
- data/lib/puppet/util/profiler.rb +1 -1
- data/lib/puppet/util/rdoc.rb +1 -1
- data/lib/puppet/util/rdoc/generators/puppet_generator.rb +0 -1
- data/lib/puppet/util/rdoc/generators/template/puppet/puppet.rb +50 -42
- data/lib/puppet/util/retryaction.rb +0 -1
- data/lib/puppet/util/symbolic_file_mode.rb +5 -1
- data/lib/puppet/util/tagging.rb +0 -2
- data/lib/puppet/util/warnings.rb +3 -0
- data/lib/puppet/util/watched_file.rb +37 -0
- data/lib/puppet/util/watcher.rb +17 -0
- data/lib/puppet/util/watcher/change_watcher.rb +33 -0
- data/lib/puppet/util/watcher/periodic_watcher.rb +37 -0
- data/lib/puppet/util/watcher/timer.rb +19 -0
- data/lib/puppet/util/windows/user.rb +1 -1
- data/lib/puppet/version.rb +1 -1
- data/lib/puppetx.rb +109 -0
- data/lib/puppetx/puppet/bindings_scheme_handler.rb +130 -0
- data/lib/puppetx/puppet/hiera2_backend.rb +31 -0
- data/lib/puppetx/puppet/syntax_checker.rb +91 -0
- data/lib/puppetx/puppetlabs/syntax_checkers/json.rb +39 -0
- data/lib/semver.rb +1 -1
- data/man/man8/puppet-kick.8 +1 -1
- data/spec/fixtures/integration/provider/cron/crontab/unspecialized +15 -0
- data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/binder_config.yaml +18 -0
- data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/hiera.yaml +8 -0
- data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/modules/good/common.yaml +1 -0
- data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/modules/good/hiera.yaml +10 -0
- data/spec/fixtures/unit/pops/binder/bindings_composer/ok/binder_config.yaml +19 -0
- data/spec/fixtures/unit/pops/binder/bindings_composer/ok/common.yaml +1 -0
- data/spec/fixtures/unit/pops/binder/bindings_composer/ok/hiera.yaml +11 -0
- data/spec/fixtures/unit/pops/binder/bindings_composer/ok/localhost.yaml +1 -0
- data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/common.yaml +3 -0
- data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/hiera.yaml +13 -0
- data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/lib/puppet/bindings/awesome/default.rb +4 -0
- data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/lib/puppetx/awesome/echo_backend.rb +11 -0
- data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/lib/puppetx/awesome/echo_scheme_handler.rb +18 -0
- data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/localhost.yaml +1 -0
- data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/bad/common.yaml +3 -0
- data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/bad/hiera_config.yaml +9 -0
- data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/good/common.yaml +2 -0
- data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/good/hiera.yaml +11 -0
- data/spec/fixtures/unit/pops/binder/config/binder_config/ok/binder_config.yaml +9 -0
- data/spec/fixtures/unit/pops/binder/hiera2/bindings_provider/ok/hiera.yaml +9 -0
- data/spec/fixtures/unit/pops/binder/hiera2/bindings_provider/ok/node.example.com.json +9 -0
- data/spec/fixtures/unit/pops/binder/hiera2/bindings_provider/ok/node.example.com.yaml +5 -0
- data/spec/fixtures/unit/pops/binder/hiera2/config/bad_syntax/hiera.yaml +10 -0
- data/spec/fixtures/unit/pops/binder/hiera2/config/malformed_hierarchy/hiera.yaml +8 -0
- data/spec/fixtures/unit/pops/binder/hiera2/config/missing/foo.txt +1 -0
- data/spec/fixtures/unit/pops/binder/hiera2/config/no_backends/hiera.yaml +7 -0
- data/spec/fixtures/unit/pops/binder/hiera2/config/no_hierarchy/hiera.yaml +4 -0
- data/spec/fixtures/unit/pops/binder/hiera2/config/not_a_hash/hiera.yaml +2 -0
- data/spec/fixtures/unit/pops/binder/hiera2/config/ok/hiera.yaml +8 -0
- data/spec/fixtures/unit/pops/binder/hiera2/yaml_backend/empty/common.yaml +0 -0
- data/spec/fixtures/unit/pops/binder/hiera2/yaml_backend/invalid/common.yaml +1 -0
- data/spec/fixtures/unit/pops/binder/hiera2/yaml_backend/ok/common.yaml +2 -0
- data/spec/fixtures/unit/provider/package/openbsd/pkginfo_flavors.list +2 -0
- data/spec/integration/agent/logging_spec.rb +178 -0
- data/spec/integration/configurer_spec.rb +1 -1
- data/spec/integration/defaults_spec.rb +0 -6
- data/spec/integration/network/authconfig_spec.rb +19 -0
- data/spec/integration/network/server/webrick_spec.rb +10 -11
- data/spec/integration/parser/catalog_spec.rb +85 -0
- data/spec/integration/provider/cron/crontab_spec.rb +11 -0
- data/spec/integration/provider/mount_spec.rb +1 -0
- data/spec/integration/transaction_spec.rb +8 -8
- data/spec/integration/type/file_spec.rb +1 -1
- data/spec/integration/util/settings_spec.rb +58 -11
- data/spec/lib/matchers/include_in_order.rb +21 -0
- data/spec/lib/matchers/include_in_order_spec.rb +30 -0
- data/spec/lib/matchers/relationship_graph_matchers.rb +48 -0
- data/spec/lib/puppet_spec/compiler.rb +24 -0
- data/spec/lib/puppet_spec/pops.rb +16 -0
- data/spec/spec_helper.rb +0 -1
- data/spec/unit/application/agent_spec.rb +145 -145
- data/spec/unit/application/apply_spec.rb +1 -1
- data/spec/unit/application/doc_spec.rb +1 -1
- data/spec/unit/application/face_base_spec.rb +3 -3
- data/spec/unit/application/facts_spec.rb +1 -0
- data/spec/unit/application/master_spec.rb +0 -15
- data/spec/unit/application/queue_spec.rb +6 -12
- data/spec/unit/application/resource_spec.rb +1 -1
- data/spec/unit/configurer/fact_handler_spec.rb +19 -50
- data/spec/unit/configurer_spec.rb +23 -7
- data/spec/unit/daemon_spec.rb +97 -121
- data/spec/unit/defaults_spec.rb +44 -0
- data/spec/unit/face/node_spec.rb +2 -2
- data/spec/unit/file_serving/configuration/parser_spec.rb +23 -33
- data/spec/unit/file_serving/configuration_spec.rb +2 -2
- data/spec/unit/file_serving/mount/file_spec.rb +4 -4
- data/spec/unit/forge/repository_spec.rb +9 -29
- data/spec/unit/graph/key_spec.rb +41 -0
- data/spec/unit/{rb_tree_map_spec.rb → graph/rb_tree_map_spec.rb} +7 -7
- data/spec/unit/graph/relationship_graph_spec.rb +393 -0
- data/spec/unit/graph/sequential_prioritizer_spec.rb +32 -0
- data/spec/unit/{simple_graph_spec.rb → graph/simple_graph.rb} +42 -254
- data/spec/unit/graph/title_hash_prioritizer_spec.rb +49 -0
- data/spec/unit/hiera_puppet_spec.rb +1 -1
- data/spec/unit/indirector/catalog/active_record_spec.rb +4 -2
- data/spec/unit/indirector/catalog/compiler_spec.rb +20 -26
- data/spec/unit/indirector/face_spec.rb +1 -1
- data/spec/unit/indirector/facts/facter_spec.rb +11 -1
- data/spec/unit/indirector/facts/network_device_spec.rb +11 -1
- data/spec/unit/indirector/hiera_spec.rb +1 -1
- data/spec/unit/indirector/instrumentation_data/local_spec.rb +1 -1
- data/spec/unit/indirector/instrumentation_listener/local_spec.rb +1 -1
- data/spec/unit/indirector/request_spec.rb +92 -39
- data/spec/unit/indirector/rest_spec.rb +1 -0
- data/spec/unit/indirector_spec.rb +2 -2
- data/spec/unit/interface/option_builder_spec.rb +1 -0
- data/spec/unit/interface/option_spec.rb +1 -0
- data/spec/unit/interface_spec.rb +2 -2
- data/spec/unit/module_tool/applications/installer_spec.rb +49 -2
- data/spec/unit/module_tool/metadata_spec.rb +13 -0
- data/spec/unit/network/authstore_spec.rb +1 -1
- data/spec/unit/network/format_handler_spec.rb +33 -282
- data/spec/unit/network/format_support_spec.rb +199 -0
- data/spec/unit/network/formats_spec.rb +2 -2
- data/spec/unit/network/http/connection_spec.rb +88 -7
- data/spec/unit/network/http/handler_spec.rb +271 -249
- data/spec/unit/network/http/rack/rest_spec.rb +1 -1
- data/spec/unit/network/http/webrick/rest_spec.rb +73 -22
- data/spec/unit/network/http_pool_spec.rb +40 -0
- data/spec/unit/network/server_spec.rb +18 -207
- data/spec/unit/node/facts_spec.rb +68 -17
- data/spec/unit/other/selinux_spec.rb +24 -20
- data/spec/unit/parameter/boolean_spec.rb +25 -0
- data/spec/unit/parameter/value_collection_spec.rb +7 -7
- data/spec/unit/parameter_spec.rb +10 -13
- data/spec/unit/parser/ast/function_spec.rb +4 -4
- data/spec/unit/parser/ast/leaf_spec.rb +45 -6
- data/spec/unit/parser/collector_spec.rb +3 -3
- data/spec/unit/parser/compiler_spec.rb +4 -3
- data/spec/unit/parser/functions/create_resources_spec.rb +9 -25
- data/spec/unit/parser/functions/extlookup_spec.rb +2 -2
- data/spec/unit/parser/functions/hiera_include_spec.rb +12 -0
- data/spec/unit/parser/functions/lookup_spec.rb +96 -0
- data/spec/unit/parser/functions/regsubst_spec.rb +2 -2
- data/spec/unit/parser/functions/split_spec.rb +2 -2
- data/spec/unit/parser/functions/sprintf_spec.rb +1 -1
- data/spec/unit/parser/functions/versioncmp_spec.rb +2 -2
- data/spec/unit/parser/functions_spec.rb +7 -7
- data/spec/unit/parser/lexer_spec.rb +1 -1
- data/spec/unit/parser/methods/collect_spec.rb +43 -0
- data/spec/unit/parser/resource_spec.rb +9 -9
- data/spec/unit/parser/scope_spec.rb +45 -2
- data/spec/unit/parser/type_loader_spec.rb +159 -175
- data/spec/unit/pops/binder/binder_spec.rb +62 -0
- data/spec/unit/pops/binder/bindings_checker_spec.rb +196 -0
- data/spec/unit/pops/binder/bindings_composer_spec.rb +89 -0
- data/spec/unit/pops/binder/bindings_validator_factory_spec.rb +18 -0
- data/spec/unit/pops/binder/config/binder_config_spec.rb +48 -0
- data/spec/unit/pops/binder/hiera2/bindings_provider_spec.rb +74 -0
- data/spec/unit/pops/binder/hiera2/config_spec.rb +61 -0
- data/spec/unit/pops/binder/hiera2/yaml_backend_spec.rb +33 -0
- data/spec/unit/pops/binder/injector_spec.rb +789 -0
- data/spec/unit/pops/containment_spec.rb +1 -0
- data/spec/unit/pops/issues_spec.rb +1 -1
- data/spec/unit/pops/parser/evaluating_parser_spec.rb +88 -0
- data/spec/unit/pops/parser/lexer_spec.rb +1 -1
- data/spec/unit/pops/parser/parse_calls_spec.rb +4 -0
- data/spec/unit/pops/parser/parser_spec.rb +1 -1
- data/spec/unit/pops/types/type_calculator_spec.rb +484 -0
- data/spec/unit/pops/types/type_factory_spec.rb +65 -0
- data/spec/unit/pops/types/type_parser_spec.rb +93 -0
- data/spec/unit/property/list_spec.rb +1 -1
- data/spec/unit/property/ordered_list_spec.rb +1 -1
- data/spec/unit/provider/aixobject_spec.rb +101 -0
- data/spec/unit/provider/augeas/augeas_spec.rb +14 -3
- data/spec/unit/provider/mcx/mcxcontent_spec.rb +52 -16
- data/spec/unit/provider/mount/parsed_spec.rb +44 -56
- data/spec/unit/provider/mount_spec.rb +11 -2
- data/spec/unit/provider/naginator_spec.rb +8 -0
- data/spec/unit/provider/package/apt_spec.rb +5 -1
- data/spec/unit/provider/package/aptitude_spec.rb +9 -5
- data/spec/unit/provider/package/aptrpm_spec.rb +2 -2
- data/spec/unit/provider/package/dpkg_spec.rb +274 -99
- data/spec/unit/provider/package/openbsd_spec.rb +84 -1
- data/spec/unit/provider/package/opkg_spec.rb +3 -3
- data/spec/unit/provider/package/pip_spec.rb +16 -0
- data/spec/unit/provider/package/pkgdmg_spec.rb +62 -7
- data/spec/unit/provider/package/rpm_spec.rb +112 -21
- data/spec/unit/provider/package/urpmi.rb +80 -0
- data/spec/unit/provider/package/windows/exe_package_spec.rb +1 -1
- data/spec/unit/provider/package/yum_spec.rb +85 -0
- data/spec/unit/provider/package/zypper_spec.rb +25 -6
- data/spec/unit/provider/parsedfile_spec.rb +3 -2
- data/spec/unit/provider/service/init_spec.rb +10 -10
- data/spec/unit/provider/service/openrc_spec.rb +16 -0
- data/spec/unit/provider/service/openwrt_spec.rb +1 -1
- data/spec/unit/provider/service/redhat_spec.rb +7 -0
- data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +2 -2
- data/spec/unit/provider/user/aix_spec.rb +89 -0
- data/spec/unit/provider/user/directoryservice_spec.rb +11 -4
- data/spec/unit/provider/user/user_role_add_spec.rb +18 -0
- data/spec/unit/provider_spec.rb +2 -13
- data/spec/unit/reports/http_spec.rb +1 -1
- data/spec/unit/resource/catalog_spec.rb +23 -97
- data/spec/unit/resource/resource_type.json +34 -0
- data/spec/unit/resource/status_spec.rb +56 -0
- data/spec/unit/resource/type_collection_spec.rb +6 -6
- data/spec/unit/resource/type_spec.rb +25 -5
- data/spec/unit/resource_spec.rb +68 -24
- data/spec/unit/run_spec.rb +16 -0
- data/spec/unit/scheduler/scheduler_spec.rb +14 -27
- data/spec/unit/semver_spec.rb +5 -0
- data/spec/unit/settings/enum_setting_spec.rb +27 -0
- data/spec/unit/settings_spec.rb +53 -44
- data/spec/unit/ssl/certificate_authority_spec.rb +155 -19
- data/spec/unit/transaction/additional_resource_generator_spec.rb +419 -0
- data/spec/unit/transaction/event_manager_spec.rb +2 -2
- data/spec/unit/transaction/event_spec.rb +57 -0
- data/spec/unit/transaction/report_spec.rb +66 -0
- data/spec/unit/transaction/resource_harness_spec.rb +27 -20
- data/spec/unit/transaction_spec.rb +182 -390
- data/spec/unit/type/augeas_spec.rb +3 -3
- data/spec/unit/type/component_spec.rb +0 -9
- data/spec/unit/type/computer_spec.rb +1 -1
- data/spec/unit/type/cron_spec.rb +2 -2
- data/spec/unit/type/exec_spec.rb +4 -2
- data/spec/unit/type/file/content_spec.rb +11 -0
- data/spec/unit/type/file/group_spec.rb +1 -1
- data/spec/unit/type/file_spec.rb +16 -8
- data/spec/unit/type/mount_spec.rb +445 -259
- data/spec/unit/type/package_spec.rb +4 -4
- data/spec/unit/type/resources_spec.rb +30 -1
- data/spec/unit/type/user_spec.rb +26 -3
- data/spec/unit/type/yumrepo_spec.rb +7 -27
- data/spec/unit/type/zone_spec.rb +4 -1
- data/spec/unit/type_spec.rb +66 -33
- data/spec/unit/util/backups_spec.rb +3 -3
- data/spec/unit/util/http_proxy_spec.rb +83 -0
- data/spec/unit/util/log_spec.rb +79 -8
- data/spec/unit/util/metric_spec.rb +12 -0
- data/spec/unit/util/monkey_patches_spec.rb +6 -0
- data/spec/unit/util/network_device/config_spec.rb +26 -64
- data/spec/unit/util/pidlock_spec.rb +4 -1
- data/spec/unit/util/tagging_spec.rb +5 -9
- data/spec/unit/util/warnings_spec.rb +1 -1
- data/spec/unit/util/watched_file_spec.rb +52 -0
- data/spec/unit/util/watcher/periodic_watcher_spec.rb +52 -0
- data/spec/unit/util/watcher_spec.rb +56 -0
- data/spec/unit/util_spec.rb +16 -0
- metadata +2767 -2576
- data/ext/debian/puppet.manpages +0 -32
- data/ext/osx/PackageInfo.plist +0 -36
- data/ext/osx/createpackage.sh +0 -187
- data/ext/redhat/rundir-perms.patch +0 -28
- data/lib/puppet/external/base64.rb +0 -19
- data/lib/puppet/util/graph.rb +0 -27
- data/lib/puppet/util/loadedfile.rb +0 -61
- data/lib/puppet/util/log_paths.rb +0 -22
- data/lib/puppet/util/subclass_loader.rb +0 -78
- data/spec/monkey_patches/publicize_methods.rb +0 -11
- data/spec/unit/util/loadedfile_spec.rb +0 -71
@@ -0,0 +1,142 @@
|
|
1
|
+
# @api public
|
2
|
+
module Puppet::Pops::Binder::BinderIssues
|
3
|
+
|
4
|
+
# NOTE: The methods #issue and #hard_issue are done in a somewhat funny way
|
5
|
+
# since the Puppet::Pops::Issues is a module with these methods defined on the module-class
|
6
|
+
# This makes it hard to inherit them in this module. (Likewise if Issues was a class, and they
|
7
|
+
# need to be defined for the class, and such methods are also not inherited, it becomes more
|
8
|
+
# difficult to reuse these. It did not seem as a good idea to refactor Issues at this point
|
9
|
+
# in time - they should both probably be refactored once bindings support is finished.
|
10
|
+
# Meanwhile, they delegate to Issues.
|
11
|
+
|
12
|
+
|
13
|
+
# (see Puppet::Pops::Issues#issue)
|
14
|
+
def self.issue (issue_code, *args, &block)
|
15
|
+
Puppet::Pops::Issues.issue(issue_code, *args, &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
# (see Puppet::Pops::Issues#hard_issue)
|
19
|
+
def self.hard_issue(issue_code, *args, &block)
|
20
|
+
Puppet::Pops::Issues.hard_issue(issue_code, *args, &block)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Producer issues (binding identified using :binding argument)
|
24
|
+
|
25
|
+
# @api public
|
26
|
+
MISSING_NAME = issue :MISSING_NAME, :binding do
|
27
|
+
"#{label.a_an_uc(binding)} with #{label.a_an(semantic)} has no name"
|
28
|
+
end
|
29
|
+
|
30
|
+
# @api public
|
31
|
+
MISSING_KEY = issue :MISSING_KEY, :binding do
|
32
|
+
"#{label.a_an_uc(binding)} with #{label.a_an(semantic)} has no key"
|
33
|
+
end
|
34
|
+
|
35
|
+
# @api public
|
36
|
+
MISSING_VALUE = issue :MISSING_VALUE, :binding do
|
37
|
+
"#{label.a_an_uc(binding)} with #{label.a_an(semantic)} has no value"
|
38
|
+
end
|
39
|
+
|
40
|
+
# @api public
|
41
|
+
MISSING_EXPRESSION = issue :MISSING_EXPRESSION, :binding do
|
42
|
+
"#{label.a_an_uc(binding)} with #{label.a_an(semantic)} has no expression"
|
43
|
+
end
|
44
|
+
|
45
|
+
# @api public
|
46
|
+
MISSING_CLASS_NAME = issue :MISSING_CLASS_NAME, :binding do
|
47
|
+
"#{label.a_an_uc(binding)} with #{label.a_an(semantic)} has no class name"
|
48
|
+
end
|
49
|
+
|
50
|
+
# @api public
|
51
|
+
CACHED_PRODUCER_MISSING_PRODUCER = issue :PRODUCER_MISSING_PRODUCER, :binding do
|
52
|
+
"#{label.a_an_uc(binding)} with #{label.a_an(semantic)} has no producer"
|
53
|
+
end
|
54
|
+
|
55
|
+
# @api public
|
56
|
+
INCOMPATIBLE_TYPE = issue :INCOMPATIBLE_TYPE, :binding, :expected_type, :actual_type do
|
57
|
+
"#{label.a_an_uc(binding)} with #{label.a_an(semantic)} has an incompatible type: expected #{label.a_an(expected_type)}, but got #{label.a_an(actual_type)}."
|
58
|
+
end
|
59
|
+
|
60
|
+
# @api public
|
61
|
+
MULTIBIND_INCOMPATIBLE_TYPE = issue :MULTIBIND_INCOMPATIBLE_TYPE, :binding, :actual_type do
|
62
|
+
"#{label.a_an_uc(binding)} with #{label.a_an(semantic)} cannot bind #{label.a_an(actual_type)} value"
|
63
|
+
end
|
64
|
+
|
65
|
+
# @api public
|
66
|
+
MODEL_OBJECT_IS_UNBOUND = issue :MODEL_OBJECT_IS_UNBOUND do
|
67
|
+
"#{label.a_an_uc(semantic)} is not contained in a binding"
|
68
|
+
end
|
69
|
+
|
70
|
+
# Binding issues (binding identified using semantic)
|
71
|
+
|
72
|
+
# @api public
|
73
|
+
MISSING_PRODUCER = issue :MISSING_PRODUCER do
|
74
|
+
"#{label.a_an_uc(semantic)} has no producer"
|
75
|
+
end
|
76
|
+
|
77
|
+
# @api public
|
78
|
+
MISSING_TYPE = issue :MISSING_TYPE do
|
79
|
+
"#{label.a_an_uc(semantic)} has no type"
|
80
|
+
end
|
81
|
+
|
82
|
+
# @api public
|
83
|
+
MULTIBIND_NOT_COLLECTION_PRODUCER = issue :MULTIBIND_NOT_COLLECTION_PRODUCER, :actual_producer do
|
84
|
+
"#{label.a_an_uc(semantic)} must have a MultibindProducerDescriptor, but got: #{label.a_an(actual_producer)}"
|
85
|
+
end
|
86
|
+
|
87
|
+
# @api public
|
88
|
+
MULTIBIND_TYPE_ERROR = issue :MULTIBIND_TYPE_ERROR, :actual_type do
|
89
|
+
"#{label.a_an_uc(semantic)} is expected to bind a collection type, but got: #{label.a_an(actual_type)}."
|
90
|
+
end
|
91
|
+
|
92
|
+
# @api public
|
93
|
+
MISSING_BINDINGS = issue :MISSING_BINDINGS do
|
94
|
+
"#{label.a_an_uc(semantic)} has zero bindings"
|
95
|
+
end
|
96
|
+
|
97
|
+
# @api public
|
98
|
+
MISSING_BINDINGS_NAME = issue :MISSING_BINDINGS_NAME do
|
99
|
+
"#{label.a_an_uc(semantic)} has no name"
|
100
|
+
end
|
101
|
+
|
102
|
+
# @api public
|
103
|
+
MISSING_PREDICATES = issue :MISSING_PREDICATES do
|
104
|
+
"#{label.a_an_uc(semantic)} has zero predicates"
|
105
|
+
end
|
106
|
+
|
107
|
+
# @api public
|
108
|
+
MISSING_CATEGORIZATION = issue :MISSING_CATEGORIZATION do
|
109
|
+
"#{label.a_an_uc(semantic)} has a category without categorization"
|
110
|
+
end
|
111
|
+
|
112
|
+
# @api public
|
113
|
+
MISSING_CATEGORY_VALUE = issue :MISSING_CATEGORY_VALUE do
|
114
|
+
"#{label.a_an_uc(semantic)} has a category without value"
|
115
|
+
end
|
116
|
+
|
117
|
+
# @api public
|
118
|
+
MISSING_LAYERS = issue :MISSING_LAYERS do
|
119
|
+
"#{label.a_an_uc(semantic)} has zero layers"
|
120
|
+
end
|
121
|
+
|
122
|
+
# @api public
|
123
|
+
MISSING_LAYER_NAME = issue :MISSING_LAYER_NAME do
|
124
|
+
"#{label.a_an_uc(semantic)} has a layer without name"
|
125
|
+
end
|
126
|
+
|
127
|
+
# @api public
|
128
|
+
MISSING_BINDINGS_IN_LAYER = issue :MISSING_BINDINGS_IN_LAYER, :layer do
|
129
|
+
"#{label.a_an_uc(semantic)} has zero bindings in #{label.label(layer)}"
|
130
|
+
end
|
131
|
+
|
132
|
+
# @api public
|
133
|
+
PRECEDENCE_MISMATCH_IN_CONTRIBUTION = issue :PRECEDENCE_MISMATCH_IN_CONTRIBUTION, :categorization do
|
134
|
+
"Precedence mismatch: binding contribution '#{semantic.name}', category: '#{categorization}' is not in correct order"
|
135
|
+
end
|
136
|
+
|
137
|
+
# @api public
|
138
|
+
MISSING_CATEGORY_PRECEDENCE = issue :MISSING_CATEGORY_PRECEDENCE, :categorization do
|
139
|
+
"Missing category precedence: binding contribution '#{semantic.name}', category: '#{categorization}' not found in overall config"
|
140
|
+
end
|
141
|
+
|
142
|
+
end
|
@@ -0,0 +1,217 @@
|
|
1
|
+
# A validator/checker of a bindings model
|
2
|
+
# @api public
|
3
|
+
#
|
4
|
+
class Puppet::Pops::Binder::BindingsChecker
|
5
|
+
Bindings = Puppet::Pops::Binder::Bindings
|
6
|
+
Issues = Puppet::Pops::Binder::BinderIssues
|
7
|
+
Types = Puppet::Pops::Types
|
8
|
+
|
9
|
+
attr_reader :type_calculator
|
10
|
+
attr_reader :acceptor
|
11
|
+
|
12
|
+
# @api public
|
13
|
+
def initialize(diagnostics_producer)
|
14
|
+
@@check_visitor ||= Puppet::Pops::Visitor.new(nil, "check", 0, 0)
|
15
|
+
@type_calculator = Puppet::Pops::Types::TypeCalculator.new()
|
16
|
+
@expression_validator = Puppet::Pops::Validation::ValidatorFactory_3_1.new().checker(diagnostics_producer)
|
17
|
+
@acceptor = diagnostics_producer
|
18
|
+
end
|
19
|
+
|
20
|
+
# Validates the entire model by visiting each model element and calling `check`.
|
21
|
+
# The result is collected (or acted on immediately) by the configured diagnostic provider/acceptor
|
22
|
+
# given when creating this Checker.
|
23
|
+
#
|
24
|
+
# @api public
|
25
|
+
#
|
26
|
+
def validate(b)
|
27
|
+
check(b)
|
28
|
+
b.eAllContents.each {|c| check(c) }
|
29
|
+
end
|
30
|
+
|
31
|
+
# Performs binding validity check
|
32
|
+
# @api private
|
33
|
+
def check(b)
|
34
|
+
@@check_visitor.visit_this(self, b)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Checks that a binding has a producer and a type
|
38
|
+
# @api private
|
39
|
+
def check_Binding(b)
|
40
|
+
# Must have a type
|
41
|
+
acceptor.accept(Issues::MISSING_TYPE, b) unless b.type.is_a?(Types::PObjectType)
|
42
|
+
|
43
|
+
# Must have a producer
|
44
|
+
acceptor.accept(Issues::MISSING_PRODUCER, b) unless b.producer.is_a?(Bindings::ProducerDescriptor)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Checks that the producer is a Multibind producer and that the type is a PCollectionType
|
48
|
+
# @api private
|
49
|
+
def check_Multibinding(b)
|
50
|
+
# id is optional (empty id blocks contributions)
|
51
|
+
|
52
|
+
# A multibinding must have PCollectionType
|
53
|
+
acceptor.accept(Issues::MULTIBIND_TYPE_ERROR, b, {:actual_type => b.type}) unless b.type.is_a?(Types::PCollectionType)
|
54
|
+
|
55
|
+
# if the producer is nil, a suitable producer will be picked automatically
|
56
|
+
unless b.producer.nil? || b.producer.is_a?(Bindings::MultibindProducerDescriptor)
|
57
|
+
acceptor.accept(Issues::MULTIBIND_NOT_COLLECTION_PRODUCER, b, {:actual_producer => b.producer})
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Checks that the bindings object contains at least one binding. Then checks each binding in turn
|
62
|
+
# @api private
|
63
|
+
def check_Bindings(b)
|
64
|
+
acceptor.accept(Issues::MISSING_BINDINGS, b) unless has_entries?(b.bindings)
|
65
|
+
end
|
66
|
+
|
67
|
+
# Checks that a name has been associated with the bindings
|
68
|
+
# @api private
|
69
|
+
def check_NamedBindings(b)
|
70
|
+
acceptor.accept(Issues::MISSING_BINDINGS_NAME, b) unless has_chars?(b.name)
|
71
|
+
check_Bindings(b)
|
72
|
+
end
|
73
|
+
|
74
|
+
# Check that the category has a categorization and a value
|
75
|
+
# @api private
|
76
|
+
def check_Category(c)
|
77
|
+
acceptor.accept(Issues::MISSING_CATEGORIZATION, binding_parent(c)) unless has_chars?(c.categorization)
|
78
|
+
acceptor.accept(Issues::MISSING_CATEGORY_VALUE, binding_parent(c)) unless has_chars?(c.value)
|
79
|
+
end
|
80
|
+
|
81
|
+
# Check that the binding contains at least one predicate and that all predicates are categorized and has a value
|
82
|
+
# @api private
|
83
|
+
def check_CategorizedBindings(b)
|
84
|
+
acceptor.accept(Issues::MISSING_PREDICATES, b) unless has_entries?(b.predicates)
|
85
|
+
check_Bindings(b)
|
86
|
+
end
|
87
|
+
|
88
|
+
# @api private
|
89
|
+
def check_EffectiveCategories(ec)
|
90
|
+
end
|
91
|
+
|
92
|
+
# Check layer has a name
|
93
|
+
# @api private
|
94
|
+
def check_NamedLayer(l)
|
95
|
+
acceptor.accept(Issues::MISSING_LAYER_NAME, binding_parent(l)) unless has_chars?(l.name)
|
96
|
+
# It is ok to have an empty layer
|
97
|
+
# acceptor.accept(Issues::MISSING_BINDINGS_IN_LAYER, binding_parent(l), { :layer => l.name }) unless has_entries?(l.bindings)
|
98
|
+
end
|
99
|
+
|
100
|
+
# Checks that the binding has layers and that each layer has a name and at least one binding
|
101
|
+
# @api private
|
102
|
+
def check_LayeredBindings(b)
|
103
|
+
acceptor.accept(Issues::MISSING_LAYERS, b) unless has_entries?(b.layers)
|
104
|
+
end
|
105
|
+
|
106
|
+
# Checks that the non caching producer has a producer to delegate to
|
107
|
+
# @api private
|
108
|
+
def check_NonCachingProducerDescriptor(p)
|
109
|
+
acceptor.accept(Issues::PRODUCER_MISSING_PRODUCER, p) unless p.producer.is_a?(Bindings::ProducerDescriptor)
|
110
|
+
end
|
111
|
+
|
112
|
+
# Checks that a constant value has been declared in the producer and that the type
|
113
|
+
# of the value is compatible with the type declared in the binding
|
114
|
+
# @api private
|
115
|
+
def check_ConstantProducerDescriptor(p)
|
116
|
+
# the product must be of compatible type
|
117
|
+
# TODO: Likely to change when value becomes a typed Puppet Object
|
118
|
+
b = binding_parent(p)
|
119
|
+
if p.value.nil?
|
120
|
+
acceptor.accept(Issues::MISSING_VALUE, p, {:binding => b})
|
121
|
+
else
|
122
|
+
infered = type_calculator.infer(p.value)
|
123
|
+
unless type_calculator.assignable?(b.type, infered)
|
124
|
+
acceptor.accept(Issues::INCOMPATIBLE_TYPE, p, {:binding => b, :expected_type => b.type, :actual_type => infered})
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
# Checks that an expression has been declared in the producer
|
130
|
+
# @api private
|
131
|
+
def check_EvaluatingProducerDescriptor(p)
|
132
|
+
unless p.expression.is_a?(Puppet::Pops::Model::Expression)
|
133
|
+
acceptor.accept(Issues::MISSING_EXPRESSION, p, {:binding => binding_parent(p)})
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
# Checks that a class name has been declared in the producer
|
138
|
+
# @api private
|
139
|
+
def check_InstanceProducerDescriptor(p)
|
140
|
+
acceptor.accept(Issues::MISSING_CLASS_NAME, p, {:binding => binding_parent(p)}) unless has_chars?(p.class_name)
|
141
|
+
end
|
142
|
+
|
143
|
+
# Checks that a type and a name has been declared. The type must be assignable to the type
|
144
|
+
# declared in the binding. The name can be an empty string to denote 'no name'
|
145
|
+
# @api private
|
146
|
+
def check_LookupProducerDescriptor(p)
|
147
|
+
b = binding_parent(p)
|
148
|
+
unless type_calculator.assignable(b.type, p.type)
|
149
|
+
acceptor.accept(Issues::INCOMPATIBLE_TYPE, p, {:binding => b, :expected_type => b.type, :actual_type => p.type })
|
150
|
+
end
|
151
|
+
acceptor.accept(Issues::MISSING_NAME, p, {:binding => b}) if p.name.nil? # empty string is OK
|
152
|
+
end
|
153
|
+
|
154
|
+
# Checks that a key has been declared, then calls producer_LookupProducerDescriptor to perform
|
155
|
+
# checks associated with the super class
|
156
|
+
# @api private
|
157
|
+
def check_HashLookupProducerDescriptor(p)
|
158
|
+
acceptor.accept(Issues::MISSING_KEY, p, {:binding => binding_parent(p)}) unless has_chars?(p.key)
|
159
|
+
check_LookupProducerDescriptor(p)
|
160
|
+
end
|
161
|
+
|
162
|
+
# Checks that the type declared in the binder is a PArrayType
|
163
|
+
# @api private
|
164
|
+
def check_ArrayMultibindProducerDescriptor(p)
|
165
|
+
b = binding_parent(p)
|
166
|
+
acceptor.accept(Issues::MULTIBIND_INCOMPATIBLE_TYPE, p, {:binding => b, :actual_type => b.type}) unless b.type.is_a?(Types::PArrayType)
|
167
|
+
end
|
168
|
+
|
169
|
+
# Checks that the type declared in the binder is a PHashType
|
170
|
+
# @api private
|
171
|
+
def check_HashMultibindProducerDescriptor(p)
|
172
|
+
b = binding_parent(p)
|
173
|
+
acceptor.accept(Issues::MULTIBIND_INCOMPATIBLE_TYPE, p, {:binding => b, :actual_type => b.type}) unless b.type.is_a?(Types::PHashType)
|
174
|
+
end
|
175
|
+
|
176
|
+
# Checks that the producer that this producer delegates to is declared
|
177
|
+
# @api private
|
178
|
+
def check_ProducerProducerDescriptor(p)
|
179
|
+
unless p.producer.is_a?(Bindings::ProducerDescriptor)
|
180
|
+
acceptor.accept(Issues::PRODUCER_MISSING_PRODUCER, p, {:binding => binding_parent(p)})
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
# @api private
|
185
|
+
def check_Expression(t)
|
186
|
+
@expression_validator.validate(t)
|
187
|
+
end
|
188
|
+
|
189
|
+
# @api private
|
190
|
+
def check_PObjectType(t)
|
191
|
+
# Do nothing
|
192
|
+
end
|
193
|
+
|
194
|
+
# Returns true if the argument is a non empty string
|
195
|
+
# @api private
|
196
|
+
def has_chars?(s)
|
197
|
+
s.is_a?(String) && !s.empty?
|
198
|
+
end
|
199
|
+
|
200
|
+
# @api private
|
201
|
+
def has_entries?(s)
|
202
|
+
!(s.nil? || s.empty?)
|
203
|
+
end
|
204
|
+
|
205
|
+
# @api private
|
206
|
+
def binding_parent(p)
|
207
|
+
begin
|
208
|
+
x = p.eContainer
|
209
|
+
if x.nil?
|
210
|
+
acceptor.accept(Issues::MODEL_OBJECT_IS_UNBOUND, p)
|
211
|
+
return nil
|
212
|
+
end
|
213
|
+
p = x
|
214
|
+
end while !p.is_a?(Bindings::AbstractBinding)
|
215
|
+
p
|
216
|
+
end
|
217
|
+
end
|
@@ -0,0 +1,241 @@
|
|
1
|
+
# The BindingsComposer handles composition of multiple bindings sources
|
2
|
+
# It is directed by a {Puppet::Pops::Binder::Config::BinderConfig BinderConfig} that indicates how
|
3
|
+
# the final composition should be layered, and what should be included/excluded in each layer
|
4
|
+
#
|
5
|
+
# The bindings composer is intended to be used once per environment as the compiler starts its work.
|
6
|
+
#
|
7
|
+
# TODO: Possibly support envdir: scheme / relative to environment root (== same as confdir if there is only one environment).
|
8
|
+
# This is probably easier to do after ENC changes described in ARM-8 have been implemented.
|
9
|
+
# TODO: If same config is loaded in a higher layer, skip it in the lower (since it is meaningless to load it again with lower
|
10
|
+
# precedence. (Optimization, or possibly an error, should produce a warning).
|
11
|
+
#
|
12
|
+
class Puppet::Pops::Binder::BindingsComposer
|
13
|
+
|
14
|
+
# The BindingsConfig instance holding the read and parsed, but not evaluated configuration
|
15
|
+
# @api public
|
16
|
+
#
|
17
|
+
attr_reader :config
|
18
|
+
|
19
|
+
# map of scheme name to handler
|
20
|
+
# @api private
|
21
|
+
attr_reader :scheme_handlers
|
22
|
+
|
23
|
+
# @return Hash<String, Puppet::Module> map of module name to module instance
|
24
|
+
# @api private
|
25
|
+
attr_reader :name_to_module
|
26
|
+
|
27
|
+
# @api private
|
28
|
+
attr_reader :confdir
|
29
|
+
|
30
|
+
# @api private
|
31
|
+
attr_reader :diagnostics
|
32
|
+
|
33
|
+
# Container of all warnings and errors produced while initializing and loading bindings
|
34
|
+
#
|
35
|
+
# @api public
|
36
|
+
attr_reader :acceptor
|
37
|
+
|
38
|
+
# @api public
|
39
|
+
def initialize()
|
40
|
+
@acceptor = Puppet::Pops::Validation::Acceptor.new()
|
41
|
+
@diagnostics = Puppet::Pops::Binder::Config::DiagnosticProducer.new(acceptor)
|
42
|
+
@config = Puppet::Pops::Binder::Config::BinderConfig.new(@diagnostics)
|
43
|
+
if acceptor.errors?
|
44
|
+
Puppet::Pops::IssueReporter.assert_and_report(acceptor, :message => 'Binding Composer: error while reading config.')
|
45
|
+
raise Puppet::DevError.new("Internal Error: IssueReporter did not raise exception for errors in bindings config.")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Configures and creates the boot injector.
|
50
|
+
# The read config may optionally contain mapping of bindings scheme handler name to handler class, and
|
51
|
+
# mapping of biera2 backend symbolic name to backend class.
|
52
|
+
# If present, these are turned into bindings in the category 'extension' (which is only used in the boot injector) which
|
53
|
+
# has higher precedence than 'default'. This is done to allow users to override the default bindings for
|
54
|
+
# schemes and backends.
|
55
|
+
# @param scope [Puppet::Parser:Scope] the scope (used to find compiler and injector for the environment)
|
56
|
+
# @api private
|
57
|
+
#
|
58
|
+
def configure_and_create_injector(scope)
|
59
|
+
# create the injector (which will pick up the bindings registered above)
|
60
|
+
@scheme_handlers = SchemeHandlerHelper.new(scope)
|
61
|
+
|
62
|
+
# get extensions from the config
|
63
|
+
# ------------------------------
|
64
|
+
scheme_extensions = @config.scheme_extensions
|
65
|
+
hiera_backends = @config.hiera_backends
|
66
|
+
|
67
|
+
# Define a named bindings that are known by the SystemBindings
|
68
|
+
boot_bindings = Puppet::Pops::Binder::BindingsFactory.named_bindings(Puppet::Pops::Binder::SystemBindings::ENVIRONMENT_BOOT_BINDINGS_NAME) do
|
69
|
+
scheme_extensions.each_pair do |scheme, class_name|
|
70
|
+
# turn each scheme => class_name into a binding (contribute to the buildings-schemes multibind).
|
71
|
+
# do this in category 'extensions' to allow them to override the 'default'
|
72
|
+
when_in_category('extension', 'true').bind do
|
73
|
+
name(scheme)
|
74
|
+
instance_of(Puppetx::BINDINGS_SCHEMES_TYPE)
|
75
|
+
in_multibind(Puppetx::BINDINGS_SCHEMES)
|
76
|
+
to_instance(class_name)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
hiera_backends.each_pair do |symbolic, class_name|
|
80
|
+
# turn each symbolic => class_name into a binding (contribute to the hiera backends multibind).
|
81
|
+
# do this in category 'extensions' to allow them to override the 'default'
|
82
|
+
when_in_category('extension', 'true').bind do
|
83
|
+
name(symbolic)
|
84
|
+
instance_of(Puppetx::HIERA2_BACKENDS_TYPE)
|
85
|
+
in_multibind(Puppetx::HIERA2_BACKENDS)
|
86
|
+
to_instance(class_name)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
@injector = scope.compiler.create_boot_injector(boot_bindings.model)
|
92
|
+
end
|
93
|
+
|
94
|
+
# @return [Puppet::Pops::Binder::Bindings::LayeredBindings]
|
95
|
+
def compose(scope)
|
96
|
+
# The boot injector is used to lookup scheme-handlers
|
97
|
+
configure_and_create_injector(scope)
|
98
|
+
|
99
|
+
# get all existing modules and their root path
|
100
|
+
@name_to_module = {}
|
101
|
+
scope.environment.modules.each {|mod| name_to_module[mod.name] = mod }
|
102
|
+
|
103
|
+
# setup the confdir
|
104
|
+
@confdir = Puppet.settings[:confdir]
|
105
|
+
|
106
|
+
factory = Puppet::Pops::Binder::BindingsFactory
|
107
|
+
contributions = []
|
108
|
+
configured_layers = @config.layering_config.collect do | layer_config |
|
109
|
+
# get contributions with effective categories
|
110
|
+
contribs = configure_layer(layer_config, scope, diagnostics)
|
111
|
+
# collect the contributions separately for later checking of category precedence
|
112
|
+
contributions.concat(contribs)
|
113
|
+
# create a named layer with all the bindings for this layer
|
114
|
+
factory.named_layer(layer_config['name'], *contribs.collect {|c| c.bindings }.flatten)
|
115
|
+
end
|
116
|
+
|
117
|
+
# must check all contributions are based on compatible category precedence
|
118
|
+
# (Note that contributions no longer contains the bindings as a side effect of setting them in the collected
|
119
|
+
# layer. The effective categories and the name remains in the contributed model; this is enough for checking
|
120
|
+
# and error reporting).
|
121
|
+
check_contribution_precedence(contributions)
|
122
|
+
|
123
|
+
# Add the two system layers; the final - highest ("can not be overridden" layer), and the lowest
|
124
|
+
# Everything here can be overridden 'default' layer.
|
125
|
+
#
|
126
|
+
configured_layers.insert(0, Puppet::Pops::Binder::SystemBindings.final_contribution)
|
127
|
+
configured_layers.insert(-1, Puppet::Pops::Binder::SystemBindings.default_contribution)
|
128
|
+
|
129
|
+
# and finally... create the resulting structure
|
130
|
+
factory.layered_bindings(*configured_layers)
|
131
|
+
end
|
132
|
+
|
133
|
+
# Evaluates configured categorization and returns the result.
|
134
|
+
# The result is not cached.
|
135
|
+
# @api public
|
136
|
+
#
|
137
|
+
def effective_categories(scope)
|
138
|
+
unevaluated_categories = @config.categorization
|
139
|
+
parser = Puppet::Pops::Parser::EvaluatingParser.new()
|
140
|
+
file_source = @config.config_file or "defaults in: #{__FILE__}"
|
141
|
+
evaluated_categories = unevaluated_categories.collect do |category_tuple|
|
142
|
+
evaluated_categories = [ category_tuple[0], parser.evaluate_string( scope, parser.quote( category_tuple[1] ), file_source ) ]
|
143
|
+
if evaluated_categories[1].is_a?(String)
|
144
|
+
# category values are always in lower case
|
145
|
+
evaluated_categories[1] = evaluated_categories[1].downcase
|
146
|
+
else
|
147
|
+
raise ArgumentError, "Categorization value must be a string, category #{evaluated_categories[0]} evaluation resulted in a: '#{result[1].class}'"
|
148
|
+
end
|
149
|
+
evaluated_categories
|
150
|
+
end
|
151
|
+
Puppet::Pops::Binder::BindingsFactory::categories(evaluated_categories)
|
152
|
+
end
|
153
|
+
|
154
|
+
private
|
155
|
+
|
156
|
+
# Checks that contribution's effective categorization is in the same relative order as in the overall
|
157
|
+
# categorization precedence.
|
158
|
+
#
|
159
|
+
def check_contribution_precedence(contributions)
|
160
|
+
cat_prec = { }
|
161
|
+
@config.categorization.each_with_index {|c, i| cat_prec[ c[0] ] = i }
|
162
|
+
contributions.each() do |contrib|
|
163
|
+
# Contributions that do not specify their opinion about categorization silently accepts the precedence
|
164
|
+
# set in the root configuration - and may thus produce an unexpected result
|
165
|
+
#
|
166
|
+
next unless ec = contrib.effective_categories
|
167
|
+
next unless categories = ec.categories
|
168
|
+
prev_prec = -1
|
169
|
+
categories.each do |c|
|
170
|
+
prec = cat_prec[c.categorization]
|
171
|
+
issues = Puppet::Pops::Binder::BinderIssues
|
172
|
+
unless prec
|
173
|
+
diagnostics.accept(issues::MISSING_CATEGORY_PRECEDENCE, c, :categorization => c.categorization)
|
174
|
+
next
|
175
|
+
end
|
176
|
+
unless prec > prev_prec
|
177
|
+
diagnostics.accept(issues::PRECEDENCE_MISMATCH_IN_CONTRIBUTION, c, :categorization => c.categorization)
|
178
|
+
end
|
179
|
+
prev_prec = prec
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
def configure_layer(layer_description, scope, diagnostics)
|
185
|
+
name = layer_description['name']
|
186
|
+
|
187
|
+
# compute effective set of uris to load (and get rid of any duplicates in the process
|
188
|
+
included_uris = array_of_uris(layer_description['include'])
|
189
|
+
excluded_uris = array_of_uris(layer_description['exclude'])
|
190
|
+
effective_uris = Set.new(expand_included_uris(included_uris)).subtract(Set.new(expand_excluded_uris(excluded_uris)))
|
191
|
+
|
192
|
+
# Each URI should result in a ContributedBindings
|
193
|
+
effective_uris.collect { |uri| scheme_handlers[uri.scheme].contributed_bindings(uri, scope, self) }
|
194
|
+
end
|
195
|
+
|
196
|
+
def array_of_uris(descriptions)
|
197
|
+
return [] unless descriptions
|
198
|
+
descriptions = [descriptions] unless descriptions.is_a?(Array)
|
199
|
+
descriptions.collect {|d| URI.parse(d) }
|
200
|
+
end
|
201
|
+
|
202
|
+
def expand_included_uris(uris)
|
203
|
+
result = []
|
204
|
+
uris.each do |uri|
|
205
|
+
unless handler = scheme_handlers[uri.scheme]
|
206
|
+
raise ArgumentError, "Unknown bindings provider scheme: '#{uri.scheme}'"
|
207
|
+
end
|
208
|
+
result.concat(handler.expand_included(uri, self))
|
209
|
+
end
|
210
|
+
result
|
211
|
+
end
|
212
|
+
|
213
|
+
def expand_excluded_uris(uris)
|
214
|
+
result = []
|
215
|
+
uris.each do |uri|
|
216
|
+
unless handler = scheme_handlers[uri.scheme]
|
217
|
+
raise ArgumentError, "Unknown bindings provider scheme: '#{uri.scheme}'"
|
218
|
+
end
|
219
|
+
result.concat(handler.expand_excluded(uri, self))
|
220
|
+
end
|
221
|
+
result
|
222
|
+
end
|
223
|
+
|
224
|
+
class SchemeHandlerHelper
|
225
|
+
T = Puppet::Pops::Types::TypeFactory
|
226
|
+
HASH_OF_HANDLER = T.hash_of(T.type_of('Puppetx::Puppet::BindingsSchemeHandler'))
|
227
|
+
def initialize(scope)
|
228
|
+
@scope = scope
|
229
|
+
@cache = nil
|
230
|
+
end
|
231
|
+
def [] (scheme)
|
232
|
+
load_schemes unless @cache
|
233
|
+
@cache[scheme]
|
234
|
+
end
|
235
|
+
|
236
|
+
def load_schemes
|
237
|
+
@cache = @scope.compiler.boot_injector.lookup(@scope, HASH_OF_HANDLER, Puppetx::BINDINGS_SCHEMES) || {}
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
end
|