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
data/lib/puppet/pops.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
module Puppet
|
2
|
+
|
2
3
|
module Pops
|
3
4
|
require 'puppet/pops/patterns'
|
4
5
|
require 'puppet/pops/utils'
|
@@ -14,9 +15,18 @@ module Puppet
|
|
14
15
|
require 'puppet/pops/issues'
|
15
16
|
require 'puppet/pops/label_provider'
|
16
17
|
require 'puppet/pops/validation'
|
18
|
+
require 'puppet/pops/issue_reporter'
|
17
19
|
|
18
20
|
require 'puppet/pops/model/model'
|
19
21
|
|
22
|
+
module Types
|
23
|
+
require 'puppet/pops/types/types'
|
24
|
+
require 'puppet/pops/types/type_calculator'
|
25
|
+
require 'puppet/pops/types/type_factory'
|
26
|
+
require 'puppet/pops/types/type_parser'
|
27
|
+
require 'puppet/pops/types/class_loader'
|
28
|
+
end
|
29
|
+
|
20
30
|
module Model
|
21
31
|
require 'puppet/pops/model/tree_dumper'
|
22
32
|
require 'puppet/pops/model/ast_transformer'
|
@@ -26,10 +36,43 @@ module Puppet
|
|
26
36
|
require 'puppet/pops/model/model_label_provider'
|
27
37
|
end
|
28
38
|
|
39
|
+
module Binder
|
40
|
+
module SchemeHandler
|
41
|
+
# the handlers are auto loaded via bindings
|
42
|
+
end
|
43
|
+
module Producers
|
44
|
+
require 'puppet/pops/binder/producers'
|
45
|
+
end
|
46
|
+
|
47
|
+
require 'puppet/pops/binder/binder'
|
48
|
+
require 'puppet/pops/binder/bindings_model'
|
49
|
+
require 'puppet/pops/binder/binder_issues'
|
50
|
+
require 'puppet/pops/binder/bindings_checker'
|
51
|
+
require 'puppet/pops/binder/bindings_factory'
|
52
|
+
require 'puppet/pops/binder/bindings_label_provider'
|
53
|
+
require 'puppet/pops/binder/bindings_validator_factory'
|
54
|
+
require 'puppet/pops/binder/injector_entry'
|
55
|
+
require 'puppet/pops/binder/key_factory'
|
56
|
+
require 'puppet/pops/binder/injector'
|
57
|
+
require 'puppet/pops/binder/hiera2'
|
58
|
+
require 'puppet/pops/binder/bindings_composer'
|
59
|
+
require 'puppet/pops/binder/bindings_model_dumper'
|
60
|
+
require 'puppet/pops/binder/system_bindings'
|
61
|
+
require 'puppet/pops/binder/bindings_loader'
|
62
|
+
|
63
|
+
module Config
|
64
|
+
require 'puppet/pops/binder/config/binder_config'
|
65
|
+
require 'puppet/pops/binder/config/binder_config_checker'
|
66
|
+
require 'puppet/pops/binder/config/issues'
|
67
|
+
require 'puppet/pops/binder/config/diagnostic_producer'
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
29
71
|
module Parser
|
30
72
|
require 'puppet/pops/parser/eparser'
|
31
73
|
require 'puppet/pops/parser/parser_support'
|
32
74
|
require 'puppet/pops/parser/lexer'
|
75
|
+
require 'puppet/pops/parser/evaluating_parser'
|
33
76
|
end
|
34
77
|
|
35
78
|
module Validation
|
@@ -37,4 +80,6 @@ module Puppet
|
|
37
80
|
require 'puppet/pops/validation/validator_factory_3_1'
|
38
81
|
end
|
39
82
|
end
|
83
|
+
|
84
|
+
require 'puppet/bindings'
|
40
85
|
end
|
@@ -68,7 +68,7 @@ module Puppet::Pops::Adaptable
|
|
68
68
|
#
|
69
69
|
def self.get(o)
|
70
70
|
attr_name = :"@#{instance_var_name(self.name)}"
|
71
|
-
if
|
71
|
+
if o.instance_variable_defined?(attr_name)
|
72
72
|
o.instance_variable_get(attr_name)
|
73
73
|
else
|
74
74
|
nil
|
@@ -93,7 +93,7 @@ module Puppet::Pops::Adaptable
|
|
93
93
|
#
|
94
94
|
def self.adapt(o, &block)
|
95
95
|
attr_name = :"@#{instance_var_name(self.name)}"
|
96
|
-
adapter = if
|
96
|
+
adapter = if o.instance_variable_defined?(attr_name) && value = o.instance_variable_get(attr_name)
|
97
97
|
value
|
98
98
|
else
|
99
99
|
associate_adapter(create_adapter(o), o)
|
data/lib/puppet/pops/adapters.rb
CHANGED
@@ -47,6 +47,10 @@ module Puppet::Pops::Adapters
|
|
47
47
|
# representing the adapted object from the origin. Not including any
|
48
48
|
# trailing whitespace.
|
49
49
|
attr_accessor :length
|
50
|
+
|
51
|
+
def extract_text_from_string(string)
|
52
|
+
string.slice(offset, length)
|
53
|
+
end
|
50
54
|
end
|
51
55
|
|
52
56
|
# A LoaderAdapter adapts an object with a {Puppet::Pops::Loader}. This is used to make further loading from the
|
@@ -0,0 +1,421 @@
|
|
1
|
+
# The Binder is responsible for processing layered bindings that can be used to setup an Injector.
|
2
|
+
#
|
3
|
+
# An instance should be created, and calls should then be made to {#define_categories} to define the available categories, and
|
4
|
+
# their precedence. This should be followed by a call to {#define_layers} which will match the layered bindings against the
|
5
|
+
# effective categories (filtering out everything that does not apply, handle overrides, abstract entries etc.).
|
6
|
+
# The constructed hash with `key => InjectorEntry` mappings is obtained as {#injector_entries}, and is used to initialize an
|
7
|
+
# {Puppet::Pops::Binder::Injector Injector}.
|
8
|
+
#
|
9
|
+
# @api public
|
10
|
+
#
|
11
|
+
class Puppet::Pops::Binder::Binder
|
12
|
+
# This limits the number of available categorizations, including "common".
|
13
|
+
# @api private
|
14
|
+
PRECEDENCE_MAX = 1000
|
15
|
+
|
16
|
+
# @api private
|
17
|
+
attr_reader :category_precedences
|
18
|
+
|
19
|
+
# @api private
|
20
|
+
attr_reader :category_values
|
21
|
+
|
22
|
+
# @api private
|
23
|
+
attr_reader :injector_entries
|
24
|
+
|
25
|
+
# @api private
|
26
|
+
attr_reader :key_factory
|
27
|
+
|
28
|
+
# Whether the binder is fully configured or not
|
29
|
+
# @api public
|
30
|
+
#
|
31
|
+
attr_reader :configured
|
32
|
+
|
33
|
+
# @api public
|
34
|
+
def initialize
|
35
|
+
@category_precedences = {}
|
36
|
+
@category_values = {}
|
37
|
+
@key_factory = Puppet::Pops::Binder::KeyFactory.new()
|
38
|
+
|
39
|
+
# Resulting hash of all key -> binding
|
40
|
+
@injector_entries = {}
|
41
|
+
|
42
|
+
# Not configured until the fat lady sings
|
43
|
+
@configured = false
|
44
|
+
|
45
|
+
@next_anonymous_key = 0
|
46
|
+
end
|
47
|
+
|
48
|
+
# Answers the question 'is this binder configured?' to the point it can be used to instantiate an Injector
|
49
|
+
# @api public
|
50
|
+
def configured?()
|
51
|
+
configured()
|
52
|
+
end
|
53
|
+
|
54
|
+
# Defines the effective categories in precedence order (highest precedence first).
|
55
|
+
# The 'common' (lowest precedence) category should not be included in the list.
|
56
|
+
# A sanity check is made that there are no more than 1000 categorizations (which is pretty wild).
|
57
|
+
#
|
58
|
+
# The term 'effective categories' refers to the evaluated list of tuples (categorization, category-value) represented with
|
59
|
+
# an instance of Puppet::Pops::Binder::Bindings::EffectiveCategories.
|
60
|
+
#
|
61
|
+
# @param effective_categories [Puppet::Pops::Binder::Bindings::EffectiveCategories] effective categories (i.e. with evaluated values)
|
62
|
+
# @raise ArgumentError if this binder is already configured
|
63
|
+
# @raise ArgumentError if the argument is not an EffectiveCategories
|
64
|
+
# @raise ArgumentError if there is an attempt to redefine a category (non unique, or 'common').
|
65
|
+
# @return [Puppet::Pops::Binder::Binder] self
|
66
|
+
# @api public
|
67
|
+
#
|
68
|
+
def define_categories(effective_categories)
|
69
|
+
raise ArgumentError, "This categories are already defined. Cannot redefine." unless @category_precedences.empty?
|
70
|
+
|
71
|
+
# Note: a model instance is used since a Hash does not have a defined order in all Rubies.
|
72
|
+
unless effective_categories.is_a?(Puppet::Pops::Binder::Bindings::EffectiveCategories)
|
73
|
+
raise ArgumentError, "Expected Puppet::Pops::Binder::Bindings::EffectiveCategories, but got a: #{effective_categories.class}"
|
74
|
+
end
|
75
|
+
categories = effective_categories.categories
|
76
|
+
raise ArgumentError, "Category limit (#{PRECEDENCE_MAX}) exceeded" unless categories.size <= PRECEDENCE_MAX
|
77
|
+
|
78
|
+
# Automatically add the 'common' category with lowest precedence
|
79
|
+
@category_precedences['common'] = 0
|
80
|
+
|
81
|
+
# if categories contains "common", it should be last - simply drop it if present
|
82
|
+
if last = categories[-1]
|
83
|
+
if last.categorization == 'common'
|
84
|
+
categories.delete_at(-1)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
# Process the given categories (highest precedence is first in the list)
|
88
|
+
categories.each_with_index do |c, index|
|
89
|
+
cname = c.categorization
|
90
|
+
raise ArgumentError, "Attempt to redefine categorization: #{cname}" if @category_precedences[cname]
|
91
|
+
@category_precedences[cname] = PRECEDENCE_MAX - index
|
92
|
+
@category_values[cname] = c.value
|
93
|
+
end
|
94
|
+
self
|
95
|
+
end
|
96
|
+
|
97
|
+
# Binds layers from highest to lowest as defined by the given LayeredBindings.
|
98
|
+
# @note
|
99
|
+
# Categories must be set with #define_categories before calling this method. The model should have been
|
100
|
+
# validated to get better error messages if the model is invalid. This implementation expects the model
|
101
|
+
# to be valid, and any errors raised will be more technical runtime errors.
|
102
|
+
#
|
103
|
+
# @param layered_bindings [Puppet::Pops::Binder::Bindings::LayeredBindings] the named and ordered layers
|
104
|
+
# @raise ArgumentError if categories have not been defined
|
105
|
+
# @raise ArgumentError if this binder is already configured
|
106
|
+
# @raise ArgumentError if bindings with unresolved 'override' surfaces as an effective binding
|
107
|
+
# @raise ArgumentError if the given argument has the wrong type, or if model is invalid in some way
|
108
|
+
# @return [Puppet::Pops::Binder::Binder] self
|
109
|
+
# @api public
|
110
|
+
#
|
111
|
+
def define_layers(layered_bindings)
|
112
|
+
raise ArgumentError, "This binder is already configured. Cannot redefine its content." if configured?()
|
113
|
+
|
114
|
+
raise ArgumentError, "Categories must be defined first" if @category_precedences.empty?
|
115
|
+
LayerProcessor.new(self, key_factory).bind(layered_bindings)
|
116
|
+
injector_entries.each do |k,v|
|
117
|
+
unless key_factory.is_contributions_key?(k) || v.is_resolved?()
|
118
|
+
raise ArgumentError, "Binding with unresolved 'override' detected: #{self.class.format_binding(v.binding)}}"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
# and the fat lady has sung
|
122
|
+
@configured = true
|
123
|
+
self
|
124
|
+
end
|
125
|
+
|
126
|
+
# @api private
|
127
|
+
def next_anonymous_key
|
128
|
+
tmp = @next_anonymous_key
|
129
|
+
@next_anonymous_key += 1
|
130
|
+
tmp
|
131
|
+
end
|
132
|
+
|
133
|
+
# @api private
|
134
|
+
def self.format_binding(b)
|
135
|
+
type_name = Puppet::Pops::Types::TypeCalculator.new().string(b.type)
|
136
|
+
layer_name, bindings_name = get_named_binding_layer_and_name(b)
|
137
|
+
"binding: '#{type_name}/#{b.name}' in: '#{bindings_name}' in layer: '#{layer_name}'"
|
138
|
+
end
|
139
|
+
|
140
|
+
# @api private
|
141
|
+
def self.format_contribution_source(b)
|
142
|
+
layer_name, bindings_name = get_named_binding_layer_and_name(b)
|
143
|
+
"(layer: #{layer_name}, bindings: #{bindings_name})"
|
144
|
+
end
|
145
|
+
|
146
|
+
# @api private
|
147
|
+
def self.get_named_binding_layer_and_name(b)
|
148
|
+
return ['<unknown>', '<unknown>'] if b.nil?
|
149
|
+
return [get_named_layer(b), b.name] if b.is_a?(Puppet::Pops::Binder::Bindings::NamedBindings)
|
150
|
+
get_named_binding_layer_and_name(b.eContainer)
|
151
|
+
end
|
152
|
+
|
153
|
+
# @api private
|
154
|
+
def self.get_named_layer(b)
|
155
|
+
return '<unknown>' if b.nil?
|
156
|
+
return b.name if b.is_a?(Puppet::Pops::Binder::Bindings::NamedLayer)
|
157
|
+
get_named_layer(b.eContainer)
|
158
|
+
end
|
159
|
+
|
160
|
+
# Processes the information in a layer, aggregating it to the injector_entries hash in its parent binder.
|
161
|
+
# A LayerProcessor holds the intermediate state required while processing one layer.
|
162
|
+
#
|
163
|
+
# @api private
|
164
|
+
#
|
165
|
+
class LayerProcessor
|
166
|
+
attr :effective_prec
|
167
|
+
attr :prec_stack
|
168
|
+
attr :bindings
|
169
|
+
attr :binder
|
170
|
+
attr :key_factory
|
171
|
+
attr :contributions
|
172
|
+
|
173
|
+
def initialize(binder, key_factory)
|
174
|
+
@binder = binder
|
175
|
+
@key_factory = key_factory
|
176
|
+
@prec_stack = []
|
177
|
+
@effective_prec = nil
|
178
|
+
@bindings = []
|
179
|
+
@contributions = []
|
180
|
+
@@bind_visitor ||= Puppet::Pops::Visitor.new(nil,"bind",0,0)
|
181
|
+
end
|
182
|
+
|
183
|
+
# Add the binding to the list of potentially effective bindings from this layer
|
184
|
+
# @api private
|
185
|
+
#
|
186
|
+
def add(b)
|
187
|
+
bindings << Puppet::Pops::Binder::InjectorEntry.new(effective_prec, b)
|
188
|
+
end
|
189
|
+
|
190
|
+
# Add a multibind contribution
|
191
|
+
# @api private
|
192
|
+
#
|
193
|
+
def add_contribution(b)
|
194
|
+
contributions << Puppet::Pops::Binder::InjectorEntry.new(effective_prec, b)
|
195
|
+
end
|
196
|
+
|
197
|
+
# Bind given abstract binding
|
198
|
+
# @api private
|
199
|
+
#
|
200
|
+
def bind(binding)
|
201
|
+
@@bind_visitor.visit_this(self, binding)
|
202
|
+
end
|
203
|
+
|
204
|
+
# @return [Puppet::Pops::Binder::InjectorEntry] the entry with the highest (category) precedence
|
205
|
+
# @api private
|
206
|
+
def highest(b1, b2)
|
207
|
+
case b1.precedence <=> b2.precedence
|
208
|
+
when 1
|
209
|
+
b1
|
210
|
+
when -1
|
211
|
+
b2
|
212
|
+
when 0
|
213
|
+
raise_conflicting_binding(b1, b2)
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
# Raises a conflicting bindings error given two InjectorEntry's with same precedence in the same layer
|
218
|
+
# (if they are in different layers, something is seriously wrong)
|
219
|
+
def raise_conflicting_binding(b1, b2)
|
220
|
+
b1_layer_name, b1_bindings_name = Puppet::Pops::Binder::Binder.get_named_binding_layer_and_name(b1.binding)
|
221
|
+
b2_layer_name, b2_bindings_name = Puppet::Pops::Binder::Binder.get_named_binding_layer_and_name(b2.binding)
|
222
|
+
|
223
|
+
# The resolution is per layer, and if they differ something is serious wrong as a higher layer
|
224
|
+
# overrides a lower; so no such conflict should be possible:
|
225
|
+
unless b1_layer_name == b2_layer_name
|
226
|
+
raise ArgumentError, [
|
227
|
+
'Internal Error: Conflicting binding for',
|
228
|
+
"'#{b1.binding.name}'",
|
229
|
+
'being resolved across layers',
|
230
|
+
"'#{b1_layer_name}' and",
|
231
|
+
"'#{b2_layer_name}'"
|
232
|
+
].join(' ')
|
233
|
+
end
|
234
|
+
|
235
|
+
# Conflicting bindings made from the same source
|
236
|
+
if b1_bindings_name == b2_bindings_name
|
237
|
+
raise ArgumentError, [
|
238
|
+
'Conflicting binding for name:',
|
239
|
+
"'#{b1.binding.name}'",
|
240
|
+
'in layer:',
|
241
|
+
"'#{b1_layer_name}', ",
|
242
|
+
'both from:',
|
243
|
+
"'#{b1_bindings_name}'"
|
244
|
+
].join(' ')
|
245
|
+
end
|
246
|
+
|
247
|
+
# Conflicting bindings from different sources
|
248
|
+
raise ArgumentError, [
|
249
|
+
'Conflicting binding for name:',
|
250
|
+
"'#{b1.binding.name}'",
|
251
|
+
'in layer:',
|
252
|
+
"'#{b1_layer_name}',",
|
253
|
+
'from:',
|
254
|
+
"'#{b1_bindings_name}', and",
|
255
|
+
"'#{b2_bindings_name}'"
|
256
|
+
].join(' ')
|
257
|
+
end
|
258
|
+
|
259
|
+
|
260
|
+
# Produces the key for the given Binding.
|
261
|
+
# @param binding [Puppet::Pops::Binder::Bindings::Binding] the binding to get a key for
|
262
|
+
# @return [Object] an opaque key
|
263
|
+
# @api private
|
264
|
+
#
|
265
|
+
def key(binding)
|
266
|
+
k = if is_contribution?(binding)
|
267
|
+
# contributions get a unique (sequential) key
|
268
|
+
binder.next_anonymous_key()
|
269
|
+
else
|
270
|
+
key_factory.binding_key(binding)
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
# @api private
|
275
|
+
def is_contribution?(binding)
|
276
|
+
! binding.multibind_id.nil?
|
277
|
+
end
|
278
|
+
|
279
|
+
# @api private
|
280
|
+
def push_precedences(precedences)
|
281
|
+
prec_stack.push(precedences)
|
282
|
+
@effective_prec = nil # clear cache
|
283
|
+
end
|
284
|
+
|
285
|
+
# @api private
|
286
|
+
def pop_precedences()
|
287
|
+
prec_stack.pop()
|
288
|
+
@effective_prec = nil # clear cache
|
289
|
+
end
|
290
|
+
|
291
|
+
# Returns the effective precedence as an array with highest precedence first.
|
292
|
+
# Internally the precedence is an array with the highest precedence first.
|
293
|
+
#
|
294
|
+
# @api private
|
295
|
+
#
|
296
|
+
def effective_prec()
|
297
|
+
unless @effective_prec
|
298
|
+
@effective_prec = prec_stack.flatten.uniq.sort.reverse
|
299
|
+
if @effective_prec.size == 0
|
300
|
+
@effective_prec = [ 0 ] # i.e. "common"
|
301
|
+
end
|
302
|
+
end
|
303
|
+
@effective_prec
|
304
|
+
end
|
305
|
+
|
306
|
+
# @api private
|
307
|
+
def bind_Binding(o)
|
308
|
+
if is_contribution?(o)
|
309
|
+
add_contribution(o)
|
310
|
+
else
|
311
|
+
add(o)
|
312
|
+
end
|
313
|
+
end
|
314
|
+
|
315
|
+
# @api private
|
316
|
+
def bind_Bindings(o)
|
317
|
+
o.bindings.each {|b| bind(b) }
|
318
|
+
end
|
319
|
+
|
320
|
+
# @api private
|
321
|
+
def bind_NamedBindings(o)
|
322
|
+
# Name is ignored here, it should be introspected when needed (in case of errors)
|
323
|
+
o.bindings.each {|b| bind(b) }
|
324
|
+
end
|
325
|
+
|
326
|
+
# Process CategorizedBindings by calculating precedence, and then if satisfying the predicates, process the contained
|
327
|
+
# bindings.
|
328
|
+
# @api private
|
329
|
+
#
|
330
|
+
def bind_CategorizedBindings(o)
|
331
|
+
precedences = o.predicates.collect do |p|
|
332
|
+
prec = binder.category_precedences[p.categorization]
|
333
|
+
|
334
|
+
# Skip bindings if the categorization is not present, or
|
335
|
+
# if the category value is not the effective value for the categorization
|
336
|
+
# Ignore the value for the common category (it is not possible to state common 'false' etc.)
|
337
|
+
#
|
338
|
+
return unless prec
|
339
|
+
return unless binder.category_values[p.categorization] == p.value.downcase || p.categorization == 'common'
|
340
|
+
prec
|
341
|
+
end
|
342
|
+
push_precedences(precedences)
|
343
|
+
o.bindings.each {|b| bind(b) }
|
344
|
+
pop_precedences()
|
345
|
+
end
|
346
|
+
|
347
|
+
# Process layered bindings from highest to lowest layer
|
348
|
+
# @api private
|
349
|
+
#
|
350
|
+
def bind_LayeredBindings(o)
|
351
|
+
o.layers.each do |layer|
|
352
|
+
processor = LayerProcessor.new(binder, key_factory)
|
353
|
+
# All except abstract (==error) are transfered to injector_entries
|
354
|
+
|
355
|
+
processor.bind(layer).each do |k, v|
|
356
|
+
entry = binder.injector_entries[k]
|
357
|
+
unless key_factory.is_contributions_key?(k)
|
358
|
+
if v.is_abstract?()
|
359
|
+
layer_name, bindings_name = Puppet::Pops::Binder::Binder.get_named_binding_layer_and_name(v.binding)
|
360
|
+
type_name = key_factory.type_calculator.string(v.binding.type)
|
361
|
+
raise ArgumentError, "The abstract binding '#{type_name}/#{v.binding.name}' in '#{bindings_name}' in layer '#{layer_name}' was not overridden"
|
362
|
+
end
|
363
|
+
raise ArgumentError, "Internal Error - redefinition of key: #{k}, (should never happen)" if entry
|
364
|
+
binder.injector_entries[k] = v
|
365
|
+
else
|
366
|
+
entry ? entry << v : binder.injector_entries[k] = v
|
367
|
+
end
|
368
|
+
end
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
# Processes one named ("top level") layer consisting of a list of NamedBindings
|
373
|
+
# @api private
|
374
|
+
#
|
375
|
+
def bind_NamedLayer(o)
|
376
|
+
o.bindings.each {|b| bind(b) }
|
377
|
+
this_layer = {}
|
378
|
+
|
379
|
+
# process regular bindings
|
380
|
+
bindings.each do |b|
|
381
|
+
bkey = key(b.binding)
|
382
|
+
|
383
|
+
# ignore if a higher layer defined it, but ensure override gets resolved
|
384
|
+
if x = binder.injector_entries[bkey]
|
385
|
+
x.mark_override_resolved()
|
386
|
+
next
|
387
|
+
end
|
388
|
+
|
389
|
+
# if already found in this layer, one wins (and resolves override), or it is an error
|
390
|
+
existing = this_layer[bkey]
|
391
|
+
winner = existing ? highest(existing, b) : b
|
392
|
+
this_layer[bkey] = winner
|
393
|
+
if existing
|
394
|
+
winner.mark_override_resolved()
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
398
|
+
# Process contributions
|
399
|
+
# - organize map multibind_id to bindings with this id
|
400
|
+
# - for each id, create an array with the unique anonymous keys to the contributed bindings
|
401
|
+
# - bind the index to a special multibind contributions key (these are aggregated)
|
402
|
+
#
|
403
|
+
c_hash = Hash.new {|hash, key| hash[ key ] = [] }
|
404
|
+
contributions.each {|b| c_hash[ b.binding.multibind_id ] << b }
|
405
|
+
# - for each id
|
406
|
+
c_hash.each do |k, v|
|
407
|
+
index = v.collect do |b|
|
408
|
+
bkey = key(b.binding)
|
409
|
+
this_layer[bkey] = b
|
410
|
+
bkey
|
411
|
+
end
|
412
|
+
contributions_key = key_factory.multibind_contributions(k)
|
413
|
+
unless this_layer[contributions_key]
|
414
|
+
this_layer[contributions_key] = []
|
415
|
+
end
|
416
|
+
this_layer[contributions_key] += index
|
417
|
+
end
|
418
|
+
this_layer
|
419
|
+
end
|
420
|
+
end
|
421
|
+
end
|