puppet 0.23.2 → 0.24.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- data/CHANGELOG +112 -1
- data/README +1 -1
- data/Rakefile +1 -2
- data/bin/filebucket +2 -3
- data/bin/puppet +55 -39
- data/bin/puppetca +20 -11
- data/bin/puppetd +30 -31
- data/bin/puppetdoc +27 -28
- data/bin/puppetmasterd +24 -42
- data/bin/puppetrun +3 -4
- data/bin/ralsh +5 -7
- data/conf/redhat/puppet.spec +4 -1
- data/conf/solaris/smf/svc-puppetd +1 -1
- data/conf/solaris/smf/svc-puppetmasterd +1 -1
- data/examples/code/allatonce +1 -1
- data/examples/code/assignments +1 -1
- data/examples/code/components +1 -1
- data/examples/code/file.bl +1 -1
- data/examples/code/filedefaults +1 -1
- data/examples/code/fileparsing +1 -1
- data/examples/code/filerecursion +1 -1
- data/examples/code/functions +1 -1
- data/examples/code/groups +1 -1
- data/examples/code/head +1 -1
- data/examples/code/importing +1 -1
- data/examples/code/modules/sample-module.pp +10 -0
- data/examples/code/modules/sample-module/README.txt +17 -0
- data/examples/code/modules/sample-module/lib/puppet/parser/functions/hostname_to_dn.rb +36 -0
- data/examples/code/modules/sample-module/manifests/init.pp +12 -0
- data/examples/code/modules/sample-module/templates/sample.erb +5 -0
- data/examples/code/nodes +1 -1
- data/examples/code/one +1 -1
- data/examples/code/relationships +1 -1
- data/examples/code/selectors +1 -1
- data/examples/code/simpletests +1 -1
- data/examples/root/etc/init.d/sleeper +1 -1
- data/examples/root/etc/puppet/fileserver.conf +1 -1
- data/ext/ldap/puppet.schema +1 -1
- data/ext/module_puppet +30 -21
- data/ext/puppet-test +3 -3
- data/ext/vim/filetype.vim +1 -1
- data/install.rb +1 -2
- data/lib/puppet.rb +20 -19
- data/lib/puppet/checksum.rb +57 -0
- data/lib/puppet/config_stores/rest.rb +1 -1
- data/lib/puppet/daemon.rb +0 -1
- data/lib/puppet/{configuration.rb → defaults.rb} +56 -23
- data/lib/puppet/dsl.rb +22 -116
- data/lib/puppet/error.rb +0 -9
- data/lib/puppet/event.rb +0 -1
- data/lib/puppet/external/gratr/rdot.rb +0 -1
- data/lib/puppet/external/lock.rb +0 -1
- data/lib/puppet/feature/base.rb +3 -2
- data/lib/puppet/feature/rails.rb +0 -1
- data/lib/puppet/file_serving.rb +7 -0
- data/lib/puppet/file_serving/configuration.rb +129 -0
- data/lib/puppet/file_serving/configuration/parser.rb +124 -0
- data/lib/puppet/file_serving/content.rb +34 -0
- data/lib/puppet/file_serving/file_base.rb +63 -0
- data/lib/puppet/file_serving/fileset.rb +138 -0
- data/lib/puppet/file_serving/indirection_hooks.rb +44 -0
- data/lib/puppet/file_serving/metadata.rb +69 -0
- data/lib/puppet/file_serving/mount.rb +186 -0
- data/lib/puppet/file_serving/terminus_helper.rb +19 -0
- data/lib/puppet/indirector.rb +68 -0
- data/lib/puppet/indirector/catalog/compiler.rb +173 -0
- data/lib/puppet/indirector/catalog/yaml.rb +24 -0
- data/lib/puppet/indirector/checksum/file.rb +33 -0
- data/lib/puppet/indirector/code.rb +6 -0
- data/lib/puppet/indirector/direct_file_server.rb +27 -0
- data/lib/puppet/indirector/exec.rb +57 -0
- data/lib/puppet/indirector/facts/facter.rb +65 -0
- data/lib/puppet/indirector/facts/memory.rb +9 -0
- data/lib/puppet/indirector/facts/yaml.rb +7 -0
- data/lib/puppet/indirector/file.rb +54 -0
- data/lib/puppet/indirector/file_content.rb +5 -0
- data/lib/puppet/indirector/file_content/file.rb +11 -0
- data/lib/puppet/indirector/file_content/file_server.rb +11 -0
- data/lib/puppet/indirector/file_content/modules.rb +11 -0
- data/lib/puppet/indirector/file_content/rest.rb +12 -0
- data/lib/puppet/indirector/file_metadata.rb +5 -0
- data/lib/puppet/indirector/file_metadata/file.rb +26 -0
- data/lib/puppet/indirector/file_metadata/file_server.rb +11 -0
- data/lib/puppet/indirector/file_metadata/modules.rb +17 -0
- data/lib/puppet/indirector/file_metadata/rest.rb +12 -0
- data/lib/puppet/indirector/file_server.rb +56 -0
- data/lib/puppet/indirector/indirection.rb +237 -0
- data/lib/puppet/indirector/ldap.rb +90 -0
- data/lib/puppet/indirector/memory.rb +21 -0
- data/lib/puppet/indirector/module_files.rb +82 -0
- data/lib/puppet/indirector/node/exec.rb +52 -0
- data/lib/puppet/indirector/node/ldap.rb +120 -0
- data/lib/puppet/indirector/node/memory.rb +10 -0
- data/lib/puppet/indirector/node/plain.rb +19 -0
- data/lib/puppet/indirector/node/rest.rb +7 -0
- data/lib/puppet/indirector/node/yaml.rb +7 -0
- data/lib/puppet/indirector/plain.rb +9 -0
- data/lib/puppet/indirector/report/processor.rb +50 -0
- data/lib/puppet/indirector/rest.rb +8 -0
- data/lib/puppet/indirector/ssl_rsa.rb +5 -0
- data/lib/puppet/indirector/ssl_rsa/file.rb +33 -0
- data/lib/puppet/indirector/terminus.rb +178 -0
- data/lib/puppet/indirector/yaml.rb +57 -0
- data/lib/puppet/metatype/attributes.rb +3 -3
- data/lib/puppet/metatype/closure.rb +0 -66
- data/lib/puppet/metatype/container.rb +0 -9
- data/lib/puppet/metatype/evaluation.rb +10 -2
- data/lib/puppet/metatype/instances.rb +16 -30
- data/lib/puppet/metatype/manager.rb +1 -2
- data/lib/puppet/metatype/metaparams.rb +27 -21
- data/lib/puppet/metatype/providers.rb +3 -2
- data/lib/puppet/metatype/relationships.rb +1 -2
- data/lib/puppet/metatype/schedules.rb +0 -1
- data/lib/puppet/metatype/tags.rb +0 -1
- data/lib/puppet/module.rb +60 -32
- data/lib/puppet/network/authconfig.rb +0 -1
- data/lib/puppet/network/authorization.rb +0 -1
- data/lib/puppet/network/authstore.rb +0 -1
- data/lib/puppet/network/client.rb +13 -4
- data/lib/puppet/network/client/ca.rb +4 -5
- data/lib/puppet/network/client/dipper.rb +0 -1
- data/lib/puppet/network/client/file.rb +0 -1
- data/lib/puppet/network/client/master.rb +127 -235
- data/lib/puppet/network/client/proxy.rb +0 -1
- data/lib/puppet/network/client/report.rb +0 -1
- data/lib/puppet/network/client/resource.rb +0 -1
- data/lib/puppet/network/client/runner.rb +0 -1
- data/lib/puppet/network/client/status.rb +0 -1
- data/lib/puppet/network/client_request.rb +0 -1
- data/lib/puppet/network/handler.rb +5 -2
- data/lib/puppet/network/handler/ca.rb +1 -2
- data/lib/puppet/network/handler/configuration.rb +184 -0
- data/lib/puppet/network/handler/filebucket.rb +1 -2
- data/lib/puppet/network/handler/fileserver.rb +279 -107
- data/lib/puppet/network/handler/master.rb +57 -152
- data/lib/puppet/network/handler/report.rb +6 -65
- data/lib/puppet/network/handler/resource.rb +5 -13
- data/lib/puppet/network/handler/runner.rb +3 -4
- data/lib/puppet/network/handler/status.rb +0 -1
- data/lib/puppet/network/http.rb +13 -0
- data/lib/puppet/network/http/handler.rb +109 -0
- data/lib/puppet/network/http/mongrel.rb +54 -0
- data/lib/puppet/network/http/mongrel/rest.rb +37 -0
- data/lib/puppet/network/http/mongrel/xmlrpc.rb +4 -0
- data/lib/puppet/network/http/webrick.rb +51 -0
- data/lib/puppet/network/http/webrick/rest.rb +41 -0
- data/lib/puppet/network/http/webrick/xmlrpc.rb +4 -0
- data/lib/puppet/network/http_server.rb +3 -0
- data/lib/puppet/network/{server → http_server}/mongrel.rb +11 -5
- data/lib/puppet/network/{server → http_server}/webrick.rb +9 -5
- data/lib/puppet/network/rest_controller.rb +2 -0
- data/lib/puppet/network/rights.rb +0 -1
- data/lib/puppet/network/server.rb +63 -3
- data/lib/puppet/network/xmlrpc/client.rb +90 -23
- data/lib/puppet/network/xmlrpc/processor.rb +0 -1
- data/lib/puppet/network/xmlrpc/server.rb +0 -1
- data/lib/puppet/network/xmlrpc/webrick_servlet.rb +0 -1
- data/lib/puppet/node.rb +165 -0
- data/lib/puppet/node/catalog.rb +480 -0
- data/lib/puppet/node/environment.rb +46 -0
- data/lib/puppet/node/facts.rb +36 -0
- data/lib/puppet/parameter.rb +34 -28
- data/lib/puppet/parser/ast.rb +0 -1
- data/lib/puppet/parser/ast/astarray.rb +30 -53
- data/lib/puppet/parser/ast/branch.rb +0 -10
- data/lib/puppet/parser/ast/caseopt.rb +0 -11
- data/lib/puppet/parser/ast/casestatement.rb +0 -12
- data/lib/puppet/parser/ast/collection.rb +1 -3
- data/lib/puppet/parser/ast/collexpr.rb +0 -2
- data/lib/puppet/parser/ast/{component.rb → definition.rb} +58 -72
- data/lib/puppet/parser/ast/else.rb +0 -10
- data/lib/puppet/parser/ast/function.rb +0 -2
- data/lib/puppet/parser/ast/hostclass.rb +21 -19
- data/lib/puppet/parser/ast/ifstatement.rb +0 -13
- data/lib/puppet/parser/ast/leaf.rb +0 -8
- data/lib/puppet/parser/ast/node.rb +13 -10
- data/lib/puppet/parser/ast/resource.rb +75 -0
- data/lib/puppet/parser/ast/{resourcedefaults.rb → resource_defaults.rb} +4 -20
- data/lib/puppet/parser/ast/{resourceoverride.rb → resource_override.rb} +3 -5
- data/lib/puppet/parser/ast/resource_reference.rb +66 -0
- data/lib/puppet/parser/ast/resourceparam.rb +0 -14
- data/lib/puppet/parser/ast/selector.rb +0 -10
- data/lib/puppet/parser/ast/tag.rb +0 -2
- data/lib/puppet/parser/ast/vardef.rb +0 -14
- data/lib/puppet/parser/collector.rb +83 -101
- data/lib/puppet/parser/compile.rb +509 -0
- data/lib/puppet/parser/functions.rb +10 -10
- data/lib/puppet/parser/interpreter.rb +44 -662
- data/lib/puppet/parser/lexer.rb +1 -3
- data/lib/puppet/parser/parser.rb +674 -701
- data/lib/puppet/parser/parser_support.rb +33 -24
- data/lib/puppet/parser/resource.rb +219 -162
- data/lib/puppet/parser/resource/param.rb +1 -2
- data/lib/puppet/parser/resource/reference.rb +24 -16
- data/lib/puppet/parser/scope.rb +48 -459
- data/lib/puppet/parser/templatewrapper.rb +4 -5
- data/lib/puppet/pgraph.rb +10 -13
- data/lib/puppet/property.rb +25 -41
- data/lib/puppet/propertychange.rb +0 -2
- data/lib/puppet/provider.rb +15 -11
- data/lib/puppet/provider/cron/crontab.rb +6 -7
- data/lib/puppet/provider/group/groupadd.rb +0 -1
- data/lib/puppet/provider/group/netinfo.rb +0 -1
- data/lib/puppet/provider/group/pw.rb +0 -1
- data/lib/puppet/provider/host/netinfo.rb +0 -1
- data/lib/puppet/provider/host/parsed.rb +0 -1
- data/lib/puppet/provider/interface/redhat.rb +90 -91
- data/lib/puppet/provider/interface/sunos.rb +98 -81
- data/lib/puppet/provider/mailalias/aliases.rb +0 -1
- data/lib/puppet/provider/maillist/mailman.rb +2 -3
- data/lib/puppet/provider/mount.rb +10 -9
- data/lib/puppet/provider/mount/netinfo.rb +0 -1
- data/lib/puppet/provider/mount/parsed.rb +0 -1
- data/lib/puppet/provider/nameservice.rb +0 -1
- data/lib/puppet/provider/nameservice/netinfo.rb +0 -1
- data/lib/puppet/provider/nameservice/objectadd.rb +0 -1
- data/lib/puppet/provider/nameservice/pw.rb +0 -1
- data/lib/puppet/provider/package.rb +0 -2
- data/lib/puppet/provider/package/appdmg.rb +0 -1
- data/lib/puppet/provider/package/apple.rb +0 -1
- data/lib/puppet/provider/package/apt.rb +0 -1
- data/lib/puppet/provider/package/aptitude.rb +0 -1
- data/lib/puppet/provider/package/aptrpm.rb +0 -1
- data/lib/puppet/provider/package/blastwave.rb +0 -1
- data/lib/puppet/provider/package/darwinport.rb +0 -1
- data/lib/puppet/provider/package/dpkg.rb +9 -1
- data/lib/puppet/provider/package/fink.rb +0 -1
- data/lib/puppet/provider/package/freebsd.rb +0 -1
- data/lib/puppet/provider/package/gem.rb +0 -1
- data/lib/puppet/provider/package/openbsd.rb +1 -2
- data/lib/puppet/provider/package/pkgdmg.rb +14 -15
- data/lib/puppet/provider/package/portage.rb +6 -7
- data/lib/puppet/provider/package/ports.rb +1 -4
- data/lib/puppet/provider/package/rpm.rb +31 -45
- data/lib/puppet/provider/package/sun.rb +0 -3
- data/lib/puppet/provider/package/sunfreeware.rb +0 -1
- data/lib/puppet/provider/package/up2date.rb +0 -1
- data/lib/puppet/provider/package/urpmi.rb +0 -1
- data/lib/puppet/provider/package/yum.rb +45 -14
- data/lib/puppet/provider/package/yumhelper.py +37 -0
- data/lib/puppet/provider/parsedfile.rb +2 -3
- data/lib/puppet/provider/port/parsed.rb +0 -1
- data/lib/puppet/provider/service/base.rb +4 -1
- data/lib/puppet/provider/service/debian.rb +5 -2
- data/lib/puppet/provider/service/freebsd.rb +51 -0
- data/lib/puppet/provider/service/init.rb +16 -40
- data/lib/puppet/provider/service/redhat.rb +1 -6
- data/lib/puppet/provider/service/smf.rb +0 -1
- data/lib/puppet/provider/sshkey/parsed.rb +0 -1
- data/lib/puppet/provider/user/netinfo.rb +0 -1
- data/lib/puppet/provider/user/pw.rb +0 -1
- data/lib/puppet/provider/user/useradd.rb +0 -1
- data/lib/puppet/provider/zone/solaris.rb +0 -1
- data/lib/puppet/rails.rb +35 -30
- data/lib/puppet/rails/database/schema.rb +0 -1
- data/lib/puppet/rails/host.rb +6 -15
- data/lib/puppet/rails/param_name.rb +1 -2
- data/lib/puppet/rails/param_value.rb +0 -1
- data/lib/puppet/rails/puppet_class.rb +0 -1
- data/lib/puppet/rails/resource.rb +3 -5
- data/lib/puppet/reference/configuration.rb +12 -6
- data/lib/puppet/reference/indirection.rb +34 -0
- data/lib/puppet/reference/node_source.rb +9 -0
- data/lib/puppet/relationship.rb +10 -8
- data/lib/puppet/reports.rb +51 -0
- data/lib/puppet/reports/log.rb +2 -3
- data/lib/puppet/reports/rrdgraph.rb +2 -5
- data/lib/puppet/reports/store.rb +6 -7
- data/lib/puppet/reports/tagmail.rb +2 -3
- data/lib/puppet/resource_reference.rb +79 -0
- data/lib/puppet/simple_graph.rb +251 -0
- data/lib/puppet/sslcertificates.rb +19 -15
- data/lib/puppet/sslcertificates/ca.rb +56 -15
- data/lib/puppet/sslcertificates/certificate.rb +0 -1
- data/lib/puppet/sslcertificates/inventory.rb +2 -6
- data/lib/puppet/sslcertificates/monkey_patch.rb +6 -0
- data/lib/puppet/sslcertificates/support.rb +4 -5
- data/lib/puppet/transaction.rb +93 -96
- data/lib/puppet/transaction/report.rb +5 -1
- data/lib/puppet/transportable.rb +79 -125
- data/lib/puppet/type.rb +44 -10
- data/lib/puppet/type/component.rb +25 -110
- data/lib/puppet/type/cron.rb +1 -2
- data/lib/puppet/type/exec.rb +19 -13
- data/lib/puppet/type/group.rb +0 -1
- data/lib/puppet/type/host.rb +0 -1
- data/lib/puppet/type/interface.rb +6 -3
- data/lib/puppet/type/k5login.rb +87 -0
- data/lib/puppet/type/mailalias.rb +0 -1
- data/lib/puppet/type/maillist.rb +0 -1
- data/lib/puppet/type/mount.rb +7 -13
- data/lib/puppet/type/notify.rb +0 -1
- data/lib/puppet/type/package.rb +7 -63
- data/lib/puppet/type/pfile.rb +25 -32
- data/lib/puppet/type/pfile/checksum.rb +0 -1
- data/lib/puppet/type/pfile/content.rb +18 -3
- data/lib/puppet/type/pfile/ensure.rb +5 -6
- data/lib/puppet/type/pfile/group.rb +4 -1
- data/lib/puppet/type/pfile/mode.rb +0 -1
- data/lib/puppet/type/pfile/owner.rb +6 -9
- data/lib/puppet/type/pfile/source.rb +28 -11
- data/lib/puppet/type/pfile/target.rb +2 -1
- data/lib/puppet/type/pfile/type.rb +0 -1
- data/lib/puppet/type/pfilebucket.rb +0 -1
- data/lib/puppet/type/port.rb +0 -1
- data/lib/puppet/type/resources.rb +0 -1
- data/lib/puppet/type/schedule.rb +17 -15
- data/lib/puppet/type/service.rb +23 -159
- data/lib/puppet/type/sshkey.rb +0 -1
- data/lib/puppet/type/tidy.rb +15 -7
- data/lib/puppet/type/user.rb +0 -1
- data/lib/puppet/type/zone.rb +0 -1
- data/lib/puppet/util.rb +1 -2
- data/lib/puppet/util/autoload.rb +21 -23
- data/lib/puppet/util/checksums.rb +37 -0
- data/lib/puppet/util/classgen.rb +0 -1
- data/lib/puppet/util/diff.rb +71 -0
- data/lib/puppet/util/docs.rb +8 -2
- data/lib/puppet/util/errors.rb +0 -1
- data/lib/puppet/util/execution.rb +0 -1
- data/lib/puppet/util/fact_store.rb +0 -1
- data/lib/puppet/util/feature.rb +31 -22
- data/lib/puppet/util/fileparsing.rb +3 -2
- data/lib/puppet/util/filetype.rb +30 -12
- data/lib/puppet/util/graph.rb +0 -1
- data/lib/puppet/util/inifile.rb +0 -1
- data/lib/puppet/util/instance_loader.rb +11 -4
- data/lib/puppet/util/loadedfile.rb +0 -1
- data/lib/puppet/util/log.rb +0 -1
- data/lib/puppet/util/log_paths.rb +0 -1
- data/lib/puppet/util/logging.rb +0 -1
- data/lib/puppet/util/metaid.rb +0 -1
- data/lib/puppet/util/methodhelper.rb +0 -2
- data/lib/puppet/util/metric.rb +1 -2
- data/lib/puppet/util/plist.rb +0 -1
- data/lib/puppet/util/plist/generator.rb +0 -1
- data/lib/puppet/util/plist/parser.rb +0 -1
- data/lib/puppet/util/posix.rb +7 -1
- data/lib/puppet/util/provider_features.rb +11 -12
- data/lib/puppet/util/rails/collection_merger.rb +0 -1
- data/lib/puppet/util/reference.rb +2 -3
- data/lib/puppet/util/{config.rb → settings.rb} +424 -300
- data/lib/puppet/util/storage.rb +1 -3
- data/lib/puppet/util/subclass_loader.rb +0 -1
- data/lib/puppet/util/suidmanager.rb +25 -42
- data/lib/puppet/util/uri_helper.rb +22 -0
- data/lib/puppet/util/variables.rb +0 -1
- data/lib/puppet/util/warnings.rb +0 -1
- data/test/Rakefile +1 -1
- data/test/certmgr/ca.rb +8 -2
- data/test/certmgr/certmgr.rb +14 -6
- data/test/certmgr/inventory.rb +18 -30
- data/test/certmgr/support.rb +3 -2
- data/test/executables/filebucket.rb +1 -2
- data/test/executables/puppetbin.rb +1 -2
- data/test/executables/puppetca.rb +7 -2
- data/test/executables/puppetd.rb +23 -29
- data/test/executables/puppetmasterd.rb +1 -2
- data/test/executables/puppetmodule.rb +1 -2
- data/test/language/ast.rb +24 -29
- data/test/language/ast/casestatement.rb +1 -2
- data/test/language/ast/definition.rb +166 -0
- data/test/language/ast/hostclass.rb +50 -29
- data/test/language/ast/resource.rb +59 -0
- data/test/language/ast/{resourceref.rb → resource_reference.rb} +30 -20
- data/test/language/ast/selector.rb +1 -2
- data/test/language/ast/variable.rb +1 -2
- data/test/language/compile.rb +569 -0
- data/test/language/functions.rb +57 -76
- data/test/language/lexer.rb +20 -3
- data/test/language/parser.rb +45 -33
- data/test/language/resource.rb +275 -308
- data/test/language/scope.rb +135 -410
- data/test/language/snippets.rb +19 -41
- data/test/language/transportable.rb +8 -29
- data/test/lib/mocha/auto_verify.rb +6 -6
- data/test/lib/mocha/deprecation.rb +22 -0
- data/test/lib/mocha/exception_raiser.rb +17 -0
- data/test/lib/mocha/expectation.rb +167 -84
- data/test/lib/mocha/infinite_range.rb +4 -6
- data/test/lib/mocha/inspect.rb +3 -1
- data/test/lib/mocha/is_a.rb +9 -0
- data/test/lib/mocha/missing_expectation.rb +27 -0
- data/test/lib/mocha/mock.rb +192 -5
- data/test/lib/mocha/multiple_yields.rb +20 -0
- data/test/lib/mocha/no_yields.rb +11 -0
- data/test/lib/mocha/object.rb +11 -1
- data/test/lib/mocha/parameter_matchers.rb +9 -0
- data/test/lib/mocha/parameter_matchers/all_of.rb +39 -0
- data/test/lib/mocha/parameter_matchers/any_of.rb +44 -0
- data/test/lib/mocha/parameter_matchers/anything.rb +30 -0
- data/test/lib/mocha/parameter_matchers/has_entry.rb +39 -0
- data/test/lib/mocha/parameter_matchers/has_key.rb +39 -0
- data/test/lib/mocha/parameter_matchers/has_value.rb +39 -0
- data/test/lib/mocha/parameter_matchers/includes.rb +37 -0
- data/test/lib/mocha/return_values.rb +31 -0
- data/test/lib/mocha/single_return_value.rb +24 -0
- data/test/lib/mocha/single_yield.rb +18 -0
- data/test/lib/mocha/standalone.rb +2 -0
- data/test/lib/mocha/stub.rb +18 -0
- data/test/lib/mocha/test_case_adapter.rb +3 -3
- data/test/lib/mocha/yield_parameters.rb +31 -0
- data/test/lib/puppettest.rb +38 -20
- data/test/lib/puppettest/certificates.rb +0 -1
- data/test/lib/puppettest/exetest.rb +0 -1
- data/test/lib/puppettest/fakes.rb +0 -1
- data/test/lib/puppettest/fileparsing.rb +8 -15
- data/test/lib/puppettest/filetesting.rb +0 -1
- data/test/lib/puppettest/parsertesting.rb +37 -23
- data/test/lib/puppettest/railstesting.rb +3 -6
- data/test/lib/puppettest/reporttesting.rb +0 -1
- data/test/lib/puppettest/resourcetesting.rb +6 -34
- data/test/lib/puppettest/runnable_test.rb +30 -0
- data/test/lib/puppettest/servertest.rb +2 -3
- data/test/lib/puppettest/support/assertions.rb +13 -41
- data/test/lib/puppettest/support/collection.rb +0 -1
- data/test/lib/puppettest/support/helpers.rb +0 -1
- data/test/lib/puppettest/support/resources.rb +17 -17
- data/test/lib/puppettest/support/utils.rb +45 -27
- data/test/lib/puppettest/testcase.rb +2 -21
- data/test/lib/rake/puppet_test_loader.rb +0 -1
- data/test/lib/rake/puppet_testtask.rb +0 -1
- data/test/network/authconfig.rb +1 -2
- data/test/network/authorization.rb +1 -2
- data/test/network/authstore.rb +1 -2
- data/test/network/client/ca.rb +12 -7
- data/test/network/client/client.rb +17 -22
- data/test/network/client/dipper.rb +1 -2
- data/test/network/client/master.rb +70 -184
- data/test/network/client/resource.rb +9 -2
- data/test/network/client_request.rb +1 -2
- data/test/network/daemon.rb +1 -2
- data/test/network/handler/bucket.rb +2 -31
- data/test/network/handler/ca.rb +9 -3
- data/test/network/handler/configuration.rb +160 -0
- data/test/network/handler/fileserver.rb +24 -5
- data/test/network/handler/handler.rb +1 -2
- data/test/network/handler/master.rb +38 -243
- data/test/network/handler/report.rb +2 -104
- data/test/network/handler/resource.rb +5 -3
- data/test/network/handler/runner.rb +22 -60
- data/test/network/rights.rb +1 -2
- data/test/network/server/mongrel_test.rb +2 -3
- data/test/network/server/webrick.rb +17 -11
- data/test/network/xmlrpc/client.rb +27 -12
- data/test/network/xmlrpc/processor.rb +3 -4
- data/test/network/xmlrpc/server.rb +1 -2
- data/test/network/xmlrpc/webrick_servlet.rb +8 -2
- data/test/other/dsl.rb +2 -4
- data/test/other/events.rb +14 -56
- data/test/other/overrides.rb +3 -6
- data/test/other/propertychange.rb +1 -2
- data/test/other/provider.rb +1 -2
- data/test/other/puppet.rb +1 -2
- data/test/other/relationships.rb +15 -17
- data/test/other/report.rb +14 -20
- data/test/other/transactions.rb +109 -192
- data/test/puppet/conffiles.rb +3 -5
- data/test/puppet/defaults.rb +1 -28
- data/test/puppet/errortest.rb +1 -2
- data/test/puppet/tc_suidmanager.rb +77 -63
- data/test/rails/ast.rb +4 -4
- data/test/rails/configuration.rb +71 -0
- data/test/rails/host.rb +19 -30
- data/test/rails/rails.rb +1 -2
- data/test/rails/railsparameter.rb +3 -4
- data/test/rails/railsresource.rb +6 -5
- data/test/ral/manager/attributes.rb +1 -2
- data/test/ral/manager/instances.rb +3 -3
- data/test/ral/manager/manager.rb +1 -2
- data/test/ral/manager/provider.rb +1 -2
- data/test/ral/manager/type.rb +89 -93
- data/test/ral/providers/cron/crontab.rb +9 -11
- data/test/ral/providers/group.rb +1 -2
- data/test/ral/providers/host/netinfo.rb +1 -2
- data/test/ral/providers/host/parsed.rb +1 -2
- data/test/ral/providers/mailalias/aliases.rb +1 -2
- data/test/ral/providers/mount/netinfo.rb +1 -2
- data/test/ral/providers/nameservice.rb +1 -2
- data/test/ral/providers/package.rb +5 -4
- data/test/ral/providers/package/apt.rb +0 -1
- data/test/ral/providers/package/aptrpm.rb +0 -1
- data/test/ral/providers/parsedfile.rb +1 -2
- data/test/ral/providers/port/parsed.rb +1 -2
- data/test/ral/providers/provider.rb +10 -5
- data/test/ral/providers/service/base.rb +1 -2
- data/test/ral/providers/service/debian.rb +58 -0
- data/test/ral/providers/sshkey/parsed.rb +1 -2
- data/test/ral/providers/user.rb +3 -2
- data/test/ral/providers/user/useradd.rb +0 -1
- data/test/ral/types/basic.rb +4 -9
- data/test/ral/types/cron.rb +6 -12
- data/test/ral/types/exec.rb +6 -7
- data/test/ral/types/file.rb +35 -14
- data/test/ral/types/file/target.rb +6 -5
- data/test/ral/types/filebucket.rb +3 -2
- data/test/ral/types/fileignoresource.rb +10 -42
- data/test/ral/types/filesources.rb +21 -60
- data/test/ral/types/group.rb +3 -3
- data/test/ral/types/host.rb +6 -3
- data/test/ral/types/mailalias.rb +1 -2
- data/test/ral/types/parameter.rb +5 -3
- data/test/ral/types/port.rb +1 -2
- data/test/ral/types/property.rb +3 -3
- data/test/ral/types/resources.rb +1 -2
- data/test/ral/types/service.rb +5 -3
- data/test/ral/types/sshkey.rb +5 -3
- data/test/ral/types/tidy.rb +63 -3
- data/test/ral/types/user.rb +10 -11
- data/test/ral/types/yumrepo.rb +1 -1
- data/test/ral/types/zone.rb +1 -2
- data/test/util/autoload.rb +23 -27
- data/test/util/classgen.rb +1 -2
- data/test/util/execution.rb +1 -2
- data/test/util/features.rb +1 -3
- data/test/util/fileparsing.rb +11 -3
- data/test/util/filetype.rb +1 -2
- data/test/util/inifile.rb +1 -1
- data/test/util/instance_loader.rb +5 -6
- data/test/util/loadedfile.rb +1 -2
- data/test/util/log.rb +1 -2
- data/test/util/metrics.rb +1 -2
- data/test/util/package.rb +1 -2
- data/test/util/posixtest.rb +1 -2
- data/test/util/{config.rb → settings.rb} +123 -265
- data/test/util/storage.rb +1 -2
- data/test/util/subclass_loader.rb +1 -2
- data/test/util/utiltest.rb +1 -111
- metadata +130 -112
- data/ext/tools/passwd2puppet +0 -45
- data/lib/puppet/fact_stores/yaml.rb +0 -42
- data/lib/puppet/network/handler/facts.rb +0 -70
- data/lib/puppet/parser/ast/resourcedef.rb +0 -222
- data/lib/puppet/parser/ast/resourceref.rb +0 -58
- data/test/language/ast/component.rb +0 -142
- data/test/language/collector.rb +0 -179
- data/test/language/interpreter.rb +0 -804
- data/test/language/node.rb +0 -126
- data/test/lib/mocha/mock_methods.rb +0 -122
- data/test/lib/puppettest/graph.rb +0 -41
- data/test/lib/spec.rb +0 -8
- data/test/lib/spec/callback.rb +0 -11
- data/test/lib/spec/callback/callback_container.rb +0 -60
- data/test/lib/spec/callback/extensions/module.rb +0 -24
- data/test/lib/spec/callback/extensions/object.rb +0 -37
- data/test/lib/spec/deprecated.rb +0 -3
- data/test/lib/spec/expectations.rb +0 -59
- data/test/lib/spec/expectations/differs/default.rb +0 -62
- data/test/lib/spec/expectations/errors.rb +0 -6
- data/test/lib/spec/expectations/extensions.rb +0 -3
- data/test/lib/spec/expectations/extensions/object.rb +0 -109
- data/test/lib/spec/expectations/extensions/proc.rb +0 -57
- data/test/lib/spec/expectations/extensions/string_and_symbol.rb +0 -17
- data/test/lib/spec/expectations/handler.rb +0 -47
- data/test/lib/spec/expectations/should.rb +0 -5
- data/test/lib/spec/expectations/should/base.rb +0 -64
- data/test/lib/spec/expectations/should/change.rb +0 -69
- data/test/lib/spec/expectations/should/have.rb +0 -128
- data/test/lib/spec/expectations/should/not.rb +0 -74
- data/test/lib/spec/expectations/should/should.rb +0 -81
- data/test/lib/spec/expectations/sugar.rb +0 -47
- data/test/lib/spec/matchers.rb +0 -160
- data/test/lib/spec/matchers/be.rb +0 -161
- data/test/lib/spec/matchers/be_close.rb +0 -37
- data/test/lib/spec/matchers/change.rb +0 -120
- data/test/lib/spec/matchers/eql.rb +0 -43
- data/test/lib/spec/matchers/equal.rb +0 -43
- data/test/lib/spec/matchers/has.rb +0 -44
- data/test/lib/spec/matchers/have.rb +0 -140
- data/test/lib/spec/matchers/include.rb +0 -50
- data/test/lib/spec/matchers/match.rb +0 -41
- data/test/lib/spec/matchers/raise_error.rb +0 -100
- data/test/lib/spec/matchers/respond_to.rb +0 -35
- data/test/lib/spec/matchers/satisfy.rb +0 -47
- data/test/lib/spec/matchers/throw_symbol.rb +0 -75
- data/test/lib/spec/mocks.rb +0 -232
- data/test/lib/spec/mocks/argument_expectation.rb +0 -132
- data/test/lib/spec/mocks/error_generator.rb +0 -85
- data/test/lib/spec/mocks/errors.rb +0 -10
- data/test/lib/spec/mocks/extensions/object.rb +0 -3
- data/test/lib/spec/mocks/message_expectation.rb +0 -231
- data/test/lib/spec/mocks/methods.rb +0 -40
- data/test/lib/spec/mocks/mock.rb +0 -26
- data/test/lib/spec/mocks/mock_handler.rb +0 -166
- data/test/lib/spec/mocks/order_group.rb +0 -29
- data/test/lib/spec/rake/spectask.rb +0 -173
- data/test/lib/spec/rake/verify_rcov.rb +0 -47
- data/test/lib/spec/runner.rb +0 -132
- data/test/lib/spec/runner/backtrace_tweaker.rb +0 -55
- data/test/lib/spec/runner/command_line.rb +0 -34
- data/test/lib/spec/runner/context.rb +0 -154
- data/test/lib/spec/runner/context_eval.rb +0 -142
- data/test/lib/spec/runner/context_runner.rb +0 -55
- data/test/lib/spec/runner/drb_command_line.rb +0 -21
- data/test/lib/spec/runner/execution_context.rb +0 -17
- data/test/lib/spec/runner/extensions/kernel.rb +0 -17
- data/test/lib/spec/runner/extensions/object.rb +0 -32
- data/test/lib/spec/runner/formatter.rb +0 -5
- data/test/lib/spec/runner/formatter/base_text_formatter.rb +0 -118
- data/test/lib/spec/runner/formatter/html_formatter.rb +0 -219
- data/test/lib/spec/runner/formatter/progress_bar_formatter.rb +0 -27
- data/test/lib/spec/runner/formatter/rdoc_formatter.rb +0 -22
- data/test/lib/spec/runner/formatter/specdoc_formatter.rb +0 -23
- data/test/lib/spec/runner/heckle_runner.rb +0 -71
- data/test/lib/spec/runner/heckle_runner_win.rb +0 -10
- data/test/lib/spec/runner/option_parser.rb +0 -224
- data/test/lib/spec/runner/reporter.rb +0 -105
- data/test/lib/spec/runner/spec_matcher.rb +0 -25
- data/test/lib/spec/runner/spec_parser.rb +0 -41
- data/test/lib/spec/runner/spec_should_raise_handler.rb +0 -74
- data/test/lib/spec/runner/specification.rb +0 -114
- data/test/lib/spec/translator.rb +0 -87
- data/test/lib/spec/version.rb +0 -30
- data/test/network/handler/facts.rb +0 -112
- data/test/other/pgraph.rb +0 -290
- data/test/other/relationship.rb +0 -74
- data/test/puppet/modules.rb +0 -59
- data/test/rails/collection.rb +0 -247
- data/test/rails/interpreter.rb +0 -91
- data/test/ral/providers/mount/parsed.rb +0 -251
- data/test/ral/providers/service.rb +0 -235
- data/test/ral/types/component.rb +0 -113
- data/test/ral/types/interface.rb +0 -40
- data/test/ral/types/mount.rb +0 -362
- data/test/ral/types/package.rb +0 -154
- data/test/ral/types/schedule.rb +0 -357
- data/test/tagging/tagging.rb +0 -170
- data/test/util/fact_store.rb +0 -67
- data/test/util/graph.rb +0 -108
@@ -3,6 +3,7 @@ require 'openssl'
|
|
3
3
|
require 'puppet/external/base64'
|
4
4
|
|
5
5
|
require 'xmlrpc/client'
|
6
|
+
require 'net/https'
|
6
7
|
require 'yaml'
|
7
8
|
|
8
9
|
module Puppet::Network
|
@@ -11,12 +12,55 @@ module Puppet::Network
|
|
11
12
|
class XMLRPCClient < ::XMLRPC::Client
|
12
13
|
attr_accessor :puppet_server, :puppet_port
|
13
14
|
@clients = {}
|
15
|
+
@@http_cache = {}
|
14
16
|
|
15
17
|
class << self
|
16
18
|
include Puppet::Util
|
17
19
|
include Puppet::Util::ClassGen
|
18
20
|
end
|
19
21
|
|
22
|
+
# Clear our http cache.
|
23
|
+
def self.clear_http_instances
|
24
|
+
@@http_cache.clear
|
25
|
+
end
|
26
|
+
|
27
|
+
# Retrieve a cached http instance of caching is enabled, else return
|
28
|
+
# a new one.
|
29
|
+
def self.http_instance(host, port, reset = false)
|
30
|
+
# We overwrite the uninitialized @http here with a cached one.
|
31
|
+
key = "%s:%s" % [host, port]
|
32
|
+
|
33
|
+
# Return our cached instance if keepalive is enabled and we've got
|
34
|
+
# a cache, as long as we're not resetting the instance.
|
35
|
+
return @@http_cache[key] if ! reset and Puppet[:http_keepalive] and @@http_cache[key]
|
36
|
+
|
37
|
+
args = [host, port]
|
38
|
+
if Puppet[:http_proxy_host] == "none"
|
39
|
+
args << nil << nil
|
40
|
+
else
|
41
|
+
args << Puppet[:http_proxy_host] << Puppet[:http_proxy_port]
|
42
|
+
end
|
43
|
+
@http = Net::HTTP.new(*args)
|
44
|
+
|
45
|
+
# Pop open @http a little; older versions of Net::HTTP(s) didn't
|
46
|
+
# give us a reader for ca_file... Grr...
|
47
|
+
class << @http; attr_accessor :ca_file; end
|
48
|
+
|
49
|
+
@http.use_ssl = true
|
50
|
+
@http.read_timeout = 120
|
51
|
+
@http.open_timeout = 120
|
52
|
+
# JJM Configurable fix for #896.
|
53
|
+
if Puppet[:http_enable_post_connection_check]
|
54
|
+
@http.enable_post_connection_check = true
|
55
|
+
else
|
56
|
+
@http.enable_post_connection_check = false
|
57
|
+
end
|
58
|
+
|
59
|
+
@@http_cache[key] = @http if Puppet[:http_keepalive]
|
60
|
+
|
61
|
+
return @http
|
62
|
+
end
|
63
|
+
|
20
64
|
# Create a netclient for each handler
|
21
65
|
def self.mkclient(handler)
|
22
66
|
interface = handler.interface
|
@@ -24,7 +68,7 @@ module Puppet::Network
|
|
24
68
|
|
25
69
|
# Create a subclass for every client type. This is
|
26
70
|
# so that all of the methods are on their own class,
|
27
|
-
# so that
|
71
|
+
# so that their namespaces can define the same methods if
|
28
72
|
# they want.
|
29
73
|
constant = handler.name.to_s.capitalize
|
30
74
|
name = namespace.downcase
|
@@ -42,13 +86,14 @@ module Puppet::Network
|
|
42
86
|
begin
|
43
87
|
call("%s.%s" % [namespace, method.to_s],*args)
|
44
88
|
rescue OpenSSL::SSL::SSLError => detail
|
89
|
+
if detail.message =~ /bad write retry/
|
90
|
+
Puppet.warning "Transient SSL write error; restarting connection and retrying"
|
91
|
+
self.recycle_connection(@cert_client)
|
92
|
+
retry
|
93
|
+
end
|
45
94
|
raise XMLRPCClientError,
|
46
95
|
"Certificates were not trusted: %s" % detail
|
47
96
|
rescue ::XMLRPC::FaultException => detail
|
48
|
-
#Puppet.err "Could not call %s.%s: %s" %
|
49
|
-
# [namespace, method, detail.faultString]
|
50
|
-
#raise XMLRPCClientError,
|
51
|
-
# "XMLRPC Error: %s" % detail.faultString
|
52
97
|
raise XMLRPCClientError, detail.faultString
|
53
98
|
rescue Errno::ECONNREFUSED => detail
|
54
99
|
msg = "Could not connect to %s on port %s" %
|
@@ -56,13 +101,21 @@ module Puppet::Network
|
|
56
101
|
raise XMLRPCClientError, msg
|
57
102
|
rescue SocketError => detail
|
58
103
|
Puppet.err "Could not find server %s: %s" %
|
59
|
-
[@
|
104
|
+
[@host, detail.to_s]
|
60
105
|
error = XMLRPCClientError.new(
|
61
|
-
"Could not find server %s" % @
|
106
|
+
"Could not find server %s" % @host
|
62
107
|
)
|
63
108
|
error.set_backtrace detail.backtrace
|
64
109
|
raise error
|
110
|
+
rescue Errno::EPIPE, EOFError
|
111
|
+
Puppet.warning "Other end went away; restarting connection and retrying"
|
112
|
+
self.recycle_connection(@cert_client)
|
113
|
+
retry
|
65
114
|
rescue => detail
|
115
|
+
if detail.message =~ /^Wrong size\. Was \d+, should be \d+$/
|
116
|
+
Puppet.warning "XMLRPC returned wrong size. Retrying."
|
117
|
+
retry
|
118
|
+
end
|
66
119
|
Puppet.err "Could not call %s.%s: %s" %
|
67
120
|
[namespace, method, detail.inspect]
|
68
121
|
error = XMLRPCClientError.new(detail.to_s)
|
@@ -81,18 +134,26 @@ module Puppet::Network
|
|
81
134
|
|
82
135
|
# Use cert information from a Puppet client to set up the http object.
|
83
136
|
def cert_setup(client)
|
84
|
-
|
137
|
+
# Cache it for next time
|
138
|
+
@cert_client = client
|
139
|
+
|
140
|
+
unless FileTest.exist?(Puppet[:localcacert])
|
85
141
|
raise Puppet::SSLCertificates::Support::MissingCertificate,
|
86
142
|
"Could not find ca certificate %s" % Puppet[:localcacert]
|
87
143
|
end
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
144
|
+
|
145
|
+
# We can't overwrite certificates, @http will freeze itself
|
146
|
+
# once started.
|
147
|
+
unless @http.ca_file
|
148
|
+
@http.ca_file = Puppet[:localcacert]
|
149
|
+
store = OpenSSL::X509::Store.new
|
150
|
+
store.add_file Puppet[:localcacert]
|
151
|
+
store.purpose = OpenSSL::X509::PURPOSE_SSL_CLIENT
|
152
|
+
@http.cert_store = store
|
153
|
+
@http.cert = client.cert
|
154
|
+
@http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
155
|
+
@http.key = client.key
|
156
|
+
end
|
96
157
|
end
|
97
158
|
|
98
159
|
def initialize(hash = {})
|
@@ -107,20 +168,28 @@ module Puppet::Network
|
|
107
168
|
hash[:HTTPProxyPort] = nil
|
108
169
|
end
|
109
170
|
|
110
|
-
@puppet_server = hash[:Server]
|
111
|
-
@puppet_port = hash[:Port]
|
112
|
-
|
113
171
|
super(
|
114
172
|
hash[:Server],
|
115
173
|
hash[:Path],
|
116
174
|
hash[:Port],
|
117
|
-
hash[:HTTPProxyHost],
|
118
|
-
hash[:HTTPProxyPort],
|
175
|
+
hash[:HTTPProxyHost],
|
176
|
+
hash[:HTTPProxyPort],
|
119
177
|
nil, # user
|
120
178
|
nil, # password
|
121
179
|
true, # use_ssl
|
122
180
|
120 # a two minute timeout, instead of 30 seconds
|
123
181
|
)
|
182
|
+
@http = self.class.http_instance(@host, @port)
|
183
|
+
end
|
184
|
+
|
185
|
+
def recycle_connection(client)
|
186
|
+
@http = self.class.http_instance(@host, @port, true) # reset the instance
|
187
|
+
|
188
|
+
cert_setup(client)
|
189
|
+
end
|
190
|
+
|
191
|
+
def start
|
192
|
+
@http.start unless @http.started?
|
124
193
|
end
|
125
194
|
|
126
195
|
def local
|
@@ -132,5 +201,3 @@ module Puppet::Network
|
|
132
201
|
end
|
133
202
|
end
|
134
203
|
end
|
135
|
-
|
136
|
-
# $Id: client.rb 2661 2007-07-08 23:57:56Z luke $
|
data/lib/puppet/node.rb
ADDED
@@ -0,0 +1,165 @@
|
|
1
|
+
require 'puppet/indirector'
|
2
|
+
|
3
|
+
# A class for managing nodes, including their facts and environment.
|
4
|
+
class Puppet::Node
|
5
|
+
require 'puppet/node/facts'
|
6
|
+
require 'puppet/node/environment'
|
7
|
+
|
8
|
+
# Set up indirection, so that nodes can be looked for in
|
9
|
+
# the node sources.
|
10
|
+
extend Puppet::Indirector
|
11
|
+
|
12
|
+
# Use the node source as the indirection terminus.
|
13
|
+
indirects :node, :terminus_setting => :node_terminus, :doc => "Where to find node information.
|
14
|
+
A node is composed of its name, its facts, and its environment."
|
15
|
+
|
16
|
+
# Retrieve a node from the node source, with some additional munging
|
17
|
+
# thrown in for kicks.
|
18
|
+
def self.find_by_any_name(key)
|
19
|
+
return nil unless key
|
20
|
+
|
21
|
+
facts = node_facts(key)
|
22
|
+
node = nil
|
23
|
+
names = node_names(key, facts)
|
24
|
+
names.each do |name|
|
25
|
+
name = name.to_s if name.is_a?(Symbol)
|
26
|
+
break if node = find(name)
|
27
|
+
end
|
28
|
+
|
29
|
+
# If they made it this far, we haven't found anything, so look for a
|
30
|
+
# default node.
|
31
|
+
unless node or names.include?("default")
|
32
|
+
if node = find("default")
|
33
|
+
Puppet.notice "Using default node for %s" % key
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
if node
|
38
|
+
node.names = names
|
39
|
+
|
40
|
+
return node
|
41
|
+
else
|
42
|
+
return nil
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
# Look up the node facts so we can generate the node names to use.
|
49
|
+
def self.node_facts(key)
|
50
|
+
if facts = Puppet::Node::Facts.find(key)
|
51
|
+
facts.values
|
52
|
+
else
|
53
|
+
{}
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Calculate the list of node names we should use for looking
|
58
|
+
# up our node.
|
59
|
+
def self.node_names(key, facts = nil)
|
60
|
+
facts ||= node_facts(key)
|
61
|
+
names = []
|
62
|
+
|
63
|
+
if hostname = facts["hostname"]
|
64
|
+
unless hostname == key
|
65
|
+
names << hostname
|
66
|
+
end
|
67
|
+
else
|
68
|
+
hostname = key
|
69
|
+
end
|
70
|
+
|
71
|
+
if fqdn = facts["fqdn"]
|
72
|
+
hostname = fqdn
|
73
|
+
names << fqdn
|
74
|
+
end
|
75
|
+
|
76
|
+
# Make sure both the fqdn and the short name of the
|
77
|
+
# host can be used in the manifest
|
78
|
+
if hostname =~ /\./
|
79
|
+
names << hostname.sub(/\..+/,'')
|
80
|
+
elsif domain = facts['domain']
|
81
|
+
names << hostname + "." + domain
|
82
|
+
end
|
83
|
+
|
84
|
+
# Sort the names inversely by name length.
|
85
|
+
names.sort! { |a,b| b.length <=> a.length }
|
86
|
+
|
87
|
+
# And make sure the key is first, since that's the most
|
88
|
+
# likely usage.
|
89
|
+
([key] + names).uniq
|
90
|
+
end
|
91
|
+
|
92
|
+
public
|
93
|
+
|
94
|
+
attr_accessor :name, :classes, :parameters, :source, :ipaddress, :names
|
95
|
+
attr_reader :time
|
96
|
+
|
97
|
+
# Set the environment, making sure that it's valid.
|
98
|
+
def environment=(value)
|
99
|
+
raise(ArgumentError, "Invalid environment %s" % value) unless Puppet::Node::Environment.valid?(value)
|
100
|
+
@environment = value
|
101
|
+
end
|
102
|
+
|
103
|
+
# Do not return environments that are the empty string, and use
|
104
|
+
# explicitly set environments, then facts, then a central env
|
105
|
+
# value.
|
106
|
+
def environment
|
107
|
+
unless @environment
|
108
|
+
if env = parameters["environment"]
|
109
|
+
raise(ArgumentError, "Invalid environment %s from parameters" % env) unless Puppet::Node::Environment.valid?(env)
|
110
|
+
@environment = env
|
111
|
+
else
|
112
|
+
@environment = Puppet::Node::Environment.new.name.to_s
|
113
|
+
end
|
114
|
+
end
|
115
|
+
@environment
|
116
|
+
end
|
117
|
+
|
118
|
+
def initialize(name, options = {})
|
119
|
+
unless name
|
120
|
+
raise ArgumentError, "Node names cannot be nil"
|
121
|
+
end
|
122
|
+
@name = name
|
123
|
+
|
124
|
+
# Provide a default value.
|
125
|
+
if names = options[:names]
|
126
|
+
if names.is_a?(String)
|
127
|
+
@names = [names]
|
128
|
+
else
|
129
|
+
@names = names
|
130
|
+
end
|
131
|
+
else
|
132
|
+
@names = [name]
|
133
|
+
end
|
134
|
+
|
135
|
+
if classes = options[:classes]
|
136
|
+
if classes.is_a?(String)
|
137
|
+
@classes = [classes]
|
138
|
+
else
|
139
|
+
@classes = classes
|
140
|
+
end
|
141
|
+
else
|
142
|
+
@classes = []
|
143
|
+
end
|
144
|
+
|
145
|
+
@parameters = options[:parameters] || {}
|
146
|
+
|
147
|
+
self.environment = options[:environment] if options[:environment]
|
148
|
+
|
149
|
+
@time = Time.now
|
150
|
+
end
|
151
|
+
|
152
|
+
# Merge the node facts with parameters from the node source.
|
153
|
+
def fact_merge
|
154
|
+
if facts = Puppet::Node::Facts.find(name)
|
155
|
+
merge(facts.values)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
# Merge any random parameters into our parameter list.
|
160
|
+
def merge(params)
|
161
|
+
params.each do |name, value|
|
162
|
+
@parameters[name] = value unless @parameters.include?(name)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
@@ -0,0 +1,480 @@
|
|
1
|
+
require 'puppet/indirector'
|
2
|
+
require 'puppet/external/gratr/digraph'
|
3
|
+
|
4
|
+
# This class models a node catalog. It is the thing
|
5
|
+
# meant to be passed from server to client, and it contains all
|
6
|
+
# of the information in the catalog, including the resources
|
7
|
+
# and the relationships between them.
|
8
|
+
class Puppet::Node::Catalog < Puppet::PGraph
|
9
|
+
extend Puppet::Indirector
|
10
|
+
indirects :catalog, :terminus_class => :compiler
|
11
|
+
|
12
|
+
# The host name this is a catalog for.
|
13
|
+
attr_accessor :name
|
14
|
+
|
15
|
+
# The catalog version. Used for testing whether a catalog
|
16
|
+
# is up to date.
|
17
|
+
attr_accessor :version
|
18
|
+
|
19
|
+
# How long this catalog took to retrieve. Used for reporting stats.
|
20
|
+
attr_accessor :retrieval_duration
|
21
|
+
|
22
|
+
# How we should extract the catalog for sending to the client.
|
23
|
+
attr_reader :extraction_format
|
24
|
+
|
25
|
+
# We need the ability to set this externally, so we can yaml-dump the
|
26
|
+
# catalog.
|
27
|
+
attr_accessor :edgelist_class
|
28
|
+
|
29
|
+
# Whether this is a host catalog, which behaves very differently.
|
30
|
+
# In particular, reports are sent, graphs are made, and state is
|
31
|
+
# stored in the state database. If this is set incorrectly, then you often
|
32
|
+
# end up in infinite loops, because catalogs are used to make things
|
33
|
+
# that the host catalog needs.
|
34
|
+
attr_accessor :host_config
|
35
|
+
|
36
|
+
# Whether this graph is another catalog's relationship graph.
|
37
|
+
# We don't want to accidentally create a relationship graph for another
|
38
|
+
# relationship graph.
|
39
|
+
attr_accessor :is_relationship_graph
|
40
|
+
|
41
|
+
# Whether this catalog was retrieved from the cache, which affects
|
42
|
+
# whether it is written back out again.
|
43
|
+
attr_accessor :from_cache
|
44
|
+
|
45
|
+
# Add classes to our class list.
|
46
|
+
def add_class(*classes)
|
47
|
+
classes.each do |klass|
|
48
|
+
@classes << klass
|
49
|
+
end
|
50
|
+
|
51
|
+
# Add the class names as tags, too.
|
52
|
+
tag(*classes)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Add one or more resources to our graph and to our resource table.
|
56
|
+
def add_resource(*resources)
|
57
|
+
resources.each do |resource|
|
58
|
+
unless resource.respond_to?(:ref)
|
59
|
+
raise ArgumentError, "Can only add objects that respond to :ref"
|
60
|
+
end
|
61
|
+
|
62
|
+
ref = resource.ref
|
63
|
+
if @resource_table.include?(ref)
|
64
|
+
raise ArgumentError, "Resource %s is already defined" % ref
|
65
|
+
else
|
66
|
+
@resource_table[ref] = resource
|
67
|
+
end
|
68
|
+
resource.catalog = self unless is_relationship_graph
|
69
|
+
add_vertex!(resource)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Create an alias for a resource.
|
74
|
+
def alias(resource, name)
|
75
|
+
resource.ref =~ /^(.+)\[/
|
76
|
+
|
77
|
+
newref = "%s[%s]" % [$1 || resource.class.name, name]
|
78
|
+
raise(ArgumentError, "Cannot alias %s to %s; resource %s already exists" % [resource.ref, name, newref]) if @resource_table[newref]
|
79
|
+
@resource_table[newref] = resource
|
80
|
+
@aliases[resource.ref] << newref
|
81
|
+
end
|
82
|
+
|
83
|
+
# Apply our catalog to the local host. Valid options
|
84
|
+
# are:
|
85
|
+
# :tags - set the tags that restrict what resources run
|
86
|
+
# during the transaction
|
87
|
+
# :ignoreschedules - tell the transaction to ignore schedules
|
88
|
+
# when determining the resources to run
|
89
|
+
def apply(options = {})
|
90
|
+
@applying = true
|
91
|
+
|
92
|
+
Puppet::Util::Storage.load if host_config?
|
93
|
+
transaction = Puppet::Transaction.new(self)
|
94
|
+
|
95
|
+
transaction.tags = options[:tags] if options[:tags]
|
96
|
+
transaction.ignoreschedules = true if options[:ignoreschedules]
|
97
|
+
|
98
|
+
transaction.addtimes :config_retrieval => @retrieval_duration
|
99
|
+
|
100
|
+
|
101
|
+
begin
|
102
|
+
transaction.evaluate
|
103
|
+
rescue Puppet::Error => detail
|
104
|
+
Puppet.err "Could not apply complete catalog: %s" % detail
|
105
|
+
rescue => detail
|
106
|
+
puts detail.backtrace if Puppet[:trace]
|
107
|
+
Puppet.err "Got an uncaught exception of type %s: %s" % [detail.class, detail]
|
108
|
+
ensure
|
109
|
+
# Don't try to store state unless we're a host config
|
110
|
+
# too recursive.
|
111
|
+
Puppet::Util::Storage.store if host_config?
|
112
|
+
end
|
113
|
+
|
114
|
+
yield transaction if block_given?
|
115
|
+
|
116
|
+
transaction.send_report if host_config and (Puppet[:report] or Puppet[:summarize])
|
117
|
+
|
118
|
+
return transaction
|
119
|
+
ensure
|
120
|
+
@applying = false
|
121
|
+
cleanup()
|
122
|
+
transaction.cleanup if defined? transaction and transaction
|
123
|
+
end
|
124
|
+
|
125
|
+
# Are we in the middle of applying the catalog?
|
126
|
+
def applying?
|
127
|
+
@applying
|
128
|
+
end
|
129
|
+
|
130
|
+
def clear(remove_resources = true)
|
131
|
+
super()
|
132
|
+
# We have to do this so that the resources clean themselves up.
|
133
|
+
@resource_table.values.each { |resource| resource.remove } if remove_resources
|
134
|
+
@resource_table.clear
|
135
|
+
|
136
|
+
if defined?(@relationship_graph) and @relationship_graph
|
137
|
+
@relationship_graph.clear(false)
|
138
|
+
@relationship_graph = nil
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def classes
|
143
|
+
@classes.dup
|
144
|
+
end
|
145
|
+
|
146
|
+
# Create an implicit resource, meaning that it will lose out
|
147
|
+
# to any explicitly defined resources. This method often returns
|
148
|
+
# nil.
|
149
|
+
# The quirk of this method is that it's not possible to create
|
150
|
+
# an implicit resource before an explicit resource of the same name,
|
151
|
+
# because all explicit resources are created before any generate()
|
152
|
+
# methods are called on the individual resources. Thus, this
|
153
|
+
# method can safely just check if an explicit resource already exists
|
154
|
+
# and toss this implicit resource if so.
|
155
|
+
def create_implicit_resource(type, options)
|
156
|
+
unless options.include?(:implicit)
|
157
|
+
options[:implicit] = true
|
158
|
+
end
|
159
|
+
|
160
|
+
# This will return nil if an equivalent explicit resource already exists.
|
161
|
+
# When resource classes no longer retain references to resource instances,
|
162
|
+
# this will need to be modified to catch that conflict and discard
|
163
|
+
# implicit resources.
|
164
|
+
if resource = create_resource(type, options)
|
165
|
+
resource.implicit = true
|
166
|
+
|
167
|
+
return resource
|
168
|
+
else
|
169
|
+
return nil
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
# Create a new resource and register it in the catalog.
|
174
|
+
def create_resource(type, options)
|
175
|
+
unless klass = Puppet::Type.type(type)
|
176
|
+
raise ArgumentError, "Unknown resource type %s" % type
|
177
|
+
end
|
178
|
+
return unless resource = klass.create(options)
|
179
|
+
|
180
|
+
@transient_resources << resource if applying?
|
181
|
+
add_resource(resource)
|
182
|
+
if @relationship_graph
|
183
|
+
@relationship_graph.add_resource(resource) unless @relationship_graph.resource(resource.ref)
|
184
|
+
end
|
185
|
+
resource
|
186
|
+
end
|
187
|
+
|
188
|
+
# Make sure we support the requested extraction format.
|
189
|
+
def extraction_format=(value)
|
190
|
+
unless respond_to?("extract_to_%s" % value)
|
191
|
+
raise ArgumentError, "Invalid extraction format %s" % value
|
192
|
+
end
|
193
|
+
@extraction_format = value
|
194
|
+
end
|
195
|
+
|
196
|
+
# Turn our catalog graph into whatever the client is expecting.
|
197
|
+
def extract
|
198
|
+
send("extract_to_%s" % extraction_format)
|
199
|
+
end
|
200
|
+
|
201
|
+
# Create the traditional TransBuckets and TransObjects from our catalog
|
202
|
+
# graph. This will hopefully be deprecated soon.
|
203
|
+
def extract_to_transportable
|
204
|
+
top = nil
|
205
|
+
current = nil
|
206
|
+
buckets = {}
|
207
|
+
|
208
|
+
unless main = vertices.find { |res| res.type == "Class" and res.title == :main }
|
209
|
+
raise Puppet::DevError, "Could not find 'main' class; cannot generate catalog"
|
210
|
+
end
|
211
|
+
|
212
|
+
# Create a proc for examining edges, which we'll use to build our tree
|
213
|
+
# of TransBuckets and TransObjects.
|
214
|
+
bucket = nil
|
215
|
+
edges = proc do |edge|
|
216
|
+
# The sources are always non-builtins.
|
217
|
+
source, target = edge.source, edge.target
|
218
|
+
unless tmp = buckets[source.to_s]
|
219
|
+
if tmp = buckets[source.to_s] = source.to_trans
|
220
|
+
bucket = tmp
|
221
|
+
else
|
222
|
+
# This is because virtual resources return nil. If a virtual
|
223
|
+
# container resource contains realized resources, we still need to get
|
224
|
+
# to them. So, we keep a reference to the last valid bucket
|
225
|
+
# we returned and use that if the container resource is virtual.
|
226
|
+
end
|
227
|
+
end
|
228
|
+
bucket = tmp || bucket
|
229
|
+
if child = target.to_trans
|
230
|
+
unless bucket
|
231
|
+
raise "No bucket created for %s" % source
|
232
|
+
end
|
233
|
+
bucket.push child
|
234
|
+
|
235
|
+
# It's important that we keep a reference to any TransBuckets we've created, so
|
236
|
+
# we don't create multiple buckets for children.
|
237
|
+
unless target.builtin?
|
238
|
+
buckets[target.to_s] = child
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
242
|
+
dfs(:start => main, :examine_edge => edges)
|
243
|
+
|
244
|
+
unless main
|
245
|
+
raise Puppet::DevError, "Could not find 'main' class; cannot generate catalog"
|
246
|
+
end
|
247
|
+
|
248
|
+
# Retrieve the bucket for the top-level scope and set the appropriate metadata.
|
249
|
+
unless result = buckets[main.to_s]
|
250
|
+
# This only happens when the catalog is entirely empty.
|
251
|
+
result = buckets[main.to_s] = main.to_trans
|
252
|
+
end
|
253
|
+
|
254
|
+
result.classes = classes
|
255
|
+
|
256
|
+
# Clear the cache to encourage the GC
|
257
|
+
buckets.clear
|
258
|
+
return result
|
259
|
+
end
|
260
|
+
|
261
|
+
# Make sure all of our resources are "finished".
|
262
|
+
def finalize
|
263
|
+
@resource_table.values.each { |resource| resource.finish }
|
264
|
+
|
265
|
+
write_graph(:resources)
|
266
|
+
end
|
267
|
+
|
268
|
+
def host_config?
|
269
|
+
host_config || false
|
270
|
+
end
|
271
|
+
|
272
|
+
def initialize(name = nil)
|
273
|
+
super()
|
274
|
+
@name = name if name
|
275
|
+
@extraction_format ||= :transportable
|
276
|
+
@tags = []
|
277
|
+
@classes = []
|
278
|
+
@resource_table = {}
|
279
|
+
@transient_resources = []
|
280
|
+
@applying = false
|
281
|
+
@relationship_graph = nil
|
282
|
+
|
283
|
+
@aliases = Hash.new { |hash, key| hash[key] = [] }
|
284
|
+
|
285
|
+
if block_given?
|
286
|
+
yield(self)
|
287
|
+
finalize()
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
# Create a graph of all of the relationships in our catalog.
|
292
|
+
def relationship_graph
|
293
|
+
raise(Puppet::DevError, "Tried get a relationship graph for a relationship graph") if self.is_relationship_graph
|
294
|
+
|
295
|
+
unless defined? @relationship_graph and @relationship_graph
|
296
|
+
# It's important that we assign the graph immediately, because
|
297
|
+
# the debug messages below use the relationships in the
|
298
|
+
# relationship graph to determine the path to the resources
|
299
|
+
# spitting out the messages. If this is not set,
|
300
|
+
# then we get into an infinite loop.
|
301
|
+
@relationship_graph = Puppet::Node::Catalog.new
|
302
|
+
@relationship_graph.host_config = host_config?
|
303
|
+
@relationship_graph.is_relationship_graph = true
|
304
|
+
|
305
|
+
# First create the dependency graph
|
306
|
+
self.vertices.each do |vertex|
|
307
|
+
@relationship_graph.add_vertex! vertex
|
308
|
+
vertex.builddepends.each do |edge|
|
309
|
+
@relationship_graph.add_edge!(edge)
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
# Lastly, add in any autorequires
|
314
|
+
@relationship_graph.vertices.each do |vertex|
|
315
|
+
vertex.autorequire.each do |edge|
|
316
|
+
unless @relationship_graph.edge?(edge.source, edge.target) # don't let automatic relationships conflict with manual ones.
|
317
|
+
unless @relationship_graph.edge?(edge.target, edge.source)
|
318
|
+
vertex.debug "Autorequiring %s" % [edge.source]
|
319
|
+
@relationship_graph.add_edge!(edge)
|
320
|
+
else
|
321
|
+
vertex.debug "Skipping automatic relationship with %s" % (edge.source == vertex ? edge.target : edge.source)
|
322
|
+
end
|
323
|
+
end
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
327
|
+
@relationship_graph.write_graph(:relationships)
|
328
|
+
|
329
|
+
# Then splice in the container information
|
330
|
+
@relationship_graph.splice!(self, Puppet::Type::Component)
|
331
|
+
|
332
|
+
@relationship_graph.write_graph(:expanded_relationships)
|
333
|
+
end
|
334
|
+
@relationship_graph
|
335
|
+
end
|
336
|
+
|
337
|
+
# Remove the resource from our catalog. Notice that we also call
|
338
|
+
# 'remove' on the resource, at least until resource classes no longer maintain
|
339
|
+
# references to the resource instances.
|
340
|
+
def remove_resource(*resources)
|
341
|
+
resources.each do |resource|
|
342
|
+
@resource_table.delete(resource.ref)
|
343
|
+
@aliases[resource.ref].each { |res_alias| @resource_table.delete(res_alias) }
|
344
|
+
@aliases[resource.ref].clear
|
345
|
+
remove_vertex!(resource) if vertex?(resource)
|
346
|
+
@relationship_graph.remove_vertex!(resource) if @relationship_graph and @relationship_graph.vertex?(resource)
|
347
|
+
resource.remove
|
348
|
+
end
|
349
|
+
end
|
350
|
+
|
351
|
+
# Look a resource up by its reference (e.g., File[/etc/passwd]).
|
352
|
+
def resource(type, title = nil)
|
353
|
+
# Always create a resource reference, so that it always canonizes how we
|
354
|
+
# are referring to them.
|
355
|
+
if title
|
356
|
+
ref = Puppet::ResourceReference.new(type, title).to_s
|
357
|
+
else
|
358
|
+
# If they didn't provide a title, then we expect the first
|
359
|
+
# argument to be of the form 'Class[name]', which our
|
360
|
+
# Reference class canonizes for us.
|
361
|
+
ref = Puppet::ResourceReference.new(nil, type).to_s
|
362
|
+
end
|
363
|
+
if resource = @resource_table[ref]
|
364
|
+
return resource
|
365
|
+
elsif defined?(@relationship_graph) and @relationship_graph
|
366
|
+
@relationship_graph.resource(ref)
|
367
|
+
end
|
368
|
+
end
|
369
|
+
|
370
|
+
# Add a tag.
|
371
|
+
def tag(*names)
|
372
|
+
names.each do |name|
|
373
|
+
name = name.to_s
|
374
|
+
@tags << name unless @tags.include?(name)
|
375
|
+
if name.include?("::")
|
376
|
+
name.split("::").each do |sub|
|
377
|
+
@tags << sub unless @tags.include?(sub)
|
378
|
+
end
|
379
|
+
end
|
380
|
+
end
|
381
|
+
nil
|
382
|
+
end
|
383
|
+
|
384
|
+
# Return the list of tags.
|
385
|
+
def tags
|
386
|
+
@tags.dup
|
387
|
+
end
|
388
|
+
|
389
|
+
# Convert our catalog into a RAL catalog.
|
390
|
+
def to_ral
|
391
|
+
to_catalog :to_type
|
392
|
+
end
|
393
|
+
|
394
|
+
# Turn our parser catalog into a transportable catalog.
|
395
|
+
def to_transportable
|
396
|
+
to_catalog :to_transobject
|
397
|
+
end
|
398
|
+
|
399
|
+
# Produce the graph files if requested.
|
400
|
+
def write_graph(name)
|
401
|
+
# We only want to graph the main host catalog.
|
402
|
+
return unless host_config?
|
403
|
+
|
404
|
+
return unless Puppet[:graph]
|
405
|
+
|
406
|
+
Puppet.settings.use(:graphing)
|
407
|
+
|
408
|
+
file = File.join(Puppet[:graphdir], "%s.dot" % name.to_s)
|
409
|
+
File.open(file, "w") { |f|
|
410
|
+
f.puts to_dot("name" => name.to_s.capitalize)
|
411
|
+
}
|
412
|
+
end
|
413
|
+
|
414
|
+
# LAK:NOTE We cannot yaml-dump the class in the edgelist_class, because classes cannot be
|
415
|
+
# dumped by default, nor does yaml-dumping # the edge-labels work at this point (I don't
|
416
|
+
# know why).
|
417
|
+
# Neither of these matters right now, but I suppose it could at some point.
|
418
|
+
# We also have to have the vertex_dict dumped after the resource table, because yaml can't
|
419
|
+
# seem to handle the output of yaml-dumping the vertex_dict.
|
420
|
+
def to_yaml_properties
|
421
|
+
props = instance_variables.reject { |v| %w{@edgelist_class @edge_labels @vertex_dict}.include?(v) }
|
422
|
+
props << "@vertex_dict"
|
423
|
+
props
|
424
|
+
end
|
425
|
+
|
426
|
+
private
|
427
|
+
|
428
|
+
def cleanup
|
429
|
+
unless @transient_resources.empty?
|
430
|
+
remove_resource(*@transient_resources)
|
431
|
+
@transient_resources.clear
|
432
|
+
@relationship_graph = nil
|
433
|
+
end
|
434
|
+
end
|
435
|
+
|
436
|
+
# An abstracted method for converting one catalog into another type of catalog.
|
437
|
+
# This pretty much just converts all of the resources from one class to another, using
|
438
|
+
# a conversion method.
|
439
|
+
def to_catalog(convert)
|
440
|
+
result = self.class.new(self.name)
|
441
|
+
|
442
|
+
map = {}
|
443
|
+
vertices.each do |resource|
|
444
|
+
next if resource.respond_to?(:virtual?) and resource.virtual?
|
445
|
+
|
446
|
+
newres = resource.send(convert)
|
447
|
+
|
448
|
+
# We can't guarantee that resources don't munge their names
|
449
|
+
# (like files do with trailing slashes), so we have to keep track
|
450
|
+
# of what a resource got converted to.
|
451
|
+
map[resource.ref] = newres
|
452
|
+
|
453
|
+
result.add_resource newres
|
454
|
+
end
|
455
|
+
|
456
|
+
message = convert.to_s.gsub "_", " "
|
457
|
+
edges.each do |edge|
|
458
|
+
# Skip edges between virtual resources.
|
459
|
+
next if edge.source.respond_to?(:virtual?) and edge.source.virtual?
|
460
|
+
next if edge.target.respond_to?(:virtual?) and edge.target.virtual?
|
461
|
+
|
462
|
+
unless source = map[edge.source.ref]
|
463
|
+
raise Puppet::DevError, "Could not find resource %s when converting %s resources" % [edge.source.ref, message]
|
464
|
+
end
|
465
|
+
|
466
|
+
unless target = map[edge.target.ref]
|
467
|
+
raise Puppet::DevError, "Could not find resource %s when converting %s resources" % [edge.target.ref, message]
|
468
|
+
end
|
469
|
+
|
470
|
+
result.add_edge!(source, target, edge.label)
|
471
|
+
end
|
472
|
+
|
473
|
+
map.clear
|
474
|
+
|
475
|
+
result.add_class *self.classes
|
476
|
+
result.tag(*self.tags)
|
477
|
+
|
478
|
+
return result
|
479
|
+
end
|
480
|
+
end
|