puppet 0.18.4 → 0.22.4
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/CHANGELOG +288 -0
- data/README +2 -2
- data/Rakefile +78 -5
- data/bin/puppet +28 -36
- data/bin/puppetca +81 -38
- data/bin/puppetd +65 -62
- data/bin/puppetdoc +409 -140
- data/bin/puppetmasterd +59 -47
- data/bin/puppetrun +38 -23
- data/conf/freebsd/puppetd +26 -0
- data/conf/freebsd/puppetmasterd +26 -0
- data/conf/gentoo/conf.d/puppet +5 -0
- data/conf/gentoo/conf.d/puppetmaster +12 -0
- data/conf/gentoo/init.d/puppet +38 -0
- data/conf/gentoo/init.d/puppetmaster +50 -0
- data/conf/gentoo/puppet/fileserver.conf +12 -0
- data/conf/gentoo/puppet/puppetca.conf +29 -0
- data/conf/gentoo/puppet/puppetd.conf +29 -0
- data/conf/gentoo/puppet/puppetmasterd.conf +29 -0
- data/conf/redhat/client.init +10 -5
- data/conf/redhat/client.sysconfig +1 -1
- data/conf/redhat/fileserver.conf +2 -2
- data/conf/redhat/logrotate +1 -1
- data/conf/redhat/no-lockdir.patch +13 -0
- data/conf/redhat/puppet.spec +65 -8
- data/conf/redhat/puppetd.conf +0 -4
- data/conf/redhat/server.init +3 -6
- data/conf/solaris/pkginfo +1 -1
- data/conf/solaris/smf/svc-puppetd +2 -2
- data/conf/suse/client.init +142 -0
- data/conf/suse/puppet.spec +221 -0
- data/conf/suse/server.init +162 -0
- data/examples/code/mac_automount.pp +16 -0
- data/examples/root/bin/sleeper +3 -5
- data/examples/root/etc/init.d/sleeper +8 -2
- data/examples/root/etc/puppet/fileserver.conf +12 -2
- data/examples/root/etc/puppet/namespaceauth.conf +20 -0
- data/examples/root/etc/puppet/puppetd.conf +4 -0
- data/examples/root/etc/puppet/puppetmasterd.conf +6 -9
- data/examples/root/etc/puppet/tagmail.conf +1 -0
- data/ext/emacs/puppet-mode.el +46 -1
- data/ext/logcheck/puppet +15 -0
- data/ext/module_puppet +15 -23
- data/ext/vim/puppet.vim +4 -2
- data/install.rb +2 -1
- data/lib/puppet.rb +76 -207
- data/lib/puppet/configuration.rb +331 -0
- data/lib/puppet/daemon.rb +63 -246
- data/lib/puppet/dsl.rb +371 -0
- data/lib/puppet/element.rb +8 -26
- data/lib/puppet/error.rb +54 -0
- data/lib/puppet/event.rb +8 -243
- data/lib/puppet/{base64.rb → external/base64.rb} +0 -0
- data/lib/puppet/external/event-loop.rb +1 -0
- data/lib/puppet/{event-loop → external/event-loop}/better-definers.rb +0 -0
- data/lib/puppet/{event-loop → external/event-loop}/event-loop.rb +2 -2
- data/lib/puppet/{event-loop → external/event-loop}/signal-system.rb +1 -1
- data/lib/puppet/external/gratr.rb +33 -0
- data/lib/puppet/external/gratr/adjacency_graph.rb +257 -0
- data/lib/puppet/external/gratr/base.rb +34 -0
- data/lib/puppet/external/gratr/biconnected.rb +116 -0
- data/lib/puppet/external/gratr/chinese_postman.rb +123 -0
- data/lib/puppet/external/gratr/common.rb +73 -0
- data/lib/puppet/external/gratr/comparability.rb +92 -0
- data/lib/puppet/external/gratr/digraph.rb +116 -0
- data/lib/puppet/external/gratr/digraph_distance.rb +185 -0
- data/lib/puppet/external/gratr/dot.rb +90 -0
- data/lib/puppet/external/gratr/edge.rb +145 -0
- data/lib/puppet/external/gratr/graph.rb +303 -0
- data/lib/puppet/external/gratr/graph_api.rb +83 -0
- data/lib/puppet/external/gratr/import.rb +44 -0
- data/lib/puppet/external/gratr/labels.rb +90 -0
- data/lib/puppet/external/gratr/maximum_flow.rb +64 -0
- data/lib/puppet/external/gratr/rdot.rb +327 -0
- data/lib/puppet/external/gratr/search.rb +409 -0
- data/lib/puppet/external/gratr/strong_components.rb +127 -0
- data/lib/puppet/external/gratr/undirected_graph.rb +153 -0
- data/lib/puppet/{lock.rb → external/lock.rb} +1 -1
- data/lib/puppet/feature/base.rb +20 -0
- data/lib/puppet/feature/rails.rb +52 -0
- data/lib/puppet/metatype/attributes.rb +719 -0
- data/lib/puppet/metatype/closure.rb +111 -0
- data/lib/puppet/metatype/container.rb +94 -0
- data/lib/puppet/metatype/evaluation.rb +118 -0
- data/lib/puppet/metatype/instances.rb +261 -0
- data/lib/puppet/metatype/manager.rb +169 -0
- data/lib/puppet/metatype/metaparams.rb +409 -0
- data/lib/puppet/metatype/providers.rb +260 -0
- data/lib/puppet/metatype/relationships.rb +116 -0
- data/lib/puppet/metatype/schedules.rb +39 -0
- data/lib/puppet/metatype/tags.rb +39 -0
- data/lib/puppet/modules.rb +113 -0
- data/lib/puppet/network/authconfig.rb +168 -0
- data/lib/puppet/network/authorization.rb +84 -0
- data/lib/puppet/network/authstore.rb +293 -0
- data/lib/puppet/network/client.rb +187 -0
- data/lib/puppet/network/client/ca.rb +56 -0
- data/lib/puppet/network/client/dipper.rb +81 -0
- data/lib/puppet/network/client/file.rb +7 -0
- data/lib/puppet/network/client/logger.rb +6 -0
- data/lib/puppet/network/client/master.rb +644 -0
- data/lib/puppet/{client → network/client}/proxy.rb +3 -3
- data/lib/puppet/{client/reporter.rb → network/client/report.rb} +4 -7
- data/lib/puppet/{client/pelement.rb → network/client/resource.rb} +6 -19
- data/lib/puppet/network/client/runner.rb +13 -0
- data/lib/puppet/network/client/status.rb +5 -0
- data/lib/puppet/network/client_request.rb +32 -0
- data/lib/puppet/network/handler.rb +33 -0
- data/lib/puppet/{server → network/handler}/ca.rb +5 -6
- data/lib/puppet/network/handler/filebucket.rb +180 -0
- data/lib/puppet/{server → network/handler}/fileserver.rb +277 -219
- data/lib/puppet/{server → network/handler}/logger.rb +3 -5
- data/lib/puppet/{server → network/handler}/master.rb +42 -8
- data/lib/puppet/network/handler/report.rb +158 -0
- data/lib/puppet/network/handler/resource.rb +190 -0
- data/lib/puppet/{server → network/handler}/runner.rb +17 -18
- data/lib/puppet/network/handler/status.rb +13 -0
- data/lib/puppet/network/rights.rb +74 -0
- data/lib/puppet/network/server.rb +5 -0
- data/lib/puppet/network/server/mongrel.rb +138 -0
- data/lib/puppet/network/server/webrick.rb +153 -0
- data/lib/puppet/network/xmlrpc/client.rb +129 -0
- data/lib/puppet/network/xmlrpc/processor.rb +91 -0
- data/lib/puppet/network/xmlrpc/server.rb +20 -0
- data/lib/puppet/network/xmlrpc/webrick_servlet.rb +121 -0
- data/lib/puppet/parameter.rb +390 -346
- data/lib/puppet/parser/ast.rb +116 -147
- data/lib/puppet/parser/ast/astarray.rb +17 -33
- data/lib/puppet/parser/ast/branch.rb +2 -0
- data/lib/puppet/parser/ast/caseopt.rb +7 -12
- data/lib/puppet/parser/ast/casestatement.rb +23 -32
- data/lib/puppet/parser/ast/collection.rb +19 -80
- data/lib/puppet/parser/ast/collexpr.rb +81 -0
- data/lib/puppet/parser/ast/component.rb +160 -89
- data/lib/puppet/parser/ast/else.rb +30 -0
- data/lib/puppet/parser/ast/function.rb +9 -2
- data/lib/puppet/parser/ast/hostclass.rb +47 -131
- data/lib/puppet/parser/ast/ifstatement.rb +43 -0
- data/lib/puppet/parser/ast/leaf.rb +10 -21
- data/lib/puppet/parser/ast/node.rb +32 -79
- data/lib/puppet/parser/ast/resourcedef.rb +222 -0
- data/lib/puppet/parser/ast/{typedefaults.rb → resourcedefaults.rb} +10 -16
- data/lib/puppet/parser/ast/resourceoverride.rb +62 -0
- data/lib/puppet/parser/ast/{objectparam.rb → resourceparam.rb} +12 -6
- data/lib/puppet/parser/ast/resourceref.rb +44 -0
- data/lib/puppet/parser/ast/selector.rb +16 -8
- data/lib/puppet/parser/ast/tag.rb +3 -1
- data/lib/puppet/parser/ast/vardef.rb +8 -12
- data/lib/puppet/parser/collector.rb +181 -0
- data/lib/puppet/parser/functions.rb +191 -36
- data/lib/puppet/parser/interpreter.rb +802 -380
- data/lib/puppet/parser/lexer.rb +86 -19
- data/lib/puppet/parser/parser.rb +1123 -960
- data/lib/puppet/parser/resource.rb +353 -0
- data/lib/puppet/parser/resource/param.rb +57 -0
- data/lib/puppet/parser/resource/reference.rb +71 -0
- data/lib/puppet/parser/scope.rb +573 -1000
- data/lib/puppet/parser/templatewrapper.rb +54 -0
- data/lib/puppet/pgraph.rb +208 -0
- data/lib/puppet/propertychange.rb +143 -0
- data/lib/puppet/provider.rb +302 -0
- data/lib/puppet/provider/cron/crontab.rb +187 -0
- data/lib/puppet/provider/group/groupadd.rb +29 -0
- data/lib/puppet/provider/group/netinfo.rb +12 -0
- data/lib/puppet/provider/group/pw.rb +31 -0
- data/lib/puppet/provider/host/netinfo.rb +18 -0
- data/lib/puppet/provider/host/parsed.rb +73 -0
- data/lib/puppet/provider/mount.rb +57 -0
- data/lib/puppet/provider/mount/netinfo.rb +38 -0
- data/lib/puppet/provider/mount/parsed.rb +37 -0
- data/lib/puppet/provider/nameservice.rb +344 -0
- data/lib/puppet/provider/nameservice/netinfo.rb +210 -0
- data/lib/puppet/provider/nameservice/objectadd.rb +45 -0
- data/lib/puppet/provider/nameservice/pw.rb +22 -0
- data/lib/puppet/provider/package/apple.rb +53 -0
- data/lib/puppet/provider/package/apt.rb +119 -0
- data/lib/puppet/provider/package/aptitude.rb +30 -0
- data/lib/puppet/provider/package/aptrpm.rb +79 -0
- data/lib/puppet/provider/package/blastwave.rb +114 -0
- data/lib/puppet/provider/package/darwinport.rb +88 -0
- data/lib/puppet/provider/package/dpkg.rb +109 -0
- data/lib/puppet/provider/package/freebsd.rb +43 -0
- data/lib/puppet/provider/package/gem.rb +104 -0
- data/lib/puppet/provider/package/openbsd.rb +93 -0
- data/lib/puppet/provider/package/pkgdmg.rb +119 -0
- data/lib/puppet/provider/package/portage.rb +112 -0
- data/lib/puppet/provider/package/ports.rb +94 -0
- data/lib/puppet/provider/package/rpm.rb +125 -0
- data/lib/puppet/provider/package/rug.rb +53 -0
- data/lib/puppet/provider/package/sun.rb +168 -0
- data/lib/puppet/provider/package/sunfreeware.rb +9 -0
- data/lib/puppet/provider/package/up2date.rb +45 -0
- data/lib/puppet/provider/package/yum.rb +54 -0
- data/lib/puppet/provider/parsedfile.rb +342 -0
- data/lib/puppet/provider/port/parsed.rb +174 -0
- data/lib/puppet/provider/service/base.rb +136 -0
- data/lib/puppet/provider/service/debian.rb +32 -0
- data/lib/puppet/provider/service/gentoo.rb +49 -0
- data/lib/puppet/{type → provider}/service/init.rb +42 -40
- data/lib/puppet/provider/service/redhat.rb +59 -0
- data/lib/puppet/{type → provider}/service/smf.rb +24 -13
- data/lib/puppet/provider/sshkey/parsed.rb +36 -0
- data/lib/puppet/provider/user/netinfo.rb +106 -0
- data/lib/puppet/provider/user/pw.rb +41 -0
- data/lib/puppet/provider/user/useradd.rb +67 -0
- data/lib/puppet/provider/zone/solaris.rb +208 -0
- data/lib/puppet/rails.rb +102 -66
- data/lib/puppet/rails/database/001_add_indexes.rb +38 -0
- data/lib/puppet/rails/database/schema.rb +89 -0
- data/lib/puppet/rails/external/tagging/acts_as_taggable.rb +62 -0
- data/lib/puppet/rails/external/tagging/init.rb +5 -0
- data/lib/puppet/rails/external/tagging/tag.rb +50 -0
- data/lib/puppet/rails/external/tagging/tagging.rb +12 -0
- data/lib/puppet/rails/fact_name.rb +7 -0
- data/lib/puppet/rails/fact_value.rb +5 -0
- data/lib/puppet/rails/host.rb +95 -46
- data/lib/puppet/rails/param_name.rb +28 -0
- data/lib/puppet/rails/param_value.rb +5 -0
- data/lib/puppet/rails/puppet_class.rb +9 -0
- data/lib/puppet/rails/resource.rb +95 -0
- data/lib/puppet/rails/source_file.rb +5 -0
- data/lib/puppet/relationship.rb +63 -0
- data/lib/puppet/reports/log.rb +14 -0
- data/lib/puppet/reports/rrdgraph.rb +114 -10
- data/lib/puppet/reports/store.rb +64 -0
- data/lib/puppet/reports/tagmail.rb +144 -71
- data/lib/puppet/sslcertificates.rb +38 -5
- data/lib/puppet/sslcertificates/ca.rb +142 -37
- data/lib/puppet/sslcertificates/certificate.rb +3 -3
- data/lib/puppet/sslcertificates/inventory.rb +53 -0
- data/lib/puppet/sslcertificates/support.rb +128 -0
- data/lib/puppet/transaction.rb +568 -189
- data/lib/puppet/transaction/report.rb +14 -3
- data/lib/puppet/transportable.rb +18 -10
- data/lib/puppet/type.rb +279 -2299
- data/lib/puppet/type/component.rb +63 -63
- data/lib/puppet/type/cron.rb +294 -710
- data/lib/puppet/type/exec.rb +185 -129
- data/lib/puppet/type/group.rb +38 -89
- data/lib/puppet/type/host.rb +110 -0
- data/lib/puppet/type/mount.rb +189 -0
- data/lib/puppet/type/notify.rb +47 -0
- data/lib/puppet/type/package.rb +129 -257
- data/lib/puppet/type/parsedtype.rb +172 -297
- data/lib/puppet/type/pfile.rb +540 -319
- data/lib/puppet/type/pfile/checksum.rb +103 -76
- data/lib/puppet/type/pfile/content.rb +16 -10
- data/lib/puppet/type/pfile/ensure.rb +52 -34
- data/lib/puppet/type/pfile/group.rb +25 -18
- data/lib/puppet/type/pfile/mode.rb +7 -4
- data/lib/puppet/type/pfile/{uid.rb → owner.rb} +21 -17
- data/lib/puppet/type/pfile/source.rb +119 -124
- data/lib/puppet/type/pfile/target.rb +29 -45
- data/lib/puppet/type/pfile/type.rb +2 -2
- data/lib/puppet/type/pfilebucket.rb +18 -14
- data/lib/puppet/type/port.rb +121 -0
- data/lib/puppet/type/property.rb +530 -0
- data/lib/puppet/type/resources.rb +150 -0
- data/lib/puppet/type/schedule.rb +38 -22
- data/lib/puppet/type/service.rb +70 -326
- data/lib/puppet/type/sshkey.rb +76 -0
- data/lib/puppet/type/tidy.rb +197 -97
- data/lib/puppet/type/user.rb +107 -183
- data/lib/puppet/type/yumrepo.rb +53 -34
- data/lib/puppet/type/zone.rb +55 -208
- data/lib/puppet/util.rb +239 -201
- data/lib/puppet/util/autoload.rb +107 -0
- data/lib/puppet/util/classgen.rb +208 -0
- data/lib/puppet/{config.rb → util/config.rb} +102 -54
- data/lib/puppet/util/docs.rb +104 -0
- data/lib/puppet/util/errors.rb +55 -0
- data/lib/puppet/util/execution.rb +22 -0
- data/lib/puppet/util/feature.rb +76 -0
- data/lib/puppet/util/fileparsing.rb +380 -0
- data/lib/puppet/util/filetype.rb +300 -0
- data/lib/puppet/util/graph.rb +39 -0
- data/lib/puppet/util/inifile.rb +209 -0
- data/lib/puppet/util/loadedfile.rb +71 -0
- data/lib/puppet/util/log.rb +549 -0
- data/lib/puppet/util/logging.rb +20 -0
- data/lib/puppet/util/metaid.rb +22 -0
- data/lib/puppet/util/methodhelper.rb +37 -0
- data/lib/puppet/util/metric.rb +160 -0
- data/lib/puppet/util/package.rb +31 -0
- data/lib/puppet/util/pidlock.rb +68 -0
- data/lib/puppet/util/plist.rb +24 -0
- data/lib/puppet/util/plist/generator.rb +226 -0
- data/lib/puppet/util/plist/parser.rb +227 -0
- data/lib/puppet/util/posix.rb +87 -0
- data/lib/puppet/util/provider_features.rb +170 -0
- data/lib/puppet/util/rails/collection_merger.rb +42 -0
- data/lib/puppet/util/storage.rb +103 -0
- data/lib/puppet/util/subclass_loader.rb +83 -0
- data/lib/puppet/util/suidmanager.rb +86 -0
- data/lib/puppet/util/variables.rb +39 -0
- data/lib/puppet/util/warnings.rb +15 -0
- data/test/Rakefile +97 -0
- data/test/certmgr/ca.rb +81 -0
- data/test/certmgr/certmgr.rb +77 -50
- data/test/certmgr/inventory.rb +79 -0
- data/test/certmgr/support.rb +81 -0
- data/test/executables/filebucket.rb +49 -0
- data/test/executables/puppetbin.rb +28 -12
- data/test/executables/puppetca.rb +75 -54
- data/test/executables/puppetd.rb +10 -13
- data/test/executables/puppetmasterd.rb +12 -17
- data/test/executables/puppetmodule.rb +18 -17
- data/test/language/ast.rb +242 -798
- data/test/language/ast/casestatement.rb +104 -0
- data/test/language/ast/component.rb +133 -0
- data/test/language/ast/hostclass.rb +162 -0
- data/test/language/ast/selector.rb +62 -0
- data/test/language/ast/variable.rb +31 -0
- data/test/language/collector.rb +369 -0
- data/test/language/functions.rb +305 -18
- data/test/language/interpreter.rb +894 -125
- data/test/language/lexer.rb +98 -12
- data/test/language/node.rb +37 -53
- data/test/language/parser.rb +455 -148
- data/test/language/resource.rb +535 -0
- data/test/language/scope.rb +451 -561
- data/test/language/snippets.rb +101 -111
- data/test/language/transportable.rb +6 -8
- data/test/lib/mocha.rb +19 -0
- data/test/lib/mocha/any_instance_method.rb +35 -0
- data/test/lib/mocha/auto_verify.rb +113 -0
- data/test/lib/mocha/central.rb +35 -0
- data/test/lib/mocha/class_method.rb +62 -0
- data/test/lib/mocha/expectation.rb +295 -0
- data/test/lib/mocha/expectation_error.rb +6 -0
- data/test/lib/mocha/infinite_range.rb +27 -0
- data/test/lib/mocha/inspect.rb +37 -0
- data/test/lib/mocha/instance_method.rb +8 -0
- data/test/lib/mocha/metaclass.rb +7 -0
- data/test/lib/mocha/mock.rb +20 -0
- data/test/lib/mocha/mock_methods.rb +122 -0
- data/test/lib/mocha/object.rb +100 -0
- data/test/lib/mocha/pretty_parameters.rb +28 -0
- data/test/lib/mocha/setup_and_teardown.rb +23 -0
- data/test/lib/mocha/standalone.rb +30 -0
- data/test/lib/mocha/test_case_adapter.rb +49 -0
- data/test/lib/mocha_standalone.rb +2 -0
- data/test/lib/puppettest.rb +294 -0
- data/test/lib/puppettest/certificates.rb +61 -0
- data/test/lib/puppettest/exetest.rb +123 -0
- data/test/lib/puppettest/fakes.rb +194 -0
- data/test/lib/puppettest/fileparsing.rb +33 -0
- data/test/lib/puppettest/filetesting.rb +231 -0
- data/test/lib/puppettest/graph.rb +41 -0
- data/test/lib/puppettest/parsertesting.rb +392 -0
- data/test/lib/puppettest/railstesting.rb +56 -0
- data/test/lib/puppettest/reporttesting.rb +19 -0
- data/test/lib/puppettest/resourcetesting.rb +73 -0
- data/test/lib/puppettest/servertest.rb +72 -0
- data/test/lib/puppettest/support.rb +8 -0
- data/test/lib/puppettest/support/assertions.rb +101 -0
- data/test/lib/puppettest/support/helpers.rb +23 -0
- data/test/lib/puppettest/support/resources.rb +37 -0
- data/test/lib/puppettest/support/utils.rb +160 -0
- data/test/lib/puppettest/testcase.rb +48 -0
- data/test/lib/rake/puppet_test_loader.rb +17 -0
- data/test/lib/rake/puppet_testtask.rb +17 -0
- data/test/lib/spec.rb +8 -0
- data/test/lib/spec/callback.rb +11 -0
- data/test/lib/spec/callback/callback_container.rb +60 -0
- data/test/lib/spec/callback/extensions/module.rb +24 -0
- data/test/lib/spec/callback/extensions/object.rb +37 -0
- data/test/lib/spec/deprecated.rb +3 -0
- data/test/lib/spec/expectations.rb +59 -0
- data/test/lib/spec/expectations/differs/default.rb +62 -0
- data/test/lib/spec/expectations/errors.rb +6 -0
- data/test/lib/spec/expectations/extensions.rb +3 -0
- data/test/lib/spec/expectations/extensions/object.rb +109 -0
- data/test/lib/spec/expectations/extensions/proc.rb +57 -0
- data/test/lib/spec/expectations/extensions/string_and_symbol.rb +17 -0
- data/test/lib/spec/expectations/handler.rb +47 -0
- data/test/lib/spec/expectations/should.rb +5 -0
- data/test/lib/spec/expectations/should/base.rb +64 -0
- data/test/lib/spec/expectations/should/change.rb +69 -0
- data/test/lib/spec/expectations/should/have.rb +128 -0
- data/test/lib/spec/expectations/should/not.rb +74 -0
- data/test/lib/spec/expectations/should/should.rb +81 -0
- data/test/lib/spec/expectations/sugar.rb +47 -0
- data/test/lib/spec/matchers.rb +160 -0
- data/test/lib/spec/matchers/be.rb +161 -0
- data/test/lib/spec/matchers/be_close.rb +37 -0
- data/test/lib/spec/matchers/change.rb +120 -0
- data/test/lib/spec/matchers/eql.rb +43 -0
- data/test/lib/spec/matchers/equal.rb +43 -0
- data/test/lib/spec/matchers/has.rb +44 -0
- data/test/lib/spec/matchers/have.rb +140 -0
- data/test/lib/spec/matchers/include.rb +50 -0
- data/test/lib/spec/matchers/match.rb +41 -0
- data/test/lib/spec/matchers/raise_error.rb +100 -0
- data/test/lib/spec/matchers/respond_to.rb +35 -0
- data/test/lib/spec/matchers/satisfy.rb +47 -0
- data/test/lib/spec/matchers/throw_symbol.rb +75 -0
- data/test/lib/spec/mocks.rb +232 -0
- data/test/lib/spec/mocks/argument_expectation.rb +132 -0
- data/test/lib/spec/mocks/error_generator.rb +85 -0
- data/test/lib/spec/mocks/errors.rb +10 -0
- data/test/lib/spec/mocks/extensions/object.rb +3 -0
- data/test/lib/spec/mocks/message_expectation.rb +231 -0
- data/test/lib/spec/mocks/methods.rb +40 -0
- data/test/lib/spec/mocks/mock.rb +26 -0
- data/test/lib/spec/mocks/mock_handler.rb +166 -0
- data/test/lib/spec/mocks/order_group.rb +29 -0
- data/test/lib/spec/rake/spectask.rb +173 -0
- data/test/lib/spec/rake/verify_rcov.rb +47 -0
- data/test/lib/spec/runner.rb +132 -0
- data/test/lib/spec/runner/backtrace_tweaker.rb +55 -0
- data/test/lib/spec/runner/command_line.rb +34 -0
- data/test/lib/spec/runner/context.rb +154 -0
- data/test/lib/spec/runner/context_eval.rb +142 -0
- data/test/lib/spec/runner/context_runner.rb +55 -0
- data/test/lib/spec/runner/drb_command_line.rb +21 -0
- data/test/lib/spec/runner/execution_context.rb +17 -0
- data/test/lib/spec/runner/extensions/kernel.rb +17 -0
- data/test/lib/spec/runner/extensions/object.rb +32 -0
- data/test/lib/spec/runner/formatter.rb +5 -0
- data/test/lib/spec/runner/formatter/base_text_formatter.rb +118 -0
- data/test/lib/spec/runner/formatter/html_formatter.rb +219 -0
- data/test/lib/spec/runner/formatter/progress_bar_formatter.rb +27 -0
- data/test/lib/spec/runner/formatter/rdoc_formatter.rb +22 -0
- data/test/lib/spec/runner/formatter/specdoc_formatter.rb +23 -0
- data/test/lib/spec/runner/heckle_runner.rb +71 -0
- data/test/lib/spec/runner/heckle_runner_win.rb +10 -0
- data/test/lib/spec/runner/option_parser.rb +224 -0
- data/test/lib/spec/runner/reporter.rb +105 -0
- data/test/lib/spec/runner/spec_matcher.rb +25 -0
- data/test/lib/spec/runner/spec_parser.rb +41 -0
- data/test/lib/spec/runner/spec_should_raise_handler.rb +74 -0
- data/test/lib/spec/runner/specification.rb +114 -0
- data/test/lib/spec/translator.rb +87 -0
- data/test/lib/spec/version.rb +30 -0
- data/test/lib/stubba.rb +2 -0
- data/test/network/authconfig.rb +72 -0
- data/test/network/authorization.rb +138 -0
- data/test/network/authstore.rb +450 -0
- data/test/network/client/ca.rb +38 -0
- data/test/{client → network/client}/client.rb +107 -24
- data/test/network/client/dipper.rb +35 -0
- data/test/network/client/master.rb +627 -0
- data/test/{client/pelement.rb → network/client/resource.rb} +13 -29
- data/test/network/client_request.rb +39 -0
- data/test/network/daemon.rb +71 -0
- data/test/{server → network/handler}/bucket.rb +103 -27
- data/test/{server → network/handler}/ca.rb +14 -19
- data/test/{server → network/handler}/fileserver.rb +443 -68
- data/test/network/handler/handler.rb +64 -0
- data/test/{server → network/handler}/logger.rb +26 -26
- data/test/network/handler/master.rb +352 -0
- data/test/network/handler/report.rb +185 -0
- data/test/{server/pelement.rb → network/handler/resource.rb} +25 -38
- data/test/{server → network/handler}/runner.rb +17 -16
- data/test/network/rights.rb +38 -0
- data/test/network/server/webrick.rb +140 -0
- data/test/network/xmlrpc/client.rb +68 -0
- data/test/network/xmlrpc/processor.rb +80 -0
- data/test/network/xmlrpc/server.rb +28 -0
- data/test/network/xmlrpc/webrick_servlet.rb +26 -0
- data/test/other/dsl.rb +218 -0
- data/test/other/events.rb +22 -15
- data/test/other/overrides.rb +9 -14
- data/test/other/pgraph.rb +289 -0
- data/test/other/propertychange.rb +142 -0
- data/test/other/provider.rb +162 -0
- data/test/other/puppet.rb +63 -10
- data/test/other/relationship.rb +74 -0
- data/test/other/relationships.rb +199 -123
- data/test/other/report.rb +152 -23
- data/test/other/transactions.rb +824 -78
- data/test/puppet/conffiles.rb +16 -11
- data/test/puppet/defaults.rb +7 -10
- data/test/puppet/{error.rb → errortest.rb} +5 -8
- data/test/puppet/modules.rb +58 -0
- data/test/puppet/tc_suidmanager.rb +107 -0
- data/test/rails/host.rb +177 -0
- data/test/rails/rails.rb +27 -0
- data/test/rails/railsparameter.rb +62 -0
- data/test/rails/railsresource.rb +100 -0
- data/test/ral/manager/attributes.rb +296 -0
- data/test/ral/manager/manager.rb +55 -0
- data/test/ral/manager/provider.rb +54 -0
- data/test/ral/manager/type.rb +837 -0
- data/test/ral/providers/cron/crontab.rb +346 -0
- data/test/ral/providers/group.rb +252 -0
- data/test/ral/providers/host/netinfo.rb +58 -0
- data/test/ral/providers/host/parsed.rb +226 -0
- data/test/ral/providers/mount/netinfo.rb +80 -0
- data/test/ral/providers/mount/parsed.rb +223 -0
- data/test/ral/providers/nameservice.rb +33 -0
- data/test/ral/providers/package.rb +253 -0
- data/test/ral/providers/package/apt.rb +89 -0
- data/test/ral/providers/package/aptitude.rb +69 -0
- data/test/ral/providers/package/aptrpm.rb +89 -0
- data/test/ral/providers/package/dpkg.rb +64 -0
- data/test/ral/providers/parsedfile.rb +668 -0
- data/test/ral/providers/parsedport.rb +233 -0
- data/test/ral/providers/provider.rb +423 -0
- data/test/{types → ral/providers}/service.rb +20 -121
- data/test/ral/providers/service/base.rb +75 -0
- data/test/ral/providers/sshkey/parsed.rb +111 -0
- data/test/ral/providers/user.rb +567 -0
- data/test/ral/providers/user/useradd.rb +250 -0
- data/test/ral/types/basic.rb +90 -0
- data/test/ral/types/component.rb +113 -0
- data/test/ral/types/cron.rb +480 -0
- data/test/{types → ral/types}/exec.rb +278 -82
- data/test/ral/types/file.rb +1799 -0
- data/test/ral/types/file/target.rb +363 -0
- data/test/{types → ral/types}/filebucket.rb +15 -17
- data/test/{types → ral/types}/fileignoresource.rb +9 -15
- data/test/ral/types/filesources.rb +1046 -0
- data/test/ral/types/group.rb +169 -0
- data/test/ral/types/host.rb +155 -0
- data/test/ral/types/mount.rb +312 -0
- data/test/ral/types/package.rb +85 -0
- data/test/ral/types/parameter.rb +172 -0
- data/test/ral/types/port.rb +148 -0
- data/test/ral/types/property.rb +343 -0
- data/test/ral/types/resources.rb +221 -0
- data/test/{types → ral/types}/schedule.rb +34 -12
- data/test/ral/types/service.rb +37 -0
- data/test/{types → ral/types}/sshkey.rb +75 -65
- data/test/ral/types/tidy.rb +240 -0
- data/test/ral/types/user.rb +493 -0
- data/test/{types → ral/types}/yumrepo.rb +7 -11
- data/test/{types → ral/types}/zone.rb +45 -45
- data/test/tagging/tagging.rb +17 -26
- data/test/util/autoload.rb +130 -0
- data/test/util/classgen.rb +227 -0
- data/test/{other → util}/config.rb +373 -113
- data/test/util/execution.rb +34 -0
- data/test/util/features.rb +94 -0
- data/test/util/fileparsing.rb +677 -0
- data/test/{other → util}/filetype.rb +9 -12
- data/test/util/graph.rb +108 -0
- data/test/{other → util}/inifile.rb +24 -11
- data/test/util/loadedfile.rb +106 -0
- data/test/{other → util}/log.rb +96 -50
- data/test/{other → util}/metrics.rb +7 -17
- data/test/util/package.rb +27 -0
- data/test/util/pidlock.rb +126 -0
- data/test/util/posixtest.rb +173 -0
- data/test/util/storage.rb +123 -0
- data/test/util/subclass_loader.rb +100 -0
- data/test/util/utiltest.rb +368 -0
- metadata +449 -169
- data/examples/code/classing +0 -35
- data/examples/code/failers/badclassnoparam +0 -10
- data/examples/code/failers/badclassparam +0 -10
- data/examples/code/failers/badcompnoparam +0 -9
- data/examples/code/failers/badcompparam +0 -9
- data/examples/code/failers/badtypeparam +0 -3
- data/examples/code/failers/noobjectrvalue +0 -1
- data/examples/code/snippets/aliastest.pp +0 -16
- data/examples/code/snippets/argumentdefaults +0 -14
- data/examples/code/snippets/casestatement.pp +0 -58
- data/examples/code/snippets/classheirarchy.pp +0 -15
- data/examples/code/snippets/classincludes.pp +0 -17
- data/examples/code/snippets/classpathtest +0 -11
- data/examples/code/snippets/componentmetaparams.pp +0 -11
- data/examples/code/snippets/deepclassheirarchy.pp +0 -23
- data/examples/code/snippets/defineoverrides.pp +0 -17
- data/examples/code/snippets/dirchmod +0 -19
- data/examples/code/snippets/emptyclass.pp +0 -9
- data/examples/code/snippets/emptyexec.pp +0 -3
- data/examples/code/snippets/failmissingexecpath.pp +0 -13
- data/examples/code/snippets/falsevalues.pp +0 -3
- data/examples/code/snippets/filecreate +0 -11
- data/examples/code/snippets/implicititeration +0 -15
- data/examples/code/snippets/multipleinstances +0 -7
- data/examples/code/snippets/namevartest +0 -9
- data/examples/code/snippets/scopetest +0 -13
- data/examples/code/snippets/selectorvalues.pp +0 -42
- data/examples/code/snippets/simpledefaults +0 -5
- data/examples/code/snippets/simpleselector +0 -38
- data/examples/code/snippets/singleary.pp +0 -19
- data/examples/code/snippets/singlequote.pp +0 -11
- data/examples/code/snippets/singleselector.pp +0 -22
- data/examples/code/snippets/tag.pp +0 -9
- data/examples/code/snippets/tagged.pp +0 -35
- data/lib/puppet/client.rb +0 -177
- data/lib/puppet/client/ca.rb +0 -21
- data/lib/puppet/client/dipper.rb +0 -76
- data/lib/puppet/client/file.rb +0 -20
- data/lib/puppet/client/log.rb +0 -17
- data/lib/puppet/client/master.rb +0 -531
- data/lib/puppet/client/runner.rb +0 -17
- data/lib/puppet/client/status.rb +0 -7
- data/lib/puppet/event-loop.rb +0 -1
- data/lib/puppet/filetype.rb +0 -308
- data/lib/puppet/inifile.rb +0 -201
- data/lib/puppet/log.rb +0 -524
- data/lib/puppet/metric.rb +0 -132
- data/lib/puppet/networkclient.rb +0 -175
- data/lib/puppet/parsedfile.rb +0 -58
- data/lib/puppet/parser/ast/classdef.rb +0 -79
- data/lib/puppet/parser/ast/compdef.rb +0 -75
- data/lib/puppet/parser/ast/nodedef.rb +0 -73
- data/lib/puppet/parser/ast/objectdef.rb +0 -284
- data/lib/puppet/parser/ast/objectref.rb +0 -77
- data/lib/puppet/rails/database.rb +0 -40
- data/lib/puppet/rails/rails_object.rb +0 -42
- data/lib/puppet/rails/rails_parameter.rb +0 -5
- data/lib/puppet/server.rb +0 -196
- data/lib/puppet/server/authconfig.rb +0 -177
- data/lib/puppet/server/authstore.rb +0 -226
- data/lib/puppet/server/filebucket.rb +0 -155
- data/lib/puppet/server/pelement.rb +0 -188
- data/lib/puppet/server/report.rb +0 -184
- data/lib/puppet/server/rights.rb +0 -78
- data/lib/puppet/server/servlet.rb +0 -274
- data/lib/puppet/statechange.rb +0 -129
- data/lib/puppet/storage.rb +0 -98
- data/lib/puppet/type/nameservice.rb +0 -264
- data/lib/puppet/type/nameservice/netinfo.rb +0 -232
- data/lib/puppet/type/nameservice/objectadd.rb +0 -146
- data/lib/puppet/type/nameservice/posix.rb +0 -12
- data/lib/puppet/type/nameservice/pw.rb +0 -107
- data/lib/puppet/type/package/apple.rb +0 -41
- data/lib/puppet/type/package/apt.rb +0 -107
- data/lib/puppet/type/package/blastwave.rb +0 -136
- data/lib/puppet/type/package/darwinport.rb +0 -97
- data/lib/puppet/type/package/dpkg.rb +0 -113
- data/lib/puppet/type/package/freebsd.rb +0 -19
- data/lib/puppet/type/package/gem.rb +0 -119
- data/lib/puppet/type/package/openbsd.rb +0 -112
- data/lib/puppet/type/package/ports.rb +0 -103
- data/lib/puppet/type/package/rpm.rb +0 -121
- data/lib/puppet/type/package/sun.rb +0 -174
- data/lib/puppet/type/package/sunfreeware.rb +0 -7
- data/lib/puppet/type/package/yum.rb +0 -52
- data/lib/puppet/type/parsedtype/host.rb +0 -144
- data/lib/puppet/type/parsedtype/mount.rb +0 -271
- data/lib/puppet/type/parsedtype/port.rb +0 -261
- data/lib/puppet/type/parsedtype/sshkey.rb +0 -123
- data/lib/puppet/type/service/base.rb +0 -12
- data/lib/puppet/type/service/debian.rb +0 -46
- data/lib/puppet/type/service/redhat.rb +0 -38
- data/lib/puppet/type/state.rb +0 -393
- data/lib/puppet/type/symlink.rb +0 -186
- data/test/client/master.rb +0 -207
- data/test/language/rails.rb +0 -105
- data/test/other/parsedfile.rb +0 -58
- data/test/other/storage.rb +0 -100
- data/test/puppet/utiltest.rb +0 -299
- data/test/puppettest.rb +0 -1170
- data/test/server/authconfig.rb +0 -56
- data/test/server/authstore.rb +0 -218
- data/test/server/master.rb +0 -201
- data/test/server/report.rb +0 -93
- data/test/server/rights.rb +0 -41
- data/test/server/server.rb +0 -152
- data/test/test +0 -61
- data/test/types/basic.rb +0 -117
- data/test/types/component.rb +0 -298
- data/test/types/cron.rb +0 -718
- data/test/types/file.rb +0 -1314
- data/test/types/filesources.rb +0 -590
- data/test/types/group.rb +0 -323
- data/test/types/host.rb +0 -186
- data/test/types/mount.rb +0 -294
- data/test/types/package.rb +0 -538
- data/test/types/parameter.rb +0 -107
- data/test/types/port.rb +0 -201
- data/test/types/query.rb +0 -101
- data/test/types/state.rb +0 -92
- data/test/types/symlink.rb +0 -120
- data/test/types/tidy.rb +0 -102
- data/test/types/type.rb +0 -469
- data/test/types/user.rb +0 -563
|
@@ -1,24 +1,27 @@
|
|
|
1
|
-
#!/usr/bin/ruby
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
2
|
|
|
3
|
-
if __FILE__
|
|
4
|
-
$:.unshift '../../lib'
|
|
5
|
-
$:.unshift '..'
|
|
6
|
-
$puppetbase = "../.."
|
|
7
|
-
end
|
|
3
|
+
$:.unshift("../lib").unshift("../../lib") if __FILE__ =~ /\.rb$/
|
|
8
4
|
|
|
9
5
|
require 'facter'
|
|
10
6
|
|
|
11
7
|
require 'puppet'
|
|
12
8
|
require 'puppet/parser/interpreter'
|
|
13
9
|
require 'puppet/parser/parser'
|
|
14
|
-
require 'puppet/client'
|
|
10
|
+
require 'puppet/network/client'
|
|
15
11
|
require 'puppet/rails'
|
|
16
|
-
require 'test/unit'
|
|
17
12
|
require 'puppettest'
|
|
13
|
+
require 'puppettest/resourcetesting'
|
|
14
|
+
require 'puppettest/parsertesting'
|
|
15
|
+
require 'puppettest/servertest'
|
|
16
|
+
require 'puppettest/railstesting'
|
|
17
|
+
require 'timeout'
|
|
18
18
|
|
|
19
19
|
class TestInterpreter < Test::Unit::TestCase
|
|
20
|
-
include
|
|
21
|
-
|
|
20
|
+
include PuppetTest
|
|
21
|
+
include PuppetTest::ServerTest
|
|
22
|
+
include PuppetTest::ParserTesting
|
|
23
|
+
include PuppetTest::ResourceTesting
|
|
24
|
+
include PuppetTest::RailsTesting
|
|
22
25
|
AST = Puppet::Parser::AST
|
|
23
26
|
|
|
24
27
|
# create a simple manifest that uses nodes to create a file
|
|
@@ -73,7 +76,7 @@ class TestInterpreter < Test::Unit::TestCase
|
|
|
73
76
|
assert(config != newconfig, "Configs are somehow the same")
|
|
74
77
|
end
|
|
75
78
|
|
|
76
|
-
if
|
|
79
|
+
if Puppet.features.rails?
|
|
77
80
|
def test_hoststorage
|
|
78
81
|
assert_nothing_raised {
|
|
79
82
|
Puppet[:storeconfigs] = true
|
|
@@ -109,17 +112,10 @@ class TestInterpreter < Test::Unit::TestCase
|
|
|
109
112
|
end
|
|
110
113
|
|
|
111
114
|
if Facter["domain"].value == "madstop.com"
|
|
112
|
-
begin
|
|
113
|
-
require 'ldap'
|
|
114
|
-
$haveldap = true
|
|
115
|
-
rescue LoadError
|
|
116
|
-
$stderr.puts "Missing ldap; skipping ldap source tests"
|
|
117
|
-
$haveldap = false
|
|
118
|
-
end
|
|
119
115
|
|
|
120
116
|
# Only test ldap stuff on luke's network, since that's the only place we
|
|
121
117
|
# have data for.
|
|
122
|
-
if
|
|
118
|
+
if Puppet.features.ldap?
|
|
123
119
|
def ldapconnect
|
|
124
120
|
|
|
125
121
|
@ldap = LDAP::Conn.new("ldap", 389)
|
|
@@ -142,84 +138,67 @@ class TestInterpreter < Test::Unit::TestCase
|
|
|
142
138
|
return parent, classes
|
|
143
139
|
end
|
|
144
140
|
|
|
145
|
-
def
|
|
141
|
+
def test_ldapsearch
|
|
146
142
|
Puppet[:ldapbase] = "ou=hosts, dc=madstop, dc=com"
|
|
147
143
|
Puppet[:ldapnodes] = true
|
|
148
144
|
|
|
149
145
|
ldapconnect()
|
|
150
|
-
file = tempfile()
|
|
151
|
-
files = []
|
|
152
|
-
parentfile = tempfile() + "-parent"
|
|
153
|
-
files << parentfile
|
|
154
|
-
hostname = Facter["hostname"].value
|
|
155
|
-
lparent, lclasses = ldaphost(Facter["hostname"].value)
|
|
156
|
-
assert(lclasses, "Did not retrieve info from ldap")
|
|
157
|
-
File.open(file, "w") { |f|
|
|
158
|
-
f.puts "node #{lparent} {
|
|
159
|
-
file { \"#{parentfile}\": ensure => file }
|
|
160
|
-
}"
|
|
161
|
-
|
|
162
|
-
lclasses.each { |klass|
|
|
163
|
-
kfile = tempfile() + "-klass"
|
|
164
|
-
files << kfile
|
|
165
|
-
f.puts "class #{klass} { file { \"#{kfile}\": ensure => file } }"
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
interp = nil
|
|
169
|
-
assert_nothing_raised {
|
|
170
|
-
interp = Puppet::Parser::Interpreter.new(
|
|
171
|
-
:Manifest => file
|
|
172
|
-
)
|
|
173
|
-
}
|
|
174
146
|
|
|
175
|
-
|
|
176
|
-
classes = nil
|
|
177
|
-
# First make sure we get the default node for unknown hosts
|
|
178
|
-
dparent, dclasses = ldaphost("default")
|
|
147
|
+
interp = mkinterp :NodeSources => [:ldap, :code]
|
|
179
148
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
149
|
+
# Make sure we get nil and nil back when we search for something missing
|
|
150
|
+
parent, classes = nil
|
|
151
|
+
assert_nothing_raised do
|
|
152
|
+
parent, classes = interp.ldapsearch("nosuchhost")
|
|
153
|
+
end
|
|
183
154
|
|
|
184
|
-
|
|
185
|
-
|
|
155
|
+
assert_nil(parent, "Got a parent for a non-existent host")
|
|
156
|
+
assert_nil(classes, "Got classes for a non-existent host")
|
|
186
157
|
|
|
187
|
-
#
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
parent, classes = interp.nodesearch("noparent")
|
|
192
|
-
}
|
|
158
|
+
# Make sure we can find 'culain' in ldap
|
|
159
|
+
assert_nothing_raised do
|
|
160
|
+
parent, classes = interp.ldapsearch("culain")
|
|
161
|
+
end
|
|
193
162
|
|
|
194
|
-
|
|
195
|
-
assert_equal(
|
|
163
|
+
realparent, realclasses = ldaphost("culain")
|
|
164
|
+
assert_equal(realparent, parent)
|
|
165
|
+
assert_equal(realclasses, classes)
|
|
166
|
+
end
|
|
196
167
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
}
|
|
168
|
+
def test_ldapnodes
|
|
169
|
+
Puppet[:ldapbase] = "ou=hosts, dc=madstop, dc=com"
|
|
170
|
+
Puppet[:ldapnodes] = true
|
|
201
171
|
|
|
202
|
-
|
|
203
|
-
assert_equal(lclasses, classes, "Class list did not match")
|
|
172
|
+
ldapconnect()
|
|
204
173
|
|
|
205
|
-
|
|
206
|
-
assert_nothing_raised {
|
|
207
|
-
objects = interp.run(hostname, Puppet::Client::MasterClient.facts)
|
|
208
|
-
}
|
|
174
|
+
interp = mkinterp :NodeSources => [:ldap, :code]
|
|
209
175
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
comp = objects.to_type
|
|
213
|
-
}
|
|
176
|
+
# culain uses basenode, so create that
|
|
177
|
+
basenode = interp.newnode([:basenode])[0]
|
|
214
178
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
179
|
+
# Make sure we get nothing for nonexistent hosts
|
|
180
|
+
none = nil
|
|
181
|
+
assert_nothing_raised do
|
|
182
|
+
none = interp.nodesearch_ldap("nosuchhost")
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
assert_nil(none, "Got a node for a non-existent host")
|
|
186
|
+
|
|
187
|
+
# Make sure we can find 'culain' in ldap
|
|
188
|
+
culain = nil
|
|
189
|
+
assert_nothing_raised do
|
|
190
|
+
culain = interp.nodesearch_ldap("culain")
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
assert(culain, "Did not find culain in ldap")
|
|
194
|
+
|
|
195
|
+
assert_nothing_raised do
|
|
196
|
+
assert_equal(basenode.fqname.to_s, culain.parentclass.fqname.to_s,
|
|
197
|
+
"Did not get parent class")
|
|
198
|
+
end
|
|
220
199
|
end
|
|
221
200
|
|
|
222
|
-
if
|
|
201
|
+
if Puppet::Util::SUIDManager.uid == 0 and Facter["hostname"].value == "culain"
|
|
223
202
|
def test_ldapreconnect
|
|
224
203
|
Puppet[:ldapbase] = "ou=hosts, dc=madstop, dc=com"
|
|
225
204
|
Puppet[:ldapnodes] = true
|
|
@@ -265,56 +244,846 @@ class TestInterpreter < Test::Unit::TestCase
|
|
|
265
244
|
$stderr.puts "Not in madstop.com; skipping ldap tests"
|
|
266
245
|
end
|
|
267
246
|
|
|
247
|
+
# Test that node info and default node info in different sources isn't
|
|
248
|
+
# bad.
|
|
249
|
+
def test_multiple_nodesources
|
|
250
|
+
|
|
251
|
+
# Create another node source
|
|
252
|
+
Puppet::Parser::Interpreter.send(:define_method, :nodesearch_multi) do |*names|
|
|
253
|
+
if names[0] == "default"
|
|
254
|
+
gennode("default", {:facts => {}})
|
|
255
|
+
else
|
|
256
|
+
nil
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
interp = mkinterp :NodeSources => [:multi, :code]
|
|
261
|
+
|
|
262
|
+
interp.newnode(["node"])
|
|
263
|
+
|
|
264
|
+
obj = nil
|
|
265
|
+
assert_nothing_raised do
|
|
266
|
+
obj = interp.nodesearch("node")
|
|
267
|
+
end
|
|
268
|
+
assert(obj, "Did not find node")
|
|
269
|
+
assert_equal("node", obj.fqname)
|
|
270
|
+
end
|
|
271
|
+
|
|
268
272
|
# Make sure searchnode behaves as we expect.
|
|
269
273
|
def test_nodesearch
|
|
270
|
-
#
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
274
|
+
# We use two sources here to catch a weird bug where the default
|
|
275
|
+
# node is used if the host isn't in the first source.
|
|
276
|
+
interp = mkinterp
|
|
277
|
+
|
|
278
|
+
# Make some nodes
|
|
279
|
+
names = %w{node1 node2 node2.domain.com}
|
|
280
|
+
interp.newnode names
|
|
281
|
+
interp.newnode %w{default}
|
|
282
|
+
|
|
283
|
+
nodes = {}
|
|
284
|
+
# Make sure we can find them all, using the direct method
|
|
285
|
+
names.each do |name|
|
|
286
|
+
nodes[name] = interp.nodesearch_code(name)
|
|
287
|
+
assert(nodes[name], "Could not find %s" % name)
|
|
288
|
+
nodes[name].file = __FILE__
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
# Now let's try it with the nodesearch method
|
|
292
|
+
names.each do |name|
|
|
293
|
+
node = interp.nodesearch(name)
|
|
294
|
+
assert(node, "Could not find #{name} via nodesearch")
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
# Make sure we find the default node when we search for nonexistent nodes
|
|
298
|
+
assert_nothing_raised do
|
|
299
|
+
default = interp.nodesearch("nosuchnode")
|
|
300
|
+
assert(default, "Did not find default node")
|
|
301
|
+
assert_equal("default", default.fqname)
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
# Now make sure the longest match always wins
|
|
305
|
+
node = interp.nodesearch(*%w{node2 node2.domain.com})
|
|
306
|
+
|
|
307
|
+
assert(node, "Did not find node2")
|
|
308
|
+
assert_equal("node2.domain.com", node.fqname,
|
|
309
|
+
"Did not get longest match")
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
def test_parsedate
|
|
313
|
+
Puppet[:filetimeout] = 0
|
|
314
|
+
main = tempfile()
|
|
315
|
+
sub = tempfile()
|
|
316
|
+
mainfile = tempfile()
|
|
317
|
+
subfile = tempfile()
|
|
318
|
+
count = 0
|
|
319
|
+
updatemain = proc do
|
|
320
|
+
count += 1
|
|
321
|
+
File.open(main, "w") { |f|
|
|
322
|
+
f.puts "import '#{sub}'
|
|
323
|
+
file { \"#{mainfile}\": content => #{count} }
|
|
324
|
+
"
|
|
325
|
+
}
|
|
326
|
+
end
|
|
327
|
+
updatesub = proc do
|
|
328
|
+
count += 1
|
|
329
|
+
File.open(sub, "w") { |f|
|
|
330
|
+
f.puts "file { \"#{subfile}\": content => #{count} }
|
|
331
|
+
"
|
|
332
|
+
}
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
updatemain.call
|
|
336
|
+
updatesub.call
|
|
337
|
+
|
|
338
|
+
interp = Puppet::Parser::Interpreter.new(
|
|
339
|
+
:Manifest => main,
|
|
340
|
+
:Local => true
|
|
341
|
+
)
|
|
342
|
+
|
|
343
|
+
date = interp.parsedate
|
|
344
|
+
|
|
345
|
+
# Now update the site file and make sure we catch it
|
|
346
|
+
sleep 1
|
|
347
|
+
updatemain.call
|
|
348
|
+
newdate = interp.parsedate
|
|
349
|
+
assert(date != newdate, "Parsedate was not updated")
|
|
350
|
+
date = newdate
|
|
351
|
+
|
|
352
|
+
# And then the subfile
|
|
353
|
+
sleep 1
|
|
354
|
+
updatesub.call
|
|
355
|
+
newdate = interp.parsedate
|
|
356
|
+
assert(date != newdate, "Parsedate was not updated")
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
# Make sure our node gets added to the node table.
|
|
360
|
+
def test_newnode
|
|
361
|
+
interp = mkinterp
|
|
362
|
+
|
|
363
|
+
# First just try calling it directly
|
|
287
364
|
assert_nothing_raised {
|
|
288
|
-
interp
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
365
|
+
interp.newnode("mynode", :code => :yay)
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
assert_equal(:yay, interp.nodesearch_code("mynode").code)
|
|
369
|
+
|
|
370
|
+
# Now make sure that trying to redefine it throws an error.
|
|
371
|
+
assert_raise(Puppet::ParseError) {
|
|
372
|
+
interp.newnode("mynode", {})
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
# Now try one with no code
|
|
376
|
+
assert_nothing_raised {
|
|
377
|
+
interp.newnode("simplenode", :parent => :foo)
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
# Make sure trying to get the parentclass throws an error
|
|
381
|
+
assert_raise(Puppet::ParseError) do
|
|
382
|
+
interp.nodesearch_code("simplenode").parentclass
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
# Now define the parent node
|
|
386
|
+
interp.newnode(:foo)
|
|
387
|
+
|
|
388
|
+
# And make sure we get things back correctly
|
|
389
|
+
assert_equal("foo", interp.nodesearch_code("simplenode").parentclass.fqname)
|
|
390
|
+
assert_nil(interp.nodesearch_code("simplenode").code)
|
|
391
|
+
|
|
392
|
+
# Now make sure that trying to redefine it throws an error.
|
|
393
|
+
assert_raise(Puppet::ParseError) {
|
|
394
|
+
interp.newnode("mynode", {})
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
# Test multiple names
|
|
398
|
+
names = ["one", "two", "three"]
|
|
399
|
+
assert_nothing_raised {
|
|
400
|
+
interp.newnode(names, {:code => :yay, :parent => :foo})
|
|
292
401
|
}
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
402
|
+
|
|
403
|
+
names.each do |name|
|
|
404
|
+
assert_equal(:yay, interp.nodesearch_code(name).code)
|
|
405
|
+
assert_equal("foo", interp.nodesearch_code(name).parentclass.name)
|
|
406
|
+
# Now make sure that trying to redefine it throws an error.
|
|
407
|
+
assert_raise(Puppet::ParseError) {
|
|
408
|
+
interp.newnode(name, {})
|
|
409
|
+
}
|
|
410
|
+
end
|
|
411
|
+
end
|
|
412
|
+
|
|
413
|
+
# Make sure we're correctly generating a node definition.
|
|
414
|
+
def test_gennode
|
|
415
|
+
interp = mkinterp
|
|
416
|
+
|
|
417
|
+
interp.newnode "base"
|
|
418
|
+
interp.newclass "yaytest"
|
|
419
|
+
|
|
420
|
+
# Go through the different iterations:
|
|
421
|
+
[
|
|
422
|
+
[nil, "yaytest"],
|
|
423
|
+
[nil, ["yaytest"]],
|
|
424
|
+
[nil, nil],
|
|
425
|
+
[nil, []],
|
|
426
|
+
["base", nil],
|
|
427
|
+
["base", []],
|
|
428
|
+
["base", "yaytest"],
|
|
429
|
+
["base", ["yaytest"]]
|
|
430
|
+
].each do |parent, classes|
|
|
431
|
+
node = nil
|
|
432
|
+
assert_nothing_raised {
|
|
433
|
+
node = interp.gennode("nodeA", :classes => classes,
|
|
434
|
+
:parentnode => parent)
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
assert_instance_of(Puppet::Parser::AST::Node, node)
|
|
438
|
+
|
|
439
|
+
assert_equal("nodeA", node.name)
|
|
440
|
+
|
|
441
|
+
scope = mkscope :interp => interp
|
|
442
|
+
|
|
315
443
|
assert_nothing_raised do
|
|
316
|
-
|
|
444
|
+
node.evaluate :scope => scope
|
|
445
|
+
end
|
|
446
|
+
|
|
447
|
+
# If there's a parent, make sure it got evaluated
|
|
448
|
+
if parent
|
|
449
|
+
assert(scope.classlist.include?("base"),
|
|
450
|
+
"Did not evaluate parent node")
|
|
451
|
+
end
|
|
452
|
+
|
|
453
|
+
# If there are classes make sure they got evaluated
|
|
454
|
+
if classes == ["yaytest"] or classes == "yaytest"
|
|
455
|
+
assert(scope.classlist.include?("yaytest"),
|
|
456
|
+
"Did not evaluate class")
|
|
457
|
+
end
|
|
458
|
+
end
|
|
459
|
+
end
|
|
460
|
+
|
|
461
|
+
def test_fqfind
|
|
462
|
+
interp = mkinterp
|
|
463
|
+
|
|
464
|
+
table = {}
|
|
465
|
+
# Define a bunch of things.
|
|
466
|
+
%w{a c a::b a::b::c a::c a::b::c::d a::b::c::d::e::f c::d}.each do |string|
|
|
467
|
+
table[string] = string
|
|
468
|
+
end
|
|
469
|
+
|
|
470
|
+
check = proc do |namespace, hash|
|
|
471
|
+
hash.each do |thing, result|
|
|
472
|
+
assert_equal(result, interp.fqfind(namespace, thing, table),
|
|
473
|
+
"Could not find %s in %s" % [thing, namespace])
|
|
474
|
+
end
|
|
475
|
+
end
|
|
476
|
+
|
|
477
|
+
# Now let's do some test lookups.
|
|
478
|
+
|
|
479
|
+
# First do something really simple
|
|
480
|
+
check.call "a", "b" => "a::b", "b::c" => "a::b::c", "d" => nil, "::c" => "c"
|
|
481
|
+
|
|
482
|
+
check.call "a::b", "c" => "a::b::c", "b" => "a::b", "a" => "a"
|
|
483
|
+
|
|
484
|
+
check.call "a::b::c::d::e", "c" => "a::b::c", "::c" => "c",
|
|
485
|
+
"c::d" => "a::b::c::d", "::c::d" => "c::d"
|
|
486
|
+
|
|
487
|
+
check.call "", "a" => "a", "a::c" => "a::c"
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
def test_newdefine
|
|
491
|
+
interp = mkinterp
|
|
492
|
+
|
|
493
|
+
assert_nothing_raised {
|
|
494
|
+
interp.newdefine("mydefine", :code => :yay,
|
|
495
|
+
:arguments => ["a", stringobj("b")])
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
mydefine = interp.finddefine("", "mydefine")
|
|
499
|
+
assert(mydefine, "Could not find definition")
|
|
500
|
+
assert_equal("mydefine", interp.finddefine("", "mydefine").type)
|
|
501
|
+
assert_equal("", mydefine.namespace)
|
|
502
|
+
assert_equal("mydefine", mydefine.type)
|
|
503
|
+
|
|
504
|
+
assert_raise(Puppet::ParseError) do
|
|
505
|
+
interp.newdefine("mydefine", :code => :yay,
|
|
506
|
+
:arguments => ["a", stringobj("b")])
|
|
507
|
+
end
|
|
508
|
+
|
|
509
|
+
# Now define the same thing in a different scope
|
|
510
|
+
assert_nothing_raised {
|
|
511
|
+
interp.newdefine("other::mydefine", :code => :other,
|
|
512
|
+
:arguments => ["a", stringobj("b")])
|
|
513
|
+
}
|
|
514
|
+
other = interp.finddefine("other", "mydefine")
|
|
515
|
+
assert(other, "Could not find definition")
|
|
516
|
+
assert(interp.finddefine("", "other::mydefine"),
|
|
517
|
+
"Could not find other::mydefine")
|
|
518
|
+
assert_equal(:other, other.code)
|
|
519
|
+
assert_equal("other", other.namespace)
|
|
520
|
+
assert_equal("mydefine", other.type)
|
|
521
|
+
assert_equal("other::mydefine", other.fqname)
|
|
522
|
+
end
|
|
523
|
+
|
|
524
|
+
def test_newclass
|
|
525
|
+
interp = mkinterp
|
|
526
|
+
|
|
527
|
+
mkcode = proc do |ary|
|
|
528
|
+
classes = ary.collect do |string|
|
|
529
|
+
AST::FlatString.new(:value => string)
|
|
530
|
+
end
|
|
531
|
+
AST::ASTArray.new(:children => classes)
|
|
532
|
+
end
|
|
533
|
+
scope = Puppet::Parser::Scope.new(:interp => interp)
|
|
534
|
+
|
|
535
|
+
# First make sure that code is being appended
|
|
536
|
+
code = mkcode.call(%w{original code})
|
|
537
|
+
|
|
538
|
+
klass = nil
|
|
539
|
+
assert_nothing_raised {
|
|
540
|
+
klass = interp.newclass("myclass", :code => code)
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
assert(klass, "Did not return class")
|
|
544
|
+
|
|
545
|
+
assert(interp.findclass("", "myclass"), "Could not find definition")
|
|
546
|
+
assert_equal("myclass", interp.findclass("", "myclass").type)
|
|
547
|
+
assert_equal(%w{original code},
|
|
548
|
+
interp.findclass("", "myclass").code.evaluate(:scope => scope))
|
|
549
|
+
|
|
550
|
+
# Now create the same class name in a different scope
|
|
551
|
+
assert_nothing_raised {
|
|
552
|
+
klass = interp.newclass("other::myclass",
|
|
553
|
+
:code => mkcode.call(%w{something diff}))
|
|
554
|
+
}
|
|
555
|
+
assert(klass, "Did not return class")
|
|
556
|
+
other = interp.findclass("other", "myclass")
|
|
557
|
+
assert(other, "Could not find class")
|
|
558
|
+
assert(interp.findclass("", "other::myclass"), "Could not find class")
|
|
559
|
+
assert_equal("other::myclass", other.fqname)
|
|
560
|
+
assert_equal("other::myclass", other.namespace)
|
|
561
|
+
assert_equal("myclass", other.type)
|
|
562
|
+
assert_equal(%w{something diff},
|
|
563
|
+
interp.findclass("other", "myclass").code.evaluate(:scope => scope))
|
|
564
|
+
|
|
565
|
+
# Newclass behaves differently than the others -- it just appends
|
|
566
|
+
# the code to the existing class.
|
|
567
|
+
code = mkcode.call(%w{something new})
|
|
568
|
+
assert_nothing_raised do
|
|
569
|
+
klass = interp.newclass("myclass", :code => code)
|
|
570
|
+
end
|
|
571
|
+
assert(klass, "Did not return class when appending")
|
|
572
|
+
assert_equal(%w{original code something new},
|
|
573
|
+
interp.findclass("", "myclass").code.evaluate(:scope => scope))
|
|
574
|
+
|
|
575
|
+
# Make sure newclass deals correctly with nodes with no code
|
|
576
|
+
klass = interp.newclass("nocode")
|
|
577
|
+
assert(klass, "Did not return class")
|
|
578
|
+
|
|
579
|
+
assert_nothing_raised do
|
|
580
|
+
klass = interp.newclass("nocode", :code => mkcode.call(%w{yay test}))
|
|
581
|
+
end
|
|
582
|
+
assert(klass, "Did not return class with no code")
|
|
583
|
+
assert_equal(%w{yay test},
|
|
584
|
+
interp.findclass("", "nocode").code.evaluate(:scope => scope))
|
|
585
|
+
|
|
586
|
+
# Then try merging something into nothing
|
|
587
|
+
interp.newclass("nocode2", :code => mkcode.call(%w{foo test}))
|
|
588
|
+
assert(klass, "Did not return class with no code")
|
|
589
|
+
|
|
590
|
+
assert_nothing_raised do
|
|
591
|
+
klass = interp.newclass("nocode2")
|
|
592
|
+
end
|
|
593
|
+
assert(klass, "Did not return class with no code")
|
|
594
|
+
assert_equal(%w{foo test},
|
|
595
|
+
interp.findclass("", "nocode2").code.evaluate(:scope => scope))
|
|
596
|
+
|
|
597
|
+
# And lastly, nothing and nothing
|
|
598
|
+
klass = interp.newclass("nocode3")
|
|
599
|
+
assert(klass, "Did not return class with no code")
|
|
600
|
+
|
|
601
|
+
assert_nothing_raised do
|
|
602
|
+
klass = interp.newclass("nocode3")
|
|
603
|
+
end
|
|
604
|
+
assert(klass, "Did not return class with no code")
|
|
605
|
+
assert_nil(interp.findclass("", "nocode3").code)
|
|
606
|
+
end
|
|
607
|
+
|
|
608
|
+
# Make sure class, node, and define methods are case-insensitive
|
|
609
|
+
def test_structure_case_insensitivity
|
|
610
|
+
interp = mkinterp
|
|
611
|
+
|
|
612
|
+
result = nil
|
|
613
|
+
assert_nothing_raised do
|
|
614
|
+
result = interp.newclass "Yayness"
|
|
615
|
+
end
|
|
616
|
+
assert_equal(result, interp.findclass("", "yayNess"))
|
|
617
|
+
|
|
618
|
+
assert_nothing_raised do
|
|
619
|
+
result = interp.newdefine "FunTest"
|
|
620
|
+
end
|
|
621
|
+
assert_equal(result, interp.finddefine("", "fUntEst"),
|
|
622
|
+
"%s was not matched" % "fUntEst")
|
|
623
|
+
|
|
624
|
+
assert_nothing_raised do
|
|
625
|
+
result = interp.newnode("MyNode").shift
|
|
626
|
+
end
|
|
627
|
+
assert_equal(result, interp.nodesearch("mYnOde"),
|
|
628
|
+
"mYnOde was not matched")
|
|
629
|
+
|
|
630
|
+
assert_nothing_raised do
|
|
631
|
+
result = interp.newnode("YayTest.Domain.Com").shift
|
|
632
|
+
end
|
|
633
|
+
assert_equal(result, interp.nodesearch("yaYtEst.domAin.cOm"),
|
|
634
|
+
"yaYtEst.domAin.cOm was not matched")
|
|
635
|
+
end
|
|
636
|
+
|
|
637
|
+
# Now make sure we get appropriate behaviour with parent class conflicts.
|
|
638
|
+
def test_newclass_parentage
|
|
639
|
+
interp = mkinterp
|
|
640
|
+
interp.newclass("base1")
|
|
641
|
+
interp.newclass("one::two::three")
|
|
642
|
+
|
|
643
|
+
# First create it with no parentclass.
|
|
644
|
+
assert_nothing_raised {
|
|
645
|
+
interp.newclass("sub")
|
|
646
|
+
}
|
|
647
|
+
assert(interp.findclass("", "sub"), "Could not find definition")
|
|
648
|
+
assert_nil(interp.findclass("", "sub").parentclass)
|
|
649
|
+
|
|
650
|
+
# Make sure we can't set the parent class to ourself.
|
|
651
|
+
assert_raise(Puppet::ParseError) {
|
|
652
|
+
interp.newclass("sub", :parent => "sub")
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
# Now create another one, with a parentclass.
|
|
656
|
+
assert_nothing_raised {
|
|
657
|
+
interp.newclass("sub", :parent => "base1")
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
# Make sure we get the right parent class, and make sure it's an object.
|
|
661
|
+
assert_equal(interp.findclass("", "base1"),
|
|
662
|
+
interp.findclass("", "sub").parentclass)
|
|
663
|
+
|
|
664
|
+
# Now make sure we get a failure if we try to conflict.
|
|
665
|
+
assert_raise(Puppet::ParseError) {
|
|
666
|
+
interp.newclass("sub", :parent => "one::two::three")
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
# Make sure that failure didn't screw us up in any way.
|
|
670
|
+
assert_equal(interp.findclass("", "base1"),
|
|
671
|
+
interp.findclass("", "sub").parentclass)
|
|
672
|
+
# But make sure we can create a class with a fq parent
|
|
673
|
+
assert_nothing_raised {
|
|
674
|
+
interp.newclass("another", :parent => "one::two::three")
|
|
675
|
+
}
|
|
676
|
+
assert_equal(interp.findclass("", "one::two::three"),
|
|
677
|
+
interp.findclass("", "another").parentclass)
|
|
678
|
+
|
|
679
|
+
end
|
|
680
|
+
|
|
681
|
+
def test_namesplit
|
|
682
|
+
interp = mkinterp
|
|
683
|
+
|
|
684
|
+
assert_nothing_raised do
|
|
685
|
+
{"base::sub" => %w{base sub},
|
|
686
|
+
"main" => ["", "main"],
|
|
687
|
+
"one::two::three::four" => ["one::two::three", "four"],
|
|
688
|
+
}.each do |name, ary|
|
|
689
|
+
result = interp.namesplit(name)
|
|
690
|
+
assert_equal(ary, result, "%s split to %s" % [name, result])
|
|
691
|
+
end
|
|
692
|
+
end
|
|
693
|
+
end
|
|
694
|
+
|
|
695
|
+
# Make sure you can't have classes and defines with the same name in the
|
|
696
|
+
# same scope.
|
|
697
|
+
def test_classes_beat_defines
|
|
698
|
+
interp = mkinterp
|
|
699
|
+
|
|
700
|
+
assert_nothing_raised {
|
|
701
|
+
interp.newclass("yay::funtest")
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
assert_raise(Puppet::ParseError) do
|
|
705
|
+
interp.newdefine("yay::funtest")
|
|
706
|
+
end
|
|
707
|
+
|
|
708
|
+
assert_nothing_raised {
|
|
709
|
+
interp.newdefine("yay::yaytest")
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
assert_raise(Puppet::ParseError) do
|
|
713
|
+
interp.newclass("yay::yaytest")
|
|
714
|
+
end
|
|
715
|
+
end
|
|
716
|
+
|
|
717
|
+
# Make sure our whole chain works.
|
|
718
|
+
def test_evaluate
|
|
719
|
+
interp, scope, source = mkclassframing
|
|
720
|
+
|
|
721
|
+
# Create a define that we'll be using
|
|
722
|
+
interp.newdefine("wrapper", :code => AST::ASTArray.new(:children => [
|
|
723
|
+
resourcedef("file", varref("name"), "owner" => "root")
|
|
724
|
+
]))
|
|
725
|
+
|
|
726
|
+
# Now create a resource that uses that define
|
|
727
|
+
define = mkresource(:type => "wrapper", :title => "/tmp/testing",
|
|
728
|
+
:scope => scope, :source => source, :params => :none)
|
|
729
|
+
|
|
730
|
+
scope.setresource define
|
|
731
|
+
|
|
732
|
+
# And a normal resource
|
|
733
|
+
scope.setresource mkresource(:type => "file", :title => "/tmp/rahness",
|
|
734
|
+
:scope => scope, :source => source,
|
|
735
|
+
:params => {:owner => "root"})
|
|
736
|
+
|
|
737
|
+
# Now evaluate everything
|
|
738
|
+
objects = nil
|
|
739
|
+
interp.usenodes = false
|
|
740
|
+
assert_nothing_raised do
|
|
741
|
+
objects = interp.evaluate(nil, {})
|
|
742
|
+
end
|
|
743
|
+
|
|
744
|
+
assert_instance_of(Puppet::TransBucket, objects)
|
|
745
|
+
end
|
|
746
|
+
|
|
747
|
+
# Test evaliterate. It's a very simple method, but it's pretty tough
|
|
748
|
+
# to test. It iterates over collections and instances of defined types
|
|
749
|
+
# until there's no more work to do.
|
|
750
|
+
def test_evaliterate
|
|
751
|
+
interp, scope, source = mkclassframing
|
|
752
|
+
|
|
753
|
+
# Create a top-level definition that creates a builtin object
|
|
754
|
+
interp.newdefine("one", :arguments => [%w{owner}],
|
|
755
|
+
:code => AST::ASTArray.new(:children => [
|
|
756
|
+
resourcedef("file", varref("name"),
|
|
757
|
+
"owner" => varref("owner")
|
|
758
|
+
)
|
|
759
|
+
])
|
|
760
|
+
)
|
|
761
|
+
|
|
762
|
+
# Create another definition to call that one
|
|
763
|
+
interp.newdefine("two", :arguments => [%w{owner}],
|
|
764
|
+
:code => AST::ASTArray.new(:children => [
|
|
765
|
+
resourcedef("one", varref("name"),
|
|
766
|
+
"owner" => varref("owner")
|
|
767
|
+
)
|
|
768
|
+
])
|
|
769
|
+
)
|
|
770
|
+
|
|
771
|
+
# And then a third
|
|
772
|
+
interp.newdefine("three", :arguments => [%w{owner}],
|
|
773
|
+
:code => AST::ASTArray.new(:children => [
|
|
774
|
+
resourcedef("two", varref("name"),
|
|
775
|
+
"owner" => varref("owner")
|
|
776
|
+
)
|
|
777
|
+
])
|
|
778
|
+
)
|
|
779
|
+
|
|
780
|
+
# And create a definition that creates a virtual resource
|
|
781
|
+
interp.newdefine("virtualizer", :arguments => [%w{owner}],
|
|
782
|
+
:code => AST::ASTArray.new(:children => [
|
|
783
|
+
virt_resourcedef("one", varref("name"),
|
|
784
|
+
"owner" => varref("owner")
|
|
785
|
+
)
|
|
786
|
+
])
|
|
787
|
+
)
|
|
788
|
+
|
|
789
|
+
# Now create an instance of three
|
|
790
|
+
three = Puppet::Parser::Resource.new(
|
|
791
|
+
:type => "three", :title => "one",
|
|
792
|
+
:scope => scope, :source => source,
|
|
793
|
+
:params => paramify(source, :owner => "root")
|
|
794
|
+
)
|
|
795
|
+
scope.setresource(three)
|
|
796
|
+
|
|
797
|
+
# An instance of the virtualizer
|
|
798
|
+
virt = Puppet::Parser::Resource.new(
|
|
799
|
+
:type => "virtualizer", :title => "two",
|
|
800
|
+
:scope => scope, :source => source,
|
|
801
|
+
:params => paramify(source, :owner => "root")
|
|
802
|
+
)
|
|
803
|
+
scope.setresource(virt)
|
|
804
|
+
|
|
805
|
+
# And a virtual instance of three
|
|
806
|
+
virt_three = Puppet::Parser::Resource.new(
|
|
807
|
+
:type => "three", :title => "three",
|
|
808
|
+
:scope => scope, :source => source,
|
|
809
|
+
:params => paramify(source, :owner => "root")
|
|
810
|
+
)
|
|
811
|
+
virt_three.virtual = true
|
|
812
|
+
scope.setresource(virt_three)
|
|
813
|
+
|
|
814
|
+
# Create a normal, virtual resource
|
|
815
|
+
plainvirt = Puppet::Parser::Resource.new(
|
|
816
|
+
:type => "user", :title => "five",
|
|
817
|
+
:scope => scope, :source => source,
|
|
818
|
+
:params => paramify(source, :uid => "root")
|
|
819
|
+
)
|
|
820
|
+
plainvirt.virtual = true
|
|
821
|
+
scope.setresource(plainvirt)
|
|
822
|
+
|
|
823
|
+
# Now create some collections for our virtual resources
|
|
824
|
+
%w{Three[three] One[two]}.each do |ref|
|
|
825
|
+
coll = Puppet::Parser::Collector.new(scope, "file", nil, nil, :virtual)
|
|
826
|
+
coll.resources = [ref]
|
|
827
|
+
scope.newcollection(coll)
|
|
828
|
+
end
|
|
829
|
+
|
|
830
|
+
# And create a generic user collector for our plain resource
|
|
831
|
+
coll = Puppet::Parser::Collector.new(scope, "user", nil, nil, :virtual)
|
|
832
|
+
scope.newcollection(coll)
|
|
833
|
+
|
|
834
|
+
ret = nil
|
|
835
|
+
assert_nothing_raised do
|
|
836
|
+
ret = scope.unevaluated
|
|
837
|
+
end
|
|
838
|
+
|
|
839
|
+
|
|
840
|
+
assert_instance_of(Array, ret)
|
|
841
|
+
assert_equal(3, ret.length,
|
|
842
|
+
"did not get the correct number of unevaled resources")
|
|
843
|
+
|
|
844
|
+
# Now translate the whole tree
|
|
845
|
+
assert_nothing_raised do
|
|
846
|
+
Timeout::timeout(2) do
|
|
847
|
+
interp.evaliterate(scope)
|
|
848
|
+
end
|
|
849
|
+
end
|
|
850
|
+
|
|
851
|
+
# Now make sure we've got all of our files
|
|
852
|
+
%w{one two three}.each do |name|
|
|
853
|
+
file = scope.findresource("File[%s]" % name)
|
|
854
|
+
assert(file, "Could not find file %s" % name)
|
|
855
|
+
|
|
856
|
+
assert_equal("root", file[:owner])
|
|
857
|
+
assert(! file.virtual?, "file %s is still virtual" % name)
|
|
858
|
+
end
|
|
859
|
+
|
|
860
|
+
# Now make sure we found the user
|
|
861
|
+
assert(! plainvirt.virtual?, "user was not realized")
|
|
862
|
+
end
|
|
863
|
+
|
|
864
|
+
# Make sure we fail if there are any leftover overrides to perform.
|
|
865
|
+
# This would normally mean that someone is trying to override an object
|
|
866
|
+
# that does not exist.
|
|
867
|
+
def test_failonleftovers
|
|
868
|
+
interp, scope, source = mkclassframing
|
|
869
|
+
|
|
870
|
+
# Make sure we don't fail, since there are no overrides
|
|
871
|
+
assert_nothing_raised do
|
|
872
|
+
interp.failonleftovers(scope)
|
|
873
|
+
end
|
|
874
|
+
|
|
875
|
+
# Add an override, and make sure it causes a failure
|
|
876
|
+
over1 = mkresource :scope => scope, :source => source,
|
|
877
|
+
:params => {:one => "yay"}
|
|
878
|
+
|
|
879
|
+
scope.setoverride(over1)
|
|
880
|
+
|
|
881
|
+
assert_raise(Puppet::ParseError) do
|
|
882
|
+
interp.failonleftovers(scope)
|
|
883
|
+
end
|
|
884
|
+
|
|
885
|
+
# Make a new scope to test leftover collections
|
|
886
|
+
scope = mkscope :interp => interp
|
|
887
|
+
interp.meta_def(:check_resource_collections) do
|
|
888
|
+
raise ArgumentError, "yep"
|
|
889
|
+
end
|
|
890
|
+
|
|
891
|
+
assert_raise(ArgumentError, "did not call check_resource_colls") do
|
|
892
|
+
interp.failonleftovers(scope)
|
|
893
|
+
end
|
|
894
|
+
end
|
|
895
|
+
|
|
896
|
+
def test_evalnode
|
|
897
|
+
interp = mkinterp
|
|
898
|
+
interp.usenodes = false
|
|
899
|
+
scope = Parser::Scope.new(:interp => interp)
|
|
900
|
+
facts = Facter.to_hash
|
|
901
|
+
|
|
902
|
+
# First make sure we get no failures when client is nil
|
|
903
|
+
assert_nothing_raised do
|
|
904
|
+
interp.evalnode(nil, scope, facts)
|
|
905
|
+
end
|
|
906
|
+
|
|
907
|
+
# Now define a node
|
|
908
|
+
interp.newnode "mynode", :code => AST::ASTArray.new(:children => [
|
|
909
|
+
resourcedef("file", "/tmp/testing", "owner" => "root")
|
|
910
|
+
])
|
|
911
|
+
|
|
912
|
+
# Eval again, and make sure it does nothing
|
|
913
|
+
assert_nothing_raised do
|
|
914
|
+
interp.evalnode("mynode", scope, facts)
|
|
915
|
+
end
|
|
916
|
+
|
|
917
|
+
assert_nil(scope.findresource("File[/tmp/testing]"),
|
|
918
|
+
"Eval'ed node with nodes off")
|
|
919
|
+
|
|
920
|
+
# Now enable usenodes and make sure it works.
|
|
921
|
+
interp.usenodes = true
|
|
922
|
+
assert_nothing_raised do
|
|
923
|
+
interp.evalnode("mynode", scope, facts)
|
|
924
|
+
end
|
|
925
|
+
file = scope.findresource("File[/tmp/testing]")
|
|
926
|
+
|
|
927
|
+
assert_instance_of(Puppet::Parser::Resource, file,
|
|
928
|
+
"Could not find file")
|
|
929
|
+
end
|
|
930
|
+
|
|
931
|
+
# This is mostly used for the cfengine module
|
|
932
|
+
def test_specificclasses
|
|
933
|
+
interp = mkinterp :Classes => %w{klass1 klass2}, :UseNodes => false
|
|
934
|
+
|
|
935
|
+
# Make sure it's not a failure to be missing classes, since
|
|
936
|
+
# we're using the cfengine class list, which is huge.
|
|
937
|
+
assert_nothing_raised do
|
|
938
|
+
interp.evaluate(nil, {})
|
|
939
|
+
end
|
|
940
|
+
|
|
941
|
+
interp.newclass("klass1", :code => AST::ASTArray.new(:children => [
|
|
942
|
+
resourcedef("file", "/tmp/klass1", "owner" => "root")
|
|
943
|
+
]))
|
|
944
|
+
interp.newclass("klass2", :code => AST::ASTArray.new(:children => [
|
|
945
|
+
resourcedef("file", "/tmp/klass2", "owner" => "root")
|
|
946
|
+
]))
|
|
947
|
+
|
|
948
|
+
ret = nil
|
|
949
|
+
assert_nothing_raised do
|
|
950
|
+
ret = interp.evaluate(nil, {})
|
|
951
|
+
end
|
|
952
|
+
|
|
953
|
+
found = ret.flatten.collect do |res| res.name end
|
|
954
|
+
|
|
955
|
+
assert(found.include?("/tmp/klass1"), "Did not evaluate klass1")
|
|
956
|
+
assert(found.include?("/tmp/klass2"), "Did not evaluate klass2")
|
|
957
|
+
end
|
|
958
|
+
|
|
959
|
+
if Puppet.features.rails?
|
|
960
|
+
# We need to make sure finished objects are stored in the db.
|
|
961
|
+
def test_finish_before_store
|
|
962
|
+
railsinit
|
|
963
|
+
interp = mkinterp
|
|
964
|
+
|
|
965
|
+
node = interp.newnode ["myhost"], :code => AST::ASTArray.new(:children => [
|
|
966
|
+
resourcedef("file", "/tmp/yay", :group => "root"),
|
|
967
|
+
defaultobj("file", :owner => "root")
|
|
968
|
+
])
|
|
969
|
+
|
|
970
|
+
interp.newclass "myclass", :code => AST::ASTArray.new(:children => [
|
|
971
|
+
])
|
|
972
|
+
|
|
973
|
+
interp.newclass "sub", :parent => "myclass",
|
|
974
|
+
:code => AST::ASTArray.new(:children => [
|
|
975
|
+
resourceoverride("file", "/tmp/yay", :owner => "root")
|
|
976
|
+
]
|
|
977
|
+
)
|
|
978
|
+
|
|
979
|
+
# Now do the rails crap
|
|
980
|
+
Puppet[:storeconfigs] = true
|
|
981
|
+
|
|
982
|
+
interp.evaluate("myhost", {})
|
|
983
|
+
|
|
984
|
+
# And then retrieve the object from rails
|
|
985
|
+
res = Puppet::Rails::Resource.find_by_restype_and_title("file", "/tmp/yay")
|
|
986
|
+
|
|
987
|
+
assert(res, "Did not get resource from rails")
|
|
988
|
+
|
|
989
|
+
param = res.param_names.find_by_name("owner", :include => :param_values)
|
|
990
|
+
|
|
991
|
+
assert(param, "Did not find owner param")
|
|
992
|
+
|
|
993
|
+
pvalue = param.param_values.find_by_value("root")
|
|
994
|
+
assert_equal("root", pvalue[:value])
|
|
995
|
+
end
|
|
996
|
+
end
|
|
997
|
+
|
|
998
|
+
def mk_node_mapper
|
|
999
|
+
# First, make sure our nodesearch command works as we expect
|
|
1000
|
+
# Make a nodemapper
|
|
1001
|
+
mapper = tempfile()
|
|
1002
|
+
ruby = %x{which ruby}.chomp
|
|
1003
|
+
File.open(mapper, "w") { |f|
|
|
1004
|
+
f.puts "#!#{ruby}
|
|
1005
|
+
name = ARGV[0]
|
|
1006
|
+
if name =~ /a/
|
|
1007
|
+
puts ARGV[0].gsub('a', 'b')
|
|
1008
|
+
else
|
|
1009
|
+
puts ''
|
|
1010
|
+
end
|
|
1011
|
+
if name =~ /p/
|
|
1012
|
+
puts [1,2,3].collect { |n| ARGV[0] + n.to_s }.join(' ')
|
|
1013
|
+
else
|
|
1014
|
+
puts ''
|
|
1015
|
+
end
|
|
1016
|
+
"
|
|
1017
|
+
}
|
|
1018
|
+
File.chmod(0755, mapper)
|
|
1019
|
+
mapper
|
|
1020
|
+
end
|
|
1021
|
+
|
|
1022
|
+
def test_nodesearch_external
|
|
1023
|
+
interp = mkinterp
|
|
1024
|
+
|
|
1025
|
+
# Make a fake gennode method
|
|
1026
|
+
class << interp
|
|
1027
|
+
def gennode(name, args, source)
|
|
1028
|
+
args[:name] = name
|
|
1029
|
+
return args
|
|
317
1030
|
end
|
|
318
1031
|
end
|
|
1032
|
+
|
|
1033
|
+
mapper = mk_node_mapper
|
|
1034
|
+
# Make sure it gives the right response
|
|
1035
|
+
assert_equal("bpple\napple1 apple2 apple3\n",
|
|
1036
|
+
%x{#{mapper} apple})
|
|
1037
|
+
|
|
1038
|
+
# First make sure we get nil back by default
|
|
1039
|
+
assert_nothing_raised {
|
|
1040
|
+
assert_nil(interp.nodesearch_external("apple"),
|
|
1041
|
+
"Interp#nodesearch_external defaulted to a non-nil response")
|
|
1042
|
+
}
|
|
1043
|
+
assert_nothing_raised { Puppet[:external_nodes] = mapper }
|
|
1044
|
+
|
|
1045
|
+
node = nil
|
|
1046
|
+
assert_nothing_raised { node = interp.nodesearch_external("apple") }
|
|
1047
|
+
|
|
1048
|
+
assert_equal({:name => "apple", :classes => %w{apple1 apple2 apple3}, :parentnode => "bpple"},
|
|
1049
|
+
node)
|
|
1050
|
+
|
|
1051
|
+
assert_nothing_raised { node = interp.nodesearch_external("plum")} # no a's, thus no parent
|
|
1052
|
+
assert_equal({:name => "plum", :classes => %w{plum1 plum2 plum3}},
|
|
1053
|
+
node)
|
|
1054
|
+
|
|
1055
|
+
assert_nothing_raised { node = interp.nodesearch_external("guava")} # no p's, thus no classes
|
|
1056
|
+
assert_equal({:name => "guava", :parentnode => "gubvb"},
|
|
1057
|
+
node)
|
|
1058
|
+
|
|
1059
|
+
assert_nothing_raised { node = interp.nodesearch_external("honeydew")} # neither, thus nil
|
|
1060
|
+
assert_nil(node)
|
|
1061
|
+
end
|
|
1062
|
+
|
|
1063
|
+
def test_nodesearch_external_functional
|
|
1064
|
+
mapper = mk_node_mapper
|
|
1065
|
+
|
|
1066
|
+
Puppet[:external_nodes] = mapper
|
|
1067
|
+
interp = mkinterp
|
|
1068
|
+
|
|
1069
|
+
node = nil
|
|
1070
|
+
assert_nothing_raised do
|
|
1071
|
+
node = interp.nodesearch("apple")
|
|
1072
|
+
end
|
|
1073
|
+
assert_instance_of(Puppet::Parser::AST::Node, node, "did not create node")
|
|
1074
|
+
end
|
|
1075
|
+
|
|
1076
|
+
def test_check_resource_collections
|
|
1077
|
+
interp = mkinterp
|
|
1078
|
+
scope = mkscope :interp => interp
|
|
1079
|
+
coll = Puppet::Parser::Collector.new(scope, "file", nil, nil, :virtual)
|
|
1080
|
+
coll.resources = ["File[/tmp/virtual1]", "File[/tmp/virtual2]"]
|
|
1081
|
+
scope.newcollection(coll)
|
|
1082
|
+
|
|
1083
|
+
assert_raise(Puppet::ParseError, "Did not fail on remaining resource colls") do
|
|
1084
|
+
interp.check_resource_collections(scope)
|
|
1085
|
+
end
|
|
319
1086
|
end
|
|
320
1087
|
end
|
|
1088
|
+
|
|
1089
|
+
# $Id: interpreter.rb 2334 2007-03-19 23:04:32Z luke $
|