puppet 3.1.1 → 3.2.0.rc1
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/CONTRIBUTING.md +2 -2
- data/Gemfile +32 -19
- data/README_DEVELOPER.md +332 -14
- data/Rakefile +9 -5
- data/ext/build_defaults.yaml +2 -3
- data/ext/debian/changelog.erb +6 -0
- data/ext/debian/control +6 -6
- data/ext/envpuppet +4 -4
- data/ext/project_data.yaml +1 -0
- data/ext/puppet-nm-dispatcher +13 -0
- data/ext/redhat/puppet.spec.erb +17 -0
- data/ext/suse/client.init +1 -1
- data/ext/systemd/puppetagent.service +2 -2
- data/ext/systemd/puppetmaster.service +2 -2
- data/lib/hiera/scope.rb +29 -11
- data/lib/hiera_puppet.rb +1 -3
- data/lib/puppet/agent.rb +3 -3
- data/lib/puppet/application.rb +2 -2
- data/lib/puppet/application/agent.rb +27 -12
- data/lib/puppet/application/apply.rb +11 -1
- data/lib/puppet/application/describe.rb +1 -1
- data/lib/puppet/application/doc.rb +13 -9
- data/lib/puppet/application/filebucket.rb +0 -1
- data/lib/puppet/application/kick.rb +1 -0
- data/lib/puppet/application/master.rb +16 -8
- data/lib/puppet/daemon.rb +19 -64
- data/lib/puppet/defaults.rb +61 -5
- data/lib/puppet/error.rb +15 -4
- data/lib/puppet/external/nagios/grammar.ry +1 -1
- data/lib/puppet/external/nagios/makefile +1 -1
- data/lib/puppet/external/nagios/parser.rb +185 -618
- data/lib/puppet/external/pson/pure/parser.rb +47 -1
- data/lib/puppet/face/certificate.rb +3 -3
- data/lib/puppet/face/module.rb +1 -1
- data/lib/puppet/face/module/changes.rb +3 -1
- data/lib/puppet/face/module/uninstall.rb +1 -1
- data/lib/puppet/face/node/clean.rb +5 -5
- data/lib/puppet/feature/base.rb +3 -1
- data/lib/puppet/feature/libuser.rb +8 -0
- data/lib/puppet/file_serving/fileset.rb +9 -1
- data/lib/puppet/forge.rb +28 -5
- data/lib/puppet/forge/errors.rb +34 -0
- data/lib/puppet/forge/repository.rb +1 -1
- data/lib/puppet/indirector.rb +4 -1
- data/lib/puppet/indirector/catalog/compiler.rb +37 -30
- data/lib/puppet/indirector/facts/inventory_active_record.rb +1 -0
- data/lib/puppet/indirector/indirection.rb +28 -15
- data/lib/puppet/indirector/rest.rb +18 -10
- data/lib/puppet/interface.rb +11 -4
- data/lib/puppet/interface/action.rb +1 -3
- data/lib/puppet/interface/action_builder.rb +0 -3
- data/lib/puppet/interface/action_manager.rb +0 -3
- data/lib/puppet/interface/face_collection.rb +0 -2
- data/lib/puppet/interface/option.rb +0 -2
- data/lib/puppet/interface/option_builder.rb +0 -2
- data/lib/puppet/interface/option_manager.rb +0 -2
- data/lib/puppet/metatype/manager.rb +1 -1
- data/lib/puppet/module_tool.rb +1 -0
- data/lib/puppet/module_tool/applications/application.rb +0 -3
- data/lib/puppet/module_tool/applications/builder.rb +8 -20
- data/lib/puppet/module_tool/applications/checksummer.rb +1 -1
- data/lib/puppet/module_tool/applications/installer.rb +1 -0
- data/lib/puppet/module_tool/applications/unpacker.rb +3 -11
- data/lib/puppet/module_tool/checksums.rb +1 -1
- data/lib/puppet/module_tool/errors/installer.rb +18 -1
- data/lib/puppet/module_tool/modulefile.rb +2 -2
- data/lib/puppet/module_tool/skeleton/templates/generator/Modulefile.erb +1 -1
- data/lib/puppet/module_tool/tar.rb +17 -0
- data/lib/puppet/module_tool/tar/gnu.rb +9 -0
- data/lib/puppet/module_tool/tar/mini.rb +39 -0
- data/lib/puppet/module_tool/tar/solaris.rb +5 -0
- data/lib/puppet/network/http.rb +1 -0
- data/lib/puppet/network/http/connection.rb +9 -23
- data/lib/puppet/network/http/handler.rb +38 -7
- data/lib/puppet/network/http/rack/rest.rb +14 -3
- data/lib/puppet/network/http/webrick.rb +3 -1
- data/lib/puppet/network/http/webrick/rest.rb +11 -2
- data/lib/puppet/node/environment.rb +3 -1
- data/lib/puppet/parameter.rb +32 -29
- data/lib/puppet/parameter/package_options.rb +1 -1
- data/lib/puppet/parameter/path.rb +1 -1
- data/lib/puppet/parameter/value.rb +1 -1
- data/lib/puppet/parameter/value_collection.rb +7 -3
- data/lib/puppet/parser/ast.rb +3 -1
- data/lib/puppet/parser/ast/arithmetic_operator.rb +56 -12
- data/lib/puppet/parser/ast/astarray.rb +1 -1
- data/lib/puppet/parser/ast/block_expression.rb +41 -0
- data/lib/puppet/parser/ast/function.rb +13 -2
- data/lib/puppet/parser/ast/lambda.rb +107 -0
- data/lib/puppet/parser/ast/leaf.rb +1 -2
- data/lib/puppet/parser/ast/method_call.rb +77 -0
- data/lib/puppet/parser/ast/vardef.rb +7 -0
- data/lib/puppet/parser/compiler.rb +27 -16
- data/lib/puppet/parser/e_parser_adapter.rb +120 -0
- data/lib/puppet/parser/files.rb +7 -6
- data/lib/puppet/parser/functions.rb +10 -8
- data/lib/puppet/parser/functions/collect.rb +43 -0
- data/lib/puppet/parser/functions/each.rb +96 -0
- data/lib/puppet/parser/functions/foreach.rb +96 -0
- data/lib/puppet/parser/functions/fqdn_rand.rb +2 -2
- data/lib/puppet/parser/functions/hiera.rb +20 -2
- data/lib/puppet/parser/functions/hiera_array.rb +21 -2
- data/lib/puppet/parser/functions/hiera_hash.rb +23 -2
- data/lib/puppet/parser/functions/hiera_include.rb +33 -2
- data/lib/puppet/parser/functions/inline_template.rb +4 -4
- data/lib/puppet/parser/functions/reduce.rb +74 -0
- data/lib/puppet/parser/functions/reject.rb +46 -0
- data/lib/puppet/parser/functions/select.rb +46 -0
- data/lib/puppet/parser/functions/slice.rb +96 -0
- data/lib/puppet/parser/functions/template.rb +2 -2
- data/lib/puppet/parser/grammar.ra +7 -4
- data/lib/puppet/parser/lexer.rb +10 -0
- data/lib/puppet/parser/methods.rb +69 -0
- data/lib/puppet/parser/parser.rb +855 -808
- data/lib/puppet/parser/parser_factory.rb +62 -0
- data/lib/puppet/parser/parser_support.rb +8 -2
- data/lib/puppet/parser/scope.rb +153 -47
- data/lib/puppet/parser/templatewrapper.rb +28 -21
- data/lib/puppet/parser/type_loader.rb +3 -1
- data/lib/puppet/pops.rb +40 -0
- data/lib/puppet/pops/adaptable.rb +190 -0
- data/lib/puppet/pops/adapters.rb +65 -0
- data/lib/puppet/pops/containment.rb +37 -0
- data/lib/puppet/pops/issues.rb +258 -0
- data/lib/puppet/pops/label_provider.rb +71 -0
- data/lib/puppet/pops/model/ast_transformer.rb +636 -0
- data/lib/puppet/pops/model/ast_tree_dumper.rb +378 -0
- data/lib/puppet/pops/model/factory.rb +804 -0
- data/lib/puppet/pops/model/model.rb +567 -0
- data/lib/puppet/pops/model/model_label_provider.rb +75 -0
- data/lib/puppet/pops/model/model_tree_dumper.rb +352 -0
- data/lib/puppet/pops/model/tree_dumper.rb +59 -0
- data/lib/puppet/pops/parser/egrammar.ra +723 -0
- data/lib/puppet/pops/parser/eparser.rb +2300 -0
- data/lib/puppet/pops/parser/grammar.ra +746 -0
- data/lib/puppet/pops/parser/lexer.rb +842 -0
- data/lib/puppet/pops/parser/makefile +13 -0
- data/lib/puppet/pops/parser/parser_support.rb +203 -0
- data/lib/puppet/pops/patterns.rb +35 -0
- data/lib/puppet/pops/utils.rb +104 -0
- data/lib/puppet/pops/validation.rb +297 -0
- data/lib/puppet/pops/validation/checker3_1.rb +551 -0
- data/lib/puppet/pops/validation/validator_factory_3_1.rb +41 -0
- data/lib/puppet/pops/visitable.rb +6 -0
- data/lib/puppet/pops/visitor.rb +50 -0
- data/lib/puppet/property.rb +37 -28
- data/lib/puppet/property/ensure.rb +2 -2
- data/lib/puppet/property/ordered_list.rb +1 -1
- data/lib/puppet/provider.rb +26 -30
- data/lib/puppet/provider/aixobject.rb +45 -44
- data/lib/puppet/provider/augeas/augeas.rb +0 -1
- data/lib/puppet/provider/confiner.rb +1 -1
- data/lib/puppet/provider/cron/crontab.rb +107 -67
- data/lib/puppet/provider/group/groupadd.rb +59 -3
- data/lib/puppet/provider/interface/cisco.rb +4 -4
- data/lib/puppet/provider/mount/parsed.rb +1 -1
- data/lib/puppet/provider/nameservice.rb +22 -6
- data/lib/puppet/provider/nameservice/pw.rb +1 -1
- data/lib/puppet/provider/package/aix.rb +28 -4
- data/lib/puppet/provider/package/gem.rb +0 -2
- data/lib/puppet/provider/package/macports.rb +1 -1
- data/lib/puppet/provider/package/nim.rb +249 -4
- data/lib/puppet/provider/package/opkg.rb +77 -0
- data/lib/puppet/provider/package/pacman.rb +2 -2
- data/lib/puppet/provider/package/rpm.rb +30 -16
- data/lib/puppet/provider/package/yum.rb +3 -3
- data/lib/puppet/provider/parsedfile.rb +80 -3
- data/lib/puppet/provider/selmodule/semodule.rb +2 -2
- data/lib/puppet/provider/service/debian.rb +0 -4
- data/lib/puppet/provider/service/freebsd.rb +2 -2
- data/lib/puppet/provider/service/gentoo.rb +0 -9
- data/lib/puppet/provider/service/init.rb +27 -2
- data/lib/puppet/provider/service/launchd.rb +1 -1
- data/lib/puppet/provider/service/openwrt.rb +36 -0
- data/lib/puppet/provider/service/redhat.rb +0 -9
- data/lib/puppet/provider/service/src.rb +38 -4
- data/lib/puppet/provider/service/systemd.rb +2 -2
- data/lib/puppet/provider/service/upstart.rb +1 -8
- data/lib/puppet/provider/user/aix.rb +4 -10
- data/lib/puppet/provider/user/pw.rb +6 -10
- data/lib/puppet/provider/user/useradd.rb +129 -31
- data/lib/puppet/provider/vlan/cisco.rb +4 -4
- data/lib/puppet/reference/function.rb +2 -2
- data/lib/puppet/reference/indirection.rb +46 -5
- data/lib/puppet/reference/metaparameter.rb +2 -2
- data/lib/puppet/reports.rb +5 -5
- data/lib/puppet/reports/rrdgraph.rb +4 -4
- data/lib/puppet/reports/tagmail.rb +1 -1
- data/lib/puppet/resource.rb +1 -1
- data/lib/puppet/resource/type.rb +13 -11
- data/lib/puppet/scheduler.rb +16 -0
- data/lib/puppet/scheduler/job.rb +53 -0
- data/lib/puppet/scheduler/scheduler.rb +45 -0
- data/lib/puppet/scheduler/splay_job.rb +32 -0
- data/lib/puppet/scheduler/timer.rb +13 -0
- data/lib/puppet/settings/base_setting.rb +1 -1
- data/lib/puppet/simple_graph.rb +4 -4
- data/lib/puppet/ssl/base.rb +12 -2
- data/lib/puppet/ssl/certificate.rb +4 -1
- data/lib/puppet/ssl/certificate_request.rb +4 -1
- data/lib/puppet/ssl/certificate_revocation_list.rb +4 -1
- data/lib/puppet/ssl/configuration.rb +32 -0
- data/lib/puppet/ssl/host.rb +18 -21
- data/lib/puppet/ssl/key.rb +4 -1
- data/lib/puppet/ssl/validator.rb +116 -0
- data/lib/puppet/transaction.rb +1 -1
- data/lib/puppet/transaction/event.rb +3 -10
- data/lib/puppet/transaction/event_manager.rb +8 -1
- data/lib/puppet/transaction/report.rb +17 -16
- data/lib/puppet/type.rb +77 -69
- data/lib/puppet/type/cron.rb +20 -8
- data/lib/puppet/type/exec.rb +9 -3
- data/lib/puppet/type/file.rb +95 -21
- data/lib/puppet/type/file/content.rb +1 -1
- data/lib/puppet/type/file/mode.rb +7 -1
- data/lib/puppet/type/file/source.rb +2 -2
- data/lib/puppet/type/group.rb +11 -0
- data/lib/puppet/type/scheduled_task.rb +5 -1
- data/lib/puppet/type/service.rb +1 -1
- data/lib/puppet/type/ssh_authorized_key.rb +2 -2
- data/lib/puppet/type/user.rb +24 -6
- data/lib/puppet/util.rb +12 -2
- data/lib/puppet/util/classgen.rb +4 -4
- data/lib/puppet/util/colors.rb +55 -0
- data/lib/puppet/util/command_line/trollop.rb +4 -4
- data/lib/puppet/util/errors.rb +39 -3
- data/lib/puppet/util/fileparsing.rb +5 -0
- data/lib/puppet/util/filetype.rb +11 -9
- data/lib/puppet/util/instrumentation/instrumentable.rb +2 -2
- data/lib/puppet/util/libuser.conf +15 -0
- data/lib/puppet/util/libuser.rb +12 -0
- data/lib/puppet/util/monkey_patches.rb +48 -0
- data/lib/puppet/util/network_device.rb +1 -1
- data/lib/puppet/util/network_device/base.rb +2 -2
- data/lib/puppet/util/network_device/cisco/device.rb +29 -19
- data/lib/puppet/util/network_device/config.rb +5 -2
- data/lib/puppet/util/network_device/ipcalc.rb +1 -1
- data/lib/puppet/util/network_device/transport/ssh.rb +4 -3
- data/lib/puppet/util/network_device/transport/telnet.rb +4 -2
- data/lib/puppet/util/plugins.rb +4 -4
- data/lib/puppet/util/posix.rb +1 -1
- data/lib/puppet/util/profiler.rb +28 -0
- data/lib/puppet/util/profiler/logging.rb +47 -0
- data/lib/puppet/util/profiler/none.rb +8 -0
- data/lib/puppet/util/profiler/object_counts.rb +17 -0
- data/lib/puppet/util/profiler/wall_clock.rb +34 -0
- data/lib/puppet/util/provider_features.rb +1 -1
- data/lib/puppet/util/rdoc/parser.rb +5 -5
- data/lib/puppet/util/ssl.rb +38 -0
- data/lib/puppet/util/subclass_loader.rb +1 -5
- data/lib/puppet/util/windows.rb +1 -0
- data/lib/puppet/util/windows/process.rb +3 -0
- data/lib/puppet/util/windows/root_certs.rb +86 -0
- data/lib/puppet/util/windows/security.rb +1 -0
- data/lib/puppet/version.rb +1 -1
- data/spec/fixtures/integration/provider/cron/crontab/create_normal_entry +19 -0
- data/spec/fixtures/integration/provider/cron/crontab/create_special_entry +18 -0
- data/spec/fixtures/integration/provider/cron/crontab/crontab_user1 +15 -0
- data/spec/fixtures/integration/provider/cron/crontab/crontab_user2 +4 -0
- data/spec/fixtures/integration/provider/cron/crontab/modify_entry +13 -0
- data/spec/fixtures/integration/provider/cron/crontab/moved_cronjob_input1 +15 -0
- data/spec/fixtures/integration/provider/cron/crontab/moved_cronjob_input2 +6 -0
- data/spec/fixtures/integration/provider/cron/crontab/remove_named_resource +12 -0
- data/spec/fixtures/integration/provider/cron/crontab/remove_unnamed_resource +14 -0
- data/spec/fixtures/unit/pops/parser/lexer/aliastest.pp +16 -0
- data/spec/fixtures/unit/pops/parser/lexer/append.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/argumentdefaults.pp +14 -0
- data/spec/fixtures/unit/pops/parser/lexer/arithmetic_expression.pp +8 -0
- data/spec/fixtures/unit/pops/parser/lexer/arraytrailingcomma.pp +3 -0
- data/spec/fixtures/unit/pops/parser/lexer/casestatement.pp +65 -0
- data/spec/fixtures/unit/pops/parser/lexer/classheirarchy.pp +15 -0
- data/spec/fixtures/unit/pops/parser/lexer/classincludes.pp +17 -0
- data/spec/fixtures/unit/pops/parser/lexer/classpathtest.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/collection.pp +10 -0
- data/spec/fixtures/unit/pops/parser/lexer/collection_override.pp +8 -0
- data/spec/fixtures/unit/pops/parser/lexer/collection_within_virtual_definitions.pp +20 -0
- data/spec/fixtures/unit/pops/parser/lexer/componentmetaparams.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/componentrequire.pp +8 -0
- data/spec/fixtures/unit/pops/parser/lexer/deepclassheirarchy.pp +23 -0
- data/spec/fixtures/unit/pops/parser/lexer/defineoverrides.pp +17 -0
- data/spec/fixtures/unit/pops/parser/lexer/emptyclass.pp +9 -0
- data/spec/fixtures/unit/pops/parser/lexer/emptyexec.pp +3 -0
- data/spec/fixtures/unit/pops/parser/lexer/emptyifelse.pp +9 -0
- data/spec/fixtures/unit/pops/parser/lexer/falsevalues.pp +3 -0
- data/spec/fixtures/unit/pops/parser/lexer/filecreate.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/fqdefinition.pp +5 -0
- data/spec/fixtures/unit/pops/parser/lexer/fqparents.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/funccomma.pp +5 -0
- data/spec/fixtures/unit/pops/parser/lexer/hash.pp +33 -0
- data/spec/fixtures/unit/pops/parser/lexer/ifexpression.pp +12 -0
- data/spec/fixtures/unit/pops/parser/lexer/implicititeration.pp +15 -0
- data/spec/fixtures/unit/pops/parser/lexer/multilinecomments.pp +10 -0
- data/spec/fixtures/unit/pops/parser/lexer/multipleclass.pp +9 -0
- data/spec/fixtures/unit/pops/parser/lexer/multipleinstances.pp +7 -0
- data/spec/fixtures/unit/pops/parser/lexer/multisubs.pp +13 -0
- data/spec/fixtures/unit/pops/parser/lexer/namevartest.pp +9 -0
- data/spec/fixtures/unit/pops/parser/lexer/scopetest.pp +13 -0
- data/spec/fixtures/unit/pops/parser/lexer/selectorvalues.pp +49 -0
- data/spec/fixtures/unit/pops/parser/lexer/simpledefaults.pp +5 -0
- data/spec/fixtures/unit/pops/parser/lexer/simpleselector.pp +38 -0
- data/spec/fixtures/unit/pops/parser/lexer/singleary.pp +19 -0
- data/spec/fixtures/unit/pops/parser/lexer/singlequote.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/singleselector.pp +22 -0
- data/spec/fixtures/unit/pops/parser/lexer/subclass_name_duplication.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/tag.pp +9 -0
- data/spec/fixtures/unit/pops/parser/lexer/tagged.pp +35 -0
- data/spec/fixtures/unit/pops/parser/lexer/virtualresources.pp +14 -0
- data/spec/fixtures/unit/provider/cron/crontab/single_line.yaml +4 -4
- data/spec/fixtures/unit/provider/cron/crontab/vixie_header.txt +3 -0
- data/spec/fixtures/unit/provider/cron/parsed/managed +6 -0
- data/spec/fixtures/unit/provider/cron/parsed/simple +9 -0
- data/spec/fixtures/unit/provider/parsedfile/simple.txt +4 -0
- data/spec/fixtures/unit/provider/service/systemd/list_units +18 -0
- data/spec/integration/parser/collector_spec.rb +1 -1
- data/spec/integration/parser/compiler_spec.rb +252 -227
- data/spec/integration/parser/parser_spec.rb +171 -53
- data/spec/integration/parser/scope_spec.rb +1 -1
- data/spec/integration/provider/cron/crontab_spec.rb +187 -0
- data/spec/integration/provider/service/systemd_spec.rb +20 -0
- data/spec/integration/type/file_spec.rb +21 -21
- data/spec/integration/type/package_spec.rb +1 -1
- data/spec/lib/puppet_spec/database.rb +2 -5
- data/spec/spec_helper.rb +6 -1
- data/spec/unit/application/apply_spec.rb +16 -1
- data/spec/unit/application/describe_spec.rb +1 -1
- data/spec/unit/application/doc_spec.rb +55 -32
- data/spec/unit/application/kick_spec.rb +8 -6
- data/spec/unit/application/master_spec.rb +4 -4
- data/spec/unit/daemon_spec.rb +1 -1
- data/spec/unit/forge/errors_spec.rb +40 -0
- data/spec/unit/forge/repository_spec.rb +11 -1
- data/spec/unit/forge_spec.rb +13 -3
- data/spec/unit/hiera/backend/puppet_backend_spec.rb +1 -0
- data/spec/unit/hiera/scope_spec.rb +48 -25
- data/spec/unit/indirector/catalog/active_record_spec.rb +6 -3
- data/spec/unit/indirector/catalog/compiler_spec.rb +3 -28
- data/spec/unit/indirector/catalog/static_compiler_spec.rb +1 -1
- data/spec/unit/indirector/facts/inventory_active_record_spec.rb +154 -150
- data/spec/unit/indirector/indirection_spec.rb +5 -0
- data/spec/unit/indirector/resource/active_record_spec.rb +5 -22
- data/spec/unit/indirector_spec.rb +7 -1
- data/spec/unit/interface/action_builder_spec.rb +1 -1
- data/spec/unit/interface/action_manager_spec.rb +0 -2
- data/spec/unit/interface/action_spec.rb +1 -1
- data/spec/unit/interface/documentation_spec.rb +0 -2
- data/spec/unit/interface/face_collection_spec.rb +1 -1
- data/spec/unit/interface/option_builder_spec.rb +1 -1
- data/spec/unit/interface/option_spec.rb +0 -1
- data/spec/unit/module_spec.rb +17 -19
- data/spec/unit/module_tool/application_spec.rb +1 -3
- data/spec/unit/module_tool/applications/builder_spec.rb +38 -0
- data/spec/unit/module_tool/applications/checksummer_spec.rb +134 -0
- data/spec/unit/module_tool/applications/installer_spec.rb +71 -91
- data/spec/unit/module_tool/applications/searcher_spec.rb +1 -3
- data/spec/unit/module_tool/applications/uninstaller_spec.rb +18 -26
- data/spec/unit/module_tool/applications/unpacker_spec.rb +19 -52
- data/spec/unit/module_tool/tar/gnu_spec.rb +19 -0
- data/spec/unit/module_tool/tar/mini_spec.rb +59 -0
- data/spec/unit/module_tool/tar/solaris_spec.rb +19 -0
- data/spec/unit/network/http/connection_spec.rb +17 -2
- data/spec/unit/network/http/handler_spec.rb +195 -167
- data/spec/unit/network/http/rack/rest_spec.rb +26 -4
- data/spec/unit/network/http/webrick/rest_spec.rb +28 -1
- data/spec/unit/network/http/webrick_spec.rb +12 -3
- data/spec/unit/node/environment_spec.rb +421 -404
- data/spec/unit/parser/ast/arithmetic_operator_spec.rb +98 -2
- data/spec/unit/parser/collector_spec.rb +4 -4
- data/spec/unit/parser/compiler_spec.rb +13 -13
- data/spec/unit/parser/eparser_adapter_spec.rb +407 -0
- data/spec/unit/parser/functions/extlookup_spec.rb +20 -17
- data/spec/unit/parser/functions/fqdn_rand_spec.rb +5 -0
- data/spec/unit/parser/functions/hiera_include_spec.rb +0 -2
- data/spec/unit/parser/functions/hiera_spec.rb +0 -2
- data/spec/unit/parser/functions_spec.rb +27 -15
- data/spec/unit/parser/methods/collect_spec.rb +110 -0
- data/spec/unit/parser/methods/each_spec.rb +91 -0
- data/spec/unit/parser/methods/foreach_spec.rb +91 -0
- data/spec/unit/parser/methods/reduce_spec.rb +67 -0
- data/spec/unit/parser/methods/reject_spec.rb +73 -0
- data/spec/unit/parser/methods/select_spec.rb +79 -0
- data/spec/unit/parser/methods/shared.rb +61 -0
- data/spec/unit/parser/methods/slice_spec.rb +97 -0
- data/spec/unit/parser/parser_spec.rb +2 -2
- data/spec/unit/parser/scope_spec.rb +39 -16
- data/spec/unit/parser/templatewrapper_spec.rb +6 -5
- data/spec/unit/parser/type_loader_spec.rb +191 -165
- data/spec/unit/pops/adaptable_spec.rb +143 -0
- data/spec/unit/pops/containment_spec.rb +25 -0
- data/spec/unit/pops/factory_rspec_helper.rb +77 -0
- data/spec/unit/pops/factory_spec.rb +329 -0
- data/spec/unit/pops/issues_spec.rb +26 -0
- data/spec/unit/pops/label_provider_spec.rb +42 -0
- data/spec/unit/pops/model/ast_transformer_spec.rb +65 -0
- data/spec/unit/pops/model/model_spec.rb +37 -0
- data/spec/unit/pops/parser/lexer_spec.rb +884 -0
- data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +248 -0
- data/spec/unit/pops/parser/parse_calls_spec.rb +93 -0
- data/spec/unit/pops/parser/parse_conditionals_spec.rb +159 -0
- data/spec/unit/pops/parser/parse_containers_spec.rb +175 -0
- data/spec/unit/pops/parser/parse_resource_spec.rb +228 -0
- data/spec/unit/pops/parser/parser_rspec_helper.rb +11 -0
- data/spec/unit/pops/parser/parser_spec.rb +15 -0
- data/spec/unit/pops/parser/rgen_sanitycheck_spec.rb +16 -0
- data/spec/unit/pops/transformer/transform_basic_expressions_spec.rb +243 -0
- data/spec/unit/pops/transformer/transform_calls_spec.rb +80 -0
- data/spec/unit/pops/transformer/transform_conditionals_spec.rb +132 -0
- data/spec/unit/pops/transformer/transform_containers_spec.rb +182 -0
- data/spec/unit/pops/transformer/transform_resource_spec.rb +185 -0
- data/spec/unit/pops/transformer/transformer_rspec_helper.rb +27 -0
- data/spec/unit/pops/visitor_spec.rb +94 -0
- data/spec/unit/property_spec.rb +11 -0
- data/spec/unit/provider/augeas/augeas_spec.rb +3 -0
- data/spec/unit/provider/cron/crontab_spec.rb +97 -7
- data/spec/unit/provider/cron/parsed_spec.rb +325 -0
- data/spec/unit/provider/exec/posix_spec.rb +1 -1
- data/spec/unit/provider/group/groupadd_spec.rb +33 -3
- data/spec/unit/provider/group/pw_spec.rb +5 -5
- data/spec/unit/provider/nameservice_spec.rb +304 -0
- data/spec/unit/provider/package/aix_spec.rb +53 -11
- data/spec/unit/provider/package/aptrpm_spec.rb +6 -0
- data/spec/unit/provider/package/gem_spec.rb +6 -11
- data/spec/unit/provider/package/nim_spec.rb +216 -7
- data/spec/unit/provider/package/opkg_spec.rb +180 -0
- data/spec/unit/provider/package/rpm_spec.rb +149 -3
- data/spec/unit/provider/package/yum_spec.rb +6 -5
- data/spec/unit/provider/parsedfile_spec.rb +122 -28
- data/spec/unit/provider/service/freebsd_spec.rb +18 -0
- data/spec/unit/provider/service/init_spec.rb +108 -87
- data/spec/unit/provider/service/launchd_spec.rb +2 -2
- data/spec/unit/provider/service/openwrt_spec.rb +109 -0
- data/spec/unit/provider/service/src_spec.rb +117 -41
- data/spec/unit/provider/service/systemd_spec.rb +125 -17
- data/spec/unit/provider/service/upstart_spec.rb +1 -1
- data/spec/unit/provider/user/aix_spec.rb +42 -0
- data/spec/unit/provider/user/directoryservice_spec.rb +1 -0
- data/spec/unit/provider/user/pw_spec.rb +24 -12
- data/spec/unit/provider/user/user_role_add_spec.rb +1 -1
- data/spec/unit/provider/user/useradd_spec.rb +179 -15
- data/spec/unit/resource/type_spec.rb +3 -3
- data/spec/unit/scheduler/job_spec.rb +79 -0
- data/spec/unit/scheduler/scheduler_spec.rb +129 -0
- data/spec/unit/scheduler/splay_job_spec.rb +35 -0
- data/spec/unit/ssl/base_spec.rb +3 -9
- data/spec/unit/ssl/certificate_authority_spec.rb +1 -0
- data/spec/unit/ssl/certificate_request_spec.rb +3 -1
- data/spec/unit/ssl/certificate_spec.rb +3 -1
- data/spec/unit/ssl/configuration_spec.rb +74 -0
- data/spec/unit/ssl/host_spec.rb +28 -7
- data/spec/unit/ssl/validator_spec.rb +311 -0
- data/spec/unit/transaction/event_manager_spec.rb +49 -0
- data/spec/unit/transaction/event_spec.rb +20 -5
- data/spec/unit/transaction/report_spec.rb +8 -0
- data/spec/unit/type/cron_spec.rb +9 -0
- data/spec/unit/type/exec_spec.rb +11 -0
- data/spec/unit/type/file/content_spec.rb +20 -20
- data/spec/unit/type/file/mode_spec.rb +6 -0
- data/spec/unit/type/file/source_spec.rb +9 -7
- data/spec/unit/type/file_spec.rb +22 -3
- data/spec/unit/type/service_spec.rb +34 -21
- data/spec/unit/type_spec.rb +46 -1
- data/spec/unit/util/backups_spec.rb +2 -2
- data/spec/unit/util/execution_spec.rb +4 -1
- data/spec/unit/util/filetype_spec.rb +6 -0
- data/spec/unit/util/monkey_patches_spec.rb +18 -0
- data/spec/unit/util/network_device/cisco/device_spec.rb +37 -0
- data/spec/unit/util/network_device/config_spec.rb +14 -0
- data/spec/unit/util/network_device_spec.rb +3 -3
- data/spec/unit/util/profiler/logging_spec.rb +81 -0
- data/spec/unit/util/profiler/none_spec.rb +12 -0
- data/spec/unit/util/profiler/object_counts_spec.rb +14 -0
- data/spec/unit/util/profiler/wall_clock_spec.rb +13 -0
- data/spec/unit/util/pson_spec.rb +5 -0
- data/spec/unit/util/ssl_spec.rb +51 -0
- data/spec/unit/util/windows/root_certs_spec.rb +15 -0
- data/spec/unit/util_spec.rb +28 -0
- metadata +2593 -2307
- data/spec/unit/module_tool/applications/application_spec.rb +0 -19
@@ -0,0 +1,62 @@
|
|
1
|
+
module Puppet; end
|
2
|
+
|
3
|
+
module Puppet::Parser
|
4
|
+
# The ParserFactory makes selection of parser possible.
|
5
|
+
# Currently, it is possible to switch between two different parsers:
|
6
|
+
# * classic_parser, the parser in 3.1
|
7
|
+
# * eparser, the Expression Based Parser
|
8
|
+
#
|
9
|
+
class ParserFactory
|
10
|
+
# Produces a parser instance for the given environment
|
11
|
+
def self.parser(environment)
|
12
|
+
case Puppet[:parser]
|
13
|
+
when 'future'
|
14
|
+
eparser(environment)
|
15
|
+
else
|
16
|
+
classic_parser(environment)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Creates an instance of the classic parser.
|
21
|
+
#
|
22
|
+
def self.classic_parser(environment)
|
23
|
+
require 'puppet/parser'
|
24
|
+
Puppet::Parser::Parser.new(environment)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Creates an instance of the expression based parser 'eparser'
|
28
|
+
#
|
29
|
+
def self.eparser(environment)
|
30
|
+
# Since RGen is optional, test that it is installed
|
31
|
+
@@asserted ||= false
|
32
|
+
assert_rgen_installed() unless @asserted
|
33
|
+
require 'puppet/parser'
|
34
|
+
require 'puppet/parser/e_parser_adapter'
|
35
|
+
EParserAdapter.new(Puppet::Parser::Parser.new(environment))
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def self.assert_rgen_installed
|
41
|
+
begin
|
42
|
+
require 'rgen/metamodel_builder'
|
43
|
+
rescue LoadError
|
44
|
+
raise Puppet::DevError.new("The gem 'rgen' version >= 0.6.1 is required when using the setting '--parser future'. Please install 'rgen'.")
|
45
|
+
end
|
46
|
+
# Since RGen is optional, there is nothing specifying its version.
|
47
|
+
# It is not installed in any controlled way, so not possible to use gems to check (it may be installed some other way).
|
48
|
+
# Instead check that "eContainer, and eContainingFeature" has been installed.
|
49
|
+
require 'puppet/pops'
|
50
|
+
begin
|
51
|
+
litstring = Puppet::Pops::Model::LiteralString.new();
|
52
|
+
container = Puppet::Pops::Model::ArithmeticExpression.new();
|
53
|
+
container.left_expr = litstring
|
54
|
+
raise "no eContainer" if litstring.eContainer() != container
|
55
|
+
raise "no eContainingFeature" if litstring.eContainingFeature() != :left_expr
|
56
|
+
rescue =>e
|
57
|
+
raise Puppet::DevError.new("The gem 'rgen' version >= 0.6.1 is required when using '--parser future'. An older version is installed, please update.")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
@@ -38,6 +38,11 @@ class Puppet::Parser::Parser
|
|
38
38
|
ast AST::ASTArray, :children => [arg]
|
39
39
|
end
|
40
40
|
|
41
|
+
# Create an AST block containing a single element
|
42
|
+
def block(arg)
|
43
|
+
ast AST::BlockExpression, :children => [arg]
|
44
|
+
end
|
45
|
+
|
41
46
|
# Create an AST object, and automatically add the file and line information if
|
42
47
|
# available.
|
43
48
|
def ast(klass, hash = {})
|
@@ -146,9 +151,10 @@ class Puppet::Parser::Parser
|
|
146
151
|
rescue Puppet::ParseError => except
|
147
152
|
except.line ||= @lexer.line
|
148
153
|
except.file ||= @lexer.file
|
154
|
+
except.pos ||= @lexer.pos
|
149
155
|
raise except
|
150
156
|
rescue => except
|
151
|
-
raise Puppet::ParseError.new(except.message, @lexer.file, @lexer.line, except)
|
157
|
+
raise Puppet::ParseError.new(except.message, @lexer.file, @lexer.line, nil, except)
|
152
158
|
end
|
153
159
|
end
|
154
160
|
# Store the results as the top-level class.
|
@@ -166,6 +172,6 @@ class Puppet::Parser::Parser
|
|
166
172
|
main_object.instance_eval(File.read(self.file))
|
167
173
|
|
168
174
|
# Then extract any types that were created.
|
169
|
-
Puppet::Parser::AST::
|
175
|
+
Puppet::Parser::AST::BlockExpression.new :children => main_object.instance_eval { @__created_ast_objects__ }
|
170
176
|
end
|
171
177
|
end
|
data/lib/puppet/parser/scope.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# such.
|
3
3
|
require 'forwardable'
|
4
4
|
|
5
|
-
require 'puppet/parser
|
5
|
+
require 'puppet/parser'
|
6
6
|
require 'puppet/parser/templatewrapper'
|
7
7
|
|
8
8
|
require 'puppet/resource/type_collection_helper'
|
@@ -42,12 +42,13 @@ class Puppet::Parser::Scope
|
|
42
42
|
class Ephemeral
|
43
43
|
extend Forwardable
|
44
44
|
|
45
|
-
def initialize(parent=nil)
|
45
|
+
def initialize(parent=nil, local=false)
|
46
46
|
@symbols = {}
|
47
47
|
@parent = parent
|
48
|
+
@local_scope = local
|
48
49
|
end
|
49
50
|
|
50
|
-
def_delegators :@symbols, :
|
51
|
+
def_delegators :@symbols, :delete, :[]=, :each
|
51
52
|
|
52
53
|
def [](name)
|
53
54
|
if @symbols.include?(name) or @parent.nil?
|
@@ -56,6 +57,23 @@ class Puppet::Parser::Scope
|
|
56
57
|
@parent[name]
|
57
58
|
end
|
58
59
|
end
|
60
|
+
|
61
|
+
def include?(name)
|
62
|
+
bound?(name) or (@parent and @parent.include?(name))
|
63
|
+
end
|
64
|
+
|
65
|
+
def bound?(name)
|
66
|
+
@symbols.include?(name)
|
67
|
+
end
|
68
|
+
|
69
|
+
def is_local_scope?
|
70
|
+
@local_scope
|
71
|
+
end
|
72
|
+
|
73
|
+
# @return [Ephemeral, Hash, nil]
|
74
|
+
def parent
|
75
|
+
@parent
|
76
|
+
end
|
59
77
|
end
|
60
78
|
|
61
79
|
# Initialize a new scope suitable for parser function testing. This method
|
@@ -164,14 +182,9 @@ class Puppet::Parser::Scope
|
|
164
182
|
@tags = []
|
165
183
|
|
166
184
|
# The symbol table for this scope. This is where we store variables.
|
167
|
-
@symtable =
|
185
|
+
@symtable = Ephemeral.new
|
168
186
|
|
169
|
-
|
170
|
-
# those should not persist long, and are used for the moment only
|
171
|
-
# for $0..$xy capture variables of regexes
|
172
|
-
# this is actually implemented as a stack, with each ephemeral scope
|
173
|
-
# shadowing the previous one
|
174
|
-
@ephemeral = [ Ephemeral.new ]
|
187
|
+
@ephemeral = [ Ephemeral.new(@symtable) ]
|
175
188
|
|
176
189
|
# All of the defaults set for types. It's a hash of hashes,
|
177
190
|
# with the first key being the type, then the second key being
|
@@ -257,27 +270,21 @@ class Puppet::Parser::Scope
|
|
257
270
|
raise Puppet::DevError, "Scope variable name is a #{name.class}, not a string"
|
258
271
|
end
|
259
272
|
|
260
|
-
|
261
|
-
options[:origin] = self unless options[:origin]
|
262
|
-
table = ephemeral?(name) ? @ephemeral.last : @symtable
|
273
|
+
table = @ephemeral.last
|
263
274
|
|
264
275
|
if name =~ /^(.*)::(.+)$/
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
warning "Could not look up qualified variable '#{name}'; #{e.message}#{location}"
|
270
|
-
nil
|
271
|
-
end
|
272
|
-
# If the value is present and either we are top/node scope or originating scope...
|
273
|
-
elsif (ephemeral_include?(name) or table.include?(name)) and (compiler and self == compiler.topscope or (resource and resource.type == "Node") or self == options[:origin])
|
276
|
+
class_name = $1
|
277
|
+
variable_name = $2
|
278
|
+
lookup_qualified_variable(class_name, variable_name, options)
|
279
|
+
elsif table.include?(name)
|
274
280
|
table[name]
|
275
|
-
elsif resource and resource.type == "Class" and parent_type = resource.resource_type.parent
|
276
|
-
qualified_scope(parent_type).lookupvar(name, options.merge({:origin => nil}))
|
277
|
-
elsif parent
|
278
|
-
parent.lookupvar(name, options)
|
279
281
|
else
|
280
|
-
|
282
|
+
next_scope = inherited_scope || enclosing_scope
|
283
|
+
if next_scope
|
284
|
+
next_scope.lookupvar(name, options)
|
285
|
+
else
|
286
|
+
nil
|
287
|
+
end
|
281
288
|
end
|
282
289
|
end
|
283
290
|
|
@@ -295,6 +302,75 @@ class Puppet::Parser::Scope
|
|
295
302
|
lookupvar(varname, options)
|
296
303
|
end
|
297
304
|
|
305
|
+
# The scope of the inherited thing of this scope's resource. This could
|
306
|
+
# either be a node that was inherited or the class.
|
307
|
+
#
|
308
|
+
# @returns [Puppet::Parser::Scope] The scope or nil if there is not an inherited scope
|
309
|
+
def inherited_scope
|
310
|
+
if has_inherited_class?
|
311
|
+
qualified_scope(resource.resource_type.parent)
|
312
|
+
else
|
313
|
+
nil
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
# The enclosing scope (topscope or nodescope) of this scope.
|
318
|
+
# The enclosing scopes are produced when a class or define is included at
|
319
|
+
# some point. The parent scope of the included class or define becomes the
|
320
|
+
# scope in which it was included. The chain of parent scopes is followed
|
321
|
+
# until a node scope or the topscope is found
|
322
|
+
#
|
323
|
+
# @returns [Puppet::Parser::Scope] The scope or nil if there is no enclosing scope
|
324
|
+
def enclosing_scope
|
325
|
+
if has_enclosing_scope?
|
326
|
+
if parent.is_topscope? or parent.is_nodescope?
|
327
|
+
parent
|
328
|
+
else
|
329
|
+
parent.enclosing_scope
|
330
|
+
end
|
331
|
+
else
|
332
|
+
nil
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
336
|
+
def is_classscope?
|
337
|
+
resource and resource.type == "Class"
|
338
|
+
end
|
339
|
+
|
340
|
+
def is_nodescope?
|
341
|
+
resource and resource.type == "Node"
|
342
|
+
end
|
343
|
+
|
344
|
+
def is_topscope?
|
345
|
+
compiler and self == compiler.topscope
|
346
|
+
end
|
347
|
+
|
348
|
+
def lookup_qualified_variable(class_name, variable_name, position)
|
349
|
+
begin
|
350
|
+
qualified_scope(class_name).lookupvar(variable_name, position)
|
351
|
+
rescue RuntimeError => e
|
352
|
+
location = if position[:lineproc]
|
353
|
+
" at #{position[:lineproc].call}"
|
354
|
+
elsif position[:file] && position[:line]
|
355
|
+
" at #{position[:file]}:#{position[:line]}"
|
356
|
+
else
|
357
|
+
""
|
358
|
+
end
|
359
|
+
warning "Could not look up qualified variable '#{class_name}::#{variable_name}'; #{e.message}#{location}"
|
360
|
+
nil
|
361
|
+
end
|
362
|
+
end
|
363
|
+
|
364
|
+
def has_inherited_class?
|
365
|
+
is_classscope? and resource.resource_type.parent
|
366
|
+
end
|
367
|
+
private :has_inherited_class?
|
368
|
+
|
369
|
+
def has_enclosing_scope?
|
370
|
+
not parent.nil?
|
371
|
+
end
|
372
|
+
private :has_enclosing_scope?
|
373
|
+
|
298
374
|
def qualified_scope(classname)
|
299
375
|
raise "class #{classname} could not be found" unless klass = find_hostclass(classname)
|
300
376
|
raise "class #{classname} has not been evaluated" unless kscope = class_scope(klass)
|
@@ -361,12 +437,15 @@ class Puppet::Parser::Scope
|
|
361
437
|
# It's preferred that you use self[]= instead of this; only use this
|
362
438
|
# when you need to set options.
|
363
439
|
def setvar(name, value, options = {})
|
440
|
+
if name =~ /^[0-9]+$/
|
441
|
+
raise Puppet::ParseError.new("Cannot assign to a numeric match result variable '$#{name}'") unless options[:ephemeral]
|
442
|
+
end
|
364
443
|
unless name.is_a? String
|
365
444
|
raise Puppet::DevError, "Scope variable name is a #{name.class}, not a string"
|
366
445
|
end
|
367
446
|
|
368
|
-
table = options[:ephemeral]
|
369
|
-
if table.
|
447
|
+
table = effective_symtable options[:ephemeral]
|
448
|
+
if table.bound?(name)
|
370
449
|
if options[:append]
|
371
450
|
error = Puppet::ParseError.new("Cannot append, variable #{name} is defined in this scope")
|
372
451
|
else
|
@@ -379,9 +458,26 @@ class Puppet::Parser::Scope
|
|
379
458
|
|
380
459
|
if options[:append]
|
381
460
|
table[name] = append_value(undef_as('', self[name]), value)
|
382
|
-
else
|
461
|
+
else
|
383
462
|
table[name] = value
|
384
463
|
end
|
464
|
+
table[name]
|
465
|
+
end
|
466
|
+
|
467
|
+
# Return the effective "table" for setting variables.
|
468
|
+
# This method returns the first ephemeral "table" that acts as a local scope, or this
|
469
|
+
# scope's symtable. If the parameter `use_ephemeral` is true, the "top most" ephemeral "table"
|
470
|
+
# will be returned (irrespective of it being a match scope or a local scope).
|
471
|
+
#
|
472
|
+
# @param [Boolean] whether the top most ephemeral (of any kind) should be used or not
|
473
|
+
def effective_symtable use_ephemeral
|
474
|
+
s = @ephemeral.last
|
475
|
+
return s if use_ephemeral
|
476
|
+
|
477
|
+
while s && !(s.is_a?(Hash) || s.is_local_scope?())
|
478
|
+
s = s.parent
|
479
|
+
end
|
480
|
+
s ? s : @symtable
|
385
481
|
end
|
386
482
|
|
387
483
|
# Sets the variable value of the name given as an argument to the given value. The value is
|
@@ -407,7 +503,7 @@ class Puppet::Parser::Scope
|
|
407
503
|
bound_value.merge(new_value)
|
408
504
|
else
|
409
505
|
if bound_value.is_a?(Hash)
|
410
|
-
raise ArgumentError, "Trying to append to a hash with something which is not a hash is unsupported"
|
506
|
+
raise ArgumentError, "Trying to append to a hash with something which is not a hash is unsupported"
|
411
507
|
end
|
412
508
|
bound_value + new_value
|
413
509
|
end
|
@@ -425,7 +521,7 @@ class Puppet::Parser::Scope
|
|
425
521
|
# remove ephemeral scope up to level
|
426
522
|
def unset_ephemeral_var(level=:all)
|
427
523
|
if level == :all
|
428
|
-
@ephemeral = [ Ephemeral.new
|
524
|
+
@ephemeral = [ Ephemeral.new(@symtable)]
|
429
525
|
else
|
430
526
|
# If we ever drop 1.8.6 and lower, this should be replaced by a single
|
431
527
|
# pop-with-a-count - or if someone more ambitious wants to monkey-patch
|
@@ -436,32 +532,41 @@ class Puppet::Parser::Scope
|
|
436
532
|
end
|
437
533
|
end
|
438
534
|
|
439
|
-
# check if name exists in one of the ephemeral
|
535
|
+
# check if name exists in one of the ephemeral scopes.
|
440
536
|
def ephemeral_include?(name)
|
441
537
|
@ephemeral.any? {|eph| eph.include?(name) }
|
442
538
|
end
|
443
539
|
|
444
|
-
#
|
540
|
+
# Checks whether the variable should be processed in the ephemeral scope or not.
|
541
|
+
# All numerical variables are processed in ephemeral scope at all times, and all other
|
542
|
+
# variables when the ephemeral scope is a local scope.
|
543
|
+
#
|
445
544
|
def ephemeral?(name)
|
446
|
-
name =~ /^\d+$/
|
545
|
+
@ephemeral.last.is_local_scope? || name =~ /^\d+$/
|
447
546
|
end
|
448
547
|
|
449
548
|
def ephemeral_level
|
450
549
|
@ephemeral.size
|
451
550
|
end
|
452
551
|
|
453
|
-
def new_ephemeral
|
454
|
-
@ephemeral.push(Ephemeral.new(@ephemeral.last))
|
552
|
+
def new_ephemeral(local_scope = false)
|
553
|
+
@ephemeral.push(Ephemeral.new(@ephemeral.last, local_scope))
|
455
554
|
end
|
456
555
|
|
457
556
|
def ephemeral_from(match, file = nil, line = nil)
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
557
|
+
case match
|
558
|
+
when Hash
|
559
|
+
# Create local scope ephemeral and set all values from hash
|
560
|
+
new_ephemeral true
|
561
|
+
match.each {|k,v| setvar(k, v, :file => file, :line => line, :ephemeral => true) }
|
562
|
+
else
|
563
|
+
raise(ArgumentError,"Invalid regex match data. Got a #{match.class}") unless match.is_a?(MatchData)
|
564
|
+
# Create a match ephemeral and set values from match data
|
565
|
+
new_ephemeral false
|
566
|
+
setvar("0", match[0], :file => file, :line => line, :ephemeral => true)
|
567
|
+
match.captures.each_with_index do |m,i|
|
568
|
+
setvar("#{i+1}", m, :file => file, :line => line, :ephemeral => true)
|
569
|
+
end
|
465
570
|
end
|
466
571
|
end
|
467
572
|
|
@@ -481,14 +586,15 @@ class Puppet::Parser::Scope
|
|
481
586
|
|
482
587
|
def method_missing(method, *args, &block)
|
483
588
|
method.to_s =~ /^function_(.*)$/
|
484
|
-
|
485
|
-
super unless
|
589
|
+
name = $1
|
590
|
+
super unless name
|
591
|
+
super unless Puppet::Parser::Functions.function(name)
|
486
592
|
# In odd circumstances, this might not end up defined by the previous
|
487
593
|
# method, so we might as well be certain.
|
488
594
|
if respond_to? method
|
489
595
|
send(method, *args)
|
490
596
|
else
|
491
|
-
raise Puppet::DevError, "Function #{
|
597
|
+
raise Puppet::DevError, "Function #{name} not defined despite being loaded!"
|
492
598
|
end
|
493
599
|
end
|
494
600
|
|
@@ -1,10 +1,11 @@
|
|
1
|
-
# A simple wrapper for templates, so they don't have full access to
|
2
|
-
# the scope objects.
|
3
1
|
require 'puppet/parser/files'
|
4
2
|
require 'erb'
|
5
3
|
|
4
|
+
# A simple wrapper for templates, so they don't have full access to
|
5
|
+
# the scope objects.
|
6
|
+
#
|
7
|
+
# @api private
|
6
8
|
class Puppet::Parser::TemplateWrapper
|
7
|
-
attr_writer :scope
|
8
9
|
include Puppet::Util
|
9
10
|
Puppet::Util.logmethods(self)
|
10
11
|
|
@@ -12,41 +13,47 @@ class Puppet::Parser::TemplateWrapper
|
|
12
13
|
@__scope__ = scope
|
13
14
|
end
|
14
15
|
|
16
|
+
# @return [String] The full path name of the template that is being executed
|
17
|
+
# @api public
|
15
18
|
def file
|
16
19
|
@__file__
|
17
20
|
end
|
18
21
|
|
22
|
+
# @return [Puppet::Parser::Scope] The scope in which the template is evaluated
|
23
|
+
# @api public
|
19
24
|
def scope
|
20
25
|
@__scope__
|
21
26
|
end
|
22
27
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
# every variable lookup can be quite time consuming
|
27
|
-
Proc.new { (caller.find { |l| l =~ /#{@__file__}:/ }||"")[/:(\d+):/,1] }
|
28
|
-
end
|
29
|
-
|
28
|
+
# Find which line in the template (if any) we were called from.
|
29
|
+
# @return [String] the line number
|
30
|
+
# @api private
|
30
31
|
def script_line
|
31
|
-
|
32
|
+
identifier = Regexp.escape(@__file__ || "(erb)")
|
33
|
+
(caller.find { |l| l =~ /#{identifier}:/ }||"")[/:(\d+):/,1]
|
32
34
|
end
|
35
|
+
private :script_line
|
33
36
|
|
34
37
|
# Should return true if a variable is defined, false if it is not
|
38
|
+
# @api public
|
35
39
|
def has_variable?(name)
|
36
40
|
scope.include?(name.to_s)
|
37
41
|
end
|
38
42
|
|
39
|
-
#
|
43
|
+
# @return [Array<String>] The list of defined classes
|
44
|
+
# @api public
|
40
45
|
def classes
|
41
46
|
scope.catalog.classes
|
42
47
|
end
|
43
48
|
|
44
|
-
#
|
49
|
+
# @return [Array<String>] The tags defined in the current scope
|
50
|
+
# @api public
|
45
51
|
def tags
|
46
52
|
scope.tags
|
47
53
|
end
|
48
54
|
|
49
|
-
#
|
55
|
+
# @return [Array<String>] All the defined tags
|
56
|
+
# @api public
|
50
57
|
def all_tags
|
51
58
|
scope.catalog.tags
|
52
59
|
end
|
@@ -64,15 +71,18 @@ class Puppet::Parser::TemplateWrapper
|
|
64
71
|
# the missing_method definition here until we declare the syntax finally
|
65
72
|
# dead.
|
66
73
|
def method_missing(name, *args)
|
74
|
+
line_number = script_line
|
67
75
|
if scope.include?(name.to_s)
|
68
|
-
|
76
|
+
Puppet.deprecation_warning("Variable access via '#{name}' is deprecated. Use '@#{name}' instead. #{to_s}:#{line_number}")
|
77
|
+
return scope[name.to_s, { :file => @__file__, :line => line_number }]
|
69
78
|
else
|
70
79
|
# Just throw an error immediately, instead of searching for
|
71
80
|
# other missingmethod things or whatever.
|
72
|
-
raise Puppet::ParseError.new("Could not find value for '#{name}'", @__file__,
|
81
|
+
raise Puppet::ParseError.new("Could not find value for '#{name}'", @__file__, line_number)
|
73
82
|
end
|
74
83
|
end
|
75
84
|
|
85
|
+
# @api private
|
76
86
|
def file=(filename)
|
77
87
|
unless @__file__ = Puppet::Parser::Files.find_template(filename, scope.compiler.environment.to_s)
|
78
88
|
raise Puppet::ParseError, "Could not find template '#{filename}'"
|
@@ -82,6 +92,7 @@ class Puppet::Parser::TemplateWrapper
|
|
82
92
|
scope.known_resource_types.watch_file(@__file__)
|
83
93
|
end
|
84
94
|
|
95
|
+
# @api private
|
85
96
|
def result(string = nil)
|
86
97
|
if string
|
87
98
|
template_source = "inline template"
|
@@ -95,11 +106,7 @@ class Puppet::Parser::TemplateWrapper
|
|
95
106
|
# to the regular methods.
|
96
107
|
benchmark(:debug, "Bound template variables for #{template_source}") do
|
97
108
|
scope.to_hash.each do |name, value|
|
98
|
-
|
99
|
-
realname = name.gsub(/[^\w]/, "_")
|
100
|
-
else
|
101
|
-
realname = name
|
102
|
-
end
|
109
|
+
realname = name.gsub(/[^\w]/, "_")
|
103
110
|
instance_variable_set("@#{realname}", value)
|
104
111
|
end
|
105
112
|
end
|