puppet 3.1.1 → 3.2.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CONTRIBUTING.md +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
|
@@ -24,7 +24,7 @@ describe Puppet::Parser::AST::ArithmeticOperator do
|
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
it "should fail for an unknown operator" do
|
|
27
|
-
lambda { operator = ast::ArithmeticOperator.new :lval => @one, :operator => "
|
|
27
|
+
lambda { operator = ast::ArithmeticOperator.new :lval => @one, :operator => "^", :rval => @two }.should raise_error
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
it "should call Puppet::Parser::Scope.number?" do
|
|
@@ -35,7 +35,7 @@ describe Puppet::Parser::AST::ArithmeticOperator do
|
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
|
|
38
|
-
%w{ + - * / << >>}.each do |op|
|
|
38
|
+
%w{ + - * / % << >>}.each do |op|
|
|
39
39
|
it "should call ruby Numeric '#{op}'" do
|
|
40
40
|
one = stub 'one'
|
|
41
41
|
two = stub 'two'
|
|
@@ -61,4 +61,100 @@ describe Puppet::Parser::AST::ArithmeticOperator do
|
|
|
61
61
|
operator.evaluate(@scope).should == 4.33
|
|
62
62
|
end
|
|
63
63
|
|
|
64
|
+
context "when applied to array" do
|
|
65
|
+
before :each do
|
|
66
|
+
Puppet[:parser] = 'future'
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "+ should concatenate an array" do
|
|
70
|
+
one = stub 'one', :safeevaluate => [1,2,3]
|
|
71
|
+
two = stub 'two', :safeevaluate => [4,5]
|
|
72
|
+
operator = ast::ArithmeticOperator.new :lval => one, :operator => "+", :rval => two
|
|
73
|
+
operator.evaluate(@scope).should == [1,2,3,4,5]
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it "<< should append array to an array" do
|
|
77
|
+
one = stub 'one', :safeevaluate => [1,2,3]
|
|
78
|
+
two = stub 'two', :safeevaluate => [4,5]
|
|
79
|
+
operator = ast::ArithmeticOperator.new :lval => one, :operator => "<<", :rval => two
|
|
80
|
+
operator.evaluate(@scope).should == [1,2,3, [4,5]]
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it "<< should append object to an array" do
|
|
84
|
+
one = stub 'one', :safeevaluate => [1,2,3]
|
|
85
|
+
two = stub 'two', :safeevaluate => 'a b c'
|
|
86
|
+
operator = ast::ArithmeticOperator.new :lval => one, :operator => "<<", :rval => two
|
|
87
|
+
operator.evaluate(@scope).should == [1,2,3, 'a b c']
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
context "and input is invalid" do
|
|
91
|
+
it "should raise error for + if left is not an array" do
|
|
92
|
+
one = stub 'one', :safeevaluate => 4
|
|
93
|
+
two = stub 'two', :safeevaluate => [4,5]
|
|
94
|
+
operator = ast::ArithmeticOperator.new :lval => one, :operator => "+", :rval => two
|
|
95
|
+
lambda { operator.evaluate(@scope).should == [1,2,3,4,5] }.should raise_error(/left/)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
it "should raise error for << if left is not an array" do
|
|
99
|
+
one = stub 'one', :safeevaluate => 4
|
|
100
|
+
two = stub 'two', :safeevaluate => [4,5]
|
|
101
|
+
operator = ast::ArithmeticOperator.new :lval => one, :operator => "<<", :rval => two
|
|
102
|
+
lambda { operator.evaluate(@scope).should == [1,2,3,4,5] }.should raise_error(/left/)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
it "should raise error for + if right is not an array" do
|
|
106
|
+
one = stub 'one', :safeevaluate => [1,2]
|
|
107
|
+
two = stub 'two', :safeevaluate => 45
|
|
108
|
+
operator = ast::ArithmeticOperator.new :lval => one, :operator => "+", :rval => two
|
|
109
|
+
lambda { operator.evaluate(@scope).should == [1,2,3,4,5] }.should raise_error(/right/)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
%w{ - * / % >>}.each do |op|
|
|
113
|
+
it "should raise error for '#{op}'" do
|
|
114
|
+
one = stub 'one', :safeevaluate => [1,2,3]
|
|
115
|
+
two = stub 'two', :safeevaluate => [4,5]
|
|
116
|
+
operator = ast::ArithmeticOperator.new :lval => @one, :operator => op, :rval => @two
|
|
117
|
+
lambda { operator.evaluate(@scope).should == [1,2,3,4,5] }.should raise_error
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
context "when applied to hash" do
|
|
123
|
+
before :each do
|
|
124
|
+
Puppet[:parser] = 'future'
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
it "+ should merge two hashes" do
|
|
128
|
+
one = stub 'one', :safeevaluate => {'a' => 1, 'b' => 2}
|
|
129
|
+
two = stub 'two', :safeevaluate => {'c' => 3 }
|
|
130
|
+
operator = ast::ArithmeticOperator.new :lval => one, :operator => "+", :rval => two
|
|
131
|
+
operator.evaluate(@scope).should == {'a' => 1, 'b' => 2, 'c' => 3}
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
context "and input is invalid" do
|
|
135
|
+
it "should raise error for + if left is not a hash" do
|
|
136
|
+
one = stub 'one', :safeevaluate => 4
|
|
137
|
+
two = stub 'two', :safeevaluate => {'a' => 1}
|
|
138
|
+
operator = ast::ArithmeticOperator.new :lval => one, :operator => "+", :rval => two
|
|
139
|
+
lambda { operator.evaluate(@scope).should == [1,2,3,4,5] }.should raise_error(/left/)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
it "should raise error for + if right is not a hash" do
|
|
143
|
+
one = stub 'one', :safeevaluate => {'a' => 1}
|
|
144
|
+
two = stub 'two', :safeevaluate => 1
|
|
145
|
+
operator = ast::ArithmeticOperator.new :lval => one, :operator => "+", :rval => two
|
|
146
|
+
lambda { operator.evaluate(@scope).should == {'a'=>1, 1=>nil} }.should raise_error(/right/)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
%w{ - * / % << >>}.each do |op|
|
|
150
|
+
it "should raise error for '#{op}'" do
|
|
151
|
+
one = stub 'one', :safeevaluate => {'a' => 1, 'b' => 2}
|
|
152
|
+
two = stub 'two', :safeevaluate => {'c' => 3 }
|
|
153
|
+
operator = ast::ArithmeticOperator.new :lval => @one, :operator => op, :rval => @two
|
|
154
|
+
lambda { operator.evaluate(@scope).should == [1,2,3,4,5] }.should raise_error
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
end
|
|
64
160
|
end
|
|
@@ -288,6 +288,10 @@ describe Puppet::Parser::Collector, "when collecting exported resources", :if =>
|
|
|
288
288
|
Puppet[:storeconfigs_backend] = "active_record"
|
|
289
289
|
end
|
|
290
290
|
|
|
291
|
+
after :each do
|
|
292
|
+
Puppet::Rails.teardown
|
|
293
|
+
end
|
|
294
|
+
|
|
291
295
|
it "should return all matching resources from the current compile and mark them non-virtual and non-exported" do
|
|
292
296
|
one = Puppet::Parser::Resource.new('notify', 'one',
|
|
293
297
|
:virtual => true,
|
|
@@ -304,10 +308,6 @@ describe Puppet::Parser::Collector, "when collecting exported resources", :if =>
|
|
|
304
308
|
@collector.evaluate.should == [one, two]
|
|
305
309
|
one.should_not be_virtual
|
|
306
310
|
two.should_not be_virtual
|
|
307
|
-
|
|
308
|
-
# REVISIT: Apparently we never actually marked local resources as
|
|
309
|
-
# non-exported. So, this is what the previous test asserted, and checking
|
|
310
|
-
# what it claims to do causes test failures. --daniel 2011-08-23
|
|
311
311
|
end
|
|
312
312
|
|
|
313
313
|
it "should mark all returned resources as not virtual" do
|
|
@@ -152,7 +152,7 @@ describe Puppet::Parser::Compiler do
|
|
|
152
152
|
|
|
153
153
|
it "should transform node class hashes into a class list" do
|
|
154
154
|
node = Puppet::Node.new("mynode")
|
|
155
|
-
node.classes = {'foo'=>{'one'=>'
|
|
155
|
+
node.classes = {'foo'=>{'one'=>'p1'}, 'bar'=>{'two'=>'p2'}}
|
|
156
156
|
compiler = Puppet::Parser::Compiler.new(node)
|
|
157
157
|
|
|
158
158
|
compiler.classlist.should =~ ['foo', 'bar']
|
|
@@ -231,7 +231,7 @@ describe Puppet::Parser::Compiler do
|
|
|
231
231
|
end
|
|
232
232
|
|
|
233
233
|
it "should evaluate any parameterized classes named in the node" do
|
|
234
|
-
classes = {'foo'=>{'
|
|
234
|
+
classes = {'foo'=>{'p1'=>'one'}, 'bar'=>{'p2'=>'two'}}
|
|
235
235
|
@node.stubs(:classes).returns(classes)
|
|
236
236
|
@compiler.expects(:evaluate_classes).with(classes, @compiler.topscope)
|
|
237
237
|
@compiler.compile
|
|
@@ -609,7 +609,7 @@ describe Puppet::Parser::Compiler do
|
|
|
609
609
|
# Define the given class with default parameters
|
|
610
610
|
def define_class(name, parameters)
|
|
611
611
|
@node.classes[name] = parameters
|
|
612
|
-
klass = Puppet::Resource::Type.new(:hostclass, name, :arguments => {'
|
|
612
|
+
klass = Puppet::Resource::Type.new(:hostclass, name, :arguments => {'p1' => @ast_obj, 'p2' => @ast_obj})
|
|
613
613
|
@compiler.topscope.known_resource_types.add klass
|
|
614
614
|
end
|
|
615
615
|
|
|
@@ -627,20 +627,20 @@ describe Puppet::Parser::Compiler do
|
|
|
627
627
|
it "should provide default values for parameters that have no values specified" do
|
|
628
628
|
define_class('foo', {})
|
|
629
629
|
compile()
|
|
630
|
-
@catalog.resource(:class, 'foo')['
|
|
630
|
+
@catalog.resource(:class, 'foo')['p1'].should == "foo"
|
|
631
631
|
end
|
|
632
632
|
|
|
633
633
|
it "should use any provided values" do
|
|
634
|
-
define_class('foo', {'
|
|
634
|
+
define_class('foo', {'p1' => 'real_value'})
|
|
635
635
|
compile()
|
|
636
|
-
@catalog.resource(:class, 'foo')['
|
|
636
|
+
@catalog.resource(:class, 'foo')['p1'].should == "real_value"
|
|
637
637
|
end
|
|
638
638
|
|
|
639
639
|
it "should support providing some but not all values" do
|
|
640
|
-
define_class('foo', {'
|
|
640
|
+
define_class('foo', {'p1' => 'real_value'})
|
|
641
641
|
compile()
|
|
642
|
-
@catalog.resource(:class, 'Foo')['
|
|
643
|
-
@catalog.resource(:class, 'Foo')['
|
|
642
|
+
@catalog.resource(:class, 'Foo')['p1'].should == "real_value"
|
|
643
|
+
@catalog.resource(:class, 'Foo')['p2'].should == "foo"
|
|
644
644
|
end
|
|
645
645
|
|
|
646
646
|
it "should ensure each node class is in catalog and has appropriate tags" do
|
|
@@ -648,7 +648,7 @@ describe Puppet::Parser::Compiler do
|
|
|
648
648
|
@node.classes = klasses
|
|
649
649
|
ast_obj = Puppet::Parser::AST::String.new(:value => 'foo')
|
|
650
650
|
klasses.each do |name|
|
|
651
|
-
klass = Puppet::Resource::Type.new(:hostclass, name, :arguments => {'
|
|
651
|
+
klass = Puppet::Resource::Type.new(:hostclass, name, :arguments => {'p1' => ast_obj, 'p2' => ast_obj})
|
|
652
652
|
@compiler.topscope.known_resource_types.add klass
|
|
653
653
|
end
|
|
654
654
|
catalog = @compiler.compile
|
|
@@ -659,11 +659,11 @@ describe Puppet::Parser::Compiler do
|
|
|
659
659
|
end
|
|
660
660
|
|
|
661
661
|
it "should fail if required parameters are missing" do
|
|
662
|
-
klass = {'foo'=>{'
|
|
662
|
+
klass = {'foo'=>{'a'=>'one'}}
|
|
663
663
|
@node.classes = klass
|
|
664
|
-
klass = Puppet::Resource::Type.new(:hostclass, 'foo', :arguments => {'
|
|
664
|
+
klass = Puppet::Resource::Type.new(:hostclass, 'foo', :arguments => {'a' => nil, 'b' => nil})
|
|
665
665
|
@compiler.topscope.known_resource_types.add klass
|
|
666
|
-
lambda { @compiler.compile }.should raise_error(Puppet::ParseError, "Must pass
|
|
666
|
+
lambda { @compiler.compile }.should raise_error(Puppet::ParseError, "Must pass b to Class[Foo]")
|
|
667
667
|
end
|
|
668
668
|
|
|
669
669
|
it "should fail if invalid parameters are passed" do
|
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
#! /usr/bin/env ruby
|
|
2
|
+
require 'spec_helper'
|
|
3
|
+
require 'puppet/parser/e_parser_adapter'
|
|
4
|
+
|
|
5
|
+
describe Puppet::Parser do
|
|
6
|
+
|
|
7
|
+
Puppet::Parser::AST
|
|
8
|
+
|
|
9
|
+
before :each do
|
|
10
|
+
@known_resource_types = Puppet::Resource::TypeCollection.new("development")
|
|
11
|
+
@classic_parser = Puppet::Parser::Parser.new "development"
|
|
12
|
+
@parser = Puppet::Parser::EParserAdapter.new(@classic_parser)
|
|
13
|
+
@classic_parser.stubs(:known_resource_types).returns @known_resource_types
|
|
14
|
+
@true_ast = Puppet::Parser::AST::Boolean.new :value => true
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "should require an environment at initialization" do
|
|
18
|
+
expect {
|
|
19
|
+
Puppet::Parser::EParserAdapter.new
|
|
20
|
+
}.to raise_error(ArgumentError, /wrong number of arguments/)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
describe "when parsing append operator" do
|
|
24
|
+
|
|
25
|
+
it "should not raise syntax errors" do
|
|
26
|
+
expect { @parser.parse("$var += something") }.to_not raise_error
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "should raise syntax error on incomplete syntax " do
|
|
30
|
+
expect {
|
|
31
|
+
@parser.parse("$var += ")
|
|
32
|
+
}.to raise_error(Puppet::ParseError, /Syntax error at end of file/)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "should create ast::VarDef with append=true" do
|
|
36
|
+
vardef = @parser.parse("$var += 2").code[0]
|
|
37
|
+
vardef.should be_a(Puppet::Parser::AST::VarDef)
|
|
38
|
+
vardef.append.should == true
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "should work with arrays too" do
|
|
42
|
+
vardef = @parser.parse("$var += ['test']").code[0]
|
|
43
|
+
vardef.should be_a(Puppet::Parser::AST::VarDef)
|
|
44
|
+
vardef.append.should == true
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
describe "when parsing selector" do
|
|
50
|
+
it "should support hash access on the left hand side" do
|
|
51
|
+
expect { @parser.parse("$h = { 'a' => 'b' } $a = $h['a'] ? { 'b' => 'd', default => undef }") }.to_not raise_error
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
describe "parsing 'unless'" do
|
|
56
|
+
it "should create the correct ast objects" do
|
|
57
|
+
Puppet::Parser::AST::Not.expects(:new).with { |h| h[:value].is_a?(Puppet::Parser::AST::Boolean) }
|
|
58
|
+
@parser.parse("unless false { $var = 1 }")
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "should not raise an error with empty statements" do
|
|
62
|
+
expect { @parser.parse("unless false { }") }.to_not raise_error
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
#test for bug #13296
|
|
66
|
+
it "should not override 'unless' as a parameter inside resources" do
|
|
67
|
+
lambda { @parser.parse("exec {'/bin/echo foo': unless => '/usr/bin/false',}") }.should_not raise_error
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
describe "when parsing parameter names" do
|
|
72
|
+
Puppet::Parser::Lexer::KEYWORDS.sort_tokens.each do |keyword|
|
|
73
|
+
it "should allow #{keyword} as a keyword" do
|
|
74
|
+
lambda { @parser.parse("exec {'/bin/echo foo': #{keyword} => '/usr/bin/false',}") }.should_not raise_error
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
describe "when parsing 'if'" do
|
|
80
|
+
it "not, it should create the correct ast objects" do
|
|
81
|
+
Puppet::Parser::AST::Not.expects(:new).with { |h| h[:value].is_a?(Puppet::Parser::AST::Boolean) }
|
|
82
|
+
@parser.parse("if ! true { $var = 1 }")
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
it "boolean operation, it should create the correct ast objects" do
|
|
86
|
+
Puppet::Parser::AST::BooleanOperator.expects(:new).with {
|
|
87
|
+
|h| h[:rval].is_a?(Puppet::Parser::AST::Boolean) and h[:lval].is_a?(Puppet::Parser::AST::Boolean) and h[:operator]=="or"
|
|
88
|
+
}
|
|
89
|
+
@parser.parse("if true or true { $var = 1 }")
|
|
90
|
+
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it "comparison operation, it should create the correct ast objects" do
|
|
94
|
+
Puppet::Parser::AST::ComparisonOperator.expects(:new).with {
|
|
95
|
+
|h| h[:lval].is_a?(Puppet::Parser::AST::Name) and h[:rval].is_a?(Puppet::Parser::AST::Name) and h[:operator]=="<"
|
|
96
|
+
}
|
|
97
|
+
@parser.parse("if 1 < 2 { $var = 1 }")
|
|
98
|
+
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
describe "when parsing if complex expressions" do
|
|
104
|
+
it "should create a correct ast tree" do
|
|
105
|
+
aststub = stub_everything 'ast'
|
|
106
|
+
Puppet::Parser::AST::ComparisonOperator.expects(:new).with {
|
|
107
|
+
|h| h[:rval].is_a?(Puppet::Parser::AST::Name) and h[:lval].is_a?(Puppet::Parser::AST::Name) and h[:operator]==">"
|
|
108
|
+
}.returns(aststub)
|
|
109
|
+
Puppet::Parser::AST::ComparisonOperator.expects(:new).with {
|
|
110
|
+
|h| h[:rval].is_a?(Puppet::Parser::AST::Name) and h[:lval].is_a?(Puppet::Parser::AST::Name) and h[:operator]=="=="
|
|
111
|
+
}.returns(aststub)
|
|
112
|
+
Puppet::Parser::AST::BooleanOperator.expects(:new).with {
|
|
113
|
+
|h| h[:rval]==aststub and h[:lval]==aststub and h[:operator]=="and"
|
|
114
|
+
}
|
|
115
|
+
@parser.parse("if (1 > 2) and (1 == 2) { $var = 1 }")
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
it "should raise an error on incorrect expression" do
|
|
119
|
+
expect {
|
|
120
|
+
@parser.parse("if (1 > 2 > ) or (1 == 2) { $var = 1 }")
|
|
121
|
+
}.to raise_error(Puppet::ParseError, /Syntax error at '\)'/)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
describe "when parsing resource references" do
|
|
127
|
+
|
|
128
|
+
it "should not raise syntax errors" do
|
|
129
|
+
expect { @parser.parse('exec { test: param => File["a"] }') }.to_not raise_error
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
it "should not raise syntax errors with multiple references" do
|
|
133
|
+
expect { @parser.parse('exec { test: param => File["a","b"] }') }.to_not raise_error
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
it "should create an ast::ResourceReference" do
|
|
137
|
+
# NOTE: In egrammar, type and name are unified immediately to lower case whereas the regular grammar
|
|
138
|
+
# keeps the UC name in some contexts - it gets downcased later as the name of the type is in lower case.
|
|
139
|
+
#
|
|
140
|
+
Puppet::Parser::AST::ResourceReference.expects(:new).with { |arg|
|
|
141
|
+
arg[:line]==1 and arg[:pos] ==25 and arg[:type]=="file" and arg[:title].is_a?(Puppet::Parser::AST::ASTArray)
|
|
142
|
+
}
|
|
143
|
+
@parser.parse('exec { test: command => File["a","b"] }')
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
describe "when parsing resource overrides" do
|
|
148
|
+
|
|
149
|
+
it "should not raise syntax errors" do
|
|
150
|
+
expect { @parser.parse('Resource["title"] { param => value }') }.to_not raise_error
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
it "should not raise syntax errors with multiple overrides" do
|
|
154
|
+
expect { @parser.parse('Resource["title1","title2"] { param => value }') }.to_not raise_error
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
it "should create an ast::ResourceOverride" do
|
|
158
|
+
ro = @parser.parse('Resource["title1","title2"] { param => value }').code[0]
|
|
159
|
+
ro.should be_a(Puppet::Parser::AST::ResourceOverride)
|
|
160
|
+
ro.line.should == 1
|
|
161
|
+
ro.object.should be_a(Puppet::Parser::AST::ResourceReference)
|
|
162
|
+
ro.parameters[0].should be_a(Puppet::Parser::AST::ResourceParam)
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
describe "when parsing if statements" do
|
|
168
|
+
|
|
169
|
+
it "should not raise errors with empty if" do
|
|
170
|
+
expect { @parser.parse("if true { }") }.to_not raise_error
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
it "should not raise errors with empty else" do
|
|
174
|
+
expect { @parser.parse("if false { notice('if') } else { }") }.to_not raise_error
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
it "should not raise errors with empty if and else" do
|
|
178
|
+
expect { @parser.parse("if false { } else { }") }.to_not raise_error
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
it "should create a nop node for empty branch" do
|
|
182
|
+
Puppet::Parser::AST::Nop.expects(:new).twice
|
|
183
|
+
@parser.parse("if true { }")
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
it "should create a nop node for empty else branch" do
|
|
187
|
+
Puppet::Parser::AST::Nop.expects(:new)
|
|
188
|
+
@parser.parse("if true { notice('test') } else { }")
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
it "should build a chain of 'ifs' if there's an 'elsif'" do
|
|
192
|
+
expect { @parser.parse(<<-PP) }.to_not raise_error
|
|
193
|
+
if true { notice('test') } elsif true {} else { }
|
|
194
|
+
PP
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
describe "when parsing function calls" do
|
|
200
|
+
it "should not raise errors with no arguments" do
|
|
201
|
+
expect { @parser.parse("tag()") }.to_not raise_error
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
it "should not raise errors with rvalue function with no args" do
|
|
205
|
+
expect { @parser.parse("$a = template()") }.to_not raise_error
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
it "should not raise errors with arguments" do
|
|
209
|
+
expect { @parser.parse("notice(1)") }.to_not raise_error
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
it "should not raise errors with multiple arguments" do
|
|
213
|
+
expect { @parser.parse("notice(1,2)") }.to_not raise_error
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
it "should not raise errors with multiple arguments and a trailing comma" do
|
|
217
|
+
expect { @parser.parse("notice(1,2,)") }.to_not raise_error
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
describe "when parsing arrays" do
|
|
223
|
+
it "should parse an array" do
|
|
224
|
+
expect { @parser.parse("$a = [1,2]") }.to_not raise_error
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
it "should not raise errors with a trailing comma" do
|
|
228
|
+
expect { @parser.parse("$a = [1,2,]") }.to_not raise_error
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
it "should accept an empty array" do
|
|
232
|
+
expect { @parser.parse("$var = []\n") }.to_not raise_error
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
describe "when parsing classes" do
|
|
237
|
+
before :each do
|
|
238
|
+
@krt = Puppet::Resource::TypeCollection.new("development")
|
|
239
|
+
@classic_parser = Puppet::Parser::Parser.new "development"
|
|
240
|
+
@parser = Puppet::Parser::EParserAdapter.new(@classic_parser)
|
|
241
|
+
@classic_parser.stubs(:known_resource_types).returns @krt
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
it "should not create new classes" do
|
|
245
|
+
@parser.parse("class foobar {}").code[0].should be_a(Puppet::Parser::AST::Hostclass)
|
|
246
|
+
@krt.hostclass("foobar").should be_nil
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
it "should correctly set the parent class when one is provided" do
|
|
250
|
+
@parser.parse("class foobar inherits yayness {}").code[0].instantiate('')[0].parent.should == "yayness"
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
it "should correctly set the parent class for multiple classes at a time" do
|
|
254
|
+
statements = @parser.parse("class foobar inherits yayness {}\nclass boo inherits bar {}").code
|
|
255
|
+
statements[0].instantiate('')[0].parent.should == "yayness"
|
|
256
|
+
statements[1].instantiate('')[0].parent.should == "bar"
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
it "should define the code when some is provided" do
|
|
260
|
+
@parser.parse("class foobar { $var = val }").code[0].code.should_not be_nil
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
it "should accept parameters with trailing comma" do
|
|
264
|
+
@parser.parse("file { '/example': ensure => file, }").should be
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
it "should accept parametrized classes with trailing comma" do
|
|
268
|
+
@parser.parse("class foobar ($var1 = 0,) { $var = val }").code[0].code.should_not be_nil
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
it "should define parameters when provided" do
|
|
272
|
+
foobar = @parser.parse("class foobar($biz,$baz) {}").code[0].instantiate('')[0]
|
|
273
|
+
foobar.arguments.should == {"biz" => nil, "baz" => nil}
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
describe "when parsing resources" do
|
|
278
|
+
before :each do
|
|
279
|
+
@krt = Puppet::Resource::TypeCollection.new("development")
|
|
280
|
+
@classic_parser = Puppet::Parser::Parser.new "development"
|
|
281
|
+
@parser = Puppet::Parser::EParserAdapter.new(@classic_parser)
|
|
282
|
+
@classic_parser.stubs(:known_resource_types).returns @krt
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
it "should be able to parse class resources" do
|
|
286
|
+
@krt.add(Puppet::Resource::Type.new(:hostclass, "foobar", :arguments => {"biz" => nil}))
|
|
287
|
+
expect { @parser.parse("class { foobar: biz => stuff }") }.to_not raise_error
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
it "should correctly mark exported resources as exported" do
|
|
291
|
+
@parser.parse("@@file { '/file': }").code[0].exported.should be_true
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
it "should correctly mark virtual resources as virtual" do
|
|
295
|
+
@parser.parse("@file { '/file': }").code[0].virtual.should be_true
|
|
296
|
+
end
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
describe "when parsing nodes" do
|
|
300
|
+
it "should be able to parse a node with a single name" do
|
|
301
|
+
node = @parser.parse("node foo { }").code[0]
|
|
302
|
+
node.should be_a Puppet::Parser::AST::Node
|
|
303
|
+
node.names.length.should == 1
|
|
304
|
+
node.names[0].value.should == "foo"
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
it "should be able to parse a node with two names" do
|
|
308
|
+
node = @parser.parse("node foo, bar { }").code[0]
|
|
309
|
+
node.should be_a Puppet::Parser::AST::Node
|
|
310
|
+
node.names.length.should == 2
|
|
311
|
+
node.names[0].value.should == "foo"
|
|
312
|
+
node.names[1].value.should == "bar"
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
it "should be able to parse a node with three names" do
|
|
316
|
+
node = @parser.parse("node foo, bar, baz { }").code[0]
|
|
317
|
+
node.should be_a Puppet::Parser::AST::Node
|
|
318
|
+
node.names.length.should == 3
|
|
319
|
+
node.names[0].value.should == "foo"
|
|
320
|
+
node.names[1].value.should == "bar"
|
|
321
|
+
node.names[2].value.should == "baz"
|
|
322
|
+
end
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
it "should fail if trying to collect defaults" do
|
|
326
|
+
expect {
|
|
327
|
+
@parser.parse("@Port { protocols => tcp }")
|
|
328
|
+
}.to raise_error(Puppet::ParseError, /Defaults are not virtualizable/)
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
context "when parsing collections" do
|
|
332
|
+
it "should parse basic collections" do
|
|
333
|
+
@parser.parse("Port <| |>").code.
|
|
334
|
+
should be_all {|x| x.is_a? Puppet::Parser::AST::Collection }
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
it "should parse fully qualified collections" do
|
|
338
|
+
@parser.parse("Port::Range <| |>").code.
|
|
339
|
+
should be_all {|x| x.is_a? Puppet::Parser::AST::Collection }
|
|
340
|
+
end
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
it "should not assign to a fully qualified variable" do
|
|
344
|
+
expect {
|
|
345
|
+
@parser.parse("$one::two = yay")
|
|
346
|
+
}.to raise_error(Puppet::ParseError, /Cannot assign to variables in other namespaces/)
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
it "should parse assignment of undef" do
|
|
350
|
+
tree = @parser.parse("$var = undef")
|
|
351
|
+
tree.code.children[0].should be_an_instance_of Puppet::Parser::AST::VarDef
|
|
352
|
+
tree.code.children[0].value.should be_an_instance_of Puppet::Parser::AST::Undef
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
it "should treat classes as case insensitive" do
|
|
356
|
+
@classic_parser.known_resource_types.import_ast(@parser.parse("class yayness {}"), '')
|
|
357
|
+
@classic_parser.known_resource_types.hostclass('yayness').
|
|
358
|
+
should == @classic_parser.find_hostclass("", "YayNess")
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
it "should treat defines as case insensitive" do
|
|
362
|
+
@classic_parser.known_resource_types.import_ast(@parser.parse("define funtest {}"), '')
|
|
363
|
+
@classic_parser.known_resource_types.hostclass('funtest').
|
|
364
|
+
should == @classic_parser.find_hostclass("", "fUntEst")
|
|
365
|
+
end
|
|
366
|
+
context "when parsing method calls" do
|
|
367
|
+
it "should parse method call with one param lambda" do
|
|
368
|
+
expect { @parser.parse("$a.foreach {|$a| debug $a }") }.to_not raise_error
|
|
369
|
+
end
|
|
370
|
+
it "should parse method call with two param lambda" do
|
|
371
|
+
expect { @parser.parse("$a.foreach {|$a,$b| debug $a }") }.to_not raise_error
|
|
372
|
+
end
|
|
373
|
+
it "should parse method call with two param lambda and default value" do
|
|
374
|
+
expect { @parser.parse("$a.foreach {|$a,$b=1| debug $a }") }.to_not raise_error
|
|
375
|
+
end
|
|
376
|
+
it "should parse method call without lambda (statement)" do
|
|
377
|
+
expect { @parser.parse("$a.foreach") }.to_not raise_error
|
|
378
|
+
end
|
|
379
|
+
it "should parse method call without lambda (expression)" do
|
|
380
|
+
expect { @parser.parse("$x = $a.foreach + 1") }.to_not raise_error
|
|
381
|
+
end
|
|
382
|
+
context "a receiver expression of type" do
|
|
383
|
+
it "variable should be allowed" do
|
|
384
|
+
expect { @parser.parse("$a.foreach") }.to_not raise_error
|
|
385
|
+
end
|
|
386
|
+
it "hasharrayaccess should be allowed" do
|
|
387
|
+
expect { @parser.parse("$a[0][1].foreach") }.to_not raise_error
|
|
388
|
+
end
|
|
389
|
+
it "quoted text should be allowed" do
|
|
390
|
+
expect { @parser.parse("\"monkey\".foreach") }.to_not raise_error
|
|
391
|
+
expect { @parser.parse("'monkey'.foreach") }.to_not raise_error
|
|
392
|
+
end
|
|
393
|
+
it "selector text should be allowed" do
|
|
394
|
+
expect { @parser.parse("$a ? { 'banana'=>[1,2,3]}.foreach") }.to_not raise_error
|
|
395
|
+
end
|
|
396
|
+
it "function call should be allowed" do
|
|
397
|
+
expect { @parser.parse("duh(1,2,3).foreach") }.to_not raise_error
|
|
398
|
+
end
|
|
399
|
+
it "method call should be allowed" do
|
|
400
|
+
expect { @parser.parse("$a.foo.bar") }.to_not raise_error
|
|
401
|
+
end
|
|
402
|
+
it "chained method calls with lambda should be allowed" do
|
|
403
|
+
expect { @parser.parse("$a.foo{||}.bar{||}") }.to_not raise_error
|
|
404
|
+
end
|
|
405
|
+
end
|
|
406
|
+
end
|
|
407
|
+
end
|