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/issues.rb
CHANGED
@@ -44,8 +44,12 @@ module Puppet::Pops::Issues
|
|
44
44
|
# Create a Message Data where all hash keys become methods for convenient interpolation
|
45
45
|
# in issue text.
|
46
46
|
msgdata = MessageData.new(*arg_names)
|
47
|
-
|
48
|
-
|
47
|
+
begin
|
48
|
+
# Evaluate the message block in the msg data's binding
|
49
|
+
msgdata.format(hash, &message_block)
|
50
|
+
rescue StandardError => e
|
51
|
+
raise RuntimeError, "Error while reporting issue: #{issue_code}. #{e.message}", caller
|
52
|
+
end
|
49
53
|
end
|
50
54
|
end
|
51
55
|
|
@@ -91,8 +95,8 @@ module Puppet::Pops::Issues
|
|
91
95
|
#
|
92
96
|
# @param issue_code [Symbol] the issue code for the issue used as an identifier, should be the same as the constant
|
93
97
|
# the issue is bound to.
|
94
|
-
# @param
|
95
|
-
# @param
|
98
|
+
# @param args [Symbol] required arguments that must be passed when formatting the message, may be empty
|
99
|
+
# @param block [Proc] a block producing the message string, evaluated in a MessageData scope. The produced string
|
96
100
|
# should not end with a period as additional information may be appended.
|
97
101
|
#
|
98
102
|
# @see MessageData
|
@@ -123,7 +127,7 @@ module Puppet::Pops::Issues
|
|
123
127
|
# @todo configuration
|
124
128
|
#
|
125
129
|
NAME_WITH_HYPHEN = issue :NAME_WITH_HYPHEN, :name do
|
126
|
-
"#{label.a_an_uc(semantic)} may not have a name
|
130
|
+
"#{label.a_an_uc(semantic)} may not have a name containing a hyphen. The name '#{name}' is not legal"
|
127
131
|
end
|
128
132
|
|
129
133
|
# When a variable name contains a hyphen and these are illegal.
|
@@ -93,7 +93,7 @@ class Puppet::Pops::Model::AstTransformer
|
|
93
93
|
end
|
94
94
|
|
95
95
|
def transform_ArithmeticExpression(o)
|
96
|
-
ast o, AST::
|
96
|
+
ast o, AST::ArithmeticOperator2, :lval => transform(o.left_expr), :rval=>transform(o.right_expr),
|
97
97
|
:operator => o.operator.to_s
|
98
98
|
end
|
99
99
|
|
@@ -533,7 +533,7 @@ class Puppet::Pops::Model::AstTransformer
|
|
533
533
|
def transform_IfExpression(o)
|
534
534
|
args = { :test => transform(o.test), :statements => transform(o.then_expr) }
|
535
535
|
args[:else] = transform(o.else_expr) # Tests say Nop should be there (unless is_nop? o.else_expr), probably not needed
|
536
|
-
|
536
|
+
ast o, AST::IfStatement, args
|
537
537
|
end
|
538
538
|
|
539
539
|
# Unless is not an AST object, instead an AST::IfStatement is used with an AST::Not around the test
|
@@ -541,9 +541,9 @@ class Puppet::Pops::Model::AstTransformer
|
|
541
541
|
def transform_UnlessExpression(o)
|
542
542
|
args = { :test => ast(o, AST::Not, :value => transform(o.test)),
|
543
543
|
:statements => transform(o.then_expr) }
|
544
|
-
# AST 3.1 does not allow else on unless in the grammar, but it is ok since unless is encoded as
|
544
|
+
# AST 3.1 does not allow else on unless in the grammar, but it is ok since unless is encoded as an if !x
|
545
545
|
args.merge!({:else => transform(o.else_expr)}) unless is_nop?(o.else_expr)
|
546
|
-
|
546
|
+
ast o, AST::IfStatement, args
|
547
547
|
end
|
548
548
|
|
549
549
|
# Puppet 3.1 AST only supports calling a function by name (it is not possible to produce a function
|
@@ -131,7 +131,7 @@ class Puppet::Pops::Model::AstTreeDumper < Puppet::Pops::Model::TreeDumper
|
|
131
131
|
|
132
132
|
if o.is_a? String
|
133
133
|
o # A Ruby String, not quoted
|
134
|
-
elsif
|
134
|
+
elsif Puppet::Pops::Utils.to_n(o.value)
|
135
135
|
o.value # AST::String that is a number without quotes
|
136
136
|
else
|
137
137
|
"'#{o.value}'" # AST::String that is not a number
|
@@ -11,6 +11,8 @@ class Puppet::Pops::Model::Factory
|
|
11
11
|
|
12
12
|
attr_accessor :current
|
13
13
|
|
14
|
+
alias_method :model, :current
|
15
|
+
|
14
16
|
# Shared build_visitor, since there are many instances of Factory being used
|
15
17
|
@@build_visitor = Puppet::Pops::Visitor.new(self, "build")
|
16
18
|
# Initialize a factory with a single object, or a class with arguments applied to build of
|
@@ -180,10 +182,14 @@ class Puppet::Pops::Model::Factory
|
|
180
182
|
end
|
181
183
|
|
182
184
|
# Builds body :) from different kinds of input
|
183
|
-
# @
|
184
|
-
#
|
185
|
-
# @
|
186
|
-
#
|
185
|
+
# @overload f_build_body(nothing)
|
186
|
+
# @param nothing [nil] unchanged, produces nil
|
187
|
+
# @overload f_build_body(array)
|
188
|
+
# @param array [Array<Expression>] turns into a BlockExpression
|
189
|
+
# @overload f_build_body(expr)
|
190
|
+
# @param expr [Expression] produces the given expression
|
191
|
+
# @overload f_build_body(obj)
|
192
|
+
# @param obj [Object] produces the result of calling #build with body as argument
|
187
193
|
def f_build_body(body)
|
188
194
|
case body
|
189
195
|
when NilClass
|
@@ -429,7 +435,7 @@ class Puppet::Pops::Model::Factory
|
|
429
435
|
# Does nothing if file is nil.
|
430
436
|
#
|
431
437
|
# @param file [String,nil] the file/path to the origin, may contain URI scheme of file: or some other URI scheme
|
432
|
-
# @
|
438
|
+
# @return [Factory] returns self
|
433
439
|
#
|
434
440
|
def record_origin(file)
|
435
441
|
return self unless file
|
@@ -457,11 +463,11 @@ class Puppet::Pops::Model::Factory
|
|
457
463
|
a.documentation = doc_string
|
458
464
|
end
|
459
465
|
|
460
|
-
# Returns symbolic information about
|
466
|
+
# Returns symbolic information about an expected share of a resource expression given the LHS of a resource expr.
|
461
467
|
#
|
462
468
|
# * `name { }` => `:resource`, create a resource of the given type
|
463
|
-
# * `Name { }` => ':defaults`, set
|
464
|
-
# * `Name[] { }` => `:override`,
|
469
|
+
# * `Name { }` => ':defaults`, set defaults for the referenced type
|
470
|
+
# * `Name[] { }` => `:override`, overrides instances referenced by LHS
|
465
471
|
# * _any other_ => ':error', all other are considered illegal
|
466
472
|
#
|
467
473
|
def self.resource_shape(expr)
|
@@ -657,14 +663,20 @@ class Puppet::Pops::Model::Factory
|
|
657
663
|
memo[-1] = Puppet::Pops::Model::Factory.IMPORT(expr.is_a?(Array) ? expr : [expr])
|
658
664
|
else
|
659
665
|
memo[-1] = Puppet::Pops::Model::Factory.CALL_NAMED(name, false, expr.is_a?(Array) ? expr : [expr])
|
666
|
+
if expr.is_a?(Model::CallNamedFunctionExpression)
|
667
|
+
# Patch statement function call to expression style
|
668
|
+
# This is needed because it is first parsed as a "statement" and the requirement changes as it becomes
|
669
|
+
# an argument to the name to call transform above.
|
670
|
+
expr.rval_required = true
|
671
|
+
end
|
660
672
|
end
|
661
673
|
else
|
662
674
|
memo << expr
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
675
|
+
if expr.is_a?(Model::CallNamedFunctionExpression)
|
676
|
+
# Patch rvalue expression function call to statement style.
|
677
|
+
# This is not really required but done to be AST model compliant
|
678
|
+
expr.rval_required = false
|
679
|
+
end
|
668
680
|
end
|
669
681
|
memo
|
670
682
|
end
|
@@ -5,7 +5,7 @@
|
|
5
5
|
# It describes a Metamodel containing DSL instructions, a description of PuppetType and related
|
6
6
|
# classes needed to evaluate puppet logic.
|
7
7
|
# The metamodel resembles the existing AST model, but it is a semantic model of instructions and
|
8
|
-
# the types that they operate on rather than
|
8
|
+
# the types that they operate on rather than an Abstract Syntax Tree, although closely related.
|
9
9
|
#
|
10
10
|
# The metamodel is anemic (has no behavior) except basic datatype and type
|
11
11
|
# assertions and reference/containment assertions.
|
@@ -25,9 +25,9 @@ class Puppet::Pops::Model::TreeDumper
|
|
25
25
|
parts.each_index do |i|
|
26
26
|
if i > 0
|
27
27
|
# separate with space unless previous ends with whitepsace or (
|
28
|
-
result << ' ' if parts[i] != ")" && parts[i-1] !~ /.*(?:\s+|\()$/ && parts[i] !~
|
28
|
+
result << ' ' if parts[i] != ")" && parts[i-1] !~ /.*(?:\s+|\()$/ && parts[i] !~ /^\s+/
|
29
29
|
end
|
30
|
-
result << parts[i]
|
30
|
+
result << parts[i].to_s
|
31
31
|
end
|
32
32
|
result
|
33
33
|
end
|
@@ -7,7 +7,6 @@
|
|
7
7
|
require 'racc/parser.rb'
|
8
8
|
|
9
9
|
require 'puppet'
|
10
|
-
require 'puppet/util/loadedfile'
|
11
10
|
require 'puppet/pops'
|
12
11
|
|
13
12
|
module Puppet
|
@@ -21,7 +20,7 @@ module Puppet
|
|
21
20
|
module Parser
|
22
21
|
class Parser < Racc::Parser
|
23
22
|
|
24
|
-
module_eval(<<'...end egrammar.ra/module_eval...', 'egrammar.ra',
|
23
|
+
module_eval(<<'...end egrammar.ra/module_eval...', 'egrammar.ra', 718)
|
25
24
|
|
26
25
|
# Make emacs happy
|
27
26
|
# Local Variables:
|
@@ -0,0 +1,162 @@
|
|
1
|
+
|
2
|
+
# Does not support "import" and parsing ruby files
|
3
|
+
#
|
4
|
+
class Puppet::Pops::Parser::EvaluatingParser
|
5
|
+
|
6
|
+
def initialize()
|
7
|
+
@parser = Puppet::Pops::Parser::Parser.new()
|
8
|
+
end
|
9
|
+
|
10
|
+
def parse_string(s, file_source = 'unknown')
|
11
|
+
@file_source = file_source
|
12
|
+
clear()
|
13
|
+
# Handling of syntax error can be much improved (in general), now it bails out of the parser
|
14
|
+
# and does not have as rich information (when parsing a string), need to update it with the file source
|
15
|
+
# (ideally, a syntax error should be entered as an issue, and not just thrown - but that is a general problem
|
16
|
+
# and an improvement that can be made in the eparser (rather than here).
|
17
|
+
# Also a possible improvement (if the YAML parser returns positions) is to provide correct output of position.
|
18
|
+
#
|
19
|
+
begin
|
20
|
+
assert_and_report(@parser.parse_string(s))
|
21
|
+
rescue Puppet::ParseError => e
|
22
|
+
e.file = @file_source unless e.file
|
23
|
+
raise e
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def parse_file(file)
|
28
|
+
@file_source = file
|
29
|
+
clear()
|
30
|
+
assert_and_report(@parser.parse_file(file))
|
31
|
+
end
|
32
|
+
|
33
|
+
def evaluate_string(scope, s, file_source='unknown')
|
34
|
+
evaluate(scope, parse_string(s, file_source))
|
35
|
+
end
|
36
|
+
|
37
|
+
def evaluate_file(file)
|
38
|
+
evaluate(parse_file(file))
|
39
|
+
end
|
40
|
+
|
41
|
+
def clear()
|
42
|
+
@acceptor = nil
|
43
|
+
end
|
44
|
+
|
45
|
+
def evaluate(scope, model)
|
46
|
+
return nil unless model
|
47
|
+
ast = Puppet::Pops::Model::AstTransformer.new(@file_source, nil).transform(model)
|
48
|
+
return nil unless ast
|
49
|
+
ast.safeevaluate(scope)
|
50
|
+
end
|
51
|
+
|
52
|
+
def acceptor()
|
53
|
+
@acceptor ||= Puppet::Pops::Validation::Acceptor.new
|
54
|
+
@acceptor
|
55
|
+
end
|
56
|
+
|
57
|
+
def validator()
|
58
|
+
@validator ||= Puppet::Pops::Validation::ValidatorFactory_3_1.new().validator(acceptor)
|
59
|
+
end
|
60
|
+
|
61
|
+
def assert_and_report(parse_result)
|
62
|
+
return nil unless parse_result
|
63
|
+
# make sure the result has an origin (if parsed from a string)
|
64
|
+
unless Puppet::Pops::Adapters::OriginAdapter.get(parse_result.model)
|
65
|
+
Puppet::Pops::Adapters::OriginAdapter.adapt(parse_result.model).origin = @file_source
|
66
|
+
end
|
67
|
+
validator.validate(parse_result)
|
68
|
+
|
69
|
+
max_errors = Puppet[:max_errors]
|
70
|
+
max_warnings = Puppet[:max_warnings] + 1
|
71
|
+
max_deprecations = Puppet[:max_deprecations] + 1
|
72
|
+
|
73
|
+
# If there are warnings output them
|
74
|
+
warnings = acceptor.warnings
|
75
|
+
if warnings.size > 0
|
76
|
+
formatter = Puppet::Pops::Validation::DiagnosticFormatterPuppetStyle.new
|
77
|
+
emitted_w = 0
|
78
|
+
emitted_dw = 0
|
79
|
+
acceptor.warnings.each {|w|
|
80
|
+
if w.severity == :deprecation
|
81
|
+
# Do *not* call Puppet.deprecation_warning it is for internal deprecation, not
|
82
|
+
# deprecation of constructs in manifests! (It is not designed for that purpose even if
|
83
|
+
# used throughout the code base).
|
84
|
+
#
|
85
|
+
Puppet.warning(formatter.format(w)) if emitted_dw < max_deprecations
|
86
|
+
emitted_dw += 1
|
87
|
+
else
|
88
|
+
Puppet.warning(formatter.format(w)) if emitted_w < max_warnings
|
89
|
+
emitted_w += 1
|
90
|
+
end
|
91
|
+
break if emitted_w > max_warnings && emitted_dw > max_deprecations # but only then
|
92
|
+
}
|
93
|
+
end
|
94
|
+
|
95
|
+
# If there were errors, report the first found. Use a puppet style formatter.
|
96
|
+
errors = acceptor.errors
|
97
|
+
if errors.size > 0
|
98
|
+
formatter = Puppet::Pops::Validation::DiagnosticFormatterPuppetStyle.new
|
99
|
+
if errors.size == 1 || max_errors <= 1
|
100
|
+
# raise immediately
|
101
|
+
require 'debugger'; debugger
|
102
|
+
raise Puppet::ParseError.new(formatter.format(errors[0]))
|
103
|
+
end
|
104
|
+
emitted = 0
|
105
|
+
errors.each do |e|
|
106
|
+
Puppet.err(formatter.format(e))
|
107
|
+
emitted += 1
|
108
|
+
break if emitted >= max_errors
|
109
|
+
end
|
110
|
+
warnings_message = warnings.size > 0 ? ", and #{warnings.size} warnings" : ""
|
111
|
+
giving_up_message = "Found #{errors.size} errors#{warnings_message}. Giving up"
|
112
|
+
exception = Puppet::ParseError.new(giving_up_message)
|
113
|
+
exception.file = errors[0].file
|
114
|
+
raise exception
|
115
|
+
end
|
116
|
+
parse_result
|
117
|
+
end
|
118
|
+
|
119
|
+
def quote(x)
|
120
|
+
self.class.quote(x)
|
121
|
+
end
|
122
|
+
|
123
|
+
# Translates an already parsed string that contains control characters, quotes
|
124
|
+
# and backslashes into a quoted string where all such constructs have been escaped.
|
125
|
+
# Parsing the return value of this method using the puppet parser should yield
|
126
|
+
# exactly the same string as the argument passed to this method
|
127
|
+
#
|
128
|
+
# The method makes an exception for the two character sequences \$ and \s. They
|
129
|
+
# will not be escaped since they have a special meaning in puppet syntax.
|
130
|
+
#
|
131
|
+
# @param x [String] The string to quote and "unparse"
|
132
|
+
# @return [String] The quoted string
|
133
|
+
#
|
134
|
+
def self.quote(x)
|
135
|
+
escaped = '"'
|
136
|
+
p = nil
|
137
|
+
x.each_char do |c|
|
138
|
+
case p
|
139
|
+
when nil
|
140
|
+
# do nothing
|
141
|
+
when "\t"
|
142
|
+
escaped << '\\t'
|
143
|
+
when "\n"
|
144
|
+
escaped << '\\n'
|
145
|
+
when "\f"
|
146
|
+
escaped << '\\f'
|
147
|
+
# TODO: \cx is a range of characters - skip for now
|
148
|
+
# when "\c"
|
149
|
+
# escaped << '\\c'
|
150
|
+
when '"'
|
151
|
+
escaped << '\\"'
|
152
|
+
when '\\'
|
153
|
+
escaped << if c == '$' || c == 's'; p; else '\\\\'; end # don't escape \ when followed by s or $
|
154
|
+
else
|
155
|
+
escaped << p
|
156
|
+
end
|
157
|
+
p = c
|
158
|
+
end
|
159
|
+
escaped << p unless p.nil?
|
160
|
+
escaped << '"'
|
161
|
+
end
|
162
|
+
end
|
@@ -31,10 +31,14 @@ class Puppet::Pops::Parser::Lexer
|
|
31
31
|
attr_accessor :regex, :name, :string, :skip, :skip_text
|
32
32
|
alias skip? skip
|
33
33
|
|
34
|
-
# @
|
35
|
-
#
|
36
|
-
#
|
37
|
-
#
|
34
|
+
# @overload initialize(string)
|
35
|
+
# @param string [String] a literal string token matcher
|
36
|
+
# @param name [String] the token name (what it is known as in the grammar)
|
37
|
+
# @param options [Hash] see {#set_options}
|
38
|
+
# @overload initialize(regex)
|
39
|
+
# @param regex [Regexp] a regular expression token text matcher
|
40
|
+
# @param name [String] the token name (what it is known as in the grammar)
|
41
|
+
# @param options [Hash] see {#set_options}
|
38
42
|
#
|
39
43
|
def initialize(string_or_regex, name, options = {})
|
40
44
|
if string_or_regex.is_a?(String)
|
@@ -565,7 +569,6 @@ class Puppet::Pops::Parser::Lexer
|
|
565
569
|
skip
|
566
570
|
|
567
571
|
until token_queue.empty? and @scanner.eos? do
|
568
|
-
yielded = false
|
569
572
|
offset = @scanner.pos
|
570
573
|
matched_token, value = find_token
|
571
574
|
end_offset = @scanner.pos
|
@@ -646,7 +649,6 @@ class Puppet::Pops::Parser::Lexer
|
|
646
649
|
# we search for the next quote that isn't preceded by a
|
647
650
|
# backslash; the caret is there to match empty strings
|
648
651
|
last = @scanner.matched
|
649
|
-
tmp_offset = @scanner.pos
|
650
652
|
str = @scanner.scan_until(/([^\\]|^|[^\\])([\\]{2})*[#{terminators}]/) || lex_error(positioned_message("Unclosed quote after #{format_quote(last)} followed by '#{followed_by}'"))
|
651
653
|
str.gsub!(/\\(.)/m) {
|
652
654
|
ch = $1
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'rgen/metamodel_builder'
|
2
|
+
|
3
|
+
# The ClassLoader provides a Class instance given a class name or a meta-type.
|
4
|
+
# If the class is not already loaded, it is loaded using the Puppet Autoloader.
|
5
|
+
# This means it can load a class from a gem, or from puppet modules.
|
6
|
+
#
|
7
|
+
class Puppet::Pops::Types::ClassLoader
|
8
|
+
@autoloader = Puppet::Util::Autoload.new("ClassLoader", "", :wrap => false)
|
9
|
+
|
10
|
+
# Returns a Class given a fully qualified class name.
|
11
|
+
# Lookup of class is never relative to the calling namespace.
|
12
|
+
# @param name [String, Array<String>, Array<Symbol>, Puppet::Pops::Types::PObjectType] A fully qualified
|
13
|
+
# class name String (e.g. '::Foo::Bar', 'Foo::Bar'), a PObjectType, or a fully qualified name in Array form where each part
|
14
|
+
# is either a String or a Symbol, e.g. `%w{Puppetx Puppetlabs SomeExtension}`.
|
15
|
+
# @return [Class, nil] the looked up class or nil if no such class is loaded
|
16
|
+
# @raise ArgumentError If the given argument has the wrong type
|
17
|
+
# @api public
|
18
|
+
#
|
19
|
+
def self.provide(name)
|
20
|
+
case name
|
21
|
+
when String
|
22
|
+
provide_from_string(name)
|
23
|
+
|
24
|
+
when Array
|
25
|
+
provide_from_name_path(name.join('::'), name)
|
26
|
+
|
27
|
+
when Puppet::Pops::Types::PObjectType, Puppet::Pops::Types::PType
|
28
|
+
provide_from_type(name)
|
29
|
+
|
30
|
+
else
|
31
|
+
raise ArgumentError, "Cannot provide a class from a '#{name.class.name}'"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def self.provide_from_type(type)
|
38
|
+
case type
|
39
|
+
when Puppet::Pops::Types::PRubyType
|
40
|
+
provide_from_string(type.ruby_class)
|
41
|
+
|
42
|
+
when Puppet::Pops::Types::PBooleanType
|
43
|
+
# There is no other thing to load except this Enum meta type
|
44
|
+
RGen::MetamodelBuilder::MMBase::Boolean
|
45
|
+
|
46
|
+
when Puppet::Pops::Types::PType
|
47
|
+
# TODO: PType should have a type argument (a PObjectType)
|
48
|
+
Class
|
49
|
+
|
50
|
+
# Although not expected to be the first choice for getting a concrete class for these
|
51
|
+
# types, these are of value if the calling logic just has a reference to type.
|
52
|
+
#
|
53
|
+
when Puppet::Pops::Types::PArrayType ; Array
|
54
|
+
when Puppet::Pops::Types::PHashType ; Hash
|
55
|
+
when Puppet::Pops::Types::PPatternType ; Regexp
|
56
|
+
when Puppet::Pops::Types::PIntegerType ; Integer
|
57
|
+
when Puppet::Pops::Types::PStringType ; String
|
58
|
+
when Puppet::Pops::Types::PFloatType ; Float
|
59
|
+
when Puppet::Pops::Types::PNilType ; NilClass
|
60
|
+
else
|
61
|
+
nil
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.provide_from_string(name)
|
66
|
+
name_path = name.split('::')
|
67
|
+
# always from the root, so remove an empty first segment
|
68
|
+
if name_path[0].empty?
|
69
|
+
name_path = name_path[1..-1]
|
70
|
+
end
|
71
|
+
provide_from_name_path(name, name_path)
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.provide_from_name_path(name, name_path)
|
75
|
+
# If class is already loaded, try this first
|
76
|
+
result = find_class(name_path)
|
77
|
+
|
78
|
+
unless result.is_a?(Class)
|
79
|
+
# Attempt to load it using the auto loader
|
80
|
+
loaded_path = nil
|
81
|
+
if paths_for_name(name).find {|path| loaded_path = path; @autoloader.load(path) }
|
82
|
+
result = find_class(name_path)
|
83
|
+
unless result.is_a?(Class)
|
84
|
+
raise RuntimeError, "Loading of #{name} using relative path: '#{loaded_path}' did not create expected class"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
return nil unless result.is_a?(Class)
|
89
|
+
result
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.find_class(name_path)
|
93
|
+
name_path.reduce(Object) do |ns, name|
|
94
|
+
begin
|
95
|
+
ns.const_get(name)
|
96
|
+
rescue NameError
|
97
|
+
return nil
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.paths_for_name(fq_name)
|
103
|
+
[de_camel(fq_name), downcased_path(fq_name)]
|
104
|
+
end
|
105
|
+
|
106
|
+
def self.downcased_path(fq_name)
|
107
|
+
fq_name.to_s.gsub(/::/, '/').downcase
|
108
|
+
end
|
109
|
+
|
110
|
+
def self.de_camel(fq_name)
|
111
|
+
fq_name.to_s.gsub(/::/, '/').
|
112
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
113
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
114
|
+
tr("-", "_").
|
115
|
+
downcase
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|