puppet 0.18.4 → 0.22.4
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- data/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
data/test/other/report.rb
CHANGED
@@ -1,30 +1,27 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
$puppetbase = "../.."
|
5
|
-
end
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift("../lib").unshift("../../lib") if __FILE__ =~ /\.rb$/
|
6
4
|
|
7
5
|
require 'puppet'
|
8
6
|
require 'puppet/transaction/report'
|
9
7
|
require 'puppettest'
|
10
|
-
require '
|
8
|
+
require 'puppettest/reporttesting'
|
11
9
|
|
12
10
|
class TestReports < Test::Unit::TestCase
|
13
|
-
include
|
11
|
+
include PuppetTest
|
12
|
+
include PuppetTest::Reporttesting
|
14
13
|
|
15
14
|
# Make sure we can use reports as log destinations.
|
16
15
|
def test_reports_as_log_destinations
|
17
|
-
report =
|
18
|
-
assert_nothing_raised {
|
19
|
-
report = Puppet::Transaction::Report.new
|
20
|
-
}
|
16
|
+
report = fakereport
|
21
17
|
|
22
18
|
assert_nothing_raised {
|
23
|
-
Puppet::Log.newdestination(report)
|
19
|
+
Puppet::Util::Log.newdestination(report)
|
24
20
|
}
|
25
21
|
|
26
22
|
# Now make a file for testing logging
|
27
23
|
file = Puppet::Type.newfile(:path => tempfile(), :ensure => "file")
|
24
|
+
file.finish
|
28
25
|
|
29
26
|
log = nil
|
30
27
|
assert_nothing_raised {
|
@@ -33,12 +30,12 @@ class TestReports < Test::Unit::TestCase
|
|
33
30
|
|
34
31
|
assert(report.logs.include?(log), "Report did not get log message")
|
35
32
|
|
36
|
-
log = Puppet.
|
33
|
+
log = Puppet.warning "This is a non-sourced message"
|
37
34
|
|
38
35
|
assert(! report.logs.include?(log), "Report got log message")
|
39
36
|
|
40
37
|
assert_nothing_raised {
|
41
|
-
Puppet::Log.close(report)
|
38
|
+
Puppet::Util::Log.close(report)
|
42
39
|
}
|
43
40
|
|
44
41
|
log = file.log "This is another message, yo"
|
@@ -60,12 +57,43 @@ class TestReports < Test::Unit::TestCase
|
|
60
57
|
}
|
61
58
|
end
|
62
59
|
|
63
|
-
|
60
|
+
def test_store_report
|
61
|
+
# Create a bunch of log messages in an array.
|
62
|
+
report = Puppet::Transaction::Report.new
|
63
|
+
|
64
|
+
# We have to reuse reporting here because of something going on in the
|
65
|
+
# server/report.rb file
|
66
|
+
Puppet.config.use(:reporting)
|
67
|
+
|
68
|
+
3.times { |i|
|
69
|
+
log = Puppet.warning("Report test message %s" % i)
|
70
|
+
log.tags = %w{a list of tags}
|
71
|
+
log.tags << "tag%s" % i
|
72
|
+
|
73
|
+
report.newlog(log)
|
74
|
+
}
|
75
|
+
|
76
|
+
assert_nothing_raised do
|
77
|
+
report.extend(Puppet::Network::Handler.report.report(:store))
|
78
|
+
end
|
79
|
+
|
80
|
+
yaml = YAML.dump(report)
|
81
|
+
|
82
|
+
file = nil
|
83
|
+
assert_nothing_raised {
|
84
|
+
file = report.process(yaml)
|
85
|
+
}
|
86
|
+
|
87
|
+
assert(FileTest.exists?(file), "report file did not get created")
|
88
|
+
assert_equal(yaml, File.read(file), "File did not get written")
|
89
|
+
end
|
90
|
+
|
91
|
+
if Puppet.features.rrd?
|
64
92
|
def test_rrdgraph_report
|
65
93
|
Puppet.config.use(:metrics)
|
66
94
|
# First do some work
|
67
95
|
objects = []
|
68
|
-
|
96
|
+
6.times do |i|
|
69
97
|
file = tempfile()
|
70
98
|
|
71
99
|
# Make every third file
|
@@ -88,19 +116,120 @@ class TestReports < Test::Unit::TestCase
|
|
88
116
|
trans.evaluate
|
89
117
|
}
|
90
118
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
119
|
+
report = trans.generate_report
|
120
|
+
|
121
|
+
assert(! report.metrics.empty?, "Did not receive any metrics")
|
122
|
+
|
123
|
+
assert_nothing_raised do
|
124
|
+
report.extend(Puppet::Network::Handler.report.report(:rrdgraph))
|
125
|
+
end
|
96
126
|
|
97
127
|
assert_nothing_raised {
|
98
|
-
|
128
|
+
report.process
|
99
129
|
}
|
130
|
+
|
131
|
+
hostdir = nil
|
132
|
+
assert_nothing_raised do
|
133
|
+
hostdir = report.hostdir
|
134
|
+
end
|
135
|
+
|
136
|
+
assert(hostdir, "Did not get hostdir back")
|
137
|
+
|
138
|
+
assert(FileTest.directory?(hostdir), "Host rrd dir did not get created")
|
139
|
+
index = File.join(hostdir, "index.html")
|
140
|
+
assert(FileTest.exists?(index), "index file was not created")
|
141
|
+
|
142
|
+
# Now make sure it creaets each of the rrd files
|
143
|
+
%w{changes resources time}.each do |type|
|
144
|
+
file = File.join(hostdir, "%s.rrd" % type)
|
145
|
+
assert(FileTest.exists?(file), "Did not create rrd file for %s" % type)
|
146
|
+
|
147
|
+
daily = file.sub ".rrd", "-daily.png"
|
148
|
+
assert(FileTest.exists?(daily),
|
149
|
+
"Did not make daily graph for %s" % type)
|
150
|
+
end
|
151
|
+
|
100
152
|
end
|
101
153
|
else
|
102
154
|
$stderr.puts "Install RRD for metric reporting tests"
|
103
155
|
end
|
156
|
+
|
157
|
+
def test_tagmail_parsing
|
158
|
+
report = Object.new
|
159
|
+
report.extend(Puppet::Network::Handler.report.report(:tagmail))
|
160
|
+
|
161
|
+
passers = File.join(datadir, "reports", "tagmail_passers.conf")
|
162
|
+
assert(FileTest.exists?(passers), "no passers file %s" % passers)
|
163
|
+
|
164
|
+
File.readlines(passers).each do |line|
|
165
|
+
assert_nothing_raised("Could not parse %s" % line.inspect) do
|
166
|
+
report.parse(line)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
# Now make sure the failers fail
|
171
|
+
failers = File.join(datadir, "reports", "tagmail_failers.conf")
|
172
|
+
assert(FileTest.exists?(failers), "no failers file %s" % failers)
|
173
|
+
|
174
|
+
File.readlines(failers).each do |line|
|
175
|
+
assert_raise(ArgumentError, "Parsed %s" % line.inspect) do
|
176
|
+
report.parse(line)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
def test_tagmail_parsing_results
|
182
|
+
report = Object.new
|
183
|
+
report.extend(Puppet::Network::Handler.report.report(:tagmail))
|
184
|
+
# Now test a few specific lines to make sure we get the results we want
|
185
|
+
{
|
186
|
+
"tag: abuse@domain.com" => [%w{abuse@domain.com}, %w{tag}, []],
|
187
|
+
"tag, other: abuse@domain.com" => [%w{abuse@domain.com}, %w{tag other}, []],
|
188
|
+
"tag-other: abuse@domain.com" => [%w{abuse@domain.com}, %w{tag-other}, []],
|
189
|
+
"tag, !other: abuse@domain.com" => [%w{abuse@domain.com}, %w{tag}, %w{other}],
|
190
|
+
"tag, !other, one, !two: abuse@domain.com" => [%w{abuse@domain.com}, %w{tag one}, %w{other two}],
|
191
|
+
"tag: abuse@domain.com, other@domain.com" => [%w{abuse@domain.com other@domain.com}, %w{tag}, []]
|
192
|
+
|
193
|
+
}.each do |line, results|
|
194
|
+
assert_nothing_raised("Failed to parse %s" % line.inspect) do
|
195
|
+
assert_equal(results, report.parse(line).shift, "line %s returned incorrect results %s" % [line.inspect, results.inspect])
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
def test_tagmail_matching
|
201
|
+
report = Puppet::Transaction::Report.new
|
202
|
+
Puppet::Util::Log.close
|
203
|
+
[%w{one}, %w{one two}, %w{one two three}, %w{one two three four}].each do |tags|
|
204
|
+
log = Puppet::Util::Log.new(:level => :notice, :message => tags.join(" "), :tags => tags)
|
205
|
+
|
206
|
+
report << log
|
207
|
+
end
|
208
|
+
|
209
|
+
list = report.logs.collect { |l| l.to_report }
|
210
|
+
|
211
|
+
report.extend(Puppet::Network::Handler.report.report(:tagmail))
|
212
|
+
|
213
|
+
{
|
214
|
+
[%w{abuse@domain.com}, %w{all}, []] => list,
|
215
|
+
[%w{abuse@domain.com}, %w{all}, %w{three}] => list[0..1],
|
216
|
+
[%w{abuse@domain.com}, %w{one}, []] => list,
|
217
|
+
[%w{abuse@domain.com}, %w{two}, []] => list[1..3],
|
218
|
+
[%w{abuse@domain.com}, %w{two}, %w{three}] => list[1..1],
|
219
|
+
[%w{abuse@domain.com}, %w{}, %w{one}] => nil
|
220
|
+
}.each do |args, expected|
|
221
|
+
results = nil
|
222
|
+
assert_nothing_raised("Could not match with %s" % args.inspect) do
|
223
|
+
results = report.match([args])
|
224
|
+
end
|
225
|
+
|
226
|
+
if expected
|
227
|
+
assert_equal([args[0], expected.join("\n")], results[0], "did get correct results for %s" % args.inspect)
|
228
|
+
else
|
229
|
+
assert_nil(results[0], "got a report for %s" % args.inspect)
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
104
233
|
end
|
105
234
|
|
106
|
-
# $Id: report.rb
|
235
|
+
# $Id: report.rb 2438 2007-04-30 18:15:01Z luke $
|
data/test/other/transactions.rb
CHANGED
@@ -1,20 +1,71 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
$puppetbase = "../.."
|
5
|
-
end
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift("../lib").unshift("../../lib") if __FILE__ =~ /\.rb$/
|
6
4
|
|
7
5
|
require 'puppet'
|
8
6
|
require 'puppettest'
|
9
|
-
require '
|
7
|
+
require 'mocha'
|
8
|
+
require 'puppettest/support/resources'
|
10
9
|
|
11
|
-
# $Id: transactions.rb
|
10
|
+
# $Id: transactions.rb 2372 2007-03-30 00:47:03Z luke $
|
12
11
|
|
13
12
|
class TestTransactions < Test::Unit::TestCase
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
13
|
+
include PuppetTest::FileTesting
|
14
|
+
include PuppetTest::Support::Resources
|
15
|
+
class Fakeprop <Puppet::Type::Property
|
16
|
+
attr_accessor :path, :is, :should, :name
|
17
|
+
def should_to_s
|
18
|
+
@should.to_s
|
19
|
+
end
|
20
|
+
def insync?
|
21
|
+
true
|
22
|
+
end
|
23
|
+
def info(*args)
|
24
|
+
false
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
def mkgenerator(&block)
|
30
|
+
$finished = []
|
31
|
+
cleanup { $finished = nil }
|
32
|
+
|
33
|
+
# Create a bogus type that generates new instances with shorter
|
34
|
+
type = Puppet::Type.newtype(:generator) do
|
35
|
+
newparam(:name, :namevar => true)
|
36
|
+
def finish
|
37
|
+
$finished << self.name
|
38
|
+
end
|
39
|
+
end
|
40
|
+
if block
|
41
|
+
type.class_eval(&block)
|
42
|
+
end
|
43
|
+
cleanup do
|
44
|
+
Puppet::Type.rmtype(:generator)
|
45
|
+
end
|
46
|
+
|
47
|
+
return type
|
48
|
+
end
|
49
|
+
|
50
|
+
# Create a new type that generates instances with shorter names.
|
51
|
+
def mkreducer(&block)
|
52
|
+
type = mkgenerator() do
|
53
|
+
def eval_generate
|
54
|
+
ret = []
|
55
|
+
if title.length > 1
|
56
|
+
ret << self.class.create(:title => title[0..-2])
|
57
|
+
else
|
58
|
+
return nil
|
59
|
+
end
|
60
|
+
ret
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
if block
|
65
|
+
type.class_eval(&block)
|
66
|
+
end
|
67
|
+
|
68
|
+
return type
|
18
69
|
end
|
19
70
|
|
20
71
|
def test_reports
|
@@ -35,14 +86,14 @@ class TestTransactions < Test::Unit::TestCase
|
|
35
86
|
report = nil
|
36
87
|
|
37
88
|
assert_nothing_raised {
|
38
|
-
report = trans.
|
89
|
+
report = trans.generate_report
|
39
90
|
}
|
40
91
|
|
41
92
|
# First test the report logs
|
42
93
|
assert(report.logs.length > 0, "Did not get any report logs")
|
43
94
|
|
44
95
|
report.logs.each do |obj|
|
45
|
-
assert_instance_of(Puppet::Log, obj)
|
96
|
+
assert_instance_of(Puppet::Util::Log, obj)
|
46
97
|
end
|
47
98
|
|
48
99
|
# Then test the metrics
|
@@ -51,12 +102,74 @@ class TestTransactions < Test::Unit::TestCase
|
|
51
102
|
assert(metrics, "Did not get any metrics")
|
52
103
|
assert(metrics.length > 0, "Did not get any metrics")
|
53
104
|
|
54
|
-
assert(metrics.has_key?("
|
105
|
+
assert(metrics.has_key?("resources"), "Did not get object metrics")
|
55
106
|
assert(metrics.has_key?("changes"), "Did not get change metrics")
|
56
107
|
|
57
108
|
metrics.each do |name, metric|
|
58
|
-
assert_instance_of(Puppet::Metric, metric)
|
109
|
+
assert_instance_of(Puppet::Util::Metric, metric)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_prefetch
|
114
|
+
# Create a type just for testing prefetch
|
115
|
+
name = :prefetchtesting
|
116
|
+
$prefetched = false
|
117
|
+
type = Puppet::Type.newtype(name) do
|
118
|
+
newparam(:name) {}
|
119
|
+
end
|
120
|
+
|
121
|
+
cleanup do
|
122
|
+
Puppet::Type.rmtype(name)
|
123
|
+
end
|
124
|
+
|
125
|
+
# Now create a provider
|
126
|
+
type.provide(:prefetch) do
|
127
|
+
def self.prefetch
|
128
|
+
$prefetched = true
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
# Now create an instance
|
133
|
+
inst = type.create :name => "yay"
|
134
|
+
|
135
|
+
# Create a transaction
|
136
|
+
trans = Puppet::Transaction.new(newcomp(inst))
|
137
|
+
|
138
|
+
# Make sure prefetch works
|
139
|
+
assert_nothing_raised do
|
140
|
+
trans.prefetch
|
141
|
+
end
|
142
|
+
|
143
|
+
assert_equal(true, $prefetched, "type prefetch was not called")
|
144
|
+
|
145
|
+
# Now make sure it gets called from within evaluate()
|
146
|
+
$prefetched = false
|
147
|
+
assert_nothing_raised do
|
148
|
+
trans.evaluate
|
59
149
|
end
|
150
|
+
|
151
|
+
assert_equal(true, $prefetched, "evaluate did not call prefetch")
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_refreshes_generate_events
|
155
|
+
path = tempfile()
|
156
|
+
firstpath = tempfile()
|
157
|
+
secondpath = tempfile()
|
158
|
+
file = Puppet::Type.newfile(:title => "file", :path => path, :content => "yayness")
|
159
|
+
first = Puppet::Type.newexec(:title => "first",
|
160
|
+
:command => "/bin/echo first > #{firstpath}",
|
161
|
+
:subscribe => [:file, path],
|
162
|
+
:refreshonly => true
|
163
|
+
)
|
164
|
+
second = Puppet::Type.newexec(:title => "second",
|
165
|
+
:command => "/bin/echo second > #{secondpath}",
|
166
|
+
:subscribe => [:exec, "first"],
|
167
|
+
:refreshonly => true
|
168
|
+
)
|
169
|
+
|
170
|
+
assert_apply(file, first, second)
|
171
|
+
|
172
|
+
assert(FileTest.exists?(secondpath), "Refresh did not generate an event")
|
60
173
|
end
|
61
174
|
|
62
175
|
unless %x{groups}.chomp.split(/ /).length > 1
|
@@ -110,18 +223,6 @@ class TestTransactions < Test::Unit::TestCase
|
|
110
223
|
}
|
111
224
|
end
|
112
225
|
|
113
|
-
def newservice
|
114
|
-
assert_nothing_raised() {
|
115
|
-
return Puppet.type(:service).create(
|
116
|
-
:name => "sleeper",
|
117
|
-
:type => "init",
|
118
|
-
:path => File.join($puppetbase,"examples/root/etc/init.d"),
|
119
|
-
:hasstatus => true,
|
120
|
-
:check => [:ensure]
|
121
|
-
)
|
122
|
-
}
|
123
|
-
end
|
124
|
-
|
125
226
|
def newexec(file)
|
126
227
|
assert_nothing_raised() {
|
127
228
|
return Puppet.type(:exec).create(
|
@@ -137,7 +238,7 @@ class TestTransactions < Test::Unit::TestCase
|
|
137
238
|
transaction = nil
|
138
239
|
file = newfile()
|
139
240
|
|
140
|
-
|
241
|
+
properties = {}
|
141
242
|
check = [:group,:mode]
|
142
243
|
file[:check] = check
|
143
244
|
|
@@ -146,9 +247,9 @@ class TestTransactions < Test::Unit::TestCase
|
|
146
247
|
}
|
147
248
|
|
148
249
|
assert_nothing_raised() {
|
149
|
-
check.each { |
|
150
|
-
assert(file[
|
151
|
-
|
250
|
+
check.each { |property|
|
251
|
+
assert(file[property])
|
252
|
+
properties[property] = file[property]
|
152
253
|
}
|
153
254
|
}
|
154
255
|
|
@@ -174,33 +275,13 @@ class TestTransactions < Test::Unit::TestCase
|
|
174
275
|
assert_nothing_raised() {
|
175
276
|
file.retrieve
|
176
277
|
}
|
177
|
-
|
278
|
+
properties.each { |property,value|
|
178
279
|
assert_equal(
|
179
|
-
value,file.is(
|
280
|
+
value,file.is(property), "File %s remained %s" % [property, file.is(property)]
|
180
281
|
)
|
181
282
|
}
|
182
283
|
end
|
183
284
|
|
184
|
-
# start a service, and then roll the modification back
|
185
|
-
# Disabled, because it wasn't really worth the effort.
|
186
|
-
def disabled_test_servicetrans
|
187
|
-
transaction = nil
|
188
|
-
service = newservice()
|
189
|
-
|
190
|
-
component = newcomp("service",service)
|
191
|
-
|
192
|
-
assert_nothing_raised() {
|
193
|
-
service[:ensure] = 1
|
194
|
-
}
|
195
|
-
service.retrieve
|
196
|
-
assert(service.insync?, "Service did not start")
|
197
|
-
system("ps -ef | grep ruby")
|
198
|
-
trans = assert_events([:service_started], component)
|
199
|
-
service.retrieve
|
200
|
-
|
201
|
-
assert_rollback_events(trans, [:service_stopped], "service")
|
202
|
-
end
|
203
|
-
|
204
285
|
# test that services are correctly restarted and that work is done
|
205
286
|
# in the right order
|
206
287
|
def test_refreshing
|
@@ -208,9 +289,12 @@ class TestTransactions < Test::Unit::TestCase
|
|
208
289
|
file = newfile()
|
209
290
|
execfile = File.join(tmpdir(), "exectestingness")
|
210
291
|
exec = newexec(execfile)
|
211
|
-
|
292
|
+
properties = {}
|
212
293
|
check = [:group,:mode]
|
213
294
|
file[:check] = check
|
295
|
+
file[:group] = @groups[0]
|
296
|
+
|
297
|
+
assert_apply(file)
|
214
298
|
|
215
299
|
@@tmpfiles << execfile
|
216
300
|
|
@@ -225,14 +309,14 @@ class TestTransactions < Test::Unit::TestCase
|
|
225
309
|
exec.retrieve
|
226
310
|
}
|
227
311
|
|
228
|
-
check.each { |
|
229
|
-
|
312
|
+
check.each { |property|
|
313
|
+
properties[property] = file[property]
|
230
314
|
}
|
231
315
|
assert_nothing_raised() {
|
232
316
|
file[:mode] = "755"
|
233
317
|
}
|
234
318
|
|
235
|
-
trans = assert_events([:file_changed], component)
|
319
|
+
trans = assert_events([:file_changed, :triggered], component)
|
236
320
|
|
237
321
|
assert(FileTest.exists?(execfile), "Execfile does not exist")
|
238
322
|
File.unlink(execfile)
|
@@ -240,19 +324,23 @@ class TestTransactions < Test::Unit::TestCase
|
|
240
324
|
file[:group] = @groups[1]
|
241
325
|
}
|
242
326
|
|
243
|
-
trans = assert_events([:file_changed], component)
|
327
|
+
trans = assert_events([:file_changed, :triggered], component)
|
244
328
|
assert(FileTest.exists?(execfile), "Execfile does not exist")
|
245
329
|
end
|
246
330
|
|
247
|
-
|
331
|
+
# Verify that one component requiring another causes the contained
|
332
|
+
# resources in the requiring component to get refreshed.
|
333
|
+
def test_refresh_across_two_components
|
248
334
|
transaction = nil
|
249
335
|
file = newfile()
|
250
336
|
execfile = File.join(tmpdir(), "exectestingness2")
|
251
337
|
@@tmpfiles << execfile
|
252
338
|
exec = newexec(execfile)
|
253
|
-
|
339
|
+
properties = {}
|
254
340
|
check = [:group,:mode]
|
255
341
|
file[:check] = check
|
342
|
+
file[:group] = @groups[0]
|
343
|
+
assert_apply(file)
|
256
344
|
|
257
345
|
fcomp = newcomp("file",file)
|
258
346
|
ecomp = newcomp("exec",exec)
|
@@ -261,7 +349,7 @@ class TestTransactions < Test::Unit::TestCase
|
|
261
349
|
|
262
350
|
# 'subscribe' expects an array of arrays
|
263
351
|
#component[:require] = [[file.class.name,file.name]]
|
264
|
-
ecomp[:subscribe] =
|
352
|
+
ecomp[:subscribe] = fcomp
|
265
353
|
exec[:refreshonly] = true
|
266
354
|
|
267
355
|
trans = assert_events([], component)
|
@@ -271,8 +359,7 @@ class TestTransactions < Test::Unit::TestCase
|
|
271
359
|
file[:mode] = "755"
|
272
360
|
}
|
273
361
|
|
274
|
-
trans = assert_events([:file_changed, :file_changed], component)
|
275
|
-
|
362
|
+
trans = assert_events([:file_changed, :file_changed, :triggered], component)
|
276
363
|
end
|
277
364
|
|
278
365
|
# Make sure that multiple subscriptions get triggered.
|
@@ -311,25 +398,29 @@ class TestTransactions < Test::Unit::TestCase
|
|
311
398
|
:path => path,
|
312
399
|
:ensure => "file"
|
313
400
|
)
|
314
|
-
|
315
|
-
:
|
316
|
-
:
|
401
|
+
exec1 = Puppet.type(:exec).create(
|
402
|
+
:path => ENV["PATH"],
|
403
|
+
:command => "touch /this/cannot/possibly/exist",
|
404
|
+
:logoutput => true,
|
405
|
+
:refreshonly => true,
|
406
|
+
:subscribe => file,
|
407
|
+
:title => "one"
|
317
408
|
)
|
318
|
-
|
409
|
+
exec2 = Puppet.type(:exec).create(
|
319
410
|
:path => ENV["PATH"],
|
320
411
|
:command => "touch %s" % newfile,
|
321
412
|
:logoutput => true,
|
322
413
|
:refreshonly => true,
|
323
|
-
:subscribe => [
|
414
|
+
:subscribe => [file, exec1],
|
415
|
+
:title => "two"
|
324
416
|
)
|
325
417
|
|
326
|
-
assert_apply(file,
|
327
|
-
assert(FileTest.exists?(path), "File did not get created")
|
418
|
+
assert_apply(file, exec1, exec2)
|
328
419
|
assert(FileTest.exists?(newfile), "Refresh file did not get created")
|
329
420
|
end
|
330
421
|
|
331
422
|
# Make sure that unscheduled and untagged objects still respond to events
|
332
|
-
def
|
423
|
+
def test_unscheduled_and_untagged_response
|
333
424
|
Puppet::Type.type(:schedule).mkdefaultschedules
|
334
425
|
Puppet[:ignoreschedules] = false
|
335
426
|
file = Puppet.type(:file).create(
|
@@ -359,7 +450,7 @@ class TestTransactions < Test::Unit::TestCase
|
|
359
450
|
|
360
451
|
file[:content] = "some content"
|
361
452
|
|
362
|
-
assert_events([:file_changed], comp)
|
453
|
+
assert_events([:file_changed, :triggered], comp)
|
363
454
|
assert(FileTest.exists?(fname), "File did not get recreated")
|
364
455
|
|
365
456
|
# Now remove it, so it can get created again
|
@@ -377,30 +468,685 @@ class TestTransactions < Test::Unit::TestCase
|
|
377
468
|
|
378
469
|
assert(! file.insync?, "Uh, file is in sync?")
|
379
470
|
|
380
|
-
assert_events([:file_changed], comp)
|
471
|
+
assert_events([:file_changed, :triggered], comp)
|
381
472
|
assert(FileTest.exists?(fname), "File did not get recreated")
|
382
473
|
end
|
383
474
|
|
384
475
|
def test_failed_reqs_mean_no_run
|
385
476
|
exec = Puppet::Type.type(:exec).create(
|
386
477
|
:command => "/bin/mkdir /this/path/cannot/possibly/exit",
|
387
|
-
:
|
478
|
+
:title => "mkdir"
|
388
479
|
)
|
389
480
|
|
390
|
-
|
481
|
+
file1 = Puppet::Type.type(:file).create(
|
482
|
+
:title => "file1",
|
391
483
|
:path => tempfile(),
|
392
|
-
:require =>
|
484
|
+
:require => exec,
|
393
485
|
:ensure => :file
|
394
486
|
)
|
395
487
|
|
396
|
-
|
488
|
+
file2 = Puppet::Type.type(:file).create(
|
489
|
+
:title => "file2",
|
490
|
+
:path => tempfile(),
|
491
|
+
:require => file1,
|
492
|
+
:ensure => :file
|
493
|
+
)
|
494
|
+
|
495
|
+
comp = newcomp(exec, file1, file2)
|
397
496
|
|
398
497
|
comp.finalize
|
399
498
|
|
400
499
|
assert_apply(comp)
|
401
500
|
|
402
|
-
assert(! FileTest.exists?(
|
501
|
+
assert(! FileTest.exists?(file1[:path]),
|
403
502
|
"File got created even tho its dependency failed")
|
503
|
+
assert(! FileTest.exists?(file2[:path]),
|
504
|
+
"File got created even tho its deep dependency failed")
|
505
|
+
end
|
506
|
+
end
|
507
|
+
|
508
|
+
def f(n)
|
509
|
+
Puppet::Type.type(:file)["/tmp/#{n.to_s}"]
|
510
|
+
end
|
511
|
+
|
512
|
+
def test_relationship_graph
|
513
|
+
one, two, middle, top = mktree
|
514
|
+
|
515
|
+
{one => two, "f" => "c", "h" => middle}.each do |source, target|
|
516
|
+
if source.is_a?(String)
|
517
|
+
source = f(source)
|
518
|
+
end
|
519
|
+
if target.is_a?(String)
|
520
|
+
target = f(target)
|
521
|
+
end
|
522
|
+
target[:require] = source
|
523
|
+
end
|
524
|
+
|
525
|
+
trans = Puppet::Transaction.new(top)
|
526
|
+
|
527
|
+
graph = nil
|
528
|
+
assert_nothing_raised do
|
529
|
+
graph = trans.relationship_graph
|
530
|
+
end
|
531
|
+
|
532
|
+
assert_instance_of(Puppet::PGraph, graph,
|
533
|
+
"Did not get relationship graph")
|
534
|
+
|
535
|
+
# Make sure all of the components are gone
|
536
|
+
comps = graph.vertices.find_all { |v| v.is_a?(Puppet::Type::Component)}
|
537
|
+
assert(comps.empty?, "Deps graph still contains components %s" %
|
538
|
+
comps.collect { |c| c.ref }.join(","))
|
539
|
+
|
540
|
+
assert_equal([], comps, "Deps graph still contains components")
|
541
|
+
|
542
|
+
# It must be reversed because of how topsort works
|
543
|
+
sorted = graph.topsort.reverse
|
544
|
+
|
545
|
+
# Now make sure the appropriate edges are there and are in the right order
|
546
|
+
assert(graph.dependents(f(:f)).include?(f(:c)),
|
547
|
+
"c not marked a dep of f")
|
548
|
+
assert(sorted.index(f(:c)) < sorted.index(f(:f)),
|
549
|
+
"c is not before f")
|
550
|
+
|
551
|
+
one.each do |o|
|
552
|
+
two.each do |t|
|
553
|
+
assert(graph.dependents(o).include?(t),
|
554
|
+
"%s not marked a dep of %s" % [t.ref, o.ref])
|
555
|
+
assert(sorted.index(t) < sorted.index(o),
|
556
|
+
"%s is not before %s" % [t.ref, o.ref])
|
557
|
+
end
|
558
|
+
end
|
559
|
+
|
560
|
+
trans.resources.leaves(middle).each do |child|
|
561
|
+
assert(graph.dependents(f(:h)).include?(child),
|
562
|
+
"%s not marked a dep of h" % [child.ref])
|
563
|
+
assert(sorted.index(child) < sorted.index(f(:h)),
|
564
|
+
"%s is not before h" % child.ref)
|
565
|
+
end
|
566
|
+
|
567
|
+
# Lastly, make sure our 'g' vertex made it into the relationship
|
568
|
+
# graph, since it's not involved in any relationships.
|
569
|
+
assert(graph.vertex?(f(:g)),
|
570
|
+
"Lost vertexes with no relations")
|
571
|
+
|
572
|
+
# Now make the reversal graph and make sure all of the vertices made it into that
|
573
|
+
reverse = graph.reversal
|
574
|
+
%w{a b c d e f g h}.each do |letter|
|
575
|
+
file = f(letter)
|
576
|
+
assert(reverse.vertex?(file), "%s did not make it into reversal" % letter)
|
577
|
+
end
|
578
|
+
end
|
579
|
+
|
580
|
+
# Test pre-evaluation generation
|
581
|
+
def test_generate
|
582
|
+
mkgenerator() do
|
583
|
+
def generate
|
584
|
+
ret = []
|
585
|
+
if title.length > 1
|
586
|
+
ret << self.class.create(:title => title[0..-2])
|
587
|
+
else
|
588
|
+
return nil
|
589
|
+
end
|
590
|
+
ret
|
591
|
+
end
|
592
|
+
end
|
593
|
+
|
594
|
+
yay = Puppet::Type.newgenerator :title => "yay"
|
595
|
+
rah = Puppet::Type.newgenerator :title => "rah"
|
596
|
+
comp = newcomp(yay, rah)
|
597
|
+
trans = comp.evaluate
|
598
|
+
|
599
|
+
assert_nothing_raised do
|
600
|
+
trans.generate
|
601
|
+
end
|
602
|
+
|
603
|
+
%w{ya ra y r}.each do |name|
|
604
|
+
assert(trans.resources.vertex?(Puppet::Type.type(:generator)[name]),
|
605
|
+
"Generated %s was not a vertex" % name)
|
606
|
+
assert($finished.include?(name), "%s was not finished" % name)
|
607
|
+
end
|
608
|
+
|
609
|
+
# Now make sure that cleanup gets rid of those generated types.
|
610
|
+
assert_nothing_raised do
|
611
|
+
trans.cleanup
|
612
|
+
end
|
613
|
+
|
614
|
+
%w{ya ra y r}.each do |name|
|
615
|
+
assert(!trans.resources.vertex?(Puppet::Type.type(:generator)[name]),
|
616
|
+
"Generated vertex %s was not removed from graph" % name)
|
617
|
+
assert_nil(Puppet::Type.type(:generator)[name],
|
618
|
+
"Generated vertex %s was not removed from class" % name)
|
619
|
+
end
|
620
|
+
end
|
621
|
+
|
622
|
+
# Test mid-evaluation generation.
|
623
|
+
def test_eval_generate
|
624
|
+
$evaluated = []
|
625
|
+
cleanup { $evaluated = nil }
|
626
|
+
type = mkreducer() do
|
627
|
+
def evaluate
|
628
|
+
$evaluated << self.title
|
629
|
+
return []
|
630
|
+
end
|
631
|
+
end
|
632
|
+
|
633
|
+
yay = Puppet::Type.newgenerator :title => "yay"
|
634
|
+
rah = Puppet::Type.newgenerator :title => "rah", :subscribe => yay
|
635
|
+
comp = newcomp(yay, rah)
|
636
|
+
trans = comp.evaluate
|
637
|
+
|
638
|
+
trans.prepare
|
639
|
+
|
640
|
+
# Now apply the resources, and make sure they appropriately generate
|
641
|
+
# things.
|
642
|
+
assert_nothing_raised("failed to apply yay") do
|
643
|
+
trans.eval_resource(yay)
|
644
|
+
end
|
645
|
+
ya = type["ya"]
|
646
|
+
assert(ya, "Did not generate ya")
|
647
|
+
assert(trans.relgraph.vertex?(ya),
|
648
|
+
"Did not add ya to rel_graph")
|
649
|
+
|
650
|
+
# Now make sure the appropriate relationships were added
|
651
|
+
assert(trans.relgraph.edge?(yay, ya),
|
652
|
+
"parent was not required by child")
|
653
|
+
assert(! trans.relgraph.edge?(ya, rah),
|
654
|
+
"generated child ya inherited depencency on rah")
|
655
|
+
|
656
|
+
# Now make sure it in turn eval_generates appropriately
|
657
|
+
assert_nothing_raised("failed to apply yay") do
|
658
|
+
trans.eval_resource(type["ya"])
|
659
|
+
end
|
660
|
+
|
661
|
+
%w{y}.each do |name|
|
662
|
+
res = type[name]
|
663
|
+
assert(res, "Did not generate %s" % name)
|
664
|
+
assert(trans.relgraph.vertex?(res),
|
665
|
+
"Did not add %s to rel_graph" % name)
|
666
|
+
assert($finished.include?("y"), "y was not finished")
|
667
|
+
end
|
668
|
+
|
669
|
+
assert_nothing_raised("failed to eval_generate with nil response") do
|
670
|
+
trans.eval_resource(type["y"])
|
671
|
+
end
|
672
|
+
assert(trans.relgraph.edge?(yay, ya), "no edge was created for ya => yay")
|
673
|
+
|
674
|
+
assert_nothing_raised("failed to apply rah") do
|
675
|
+
trans.eval_resource(rah)
|
676
|
+
end
|
677
|
+
|
678
|
+
ra = type["ra"]
|
679
|
+
assert(ra, "Did not generate ra")
|
680
|
+
assert(trans.relgraph.vertex?(ra),
|
681
|
+
"Did not add ra to rel_graph" % name)
|
682
|
+
assert($finished.include?("ra"), "y was not finished")
|
683
|
+
|
684
|
+
# Now make sure this generated resource has the same relationships as
|
685
|
+
# the generating resource
|
686
|
+
assert(! trans.relgraph.edge?(yay, ra),
|
687
|
+
"rah passed its dependencies on to its children")
|
688
|
+
assert(! trans.relgraph.edge?(ya, ra),
|
689
|
+
"children have a direct relationship")
|
690
|
+
|
691
|
+
# Now make sure that cleanup gets rid of those generated types.
|
692
|
+
assert_nothing_raised do
|
693
|
+
trans.cleanup
|
694
|
+
end
|
695
|
+
|
696
|
+
%w{ya ra y r}.each do |name|
|
697
|
+
assert(!trans.relgraph.vertex?(type[name]),
|
698
|
+
"Generated vertex %s was not removed from graph" % name)
|
699
|
+
assert_nil(type[name],
|
700
|
+
"Generated vertex %s was not removed from class" % name)
|
701
|
+
end
|
702
|
+
|
703
|
+
# Now, start over and make sure that everything gets evaluated.
|
704
|
+
trans = comp.evaluate
|
705
|
+
$evaluated.clear
|
706
|
+
assert_nothing_raised do
|
707
|
+
trans.evaluate
|
708
|
+
end
|
709
|
+
|
710
|
+
assert_equal(%w{yay ya y rah ra r}, $evaluated,
|
711
|
+
"Not all resources were evaluated or not in the right order")
|
712
|
+
end
|
713
|
+
|
714
|
+
def test_tags
|
715
|
+
res = Puppet::Type.newfile :path => tempfile()
|
716
|
+
comp = newcomp(res)
|
717
|
+
|
718
|
+
# Make sure they default to none
|
719
|
+
assert_equal([], comp.evaluate.tags)
|
720
|
+
|
721
|
+
# Make sure we get the main tags
|
722
|
+
Puppet[:tags] = %w{this is some tags}
|
723
|
+
assert_equal(%w{this is some tags}, comp.evaluate.tags)
|
724
|
+
|
725
|
+
# And make sure they get processed correctly
|
726
|
+
Puppet[:tags] = ["one", "two,three", "four"]
|
727
|
+
assert_equal(%w{one two three four}, comp.evaluate.tags)
|
728
|
+
|
729
|
+
# lastly, make sure we can override them
|
730
|
+
trans = comp.evaluate
|
731
|
+
trans.tags = ["one", "two,three", "four"]
|
732
|
+
assert_equal(%w{one two three four}, comp.evaluate.tags)
|
733
|
+
end
|
734
|
+
|
735
|
+
def test_tagged?
|
736
|
+
res = Puppet::Type.newfile :path => tempfile()
|
737
|
+
comp = newcomp(res)
|
738
|
+
trans = comp.evaluate
|
739
|
+
|
740
|
+
assert(trans.tagged?(res), "tagged? defaulted to false")
|
741
|
+
|
742
|
+
# Now set some tags
|
743
|
+
trans.tags = %w{some tags}
|
744
|
+
|
745
|
+
# And make sure it's false
|
746
|
+
assert(! trans.tagged?(res), "matched invalid tags")
|
747
|
+
|
748
|
+
# Set ignoretags and make sure it sticks
|
749
|
+
trans.ignoretags = true
|
750
|
+
assert(trans.tagged?(res), "tags were not ignored")
|
751
|
+
|
752
|
+
# Now make sure we actually correctly match tags
|
753
|
+
res[:tag] = "mytag"
|
754
|
+
trans.ignoretags = false
|
755
|
+
trans.tags = %w{notag}
|
756
|
+
|
757
|
+
assert(! trans.tagged?(res), "tags incorrectly matched")
|
758
|
+
|
759
|
+
trans.tags = %w{mytag yaytag}
|
760
|
+
assert(trans.tagged?(res), "tags should have matched")
|
761
|
+
end
|
762
|
+
|
763
|
+
# Make sure changes generated by eval_generated resources have proxies
|
764
|
+
# set to the top-level resource.
|
765
|
+
def test_proxy_resources
|
766
|
+
type = mkreducer do
|
767
|
+
def evaluate
|
768
|
+
return Puppet::PropertyChange.new(Fakeprop.new(
|
769
|
+
:path => :path, :is => :is, :should => :should, :name => self.name, :parent => "a parent"))
|
770
|
+
end
|
771
|
+
end
|
772
|
+
|
773
|
+
resource = type.create :name => "test"
|
774
|
+
comp = newcomp(resource)
|
775
|
+
trans = comp.evaluate
|
776
|
+
trans.prepare
|
777
|
+
|
778
|
+
assert_nothing_raised do
|
779
|
+
trans.eval_resource(resource)
|
780
|
+
end
|
781
|
+
|
782
|
+
changes = trans.instance_variable_get("@changes")
|
783
|
+
|
784
|
+
assert(changes.length > 0, "did not get any changes")
|
785
|
+
|
786
|
+
changes.each do |change|
|
787
|
+
assert_equal(resource, change.source, "change did not get proxy set correctly")
|
788
|
+
end
|
789
|
+
end
|
790
|
+
|
791
|
+
# Make sure changes in contained files still generate callback events.
|
792
|
+
def test_generated_callbacks
|
793
|
+
dir = tempfile()
|
794
|
+
maker = tempfile()
|
795
|
+
Dir.mkdir(dir)
|
796
|
+
file = File.join(dir, "file")
|
797
|
+
File.open(file, "w") { |f| f.puts "" }
|
798
|
+
File.chmod(0644, file)
|
799
|
+
File.chmod(0755, dir) # So only the child file causes a change
|
800
|
+
|
801
|
+
dirobj = Puppet::Type.type(:file).create :mode => "755", :recurse => true, :path => dir
|
802
|
+
exec = Puppet::Type.type(:exec).create :title => "make",
|
803
|
+
:command => "touch #{maker}", :path => ENV['PATH'], :refreshonly => true,
|
804
|
+
:subscribe => dirobj
|
805
|
+
|
806
|
+
assert_apply(dirobj, exec)
|
807
|
+
assert(FileTest.exists?(maker), "Did not make callback file")
|
808
|
+
end
|
809
|
+
|
810
|
+
# Yay, this out to be fun.
|
811
|
+
def test_trigger
|
812
|
+
$triggered = []
|
813
|
+
cleanup { $triggered = nil }
|
814
|
+
trigger = Class.new do
|
815
|
+
attr_accessor :name
|
816
|
+
include Puppet::Util::Logging
|
817
|
+
def initialize(name)
|
818
|
+
@name = name
|
819
|
+
end
|
820
|
+
def ref
|
821
|
+
self.name
|
822
|
+
end
|
823
|
+
def refresh
|
824
|
+
$triggered << self.name
|
825
|
+
end
|
826
|
+
|
827
|
+
def to_s
|
828
|
+
self.name
|
829
|
+
end
|
830
|
+
end
|
831
|
+
|
832
|
+
# Make a graph with some stuff in it.
|
833
|
+
graph = Puppet::PGraph.new
|
834
|
+
|
835
|
+
# Add a non-triggering edge.
|
836
|
+
a = trigger.new(:a)
|
837
|
+
b = trigger.new(:b)
|
838
|
+
c = trigger.new(:c)
|
839
|
+
nope = Puppet::Relationship.new(a, b)
|
840
|
+
yep = Puppet::Relationship.new(a, c, {:callback => :refresh})
|
841
|
+
graph.add_edge!(nope)
|
842
|
+
|
843
|
+
# And a triggering one.
|
844
|
+
graph.add_edge!(yep)
|
845
|
+
|
846
|
+
# Create our transaction
|
847
|
+
trans = Puppet::Transaction.new(graph)
|
848
|
+
|
849
|
+
# Set the non-triggering on
|
850
|
+
assert_nothing_raised do
|
851
|
+
trans.set_trigger(nope)
|
852
|
+
end
|
853
|
+
|
854
|
+
assert(! trans.targeted?(b), "b is incorrectly targeted")
|
855
|
+
|
856
|
+
# Now set the other
|
857
|
+
assert_nothing_raised do
|
858
|
+
trans.set_trigger(yep)
|
859
|
+
end
|
860
|
+
assert(trans.targeted?(c), "c is not targeted")
|
861
|
+
|
862
|
+
# Now trigger our three resources
|
863
|
+
assert_nothing_raised do
|
864
|
+
assert_nil(trans.trigger(a), "a somehow triggered something")
|
865
|
+
end
|
866
|
+
assert_nothing_raised do
|
867
|
+
assert_nil(trans.trigger(b), "b somehow triggered something")
|
868
|
+
end
|
869
|
+
assert_equal([], $triggered,"got something in triggered")
|
870
|
+
result = nil
|
871
|
+
assert_nothing_raised do
|
872
|
+
result = trans.trigger(c)
|
873
|
+
end
|
874
|
+
assert(result, "c did not trigger anything")
|
875
|
+
assert_instance_of(Array, result)
|
876
|
+
event = result.shift
|
877
|
+
assert_instance_of(Puppet::Event, event)
|
878
|
+
assert_equal(:triggered, event.event, "event was not set correctly")
|
879
|
+
assert_equal(c, event.source, "source was not set correctly")
|
880
|
+
assert_equal(trans, event.transaction, "transaction was not set correctly")
|
881
|
+
|
882
|
+
assert(trans.triggered?(c, :refresh),
|
883
|
+
"Transaction did not store the trigger")
|
404
884
|
end
|
885
|
+
|
886
|
+
def test_graph
|
887
|
+
Puppet.config.use(:puppet)
|
888
|
+
# Make a graph
|
889
|
+
graph = Puppet::PGraph.new
|
890
|
+
graph.add_edge!("a", "b")
|
891
|
+
|
892
|
+
# Create our transaction
|
893
|
+
trans = Puppet::Transaction.new(graph)
|
894
|
+
|
895
|
+
assert_nothing_raised do
|
896
|
+
trans.graph(graph, :testing)
|
897
|
+
end
|
898
|
+
|
899
|
+
dotfile = File.join(Puppet[:graphdir], "testing.dot")
|
900
|
+
assert(! FileTest.exists?(dotfile), "Enabled graphing even tho disabled")
|
901
|
+
|
902
|
+
# Now enable graphing
|
903
|
+
Puppet[:graph] = true
|
904
|
+
|
905
|
+
assert_nothing_raised do
|
906
|
+
trans.graph(graph, :testing)
|
907
|
+
end
|
908
|
+
assert(FileTest.exists?(dotfile), "Did not create graph.")
|
909
|
+
end
|
910
|
+
|
911
|
+
def test_created_graphs
|
912
|
+
FileUtils.mkdir_p(Puppet[:graphdir])
|
913
|
+
file = Puppet::Type.newfile(:path => tempfile, :content => "yay")
|
914
|
+
exec = Puppet::Type.type(:exec).create(:command => "echo yay", :path => ENV['PATH'],
|
915
|
+
:require => file)
|
916
|
+
|
917
|
+
Puppet[:graph] = true
|
918
|
+
assert_apply(file, exec)
|
919
|
+
|
920
|
+
%w{resources relationships expanded_relationships}.each do |name|
|
921
|
+
file = File.join(Puppet[:graphdir], "%s.dot" % name)
|
922
|
+
assert(FileTest.exists?(file), "graph for %s was not created" % name)
|
923
|
+
end
|
924
|
+
end
|
925
|
+
|
926
|
+
def test_set_target
|
927
|
+
file = Puppet::Type.newfile(:path => tempfile(), :content => "yay")
|
928
|
+
exec1 = Puppet::Type.type(:exec).create :command => "/bin/echo exec1"
|
929
|
+
exec2 = Puppet::Type.type(:exec).create :command => "/bin/echo exec2"
|
930
|
+
trans = Puppet::Transaction.new(newcomp(file, exec1, exec2))
|
931
|
+
|
932
|
+
# First try it with an edge that has no callback
|
933
|
+
edge = Puppet::Relationship.new(file, exec1)
|
934
|
+
assert_nothing_raised { trans.set_trigger(edge) }
|
935
|
+
assert(! trans.targeted?(exec1), "edge with no callback resulted in a target")
|
936
|
+
|
937
|
+
# Now with an edge that has an unsupported callback
|
938
|
+
edge = Puppet::Relationship.new(file, exec1, :callback => :nosuchmethod, :event => :ALL_EVENTS)
|
939
|
+
assert_nothing_raised { trans.set_trigger(edge) }
|
940
|
+
assert(! trans.targeted?(exec1), "edge with invalid callback resulted in a target")
|
941
|
+
|
942
|
+
# Lastly, with an edge with a supported callback
|
943
|
+
edge = Puppet::Relationship.new(file, exec1, :callback => :refresh, :event => :ALL_EVENTS)
|
944
|
+
assert_nothing_raised { trans.set_trigger(edge) }
|
945
|
+
assert(trans.targeted?(exec1), "edge with valid callback did not result in a target")
|
946
|
+
end
|
947
|
+
|
948
|
+
# Testing #401 -- transactions are calling refresh() on classes that don't support it.
|
949
|
+
def test_callback_availability
|
950
|
+
$called = []
|
951
|
+
klass = Puppet::Type.newtype(:norefresh) do
|
952
|
+
newparam(:name, :namevar => true) {}
|
953
|
+
def method_missing(method, *args)
|
954
|
+
$called << method
|
955
|
+
end
|
956
|
+
end
|
957
|
+
cleanup do
|
958
|
+
$called = nil
|
959
|
+
Puppet::Type.rmtype(:norefresh)
|
960
|
+
end
|
961
|
+
|
962
|
+
file = Puppet::Type.newfile :path => tempfile(), :content => "yay"
|
963
|
+
one = klass.create :name => "one", :subscribe => file
|
964
|
+
|
965
|
+
assert_apply(file, one)
|
966
|
+
|
967
|
+
assert(! $called.include?(:refresh), "Called refresh when it wasn't set as a method")
|
968
|
+
end
|
969
|
+
|
970
|
+
# Testing #437 - cyclic graphs should throw failures.
|
971
|
+
def test_fail_on_cycle
|
972
|
+
one = Puppet::Type.type(:exec).create(:name => "/bin/echo one")
|
973
|
+
two = Puppet::Type.type(:exec).create(:name => "/bin/echo two")
|
974
|
+
one[:require] = two
|
975
|
+
two[:require] = one
|
976
|
+
|
977
|
+
trans = newcomp(one, two).evaluate
|
978
|
+
assert_raise(Puppet::Error) do
|
979
|
+
trans.prepare
|
980
|
+
end
|
981
|
+
end
|
982
|
+
|
983
|
+
def test_errors_during_generation
|
984
|
+
type = Puppet::Type.newtype(:failer) do
|
985
|
+
newparam(:name) {}
|
986
|
+
def eval_generate
|
987
|
+
raise ArgumentError, "Invalid value"
|
988
|
+
end
|
989
|
+
def generate
|
990
|
+
raise ArgumentError, "Invalid value"
|
991
|
+
end
|
992
|
+
end
|
993
|
+
cleanup { Puppet::Type.rmtype(:failer) }
|
994
|
+
|
995
|
+
obj = type.create(:name => "testing")
|
996
|
+
|
997
|
+
assert_apply(obj)
|
998
|
+
end
|
999
|
+
|
1000
|
+
def test_self_refresh_causes_triggering
|
1001
|
+
type = Puppet::Type.newtype(:refresher, :self_refresh => true) do
|
1002
|
+
attr_accessor :refreshed, :testing
|
1003
|
+
newparam(:name) {}
|
1004
|
+
newproperty(:testing) do
|
1005
|
+
def sync
|
1006
|
+
self.is = self.should
|
1007
|
+
:ran_testing
|
1008
|
+
end
|
1009
|
+
end
|
1010
|
+
def refresh
|
1011
|
+
@refreshed = true
|
1012
|
+
end
|
1013
|
+
end
|
1014
|
+
cleanup { Puppet::Type.rmtype(:refresher)}
|
1015
|
+
|
1016
|
+
obj = type.create(:name => "yay", :testing => "cool")
|
1017
|
+
|
1018
|
+
assert(! obj.insync?, "fake object is already in sync")
|
1019
|
+
|
1020
|
+
# Now make sure it gets refreshed when the change happens
|
1021
|
+
assert_apply(obj)
|
1022
|
+
assert(obj.refreshed, "object was not refreshed during transaction")
|
1023
|
+
end
|
1024
|
+
|
1025
|
+
# Testing #433
|
1026
|
+
def test_explicit_dependencies_beat_automatic
|
1027
|
+
# Create a couple of different resource sets that have automatic relationships and make sure the manual relationships win
|
1028
|
+
rels = {}
|
1029
|
+
# First users and groups
|
1030
|
+
group = Puppet::Type.type(:group).create(:name => nonrootgroup.name, :ensure => :present)
|
1031
|
+
user = Puppet::Type.type(:user).create(:name => nonrootuser.name, :ensure => :present, :gid => group.title)
|
1032
|
+
|
1033
|
+
# Now add the explicit relationship
|
1034
|
+
group[:require] = user
|
1035
|
+
rels[group] = user
|
1036
|
+
# Now files
|
1037
|
+
d = tempfile()
|
1038
|
+
f = File.join(d, "file")
|
1039
|
+
file = Puppet::Type.newfile(:path => f, :content => "yay")
|
1040
|
+
dir = Puppet::Type.newfile(:path => d, :ensure => :directory, :require => file)
|
1041
|
+
|
1042
|
+
rels[dir] = file
|
1043
|
+
rels.each do |after, before|
|
1044
|
+
comp = newcomp(before, after)
|
1045
|
+
trans = comp.evaluate
|
1046
|
+
str = "from %s to %s" % [before, after]
|
1047
|
+
|
1048
|
+
assert_nothing_raised("Failed to create graph %s" % str) do
|
1049
|
+
trans.prepare
|
1050
|
+
end
|
1051
|
+
|
1052
|
+
graph = trans.relgraph
|
1053
|
+
assert(graph.edge?(before, after), "did not create manual relationship %s" % str)
|
1054
|
+
assert(! graph.edge?(after, before), "created automatic relationship %s" % str)
|
1055
|
+
end
|
1056
|
+
end
|
1057
|
+
|
1058
|
+
def test_labeled_deps_beat_unlabeled
|
1059
|
+
one = Puppet::Type.type(:exec).create :command => "/bin/echo one"
|
1060
|
+
two = Puppet::Type.type(:exec).create :command => "/bin/echo two"
|
1061
|
+
|
1062
|
+
one[:require] = two
|
1063
|
+
one[:subscribe] = two
|
1064
|
+
|
1065
|
+
comp = newcomp(one, two)
|
1066
|
+
trans = Puppet::Transaction.new(comp)
|
1067
|
+
graph = trans.relationship_graph
|
1068
|
+
|
1069
|
+
label = graph.edge_label(two, one)
|
1070
|
+
assert(label, "require beat subscribe")
|
1071
|
+
assert_equal(:refresh, label[:callback],
|
1072
|
+
"did not get correct callback from subscribe")
|
1073
|
+
|
1074
|
+
one.delete(:require)
|
1075
|
+
one.delete(:subscribe)
|
1076
|
+
|
1077
|
+
two[:before] = one
|
1078
|
+
two[:notify] = one
|
1079
|
+
|
1080
|
+
trans = Puppet::Transaction.new(comp)
|
1081
|
+
graph = trans.relationship_graph
|
1082
|
+
|
1083
|
+
label = graph.edge_label(two, one)
|
1084
|
+
assert(label, "before beat notify")
|
1085
|
+
assert_equal(:refresh, label[:callback],
|
1086
|
+
"did not get correct callback from notify")
|
1087
|
+
end
|
1088
|
+
|
1089
|
+
# #542 - make sure resources in noop mode still notify their resources,
|
1090
|
+
# so that users know if a service will get restarted.
|
1091
|
+
def test_noop_with_notify
|
1092
|
+
path = tempfile
|
1093
|
+
epath = tempfile
|
1094
|
+
spath = tempfile
|
1095
|
+
file = Puppet::Type.newfile(:path => path, :ensure => :file,
|
1096
|
+
:title => "file")
|
1097
|
+
exec = Puppet::Type.type(:exec).create(:command => "touch %s" % epath,
|
1098
|
+
:path => ENV["PATH"], :subscribe => file, :refreshonly => true,
|
1099
|
+
:title => 'exec1')
|
1100
|
+
exec2 = Puppet::Type.type(:exec).create(:command => "touch %s" % spath,
|
1101
|
+
:path => ENV["PATH"], :subscribe => exec, :refreshonly => true,
|
1102
|
+
:title => 'exec2')
|
1103
|
+
|
1104
|
+
Puppet[:noop] = true
|
1105
|
+
|
1106
|
+
assert(file.noop, "file not in noop")
|
1107
|
+
assert(exec.noop, "exec not in noop")
|
1108
|
+
|
1109
|
+
@logs.clear
|
1110
|
+
assert_apply(file, exec, exec2)
|
1111
|
+
|
1112
|
+
assert(! FileTest.exists?(path), "Created file in noop")
|
1113
|
+
assert(! FileTest.exists?(epath), "Executed exec in noop")
|
1114
|
+
assert(! FileTest.exists?(spath), "Executed second exec in noop")
|
1115
|
+
|
1116
|
+
assert(@logs.detect { |l|
|
1117
|
+
l.message =~ /should be/ and l.source == file.property(:ensure).path},
|
1118
|
+
"did not log file change")
|
1119
|
+
assert(@logs.detect { |l|
|
1120
|
+
l.message =~ /Would have/ and l.source == exec.path },
|
1121
|
+
"did not log first exec trigger")
|
1122
|
+
assert(@logs.detect { |l|
|
1123
|
+
l.message =~ /Would have/ and l.source == exec2.path },
|
1124
|
+
"did not log second exec trigger")
|
1125
|
+
end
|
1126
|
+
|
1127
|
+
def test_only_stop_purging_with_relations
|
1128
|
+
files = []
|
1129
|
+
paths = []
|
1130
|
+
3.times do |i|
|
1131
|
+
path = tempfile
|
1132
|
+
paths << path
|
1133
|
+
file = Puppet::Type.newfile(:path => path, :ensure => :absent,
|
1134
|
+
:backup => false, :title => "file%s" % i)
|
1135
|
+
File.open(path, "w") { |f| f.puts "" }
|
1136
|
+
files << file
|
1137
|
+
end
|
1138
|
+
|
1139
|
+
files[0][:ensure] = :file
|
1140
|
+
files[0][:require] = files[1..2]
|
1141
|
+
|
1142
|
+
# Mark the second as purging
|
1143
|
+
files[1].purging
|
1144
|
+
|
1145
|
+
assert_apply(*files)
|
1146
|
+
|
1147
|
+
assert(FileTest.exists?(paths[1]), "Deleted required purging file")
|
1148
|
+
assert(! FileTest.exists?(paths[2]), "Did not delete non-purged file")
|
405
1149
|
end
|
406
1150
|
end
|
1151
|
+
|
1152
|
+
# $Id: transactions.rb 2372 2007-03-30 00:47:03Z luke $
|