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
|
@@ -0,0 +1,1799 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
$:.unshift("../../lib") if __FILE__ =~ /\.rb$/
|
|
4
|
+
|
|
5
|
+
require 'puppettest'
|
|
6
|
+
require 'fileutils'
|
|
7
|
+
|
|
8
|
+
class TestFile < Test::Unit::TestCase
|
|
9
|
+
include PuppetTest::FileTesting
|
|
10
|
+
# hmmm
|
|
11
|
+
# this is complicated, because we store references to the created
|
|
12
|
+
# objects in a central store
|
|
13
|
+
def mkfile(hash)
|
|
14
|
+
file = nil
|
|
15
|
+
assert_nothing_raised {
|
|
16
|
+
file = Puppet.type(:file).create(hash)
|
|
17
|
+
}
|
|
18
|
+
return file
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def mktestfile
|
|
22
|
+
# because luke's home directory is on nfs, it can't be used for testing
|
|
23
|
+
# as root
|
|
24
|
+
tmpfile = tempfile()
|
|
25
|
+
File.open(tmpfile, "w") { |f| f.puts rand(100) }
|
|
26
|
+
@@tmpfiles.push tmpfile
|
|
27
|
+
mkfile(:name => tmpfile)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def setup
|
|
31
|
+
super
|
|
32
|
+
@file = Puppet::Type.type(:file)
|
|
33
|
+
$method = @method_name
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def teardown
|
|
37
|
+
Puppet::Util::Storage.clear
|
|
38
|
+
system("rm -rf %s" % Puppet[:statefile])
|
|
39
|
+
super
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def initstorage
|
|
43
|
+
Puppet::Util::Storage.init
|
|
44
|
+
Puppet::Util::Storage.load
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def clearstorage
|
|
48
|
+
Puppet::Util::Storage.store
|
|
49
|
+
Puppet::Util::Storage.clear
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def test_owner
|
|
53
|
+
file = mktestfile()
|
|
54
|
+
|
|
55
|
+
users = {}
|
|
56
|
+
count = 0
|
|
57
|
+
|
|
58
|
+
# collect five users
|
|
59
|
+
Etc.passwd { |passwd|
|
|
60
|
+
if count > 5
|
|
61
|
+
break
|
|
62
|
+
else
|
|
63
|
+
count += 1
|
|
64
|
+
end
|
|
65
|
+
users[passwd.uid] = passwd.name
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
fake = {}
|
|
69
|
+
# find a fake user
|
|
70
|
+
while true
|
|
71
|
+
a = rand(1000)
|
|
72
|
+
begin
|
|
73
|
+
Etc.getpwuid(a)
|
|
74
|
+
rescue
|
|
75
|
+
fake[a] = "fakeuser"
|
|
76
|
+
break
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
uid, name = users.shift
|
|
81
|
+
us = {}
|
|
82
|
+
us[uid] = name
|
|
83
|
+
users.each { |uid, name|
|
|
84
|
+
assert_apply(file)
|
|
85
|
+
assert_nothing_raised() {
|
|
86
|
+
file[:owner] = name
|
|
87
|
+
}
|
|
88
|
+
assert_nothing_raised() {
|
|
89
|
+
file.retrieve
|
|
90
|
+
}
|
|
91
|
+
assert_apply(file)
|
|
92
|
+
}
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def test_group
|
|
96
|
+
file = mktestfile()
|
|
97
|
+
[%x{groups}.chomp.split(/ /), Process.groups].flatten.each { |group|
|
|
98
|
+
assert_nothing_raised() {
|
|
99
|
+
file[:group] = group
|
|
100
|
+
}
|
|
101
|
+
assert(file.property(:group))
|
|
102
|
+
assert(file.property(:group).should)
|
|
103
|
+
}
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
if Puppet::Util::SUIDManager.uid == 0
|
|
107
|
+
def test_createasuser
|
|
108
|
+
dir = tmpdir()
|
|
109
|
+
|
|
110
|
+
user = nonrootuser()
|
|
111
|
+
path = File.join(tmpdir, "createusertesting")
|
|
112
|
+
@@tmpfiles << path
|
|
113
|
+
|
|
114
|
+
file = nil
|
|
115
|
+
assert_nothing_raised {
|
|
116
|
+
file = Puppet.type(:file).create(
|
|
117
|
+
:path => path,
|
|
118
|
+
:owner => user.name,
|
|
119
|
+
:ensure => "file",
|
|
120
|
+
:mode => "755"
|
|
121
|
+
)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
comp = newcomp("createusertest", file)
|
|
125
|
+
|
|
126
|
+
assert_events([:file_created], comp)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def test_nofollowlinks
|
|
130
|
+
basedir = tempfile()
|
|
131
|
+
Dir.mkdir(basedir)
|
|
132
|
+
file = File.join(basedir, "file")
|
|
133
|
+
link = File.join(basedir, "link")
|
|
134
|
+
|
|
135
|
+
File.open(file, "w", 0644) { |f| f.puts "yayness"; f.flush }
|
|
136
|
+
File.symlink(file, link)
|
|
137
|
+
|
|
138
|
+
# First test 'user'
|
|
139
|
+
user = nonrootuser()
|
|
140
|
+
|
|
141
|
+
inituser = File.lstat(link).uid
|
|
142
|
+
File.lchown(inituser, nil, link)
|
|
143
|
+
|
|
144
|
+
obj = nil
|
|
145
|
+
assert_nothing_raised {
|
|
146
|
+
obj = Puppet.type(:file).create(
|
|
147
|
+
:title => link,
|
|
148
|
+
:owner => user.name
|
|
149
|
+
)
|
|
150
|
+
}
|
|
151
|
+
obj.retrieve
|
|
152
|
+
|
|
153
|
+
# Make sure it defaults to managing the link
|
|
154
|
+
assert_events([:file_changed], obj)
|
|
155
|
+
assert_equal(user.uid, File.lstat(link).uid)
|
|
156
|
+
assert_equal(inituser, File.stat(file).uid)
|
|
157
|
+
File.chown(inituser, nil, file)
|
|
158
|
+
File.lchown(inituser, nil, link)
|
|
159
|
+
|
|
160
|
+
# Try following
|
|
161
|
+
obj[:links] = :follow
|
|
162
|
+
assert_events([:file_changed], obj)
|
|
163
|
+
assert_equal(user.uid, File.stat(file).uid)
|
|
164
|
+
assert_equal(inituser, File.lstat(link).uid)
|
|
165
|
+
|
|
166
|
+
# And then explicitly managing
|
|
167
|
+
File.chown(inituser, nil, file)
|
|
168
|
+
File.lchown(inituser, nil, link)
|
|
169
|
+
obj[:links] = :manage
|
|
170
|
+
assert_events([:file_changed], obj)
|
|
171
|
+
assert_equal(user.uid, File.lstat(link).uid)
|
|
172
|
+
assert_equal(inituser, File.stat(file).uid)
|
|
173
|
+
|
|
174
|
+
obj.delete(:owner)
|
|
175
|
+
obj[:links] = :ignore
|
|
176
|
+
|
|
177
|
+
# And then test 'group'
|
|
178
|
+
group = nonrootgroup
|
|
179
|
+
|
|
180
|
+
initgroup = File.stat(file).gid
|
|
181
|
+
obj[:group] = group.name
|
|
182
|
+
|
|
183
|
+
assert_events([:file_changed], obj)
|
|
184
|
+
assert_equal(initgroup, File.stat(file).gid)
|
|
185
|
+
assert_equal(group.gid, File.lstat(link).gid)
|
|
186
|
+
File.chown(nil, initgroup, file)
|
|
187
|
+
File.lchown(nil, initgroup, link)
|
|
188
|
+
|
|
189
|
+
obj[:links] = :follow
|
|
190
|
+
assert_events([:file_changed], obj)
|
|
191
|
+
assert_equal(group.gid, File.stat(file).gid)
|
|
192
|
+
File.chown(nil, initgroup, file)
|
|
193
|
+
File.lchown(nil, initgroup, link)
|
|
194
|
+
|
|
195
|
+
obj[:links] = :manage
|
|
196
|
+
assert_events([:file_changed], obj)
|
|
197
|
+
assert_equal(group.gid, File.lstat(link).gid)
|
|
198
|
+
assert_equal(initgroup, File.stat(file).gid)
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
def test_ownerasroot
|
|
202
|
+
file = mktestfile()
|
|
203
|
+
|
|
204
|
+
users = {}
|
|
205
|
+
count = 0
|
|
206
|
+
|
|
207
|
+
# collect five users
|
|
208
|
+
Etc.passwd { |passwd|
|
|
209
|
+
if count > 5
|
|
210
|
+
break
|
|
211
|
+
else
|
|
212
|
+
count += 1
|
|
213
|
+
end
|
|
214
|
+
next if passwd.uid < 0
|
|
215
|
+
users[passwd.uid] = passwd.name
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
fake = {}
|
|
219
|
+
# find a fake user
|
|
220
|
+
while true
|
|
221
|
+
a = rand(1000)
|
|
222
|
+
begin
|
|
223
|
+
Etc.getpwuid(a)
|
|
224
|
+
rescue
|
|
225
|
+
fake[a] = "fakeuser"
|
|
226
|
+
break
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
users.each { |uid, name|
|
|
231
|
+
assert_nothing_raised() {
|
|
232
|
+
file[:owner] = name
|
|
233
|
+
}
|
|
234
|
+
changes = []
|
|
235
|
+
assert_nothing_raised() {
|
|
236
|
+
changes << file.evaluate
|
|
237
|
+
}
|
|
238
|
+
assert(changes.length > 0)
|
|
239
|
+
assert_apply(file)
|
|
240
|
+
file.retrieve
|
|
241
|
+
assert(file.insync?())
|
|
242
|
+
assert_nothing_raised() {
|
|
243
|
+
file[:owner] = uid
|
|
244
|
+
}
|
|
245
|
+
assert_apply(file)
|
|
246
|
+
file.retrieve
|
|
247
|
+
# make sure changing to number doesn't cause a sync
|
|
248
|
+
assert(file.insync?())
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
# We no longer raise an error here, because we check at run time
|
|
252
|
+
#fake.each { |uid, name|
|
|
253
|
+
# assert_raise(Puppet::Error) {
|
|
254
|
+
# file[:owner] = name
|
|
255
|
+
# }
|
|
256
|
+
# assert_raise(Puppet::Error) {
|
|
257
|
+
# file[:owner] = uid
|
|
258
|
+
# }
|
|
259
|
+
#}
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
def test_groupasroot
|
|
263
|
+
file = mktestfile()
|
|
264
|
+
[%x{groups}.chomp.split(/ /), Process.groups].flatten.each { |group|
|
|
265
|
+
next unless Puppet::Util.gid(group) # grr.
|
|
266
|
+
assert_nothing_raised() {
|
|
267
|
+
file[:group] = group
|
|
268
|
+
}
|
|
269
|
+
assert(file.property(:group))
|
|
270
|
+
assert(file.property(:group).should)
|
|
271
|
+
assert_apply(file)
|
|
272
|
+
file.retrieve
|
|
273
|
+
assert(file.insync?())
|
|
274
|
+
assert_nothing_raised() {
|
|
275
|
+
file.delete(:group)
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
if Facter.value(:operatingsystem) == "Darwin"
|
|
281
|
+
def test_sillyowner
|
|
282
|
+
file = tempfile()
|
|
283
|
+
File.open(file, "w") { |f| f.puts "" }
|
|
284
|
+
File.chown(-2, nil, file)
|
|
285
|
+
|
|
286
|
+
assert(File.stat(file).uid > 120000, "eh?")
|
|
287
|
+
user = nonrootuser
|
|
288
|
+
obj = Puppet::Type.newfile(
|
|
289
|
+
:path => file,
|
|
290
|
+
:owner => user.name
|
|
291
|
+
)
|
|
292
|
+
|
|
293
|
+
assert_apply(obj)
|
|
294
|
+
|
|
295
|
+
assert_equal(user.uid, File.stat(file).uid)
|
|
296
|
+
end
|
|
297
|
+
end
|
|
298
|
+
else
|
|
299
|
+
$stderr.puts "Run as root for complete owner and group testing"
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
def test_create
|
|
303
|
+
%w{a b c d}.collect { |name| tempfile() + name.to_s }.each { |path|
|
|
304
|
+
file =nil
|
|
305
|
+
assert_nothing_raised() {
|
|
306
|
+
file = Puppet.type(:file).create(
|
|
307
|
+
:name => path,
|
|
308
|
+
:ensure => "file"
|
|
309
|
+
)
|
|
310
|
+
}
|
|
311
|
+
assert_events([:file_created], file)
|
|
312
|
+
assert_events([], file)
|
|
313
|
+
assert(FileTest.file?(path), "File does not exist")
|
|
314
|
+
assert(file.insync?())
|
|
315
|
+
@@tmpfiles.push path
|
|
316
|
+
}
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
def test_create_dir
|
|
320
|
+
basedir = tempfile()
|
|
321
|
+
Dir.mkdir(basedir)
|
|
322
|
+
%w{a b c d}.collect { |name| "#{basedir}/%s" % name }.each { |path|
|
|
323
|
+
file = nil
|
|
324
|
+
assert_nothing_raised() {
|
|
325
|
+
file = Puppet.type(:file).create(
|
|
326
|
+
:name => path,
|
|
327
|
+
:ensure => "directory"
|
|
328
|
+
)
|
|
329
|
+
}
|
|
330
|
+
assert(! FileTest.directory?(path), "Directory %s already exists" %
|
|
331
|
+
[path])
|
|
332
|
+
assert_events([:directory_created], file)
|
|
333
|
+
assert_events([], file)
|
|
334
|
+
assert(file.insync?())
|
|
335
|
+
assert(FileTest.directory?(path))
|
|
336
|
+
@@tmpfiles.push path
|
|
337
|
+
}
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
def test_modes
|
|
341
|
+
file = mktestfile
|
|
342
|
+
# Set it to something else initially
|
|
343
|
+
File.chmod(0775, file.title)
|
|
344
|
+
[0644,0755,0777,0641].each { |mode|
|
|
345
|
+
assert_nothing_raised() {
|
|
346
|
+
file[:mode] = mode
|
|
347
|
+
}
|
|
348
|
+
assert_events([:file_changed], file)
|
|
349
|
+
assert_events([], file)
|
|
350
|
+
|
|
351
|
+
assert(file.insync?())
|
|
352
|
+
|
|
353
|
+
assert_nothing_raised() {
|
|
354
|
+
file.delete(:mode)
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
def test_checksums
|
|
360
|
+
types = %w{md5 md5lite timestamp time}
|
|
361
|
+
exists = "/tmp/sumtest-exists"
|
|
362
|
+
nonexists = "/tmp/sumtest-nonexists"
|
|
363
|
+
|
|
364
|
+
@@tmpfiles << exists
|
|
365
|
+
@@tmpfiles << nonexists
|
|
366
|
+
|
|
367
|
+
# try it both with files that exist and ones that don't
|
|
368
|
+
files = [exists, nonexists]
|
|
369
|
+
initstorage
|
|
370
|
+
File.open(exists,File::CREAT|File::TRUNC|File::WRONLY) { |of|
|
|
371
|
+
of.puts "initial text"
|
|
372
|
+
}
|
|
373
|
+
types.each { |type|
|
|
374
|
+
files.each { |path|
|
|
375
|
+
if Puppet[:debug]
|
|
376
|
+
Puppet.warning "Testing %s on %s" % [type,path]
|
|
377
|
+
end
|
|
378
|
+
file = nil
|
|
379
|
+
events = nil
|
|
380
|
+
# okay, we now know that we have a file...
|
|
381
|
+
assert_nothing_raised() {
|
|
382
|
+
file = Puppet.type(:file).create(
|
|
383
|
+
:name => path,
|
|
384
|
+
:ensure => "file",
|
|
385
|
+
:checksum => type
|
|
386
|
+
)
|
|
387
|
+
}
|
|
388
|
+
trans = nil
|
|
389
|
+
|
|
390
|
+
file.retrieve
|
|
391
|
+
|
|
392
|
+
if file.title !~ /nonexists/
|
|
393
|
+
sum = file.property(:checksum)
|
|
394
|
+
assert(sum.insync?, "file is not in sync")
|
|
395
|
+
end
|
|
396
|
+
|
|
397
|
+
events = assert_apply(file)
|
|
398
|
+
|
|
399
|
+
assert(! events.include?(:file_changed),
|
|
400
|
+
"File incorrectly changed")
|
|
401
|
+
assert_events([], file)
|
|
402
|
+
|
|
403
|
+
# We have to sleep because the time resolution of the time-based
|
|
404
|
+
# mechanisms is greater than one second
|
|
405
|
+
sleep 1 if type =~ /time/
|
|
406
|
+
|
|
407
|
+
assert_nothing_raised() {
|
|
408
|
+
File.open(path,File::CREAT|File::TRUNC|File::WRONLY) { |of|
|
|
409
|
+
of.puts "some more text, yo"
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
Puppet.type(:file).clear
|
|
413
|
+
|
|
414
|
+
# now recreate the file
|
|
415
|
+
assert_nothing_raised() {
|
|
416
|
+
file = Puppet.type(:file).create(
|
|
417
|
+
:name => path,
|
|
418
|
+
:checksum => type
|
|
419
|
+
)
|
|
420
|
+
}
|
|
421
|
+
trans = nil
|
|
422
|
+
|
|
423
|
+
assert_events([:file_changed], file)
|
|
424
|
+
|
|
425
|
+
# Run it a few times to make sure we aren't getting
|
|
426
|
+
# spurious changes.
|
|
427
|
+
assert_nothing_raised do
|
|
428
|
+
file.property(:checksum).retrieve
|
|
429
|
+
end
|
|
430
|
+
assert(file.property(:checksum).insync?,
|
|
431
|
+
"checksum is not in sync")
|
|
432
|
+
|
|
433
|
+
sleep 1.1 if type =~ /time/
|
|
434
|
+
assert_nothing_raised() {
|
|
435
|
+
File.unlink(path)
|
|
436
|
+
File.open(path,File::CREAT|File::TRUNC|File::WRONLY) { |of|
|
|
437
|
+
# We have to put a certain amount of text in here or
|
|
438
|
+
# the md5-lite test fails
|
|
439
|
+
2.times {
|
|
440
|
+
of.puts rand(100)
|
|
441
|
+
}
|
|
442
|
+
of.flush
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
assert_events([:file_changed], file)
|
|
446
|
+
|
|
447
|
+
# verify that we're actually getting notified when a file changes
|
|
448
|
+
assert_nothing_raised() {
|
|
449
|
+
Puppet.type(:file).clear
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
if path =~ /nonexists/
|
|
453
|
+
File.unlink(path)
|
|
454
|
+
end
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
end
|
|
458
|
+
|
|
459
|
+
def cyclefile(path)
|
|
460
|
+
# i had problems with using :name instead of :path
|
|
461
|
+
[:name,:path].each { |param|
|
|
462
|
+
file = nil
|
|
463
|
+
changes = nil
|
|
464
|
+
comp = nil
|
|
465
|
+
trans = nil
|
|
466
|
+
|
|
467
|
+
initstorage
|
|
468
|
+
assert_nothing_raised {
|
|
469
|
+
file = Puppet.type(:file).create(
|
|
470
|
+
param => path,
|
|
471
|
+
:recurse => true,
|
|
472
|
+
:checksum => "md5"
|
|
473
|
+
)
|
|
474
|
+
}
|
|
475
|
+
comp = Puppet.type(:component).create(
|
|
476
|
+
:name => "component"
|
|
477
|
+
)
|
|
478
|
+
comp.push file
|
|
479
|
+
assert_nothing_raised {
|
|
480
|
+
trans = comp.evaluate
|
|
481
|
+
}
|
|
482
|
+
assert_nothing_raised {
|
|
483
|
+
trans.evaluate
|
|
484
|
+
}
|
|
485
|
+
clearstorage
|
|
486
|
+
Puppet::Type.allclear
|
|
487
|
+
}
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
def test_localrecurse
|
|
491
|
+
# Create a test directory
|
|
492
|
+
path = tempfile()
|
|
493
|
+
dir = @file.create :path => path, :mode => 0755, :recurse => true
|
|
494
|
+
|
|
495
|
+
Dir.mkdir(path)
|
|
496
|
+
|
|
497
|
+
# Make sure we return nothing when there are no children
|
|
498
|
+
ret = nil
|
|
499
|
+
assert_nothing_raised() { ret = dir.localrecurse(true) }
|
|
500
|
+
assert_equal([], ret, "empty dir returned children")
|
|
501
|
+
|
|
502
|
+
# Now make a file and make sure we get it
|
|
503
|
+
test = File.join(path, "file")
|
|
504
|
+
File.open(test, "w") { |f| f.puts "yay" }
|
|
505
|
+
assert_nothing_raised() { ret = dir.localrecurse(true) }
|
|
506
|
+
fileobj = @file[test]
|
|
507
|
+
assert(fileobj, "child object was not created")
|
|
508
|
+
assert_equal([fileobj], ret, "child object was not returned")
|
|
509
|
+
|
|
510
|
+
# And that it inherited our recurse setting
|
|
511
|
+
assert_equal(true, fileobj[:recurse], "file did not inherit recurse")
|
|
512
|
+
|
|
513
|
+
# Make sure it's not returned again
|
|
514
|
+
assert_nothing_raised() { ret = dir.localrecurse(true) }
|
|
515
|
+
assert_equal([], ret, "child object was returned twice")
|
|
516
|
+
|
|
517
|
+
# Now just for completion, make sure we will return many files
|
|
518
|
+
files = []
|
|
519
|
+
10.times do |i|
|
|
520
|
+
f = File.join(path, i.to_s)
|
|
521
|
+
files << f
|
|
522
|
+
File.open(f, "w") do |o| o.puts "" end
|
|
523
|
+
end
|
|
524
|
+
assert_nothing_raised() { ret = dir.localrecurse(true) }
|
|
525
|
+
assert_equal(files.sort, ret.collect { |f| f.title }.sort,
|
|
526
|
+
"child object was returned twice")
|
|
527
|
+
|
|
528
|
+
# Clean everything up and start over
|
|
529
|
+
files << test
|
|
530
|
+
files.each do |f| File.unlink(f) end
|
|
531
|
+
|
|
532
|
+
# Now make sure we correctly ignore things
|
|
533
|
+
dir[:ignore] = "*.out"
|
|
534
|
+
bad = File.join(path, "test.out")
|
|
535
|
+
good = File.join(path, "yayness")
|
|
536
|
+
[good, bad].each do |f|
|
|
537
|
+
File.open(f, "w") { |o| o.puts "" }
|
|
538
|
+
end
|
|
539
|
+
|
|
540
|
+
assert_nothing_raised() { ret = dir.localrecurse(true) }
|
|
541
|
+
assert_equal([good], ret.collect { |f| f.title }, "ignore failed")
|
|
542
|
+
|
|
543
|
+
# Now make sure purging works
|
|
544
|
+
dir[:purge] = true
|
|
545
|
+
dir[:ignore] = "svn"
|
|
546
|
+
|
|
547
|
+
assert_nothing_raised() { ret = dir.localrecurse(true) }
|
|
548
|
+
assert_equal([bad], ret.collect { |f| f.title }, "purge failed")
|
|
549
|
+
|
|
550
|
+
badobj = @file[bad]
|
|
551
|
+
assert(badobj, "did not create bad object")
|
|
552
|
+
end
|
|
553
|
+
|
|
554
|
+
def test_recurse
|
|
555
|
+
basedir = tempfile()
|
|
556
|
+
FileUtils.mkdir_p(basedir)
|
|
557
|
+
|
|
558
|
+
# Create our file
|
|
559
|
+
dir = nil
|
|
560
|
+
assert_nothing_raised {
|
|
561
|
+
dir = Puppet.type(:file).create(
|
|
562
|
+
:path => basedir,
|
|
563
|
+
:check => %w{owner mode group}
|
|
564
|
+
)
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
return_nil = false
|
|
568
|
+
|
|
569
|
+
# and monkey-patch it
|
|
570
|
+
[:localrecurse, :linkrecurse].each do |m|
|
|
571
|
+
dir.meta_def(m) do |recurse|
|
|
572
|
+
if return_nil # for testing nil return, of course
|
|
573
|
+
return nil
|
|
574
|
+
else
|
|
575
|
+
return [recurse]
|
|
576
|
+
end
|
|
577
|
+
end
|
|
578
|
+
end
|
|
579
|
+
|
|
580
|
+
# We have to special-case this, because it returns a list of
|
|
581
|
+
# found files.
|
|
582
|
+
dir.meta_def(:sourcerecurse) do |recurse|
|
|
583
|
+
if return_nil # for testing nil return, of course
|
|
584
|
+
return nil
|
|
585
|
+
else
|
|
586
|
+
return [recurse], []
|
|
587
|
+
end
|
|
588
|
+
end
|
|
589
|
+
|
|
590
|
+
# First try it with recurse set to false
|
|
591
|
+
dir[:recurse] = false
|
|
592
|
+
assert_nothing_raised do
|
|
593
|
+
assert_nil(dir.recurse)
|
|
594
|
+
end
|
|
595
|
+
|
|
596
|
+
# Now try it with the different valid positive values
|
|
597
|
+
[true, "true", "inf", 50].each do |value|
|
|
598
|
+
assert_nothing_raised { dir[:recurse] = value}
|
|
599
|
+
|
|
600
|
+
# Now make sure the methods are called appropriately
|
|
601
|
+
ret = nil
|
|
602
|
+
assert_nothing_raised do
|
|
603
|
+
ret = dir.recurse
|
|
604
|
+
end
|
|
605
|
+
|
|
606
|
+
# We should only call the localrecurse method, so make sure
|
|
607
|
+
# that's the case
|
|
608
|
+
if value == 50
|
|
609
|
+
# Make sure our counter got decremented
|
|
610
|
+
assert_equal([49], ret, "did not call localrecurse")
|
|
611
|
+
else
|
|
612
|
+
assert_equal([true], ret, "did not call localrecurse")
|
|
613
|
+
end
|
|
614
|
+
end
|
|
615
|
+
|
|
616
|
+
# Make sure it doesn't recurse when we've set recurse to false
|
|
617
|
+
[false, "false"].each do |value|
|
|
618
|
+
assert_nothing_raised { dir[:recurse] = value }
|
|
619
|
+
|
|
620
|
+
ret = nil
|
|
621
|
+
assert_nothing_raised() { ret = dir.recurse }
|
|
622
|
+
assert_nil(ret)
|
|
623
|
+
end
|
|
624
|
+
dir[:recurse] = true
|
|
625
|
+
|
|
626
|
+
# Now add a target, so we do the linking thing
|
|
627
|
+
dir[:target] = tempfile()
|
|
628
|
+
ret = nil
|
|
629
|
+
assert_nothing_raised { ret = dir.recurse }
|
|
630
|
+
assert_equal([true, true], ret, "did not call linkrecurse")
|
|
631
|
+
|
|
632
|
+
# And add a source, and make sure we call that
|
|
633
|
+
dir[:source] = tempfile()
|
|
634
|
+
assert_nothing_raised { ret = dir.recurse }
|
|
635
|
+
assert_equal([true, true, true], ret, "did not call linkrecurse")
|
|
636
|
+
|
|
637
|
+
# Lastly, make sure we correctly handle returning nil
|
|
638
|
+
return_nil = true
|
|
639
|
+
assert_nothing_raised { ret = dir.recurse }
|
|
640
|
+
end
|
|
641
|
+
|
|
642
|
+
def test_recurse?
|
|
643
|
+
file = Puppet::Type.type(:file).create :path => tempfile
|
|
644
|
+
|
|
645
|
+
# Make sure we default to false
|
|
646
|
+
assert(! file.recurse?, "Recurse defaulted to true")
|
|
647
|
+
|
|
648
|
+
[true, "true", 10, "inf"].each do |value|
|
|
649
|
+
file[:recurse] = value
|
|
650
|
+
assert(file.recurse?, "%s did not cause recursion" % value)
|
|
651
|
+
end
|
|
652
|
+
|
|
653
|
+
[false, "false", 0].each do |value|
|
|
654
|
+
file[:recurse] = value
|
|
655
|
+
assert(! file.recurse?, "%s caused recursion" % value)
|
|
656
|
+
end
|
|
657
|
+
end
|
|
658
|
+
|
|
659
|
+
def test_recursion
|
|
660
|
+
basedir = tempfile()
|
|
661
|
+
subdir = File.join(basedir, "subdir")
|
|
662
|
+
tmpfile = File.join(basedir,"testing")
|
|
663
|
+
FileUtils.mkdir_p(subdir)
|
|
664
|
+
|
|
665
|
+
dir = nil
|
|
666
|
+
[true, "true", "inf", 50].each do |value|
|
|
667
|
+
assert_nothing_raised {
|
|
668
|
+
dir = Puppet.type(:file).create(
|
|
669
|
+
:path => basedir,
|
|
670
|
+
:recurse => value,
|
|
671
|
+
:check => %w{owner mode group}
|
|
672
|
+
)
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
children = nil
|
|
676
|
+
|
|
677
|
+
assert_nothing_raised {
|
|
678
|
+
children = dir.eval_generate
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
assert_equal([subdir], children.collect {|c| c.title },
|
|
682
|
+
"Incorrect generated children")
|
|
683
|
+
|
|
684
|
+
dir.class[subdir].remove
|
|
685
|
+
|
|
686
|
+
File.open(tmpfile, "w") { |f| f.puts "yayness" }
|
|
687
|
+
|
|
688
|
+
assert_nothing_raised {
|
|
689
|
+
children = dir.eval_generate
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
assert_equal([subdir, tmpfile].sort, children.collect {|c| c.title }.sort,
|
|
693
|
+
"Incorrect generated children")
|
|
694
|
+
|
|
695
|
+
File.unlink(tmpfile)
|
|
696
|
+
#system("rm -rf %s" % basedir)
|
|
697
|
+
Puppet.type(:file).clear
|
|
698
|
+
end
|
|
699
|
+
end
|
|
700
|
+
|
|
701
|
+
def test_filetype_retrieval
|
|
702
|
+
file = nil
|
|
703
|
+
|
|
704
|
+
# Verify it retrieves files of type directory
|
|
705
|
+
assert_nothing_raised {
|
|
706
|
+
file = Puppet.type(:file).create(
|
|
707
|
+
:name => tmpdir(),
|
|
708
|
+
:check => :type
|
|
709
|
+
)
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
assert_nothing_raised {
|
|
713
|
+
file.evaluate
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
assert_equal("directory", file.property(:type).is)
|
|
717
|
+
|
|
718
|
+
# And then check files
|
|
719
|
+
assert_nothing_raised {
|
|
720
|
+
file = Puppet.type(:file).create(
|
|
721
|
+
:name => tempfile(),
|
|
722
|
+
:ensure => "file"
|
|
723
|
+
)
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
assert_apply(file)
|
|
727
|
+
file[:check] = "type"
|
|
728
|
+
assert_apply(file)
|
|
729
|
+
|
|
730
|
+
assert_equal("file", file.property(:type).is)
|
|
731
|
+
|
|
732
|
+
file[:type] = "directory"
|
|
733
|
+
|
|
734
|
+
assert_nothing_raised { file.retrieve }
|
|
735
|
+
|
|
736
|
+
# The 'retrieve' method sets @should to @is, so they're never
|
|
737
|
+
# out of sync. It's a read-only class.
|
|
738
|
+
assert(file.insync?)
|
|
739
|
+
end
|
|
740
|
+
|
|
741
|
+
def test_remove
|
|
742
|
+
basedir = tempfile()
|
|
743
|
+
subdir = File.join(basedir, "this")
|
|
744
|
+
FileUtils.mkdir_p(subdir)
|
|
745
|
+
|
|
746
|
+
dir = nil
|
|
747
|
+
assert_nothing_raised {
|
|
748
|
+
dir = Puppet.type(:file).create(
|
|
749
|
+
:path => basedir,
|
|
750
|
+
:recurse => true,
|
|
751
|
+
:check => %w{owner mode group}
|
|
752
|
+
)
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
assert_nothing_raised {
|
|
756
|
+
dir.eval_generate
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
obj = nil
|
|
760
|
+
assert_nothing_raised {
|
|
761
|
+
obj = Puppet.type(:file)[subdir]
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
assert(obj, "Could not retrieve subdir object")
|
|
765
|
+
|
|
766
|
+
assert_nothing_raised {
|
|
767
|
+
obj.remove(true)
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
assert_nothing_raised {
|
|
771
|
+
obj = Puppet.type(:file)[subdir]
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
assert_nil(obj, "Retrieved removed object")
|
|
775
|
+
end
|
|
776
|
+
|
|
777
|
+
def test_path
|
|
778
|
+
dir = tempfile()
|
|
779
|
+
|
|
780
|
+
path = File.join(dir, "subdir")
|
|
781
|
+
|
|
782
|
+
assert_nothing_raised("Could not make file") {
|
|
783
|
+
FileUtils.mkdir_p(File.dirname(path))
|
|
784
|
+
File.open(path, "w") { |f| f.puts "yayness" }
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
file = nil
|
|
788
|
+
dirobj = nil
|
|
789
|
+
assert_nothing_raised("Could not make file object") {
|
|
790
|
+
dirobj = Puppet.type(:file).create(
|
|
791
|
+
:path => dir,
|
|
792
|
+
:recurse => true,
|
|
793
|
+
:check => %w{mode owner group}
|
|
794
|
+
)
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
assert_nothing_raised {
|
|
798
|
+
dirobj.eval_generate
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
assert_nothing_raised {
|
|
802
|
+
file = dirobj.class[path]
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
assert(file, "Could not retrieve file object")
|
|
806
|
+
|
|
807
|
+
assert_equal("/%s" % file.ref, file.path)
|
|
808
|
+
end
|
|
809
|
+
|
|
810
|
+
def test_autorequire
|
|
811
|
+
basedir = tempfile()
|
|
812
|
+
subfile = File.join(basedir, "subfile")
|
|
813
|
+
|
|
814
|
+
baseobj = Puppet.type(:file).create(
|
|
815
|
+
:name => basedir,
|
|
816
|
+
:ensure => "directory"
|
|
817
|
+
)
|
|
818
|
+
|
|
819
|
+
subobj = Puppet.type(:file).create(
|
|
820
|
+
:name => subfile,
|
|
821
|
+
:ensure => "file"
|
|
822
|
+
)
|
|
823
|
+
edge = nil
|
|
824
|
+
assert_nothing_raised do
|
|
825
|
+
edge = subobj.autorequire.shift
|
|
826
|
+
end
|
|
827
|
+
assert_equal(baseobj, edge.source, "file did not require its parent dir")
|
|
828
|
+
assert_equal(subobj, edge.target, "file did not require its parent dir")
|
|
829
|
+
end
|
|
830
|
+
|
|
831
|
+
def test_content
|
|
832
|
+
file = tempfile()
|
|
833
|
+
str = "This is some content"
|
|
834
|
+
|
|
835
|
+
obj = nil
|
|
836
|
+
assert_nothing_raised {
|
|
837
|
+
obj = Puppet.type(:file).create(
|
|
838
|
+
:name => file,
|
|
839
|
+
:content => str
|
|
840
|
+
)
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
assert(!obj.insync?, "Object is incorrectly in sync")
|
|
844
|
+
|
|
845
|
+
assert_events([:file_created], obj)
|
|
846
|
+
|
|
847
|
+
obj.retrieve
|
|
848
|
+
|
|
849
|
+
assert(obj.insync?, "Object is not in sync")
|
|
850
|
+
|
|
851
|
+
text = File.read(file)
|
|
852
|
+
|
|
853
|
+
assert_equal(str, text, "Content did not copy correctly")
|
|
854
|
+
|
|
855
|
+
newstr = "Another string, yo"
|
|
856
|
+
|
|
857
|
+
obj[:content] = newstr
|
|
858
|
+
|
|
859
|
+
assert(!obj.insync?, "Object is incorrectly in sync")
|
|
860
|
+
|
|
861
|
+
assert_events([:file_changed], obj)
|
|
862
|
+
|
|
863
|
+
text = File.read(file)
|
|
864
|
+
|
|
865
|
+
assert_equal(newstr, text, "Content did not copy correctly")
|
|
866
|
+
|
|
867
|
+
obj.retrieve
|
|
868
|
+
assert(obj.insync?, "Object is not in sync")
|
|
869
|
+
end
|
|
870
|
+
|
|
871
|
+
# Unfortunately, I know this fails
|
|
872
|
+
def disabled_test_recursivemkdir
|
|
873
|
+
path = tempfile()
|
|
874
|
+
subpath = File.join(path, "this", "is", "a", "dir")
|
|
875
|
+
file = nil
|
|
876
|
+
assert_nothing_raised {
|
|
877
|
+
file = Puppet.type(:file).create(
|
|
878
|
+
:name => subpath,
|
|
879
|
+
:ensure => "directory",
|
|
880
|
+
:recurse => true
|
|
881
|
+
)
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
comp = newcomp("yay", file)
|
|
885
|
+
comp.finalize
|
|
886
|
+
assert_apply(comp)
|
|
887
|
+
#assert_events([:directory_created], comp)
|
|
888
|
+
|
|
889
|
+
assert(FileTest.directory?(subpath), "Did not create directory")
|
|
890
|
+
end
|
|
891
|
+
|
|
892
|
+
# Make sure that content updates the checksum on the same run
|
|
893
|
+
def test_checksumchange_for_content
|
|
894
|
+
dest = tempfile()
|
|
895
|
+
File.open(dest, "w") { |f| f.puts "yayness" }
|
|
896
|
+
|
|
897
|
+
file = nil
|
|
898
|
+
assert_nothing_raised {
|
|
899
|
+
file = Puppet.type(:file).create(
|
|
900
|
+
:name => dest,
|
|
901
|
+
:checksum => "md5",
|
|
902
|
+
:content => "This is some content"
|
|
903
|
+
)
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
file.retrieve
|
|
907
|
+
|
|
908
|
+
assert_events([:file_changed], file)
|
|
909
|
+
file.retrieve
|
|
910
|
+
assert_events([], file)
|
|
911
|
+
end
|
|
912
|
+
|
|
913
|
+
# Make sure that content updates the checksum on the same run
|
|
914
|
+
def test_checksumchange_for_ensure
|
|
915
|
+
dest = tempfile()
|
|
916
|
+
|
|
917
|
+
file = nil
|
|
918
|
+
assert_nothing_raised {
|
|
919
|
+
file = Puppet.type(:file).create(
|
|
920
|
+
:name => dest,
|
|
921
|
+
:checksum => "md5",
|
|
922
|
+
:ensure => "file"
|
|
923
|
+
)
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
file.retrieve
|
|
927
|
+
|
|
928
|
+
assert_events([:file_created], file)
|
|
929
|
+
file.retrieve
|
|
930
|
+
assert_events([], file)
|
|
931
|
+
end
|
|
932
|
+
|
|
933
|
+
# Make sure that content gets used before ensure
|
|
934
|
+
def test_contentbeatsensure
|
|
935
|
+
dest = tempfile()
|
|
936
|
+
|
|
937
|
+
file = nil
|
|
938
|
+
assert_nothing_raised {
|
|
939
|
+
file = Puppet.type(:file).create(
|
|
940
|
+
:name => dest,
|
|
941
|
+
:ensure => "file",
|
|
942
|
+
:content => "this is some content, yo"
|
|
943
|
+
)
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
file.retrieve
|
|
947
|
+
|
|
948
|
+
assert_events([:file_created], file)
|
|
949
|
+
file.retrieve
|
|
950
|
+
assert_events([], file)
|
|
951
|
+
assert_events([], file)
|
|
952
|
+
end
|
|
953
|
+
|
|
954
|
+
# Make sure that content gets used before ensure
|
|
955
|
+
def test_deletion_beats_source
|
|
956
|
+
dest = tempfile()
|
|
957
|
+
source = tempfile()
|
|
958
|
+
File.open(source, "w") { |f| f.puts "yay" }
|
|
959
|
+
|
|
960
|
+
file = nil
|
|
961
|
+
assert_nothing_raised {
|
|
962
|
+
file = Puppet.type(:file).create(
|
|
963
|
+
:name => dest,
|
|
964
|
+
:ensure => :absent,
|
|
965
|
+
:source => source
|
|
966
|
+
)
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
file.retrieve
|
|
970
|
+
|
|
971
|
+
assert_events([], file)
|
|
972
|
+
assert(! FileTest.exists?(dest), "file was copied during deletion")
|
|
973
|
+
|
|
974
|
+
# Now create the dest, and make sure it gets deleted
|
|
975
|
+
File.open(dest, "w") { |f| f.puts "boo" }
|
|
976
|
+
assert_events([:file_removed], file)
|
|
977
|
+
assert(! FileTest.exists?(dest), "file was not deleted during deletion")
|
|
978
|
+
end
|
|
979
|
+
|
|
980
|
+
def test_nameandpath
|
|
981
|
+
path = tempfile()
|
|
982
|
+
|
|
983
|
+
file = nil
|
|
984
|
+
assert_nothing_raised {
|
|
985
|
+
file = Puppet.type(:file).create(
|
|
986
|
+
:title => "fileness",
|
|
987
|
+
:path => path,
|
|
988
|
+
:content => "this is some content"
|
|
989
|
+
)
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
assert_apply(file)
|
|
993
|
+
|
|
994
|
+
assert(FileTest.exists?(path))
|
|
995
|
+
end
|
|
996
|
+
|
|
997
|
+
# Make sure that a missing group isn't fatal at object instantiation time.
|
|
998
|
+
def test_missinggroup
|
|
999
|
+
file = nil
|
|
1000
|
+
assert_nothing_raised {
|
|
1001
|
+
file = Puppet.type(:file).create(
|
|
1002
|
+
:path => tempfile(),
|
|
1003
|
+
:group => "fakegroup"
|
|
1004
|
+
)
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
assert(file.property(:group), "Group property failed")
|
|
1008
|
+
end
|
|
1009
|
+
|
|
1010
|
+
def test_modecreation
|
|
1011
|
+
path = tempfile()
|
|
1012
|
+
file = Puppet.type(:file).create(
|
|
1013
|
+
:path => path,
|
|
1014
|
+
:ensure => "file",
|
|
1015
|
+
:mode => "0777"
|
|
1016
|
+
)
|
|
1017
|
+
assert_equal(0777, file.should(:mode),
|
|
1018
|
+
"Mode did not get set correctly")
|
|
1019
|
+
assert_apply(file)
|
|
1020
|
+
assert_equal(0777, File.stat(path).mode & 007777,
|
|
1021
|
+
"file mode is incorrect")
|
|
1022
|
+
File.unlink(path)
|
|
1023
|
+
file[:ensure] = "directory"
|
|
1024
|
+
assert_apply(file)
|
|
1025
|
+
assert_equal(0777, File.stat(path).mode & 007777,
|
|
1026
|
+
"directory mode is incorrect")
|
|
1027
|
+
end
|
|
1028
|
+
|
|
1029
|
+
def test_followlinks
|
|
1030
|
+
File.umask(0022)
|
|
1031
|
+
|
|
1032
|
+
basedir = tempfile()
|
|
1033
|
+
Dir.mkdir(basedir)
|
|
1034
|
+
file = File.join(basedir, "file")
|
|
1035
|
+
link = File.join(basedir, "link")
|
|
1036
|
+
|
|
1037
|
+
File.open(file, "w", 0644) { |f| f.puts "yayness"; f.flush }
|
|
1038
|
+
File.symlink(file, link)
|
|
1039
|
+
|
|
1040
|
+
obj = nil
|
|
1041
|
+
assert_nothing_raised {
|
|
1042
|
+
obj = Puppet.type(:file).create(
|
|
1043
|
+
:path => link,
|
|
1044
|
+
:mode => "755"
|
|
1045
|
+
)
|
|
1046
|
+
}
|
|
1047
|
+
obj.retrieve
|
|
1048
|
+
|
|
1049
|
+
assert_events([], obj)
|
|
1050
|
+
|
|
1051
|
+
# Assert that we default to not following links
|
|
1052
|
+
assert_equal("%o" % 0644, "%o" % (File.stat(file).mode & 007777))
|
|
1053
|
+
|
|
1054
|
+
# Assert that we can manage the link directly, but modes still don't change
|
|
1055
|
+
obj[:links] = :manage
|
|
1056
|
+
assert_events([], obj)
|
|
1057
|
+
|
|
1058
|
+
assert_equal("%o" % 0644, "%o" % (File.stat(file).mode & 007777))
|
|
1059
|
+
|
|
1060
|
+
obj[:links] = :follow
|
|
1061
|
+
assert_events([:file_changed], obj)
|
|
1062
|
+
|
|
1063
|
+
assert_equal("%o" % 0755, "%o" % (File.stat(file).mode & 007777))
|
|
1064
|
+
|
|
1065
|
+
# Now verify that content and checksum don't update, either
|
|
1066
|
+
obj.delete(:mode)
|
|
1067
|
+
obj[:checksum] = "md5"
|
|
1068
|
+
obj[:links] = :ignore
|
|
1069
|
+
|
|
1070
|
+
assert_events([], obj)
|
|
1071
|
+
File.open(file, "w") { |f| f.puts "more text" }
|
|
1072
|
+
assert_events([], obj)
|
|
1073
|
+
obj[:links] = :follow
|
|
1074
|
+
assert_events([], obj)
|
|
1075
|
+
File.open(file, "w") { |f| f.puts "even more text" }
|
|
1076
|
+
assert_events([:file_changed], obj)
|
|
1077
|
+
|
|
1078
|
+
obj.delete(:checksum)
|
|
1079
|
+
obj[:content] = "this is some content"
|
|
1080
|
+
obj[:links] = :ignore
|
|
1081
|
+
|
|
1082
|
+
assert_events([], obj)
|
|
1083
|
+
File.open(file, "w") { |f| f.puts "more text" }
|
|
1084
|
+
assert_events([], obj)
|
|
1085
|
+
obj[:links] = :follow
|
|
1086
|
+
assert_events([:file_changed], obj)
|
|
1087
|
+
end
|
|
1088
|
+
|
|
1089
|
+
# If both 'ensure' and 'content' are used, make sure that all of the other
|
|
1090
|
+
# properties are handled correctly.
|
|
1091
|
+
def test_contentwithmode
|
|
1092
|
+
path = tempfile()
|
|
1093
|
+
|
|
1094
|
+
file = nil
|
|
1095
|
+
assert_nothing_raised {
|
|
1096
|
+
file = Puppet.type(:file).create(
|
|
1097
|
+
:path => path,
|
|
1098
|
+
:ensure => "file",
|
|
1099
|
+
:content => "some text\n",
|
|
1100
|
+
:mode => 0755
|
|
1101
|
+
)
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
assert_apply(file)
|
|
1105
|
+
assert_equal("%o" % 0755, "%o" % (File.stat(path).mode & 007777))
|
|
1106
|
+
end
|
|
1107
|
+
|
|
1108
|
+
def test_backupmodes
|
|
1109
|
+
File.umask(0022)
|
|
1110
|
+
|
|
1111
|
+
file = tempfile()
|
|
1112
|
+
newfile = tempfile()
|
|
1113
|
+
|
|
1114
|
+
File.open(file, "w", 0411) { |f| f.puts "yayness" }
|
|
1115
|
+
|
|
1116
|
+
obj = nil
|
|
1117
|
+
assert_nothing_raised {
|
|
1118
|
+
obj = Puppet::Type.type(:file).create(
|
|
1119
|
+
:path => file, :content => "rahness\n", :backup => ".puppet-bak"
|
|
1120
|
+
)
|
|
1121
|
+
}
|
|
1122
|
+
|
|
1123
|
+
assert_apply(obj)
|
|
1124
|
+
|
|
1125
|
+
backupfile = file + obj[:backup]
|
|
1126
|
+
@@tmpfiles << backupfile
|
|
1127
|
+
assert(FileTest.exists?(backupfile),
|
|
1128
|
+
"Backup file %s does not exist" % backupfile)
|
|
1129
|
+
|
|
1130
|
+
assert_equal(0411, filemode(backupfile),
|
|
1131
|
+
"File mode is wrong for backupfile")
|
|
1132
|
+
|
|
1133
|
+
bucket = "bucket"
|
|
1134
|
+
bpath = tempfile()
|
|
1135
|
+
Dir.mkdir(bpath)
|
|
1136
|
+
Puppet::Type.type(:filebucket).create(
|
|
1137
|
+
:title => bucket, :path => bpath
|
|
1138
|
+
)
|
|
1139
|
+
|
|
1140
|
+
obj[:backup] = bucket
|
|
1141
|
+
obj[:content] = "New content"
|
|
1142
|
+
assert_apply(obj)
|
|
1143
|
+
|
|
1144
|
+
md5 = "18cc17fa3047fcc691fdf49c0a7f539a"
|
|
1145
|
+
dir, file, pathfile = Puppet::Network::Handler.filebucket.paths(bpath, md5)
|
|
1146
|
+
|
|
1147
|
+
assert_equal(0440, filemode(file))
|
|
1148
|
+
end
|
|
1149
|
+
|
|
1150
|
+
def test_largefilechanges
|
|
1151
|
+
source = tempfile()
|
|
1152
|
+
dest = tempfile()
|
|
1153
|
+
|
|
1154
|
+
# Now make a large file
|
|
1155
|
+
File.open(source, "w") { |f|
|
|
1156
|
+
500.times { |i| f.puts "line %s" % i }
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
obj = Puppet::Type.type(:file).create(
|
|
1160
|
+
:title => dest, :source => source
|
|
1161
|
+
)
|
|
1162
|
+
|
|
1163
|
+
assert_events([:file_created], obj)
|
|
1164
|
+
|
|
1165
|
+
File.open(source, File::APPEND|File::WRONLY) { |f| f.puts "another line" }
|
|
1166
|
+
|
|
1167
|
+
assert_events([:file_changed], obj)
|
|
1168
|
+
|
|
1169
|
+
# Now modify the dest file
|
|
1170
|
+
File.open(dest, File::APPEND|File::WRONLY) { |f| f.puts "one more line" }
|
|
1171
|
+
|
|
1172
|
+
assert_events([:file_changed, :file_changed], obj)
|
|
1173
|
+
|
|
1174
|
+
end
|
|
1175
|
+
|
|
1176
|
+
def test_replacefilewithlink
|
|
1177
|
+
path = tempfile()
|
|
1178
|
+
link = tempfile()
|
|
1179
|
+
|
|
1180
|
+
File.open(path, "w") { |f| f.puts "yay" }
|
|
1181
|
+
File.open(link, "w") { |f| f.puts "a file" }
|
|
1182
|
+
|
|
1183
|
+
file = nil
|
|
1184
|
+
assert_nothing_raised {
|
|
1185
|
+
file = Puppet.type(:file).create(
|
|
1186
|
+
:ensure => path,
|
|
1187
|
+
:path => link
|
|
1188
|
+
)
|
|
1189
|
+
}
|
|
1190
|
+
|
|
1191
|
+
assert_events([:link_created], file)
|
|
1192
|
+
|
|
1193
|
+
assert(FileTest.symlink?(link), "Link was not created")
|
|
1194
|
+
|
|
1195
|
+
assert_equal(path, File.readlink(link), "Link was created incorrectly")
|
|
1196
|
+
end
|
|
1197
|
+
|
|
1198
|
+
def test_file_with_spaces
|
|
1199
|
+
dir = tempfile()
|
|
1200
|
+
Dir.mkdir(dir)
|
|
1201
|
+
source = File.join(dir, "file spaces")
|
|
1202
|
+
dest = File.join(dir, "another space")
|
|
1203
|
+
|
|
1204
|
+
File.open(source, "w") { |f| f.puts :yay }
|
|
1205
|
+
obj = Puppet::Type.type(:file).create(
|
|
1206
|
+
:path => dest,
|
|
1207
|
+
:source => source
|
|
1208
|
+
)
|
|
1209
|
+
assert(obj, "Did not create file")
|
|
1210
|
+
|
|
1211
|
+
assert_apply(obj)
|
|
1212
|
+
|
|
1213
|
+
assert(FileTest.exists?(dest), "File did not get created")
|
|
1214
|
+
end
|
|
1215
|
+
|
|
1216
|
+
def test_present_matches_anything
|
|
1217
|
+
path = tempfile()
|
|
1218
|
+
|
|
1219
|
+
file = Puppet::Type.newfile(:path => path, :ensure => :present)
|
|
1220
|
+
|
|
1221
|
+
file.retrieve
|
|
1222
|
+
assert(! file.insync?, "File incorrectly in sync")
|
|
1223
|
+
|
|
1224
|
+
# Now make a file
|
|
1225
|
+
File.open(path, "w") { |f| f.puts "yay" }
|
|
1226
|
+
|
|
1227
|
+
file.retrieve
|
|
1228
|
+
assert(file.insync?, "File not in sync")
|
|
1229
|
+
|
|
1230
|
+
# Now make a directory
|
|
1231
|
+
File.unlink(path)
|
|
1232
|
+
Dir.mkdir(path)
|
|
1233
|
+
|
|
1234
|
+
file.retrieve
|
|
1235
|
+
assert(file.insync?, "Directory not considered 'present'")
|
|
1236
|
+
|
|
1237
|
+
Dir.rmdir(path)
|
|
1238
|
+
|
|
1239
|
+
# Now make a link
|
|
1240
|
+
file[:links] = :manage
|
|
1241
|
+
|
|
1242
|
+
otherfile = tempfile()
|
|
1243
|
+
File.symlink(otherfile, path)
|
|
1244
|
+
|
|
1245
|
+
file.retrieve
|
|
1246
|
+
assert(file.insync?, "Symlink not considered 'present'")
|
|
1247
|
+
File.unlink(path)
|
|
1248
|
+
|
|
1249
|
+
# Now set some content, and make sure it works
|
|
1250
|
+
file[:content] = "yayness"
|
|
1251
|
+
|
|
1252
|
+
assert_apply(file)
|
|
1253
|
+
|
|
1254
|
+
assert_equal("yayness", File.read(path), "Content did not get set correctly")
|
|
1255
|
+
end
|
|
1256
|
+
|
|
1257
|
+
# Make sure unmanaged files are purged.
|
|
1258
|
+
def test_purge
|
|
1259
|
+
sourcedir = tempfile()
|
|
1260
|
+
destdir = tempfile()
|
|
1261
|
+
Dir.mkdir(sourcedir)
|
|
1262
|
+
Dir.mkdir(destdir)
|
|
1263
|
+
sourcefile = File.join(sourcedir, "sourcefile")
|
|
1264
|
+
dsourcefile = File.join(destdir, "sourcefile")
|
|
1265
|
+
localfile = File.join(destdir, "localfile")
|
|
1266
|
+
purgee = File.join(destdir, "to_be_purged")
|
|
1267
|
+
File.open(sourcefile, "w") { |f| f.puts "funtest" }
|
|
1268
|
+
# this file should get removed
|
|
1269
|
+
File.open(purgee, "w") { |f| f.puts "footest" }
|
|
1270
|
+
|
|
1271
|
+
lfobj = Puppet::Type.newfile(
|
|
1272
|
+
:title => "localfile",
|
|
1273
|
+
:path => localfile,
|
|
1274
|
+
:content => "rahtest"
|
|
1275
|
+
)
|
|
1276
|
+
|
|
1277
|
+
|
|
1278
|
+
destobj = Puppet::Type.newfile(:title => "destdir", :path => destdir,
|
|
1279
|
+
:source => sourcedir,
|
|
1280
|
+
:recurse => true)
|
|
1281
|
+
|
|
1282
|
+
comp = newcomp(lfobj, destobj)
|
|
1283
|
+
assert_apply(comp)
|
|
1284
|
+
|
|
1285
|
+
assert(FileTest.exists?(dsourcefile), "File did not get copied")
|
|
1286
|
+
assert(FileTest.exists?(localfile), "File did not get created")
|
|
1287
|
+
assert(FileTest.exists?(purgee), "File got prematurely purged")
|
|
1288
|
+
|
|
1289
|
+
assert_nothing_raised { destobj[:purge] = true }
|
|
1290
|
+
assert_apply(comp)
|
|
1291
|
+
|
|
1292
|
+
assert(FileTest.exists?(dsourcefile), "Source file got purged")
|
|
1293
|
+
assert(FileTest.exists?(localfile), "Local file got purged")
|
|
1294
|
+
assert(! FileTest.exists?(purgee), "File did not get purged")
|
|
1295
|
+
end
|
|
1296
|
+
|
|
1297
|
+
# Testing #274. Make sure target can be used without 'ensure'.
|
|
1298
|
+
def test_target_without_ensure
|
|
1299
|
+
source = tempfile()
|
|
1300
|
+
dest = tempfile()
|
|
1301
|
+
File.open(source, "w") { |f| f.puts "funtest" }
|
|
1302
|
+
|
|
1303
|
+
obj = nil
|
|
1304
|
+
assert_nothing_raised {
|
|
1305
|
+
obj = Puppet::Type.newfile(:path => dest, :target => source)
|
|
1306
|
+
}
|
|
1307
|
+
|
|
1308
|
+
assert_apply(obj)
|
|
1309
|
+
end
|
|
1310
|
+
|
|
1311
|
+
def test_autorequire_owner_and_group
|
|
1312
|
+
file = tempfile()
|
|
1313
|
+
comp = nil
|
|
1314
|
+
user = nil
|
|
1315
|
+
group =nil
|
|
1316
|
+
home = nil
|
|
1317
|
+
ogroup = nil
|
|
1318
|
+
assert_nothing_raised {
|
|
1319
|
+
user = Puppet.type(:user).create(
|
|
1320
|
+
:name => "pptestu",
|
|
1321
|
+
:home => file,
|
|
1322
|
+
:gid => "pptestg"
|
|
1323
|
+
)
|
|
1324
|
+
home = Puppet.type(:file).create(
|
|
1325
|
+
:path => file,
|
|
1326
|
+
:owner => "pptestu",
|
|
1327
|
+
:group => "pptestg",
|
|
1328
|
+
:ensure => "directory"
|
|
1329
|
+
)
|
|
1330
|
+
group = Puppet.type(:group).create(
|
|
1331
|
+
:name => "pptestg"
|
|
1332
|
+
)
|
|
1333
|
+
comp = newcomp(user, group, home)
|
|
1334
|
+
}
|
|
1335
|
+
|
|
1336
|
+
# Now make sure we get a relationship for each of these
|
|
1337
|
+
rels = nil
|
|
1338
|
+
assert_nothing_raised { rels = home.autorequire }
|
|
1339
|
+
assert(rels.detect { |e| e.source == user }, "owner was not autorequired")
|
|
1340
|
+
assert(rels.detect { |e| e.source == group }, "group was not autorequired")
|
|
1341
|
+
end
|
|
1342
|
+
|
|
1343
|
+
# Testing #309 -- //my/file => /my/file
|
|
1344
|
+
def test_slash_deduplication
|
|
1345
|
+
["/my/////file/for//testing", "//my/file/for/testing///",
|
|
1346
|
+
"/my/file/for/testing"].each do |path|
|
|
1347
|
+
file = nil
|
|
1348
|
+
assert_nothing_raised do
|
|
1349
|
+
file = Puppet::Type.newfile(:path => path)
|
|
1350
|
+
end
|
|
1351
|
+
|
|
1352
|
+
assert_equal("/my/file/for/testing", file.title)
|
|
1353
|
+
assert_equal(file, Puppet::Type.type(:file)["/my/file/for/testing"])
|
|
1354
|
+
Puppet::Type.type(:file).clear
|
|
1355
|
+
end
|
|
1356
|
+
end
|
|
1357
|
+
|
|
1358
|
+
# Testing #304
|
|
1359
|
+
def test_links_to_directories
|
|
1360
|
+
link = tempfile()
|
|
1361
|
+
file = tempfile()
|
|
1362
|
+
dir = tempfile()
|
|
1363
|
+
Dir.mkdir(dir)
|
|
1364
|
+
|
|
1365
|
+
bucket = Puppet::Type.newfilebucket :name => "main"
|
|
1366
|
+
File.symlink(dir, link)
|
|
1367
|
+
File.open(file, "w") { |f| f.puts "" }
|
|
1368
|
+
assert_equal(dir, File.readlink(link))
|
|
1369
|
+
obj = Puppet::Type.newfile :path => link, :ensure => :link,
|
|
1370
|
+
:target => file, :recurse => false, :backup => "main"
|
|
1371
|
+
|
|
1372
|
+
assert_apply(obj)
|
|
1373
|
+
|
|
1374
|
+
assert_equal(file, File.readlink(link))
|
|
1375
|
+
end
|
|
1376
|
+
|
|
1377
|
+
# Testing #303
|
|
1378
|
+
def test_nobackups_with_links
|
|
1379
|
+
link = tempfile()
|
|
1380
|
+
new = tempfile()
|
|
1381
|
+
|
|
1382
|
+
File.open(link, "w") { |f| f.puts "old" }
|
|
1383
|
+
File.open(new, "w") { |f| f.puts "new" }
|
|
1384
|
+
obj = Puppet::Type.newfile :path => link, :ensure => :link,
|
|
1385
|
+
:target => new, :recurse => true, :backup => false
|
|
1386
|
+
|
|
1387
|
+
assert_nothing_raised do
|
|
1388
|
+
obj.handlebackup
|
|
1389
|
+
end
|
|
1390
|
+
|
|
1391
|
+
bfile = [link, "puppet-bak"].join(".")
|
|
1392
|
+
|
|
1393
|
+
assert(! FileTest.exists?(bfile), "Backed up when told not to")
|
|
1394
|
+
|
|
1395
|
+
assert_apply(obj)
|
|
1396
|
+
|
|
1397
|
+
assert(! FileTest.exists?(bfile), "Backed up when told not to")
|
|
1398
|
+
end
|
|
1399
|
+
|
|
1400
|
+
# Make sure we consistently handle backups for all cases.
|
|
1401
|
+
def test_ensure_with_backups
|
|
1402
|
+
# We've got three file types, so make sure we can replace any type
|
|
1403
|
+
# with the other type and that backups are done correctly.
|
|
1404
|
+
types = [:file, :directory, :link]
|
|
1405
|
+
|
|
1406
|
+
dir = tempfile()
|
|
1407
|
+
path = File.join(dir, "test")
|
|
1408
|
+
linkdest = tempfile()
|
|
1409
|
+
creators = {
|
|
1410
|
+
:file => proc { File.open(path, "w") { |f| f.puts "initial" } },
|
|
1411
|
+
:directory => proc { Dir.mkdir(path) },
|
|
1412
|
+
:link => proc { File.symlink(linkdest, path) }
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1415
|
+
bucket = Puppet::Type.newfilebucket :name => "main", :path => tempfile()
|
|
1416
|
+
|
|
1417
|
+
obj = Puppet::Type.newfile :path => path, :force => true,
|
|
1418
|
+
:links => :manage
|
|
1419
|
+
|
|
1420
|
+
Puppet[:trace] = true
|
|
1421
|
+
["main", false].each do |backup|
|
|
1422
|
+
obj[:backup] = backup
|
|
1423
|
+
obj.finish
|
|
1424
|
+
types.each do |should|
|
|
1425
|
+
types.each do |is|
|
|
1426
|
+
# It makes no sense to replace a directory with a directory
|
|
1427
|
+
# next if should == :directory and is == :directory
|
|
1428
|
+
|
|
1429
|
+
Dir.mkdir(dir)
|
|
1430
|
+
|
|
1431
|
+
# Make the thing
|
|
1432
|
+
creators[is].call
|
|
1433
|
+
|
|
1434
|
+
obj[:ensure] = should
|
|
1435
|
+
|
|
1436
|
+
if should == :link
|
|
1437
|
+
obj[:target] = linkdest
|
|
1438
|
+
else
|
|
1439
|
+
if obj.property(:target)
|
|
1440
|
+
obj.delete(:target)
|
|
1441
|
+
end
|
|
1442
|
+
end
|
|
1443
|
+
|
|
1444
|
+
# First try just removing the initial data
|
|
1445
|
+
assert_nothing_raised do
|
|
1446
|
+
obj.remove_existing(should)
|
|
1447
|
+
end
|
|
1448
|
+
|
|
1449
|
+
unless is == should
|
|
1450
|
+
# Make sure the original is gone
|
|
1451
|
+
assert(! FileTest.exists?(obj[:path]),
|
|
1452
|
+
"remove_existing did not work: " +
|
|
1453
|
+
"did not remove %s with %s" % [is, should])
|
|
1454
|
+
end
|
|
1455
|
+
FileUtils.rmtree(obj[:path])
|
|
1456
|
+
|
|
1457
|
+
# Now make it again
|
|
1458
|
+
creators[is].call
|
|
1459
|
+
|
|
1460
|
+
property = obj.property(:ensure)
|
|
1461
|
+
|
|
1462
|
+
property.retrieve
|
|
1463
|
+
unless property.insync?
|
|
1464
|
+
assert_nothing_raised do
|
|
1465
|
+
property.sync
|
|
1466
|
+
end
|
|
1467
|
+
end
|
|
1468
|
+
FileUtils.rmtree(dir)
|
|
1469
|
+
end
|
|
1470
|
+
end
|
|
1471
|
+
end
|
|
1472
|
+
end
|
|
1473
|
+
|
|
1474
|
+
if Process.uid == 0
|
|
1475
|
+
# Testing #364.
|
|
1476
|
+
def test_writing_in_directories_with_no_write_access
|
|
1477
|
+
# Make a directory that our user does not have access to
|
|
1478
|
+
dir = tempfile()
|
|
1479
|
+
Dir.mkdir(dir)
|
|
1480
|
+
|
|
1481
|
+
# Get a fake user
|
|
1482
|
+
user = nonrootuser
|
|
1483
|
+
# and group
|
|
1484
|
+
group = nonrootgroup
|
|
1485
|
+
|
|
1486
|
+
# First try putting a file in there
|
|
1487
|
+
path = File.join(dir, "file")
|
|
1488
|
+
file = Puppet::Type.newfile :path => path, :owner => user.name, :group => group.name, :content => "testing"
|
|
1489
|
+
|
|
1490
|
+
# Make sure we can create it
|
|
1491
|
+
assert_apply(file)
|
|
1492
|
+
assert(FileTest.exists?(path), "File did not get created")
|
|
1493
|
+
# And that it's owned correctly
|
|
1494
|
+
assert_equal(user.uid, File.stat(path).uid, "File has the wrong owner")
|
|
1495
|
+
assert_equal(group.gid, File.stat(path).gid, "File has the wrong group")
|
|
1496
|
+
|
|
1497
|
+
assert_equal("testing", File.read(path), "file has the wrong content")
|
|
1498
|
+
|
|
1499
|
+
# Now make a dir
|
|
1500
|
+
subpath = File.join(dir, "subdir")
|
|
1501
|
+
subdir = Puppet::Type.newfile :path => subpath, :owner => user.name, :group => group.name, :ensure => :directory
|
|
1502
|
+
# Make sure we can create it
|
|
1503
|
+
assert_apply(subdir)
|
|
1504
|
+
assert(FileTest.directory?(subpath), "File did not get created")
|
|
1505
|
+
# And that it's owned correctly
|
|
1506
|
+
assert_equal(user.uid, File.stat(subpath).uid, "File has the wrong owner")
|
|
1507
|
+
assert_equal(group.gid, File.stat(subpath).gid, "File has the wrong group")
|
|
1508
|
+
|
|
1509
|
+
assert_equal("testing", File.read(path), "file has the wrong content")
|
|
1510
|
+
end
|
|
1511
|
+
end
|
|
1512
|
+
|
|
1513
|
+
# #366
|
|
1514
|
+
def test_replace_aliases
|
|
1515
|
+
file = Puppet::Type.newfile :path => tempfile()
|
|
1516
|
+
file[:replace] = :yes
|
|
1517
|
+
assert_equal(:true, file[:replace], ":replace did not alias :true to :yes")
|
|
1518
|
+
file[:replace] = :no
|
|
1519
|
+
assert_equal(:false, file[:replace], ":replace did not alias :false to :no")
|
|
1520
|
+
end
|
|
1521
|
+
|
|
1522
|
+
# #365 -- make sure generated files also use filebuckets.
|
|
1523
|
+
def test_recursive_filebuckets
|
|
1524
|
+
source = tempfile()
|
|
1525
|
+
dest = tempfile()
|
|
1526
|
+
s1 = File.join(source, "1")
|
|
1527
|
+
sdir = File.join(source, "dir")
|
|
1528
|
+
s2 = File.join(sdir, "2")
|
|
1529
|
+
Dir.mkdir(source)
|
|
1530
|
+
Dir.mkdir(sdir)
|
|
1531
|
+
[s1, s2].each { |file| File.open(file, "w") { |f| f.puts "yay: %s" % File.basename(file) } }
|
|
1532
|
+
|
|
1533
|
+
sums = {}
|
|
1534
|
+
[s1, s2].each do |f|
|
|
1535
|
+
sums[File.basename(f)] = Digest::MD5.hexdigest(File.read(f))
|
|
1536
|
+
end
|
|
1537
|
+
|
|
1538
|
+
dfiles = [File.join(dest, "1"), File.join(dest, "dir", "2")]
|
|
1539
|
+
|
|
1540
|
+
bpath = tempfile
|
|
1541
|
+
bucket = Puppet::Type.type(:filebucket).create :name => "rtest", :path => bpath
|
|
1542
|
+
dipper = bucket.bucket
|
|
1543
|
+
dipper = Puppet::Network::Handler.filebucket.new(
|
|
1544
|
+
:Path => bpath
|
|
1545
|
+
)
|
|
1546
|
+
assert(dipper, "did not receive bucket client")
|
|
1547
|
+
file = Puppet::Type.newfile :path => dest, :source => source, :recurse => true, :backup => "rtest"
|
|
1548
|
+
|
|
1549
|
+
assert_apply(file)
|
|
1550
|
+
dfiles.each do |f|
|
|
1551
|
+
assert(FileTest.exists?(f), "destfile %s was not created" % f)
|
|
1552
|
+
end
|
|
1553
|
+
|
|
1554
|
+
# Now modify the source files to make sure things get backed up correctly
|
|
1555
|
+
[s1, s2].each { |sf| File.open(sf, "w") { |f|
|
|
1556
|
+
f.puts "boo: %s" % File.basename(sf)
|
|
1557
|
+
} }
|
|
1558
|
+
|
|
1559
|
+
assert_apply(file)
|
|
1560
|
+
dfiles.each do |f|
|
|
1561
|
+
assert_equal("boo: %s\n" % File.basename(f), File.read(f),
|
|
1562
|
+
"file was not copied correctly")
|
|
1563
|
+
end
|
|
1564
|
+
|
|
1565
|
+
# Make sure we didn't just copy the files over to backup locations
|
|
1566
|
+
dfiles.each do |f|
|
|
1567
|
+
assert(! FileTest.exists?(f + "rtest"),
|
|
1568
|
+
"file %s was copied for backup instead of bucketed" % File.basename(f))
|
|
1569
|
+
end
|
|
1570
|
+
|
|
1571
|
+
# Now make sure we can get the source sums from the bucket
|
|
1572
|
+
sums.each do |f, sum|
|
|
1573
|
+
result = nil
|
|
1574
|
+
assert_nothing_raised do
|
|
1575
|
+
result = dipper.getfile(sum)
|
|
1576
|
+
end
|
|
1577
|
+
assert(result, "file %s was not backed to filebucket" % f)
|
|
1578
|
+
assert_equal("yay: %s\n" % f, result, "file backup was not correct")
|
|
1579
|
+
end
|
|
1580
|
+
end
|
|
1581
|
+
|
|
1582
|
+
def test_backup
|
|
1583
|
+
path = tempfile()
|
|
1584
|
+
file = Puppet::Type.newfile :path => path, :content => "yay"
|
|
1585
|
+
|
|
1586
|
+
[false, :false, "false"].each do |val|
|
|
1587
|
+
assert_nothing_raised do
|
|
1588
|
+
file[:backup] = val
|
|
1589
|
+
end
|
|
1590
|
+
assert_equal(false, file[:backup], "%s did not translate" % val.inspect)
|
|
1591
|
+
end
|
|
1592
|
+
[true, :true, "true", ".puppet-bak"].each do |val|
|
|
1593
|
+
assert_nothing_raised do
|
|
1594
|
+
file[:backup] = val
|
|
1595
|
+
end
|
|
1596
|
+
assert_equal(".puppet-bak", file[:backup], "%s did not translate" % val.inspect)
|
|
1597
|
+
end
|
|
1598
|
+
|
|
1599
|
+
# Now try a non-bucket string
|
|
1600
|
+
assert_nothing_raised do
|
|
1601
|
+
file[:backup] = ".bak"
|
|
1602
|
+
end
|
|
1603
|
+
assert_equal(".bak", file[:backup], ".bak did not translate")
|
|
1604
|
+
|
|
1605
|
+
# Now try a non-existent bucket
|
|
1606
|
+
assert_nothing_raised do
|
|
1607
|
+
file[:backup] = "main"
|
|
1608
|
+
end
|
|
1609
|
+
assert_equal("main", file[:backup], "bucket name was not retained")
|
|
1610
|
+
assert_equal("main", file.bucket, "file's bucket was not set")
|
|
1611
|
+
|
|
1612
|
+
# And then an existing bucket
|
|
1613
|
+
obj = Puppet::Type.type(:filebucket).create :name => "testing"
|
|
1614
|
+
bucket = obj.bucket
|
|
1615
|
+
|
|
1616
|
+
assert_nothing_raised do
|
|
1617
|
+
file[:backup] = "testing"
|
|
1618
|
+
end
|
|
1619
|
+
assert_equal("testing", file[:backup], "backup value was reset")
|
|
1620
|
+
assert_equal(obj.bucket, file.bucket, "file's bucket was not set")
|
|
1621
|
+
end
|
|
1622
|
+
|
|
1623
|
+
def test_pathbuilder
|
|
1624
|
+
dir = tempfile()
|
|
1625
|
+
Dir.mkdir(dir)
|
|
1626
|
+
file = File.join(dir, "file")
|
|
1627
|
+
File.open(file, "w") { |f| f.puts "" }
|
|
1628
|
+
obj = Puppet::Type.newfile :path => dir, :recurse => true, :mode => 0755
|
|
1629
|
+
|
|
1630
|
+
assert_equal("/%s" % obj.ref, obj.path)
|
|
1631
|
+
|
|
1632
|
+
list = obj.eval_generate
|
|
1633
|
+
fileobj = obj.class[file]
|
|
1634
|
+
assert(fileobj, "did not generate file object")
|
|
1635
|
+
assert_equal("/%s" % fileobj.ref, fileobj.path, "did not generate correct subfile path")
|
|
1636
|
+
end
|
|
1637
|
+
|
|
1638
|
+
# Testing #403
|
|
1639
|
+
def test_removal_with_content_set
|
|
1640
|
+
path = tempfile()
|
|
1641
|
+
File.open(path, "w") { |f| f.puts "yay" }
|
|
1642
|
+
file = Puppet::Type.newfile(:name => path, :ensure => :absent, :content => "foo")
|
|
1643
|
+
|
|
1644
|
+
assert_apply(file)
|
|
1645
|
+
assert(! FileTest.exists?(path), "File was not removed")
|
|
1646
|
+
end
|
|
1647
|
+
|
|
1648
|
+
# Testing #434
|
|
1649
|
+
def test_stripping_extra_slashes_during_lookup
|
|
1650
|
+
file = Puppet::Type.newfile(:path => "/one/two")
|
|
1651
|
+
%w{/one/two/ /one/two /one//two //one//two//}.each do |path|
|
|
1652
|
+
assert(Puppet::Type.type(:file)[path], "could not look up file via path %s" % path)
|
|
1653
|
+
end
|
|
1654
|
+
end
|
|
1655
|
+
|
|
1656
|
+
# Testing #438
|
|
1657
|
+
def test_creating_properties_conflict
|
|
1658
|
+
file = tempfile()
|
|
1659
|
+
first = tempfile()
|
|
1660
|
+
second = tempfile()
|
|
1661
|
+
params = [:content, :source, :target]
|
|
1662
|
+
params.each do |param|
|
|
1663
|
+
assert_nothing_raised("%s conflicted with ensure" % [param]) do
|
|
1664
|
+
Puppet::Type.newfile(:path => file, param => first, :ensure => :file)
|
|
1665
|
+
end
|
|
1666
|
+
Puppet::Type.type(:file).clear
|
|
1667
|
+
params.each do |other|
|
|
1668
|
+
next if other == param
|
|
1669
|
+
assert_raise(Puppet::Error, "%s and %s did not conflict" % [param, other]) do
|
|
1670
|
+
Puppet::Type.newfile(:path => file, other => first, param => second)
|
|
1671
|
+
end
|
|
1672
|
+
end
|
|
1673
|
+
end
|
|
1674
|
+
end
|
|
1675
|
+
|
|
1676
|
+
# Testing #508
|
|
1677
|
+
if Process.uid == 0
|
|
1678
|
+
def test_files_replace_with_right_attrs
|
|
1679
|
+
source = tempfile()
|
|
1680
|
+
File.open(source, "w") { |f|
|
|
1681
|
+
f.puts "some text"
|
|
1682
|
+
}
|
|
1683
|
+
File.chmod(0755, source)
|
|
1684
|
+
user = nonrootuser
|
|
1685
|
+
group = nonrootgroup
|
|
1686
|
+
path = tempfile()
|
|
1687
|
+
good = {:uid => user.uid, :gid => group.gid, :mode => 0640}
|
|
1688
|
+
|
|
1689
|
+
run = Proc.new do |obj, msg|
|
|
1690
|
+
assert_apply(obj)
|
|
1691
|
+
stat = File.stat(obj[:path])
|
|
1692
|
+
good.each do |should, sval|
|
|
1693
|
+
if should == :mode
|
|
1694
|
+
current = filemode(obj[:path])
|
|
1695
|
+
else
|
|
1696
|
+
current = stat.send(should)
|
|
1697
|
+
end
|
|
1698
|
+
assert_equal(sval, current,
|
|
1699
|
+
"Attr %s was not correct %s" % [should, msg])
|
|
1700
|
+
end
|
|
1701
|
+
end
|
|
1702
|
+
|
|
1703
|
+
file = Puppet::Type.newfile(:path => path, :owner => user.name,
|
|
1704
|
+
:group => group.name, :mode => 0640, :backup => false)
|
|
1705
|
+
{:source => source, :content => "some content"}.each do |attr, value|
|
|
1706
|
+
file[attr] = value
|
|
1707
|
+
# First create the file
|
|
1708
|
+
run.call(file, "upon creation with %s" % attr)
|
|
1709
|
+
|
|
1710
|
+
# Now change something so that we replace the file
|
|
1711
|
+
case attr
|
|
1712
|
+
when :source:
|
|
1713
|
+
File.open(source, "w") { |f| f.puts "some different text" }
|
|
1714
|
+
when :content: file[:content] = "something completely different"
|
|
1715
|
+
else
|
|
1716
|
+
raise "invalid attr %s" % attr
|
|
1717
|
+
end
|
|
1718
|
+
|
|
1719
|
+
# Run it again
|
|
1720
|
+
run.call(file, "after modification with %s" % attr)
|
|
1721
|
+
|
|
1722
|
+
# Now remove the file and the attr
|
|
1723
|
+
file.delete(attr)
|
|
1724
|
+
File.unlink(path)
|
|
1725
|
+
end
|
|
1726
|
+
end
|
|
1727
|
+
end
|
|
1728
|
+
|
|
1729
|
+
# #505
|
|
1730
|
+
def test_numeric_recurse
|
|
1731
|
+
dir = tempfile()
|
|
1732
|
+
subdir = File.join(dir, "subdir")
|
|
1733
|
+
other = File.join(subdir, "deeper")
|
|
1734
|
+
file = File.join(other, "file")
|
|
1735
|
+
[dir, subdir, other].each { |d| Dir.mkdir(d) }
|
|
1736
|
+
File.open(file, "w") { |f| f.puts "yay" }
|
|
1737
|
+
File.chmod(0644, file)
|
|
1738
|
+
obj = Puppet::Type.newfile(:path => dir, :mode => 0750, :recurse => "2")
|
|
1739
|
+
|
|
1740
|
+
children = nil
|
|
1741
|
+
assert_nothing_raised("Failure when recursing") do
|
|
1742
|
+
children = obj.eval_generate
|
|
1743
|
+
end
|
|
1744
|
+
assert(obj.class[subdir], "did not create subdir object")
|
|
1745
|
+
children.each do |c|
|
|
1746
|
+
assert_nothing_raised("Failure when recursing on %s" % c) do
|
|
1747
|
+
others = c.eval_generate
|
|
1748
|
+
end
|
|
1749
|
+
end
|
|
1750
|
+
oobj = obj.class[other]
|
|
1751
|
+
assert(oobj, "did not create other object")
|
|
1752
|
+
|
|
1753
|
+
assert_nothing_raised do
|
|
1754
|
+
assert_nil(oobj.eval_generate, "recursed too far")
|
|
1755
|
+
end
|
|
1756
|
+
end
|
|
1757
|
+
|
|
1758
|
+
# Make sure we default to the "puppet" filebucket, rather than a string
|
|
1759
|
+
def test_backup_defaults_to_bucket
|
|
1760
|
+
path = tempfile
|
|
1761
|
+
file = Puppet::Type.newfile(:path => path, :content => 'some content')
|
|
1762
|
+
file.finish
|
|
1763
|
+
|
|
1764
|
+
assert_instance_of(Puppet::Network::Client::Dipper, file.bucket,
|
|
1765
|
+
"did not default to a filebucket for backups")
|
|
1766
|
+
assert_equal(Puppet::Type.type(:filebucket)["puppet"].bucket, file.bucket,
|
|
1767
|
+
"did not default to the 'puppet' filebucket")
|
|
1768
|
+
end
|
|
1769
|
+
|
|
1770
|
+
# #515 - make sure 'ensure' other than "link" is deleted during recursion
|
|
1771
|
+
def test_ensure_deleted_during_recursion
|
|
1772
|
+
dir = tempfile()
|
|
1773
|
+
Dir.mkdir(dir)
|
|
1774
|
+
file = File.join(dir, "file")
|
|
1775
|
+
File.open(file, "w") { |f| f.puts "asdfasdf" }
|
|
1776
|
+
|
|
1777
|
+
obj = Puppet::Type.newfile(:path => dir, :ensure => :directory,
|
|
1778
|
+
:recurse => true)
|
|
1779
|
+
|
|
1780
|
+
children = nil
|
|
1781
|
+
assert_nothing_raised do
|
|
1782
|
+
children = obj.eval_generate
|
|
1783
|
+
end
|
|
1784
|
+
fobj = obj.class[file]
|
|
1785
|
+
assert(fobj, "did not create file object")
|
|
1786
|
+
assert(fobj.should(:ensure) != :directory, "ensure was passed to child")
|
|
1787
|
+
end
|
|
1788
|
+
|
|
1789
|
+
# #567
|
|
1790
|
+
def test_missing_files_are_in_sync
|
|
1791
|
+
file = tempfile
|
|
1792
|
+
obj = Puppet::Type.newfile(:path => file, :mode => 0755)
|
|
1793
|
+
|
|
1794
|
+
changes = obj.evaluate
|
|
1795
|
+
assert(changes.empty?, "Missing file with no ensure resulted in changes")
|
|
1796
|
+
end
|
|
1797
|
+
end
|
|
1798
|
+
|
|
1799
|
+
# $Id: file.rb 2436 2007-04-30 17:29:02Z luke $
|