puppet 0.24.6 → 0.24.7
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 +115 -0
- data/Rakefile +43 -14
- data/bin/puppetca +6 -5
- data/bin/puppetdoc +109 -15
- data/bin/ralsh +3 -1
- data/conf/redhat/puppet.spec +74 -48
- data/examples/mcx_dock_absent.pp +4 -0
- data/examples/mcx_dock_default.pp +118 -0
- data/examples/mcx_dock_full.pp +125 -0
- data/examples/mcx_dock_invalid.pp +9 -0
- data/examples/mcx_nogroup.pp +118 -0
- data/examples/mcx_notexists_absent.pp +4 -0
- data/ext/emacs/puppet-mode.el +1 -1
- data/lib/puppet.rb +1 -1
- data/lib/puppet/external/nagios/base.rb +114 -71
- data/lib/puppet/feature/base.rb +6 -0
- data/lib/puppet/indirector/yaml.rb +12 -3
- data/lib/puppet/module.rb +1 -1
- data/lib/puppet/network/client/master.rb +1 -1
- data/lib/puppet/network/xmlrpc/client.rb +3 -1
- data/lib/puppet/parameter.rb +1 -1
- data/lib/puppet/parser/ast.rb +15 -0
- data/lib/puppet/parser/ast/astarray.rb +1 -2
- data/lib/puppet/parser/ast/casestatement.rb +2 -0
- data/lib/puppet/parser/ast/collection.rb +2 -0
- data/lib/puppet/parser/ast/comparison_operator.rb +4 -0
- data/lib/puppet/parser/ast/definition.rb +2 -0
- data/lib/puppet/parser/ast/else.rb +3 -0
- data/lib/puppet/parser/ast/function.rb +19 -12
- data/lib/puppet/parser/ast/hostclass.rb +9 -1
- data/lib/puppet/parser/ast/ifstatement.rb +3 -0
- data/lib/puppet/parser/ast/node.rb +3 -0
- data/lib/puppet/parser/ast/resource.rb +3 -0
- data/lib/puppet/parser/ast/resource_defaults.rb +2 -0
- data/lib/puppet/parser/ast/resource_override.rb +3 -0
- data/lib/puppet/parser/ast/vardef.rb +3 -0
- data/lib/puppet/parser/functions.rb +14 -0
- data/lib/puppet/parser/functions/inline_template.rb +21 -0
- data/lib/puppet/parser/functions/template.rb +3 -2
- data/lib/puppet/parser/lexer.rb +56 -7
- data/lib/puppet/parser/parser.rb +114 -98
- data/lib/puppet/parser/parser_support.rb +24 -4
- data/lib/puppet/parser/resource/reference.rb +4 -3
- data/lib/puppet/parser/templatewrapper.rb +30 -22
- data/lib/puppet/property.rb +1 -1
- data/lib/puppet/property/list.rb +7 -2
- data/lib/puppet/property/ordered_list.rb +22 -0
- data/lib/puppet/provider/augeas/augeas.rb +189 -0
- data/lib/puppet/provider/computer/computer.rb +22 -0
- data/lib/puppet/provider/confine.rb +4 -1
- data/lib/puppet/provider/confine/variable.rb +13 -2
- data/lib/puppet/provider/confine_collection.rb +4 -1
- data/lib/puppet/provider/confiner.rb +1 -1
- data/lib/puppet/provider/group/directoryservice.rb +6 -3
- data/lib/puppet/provider/group/groupadd.rb +5 -2
- data/lib/puppet/provider/group/ldap.rb +11 -9
- data/lib/puppet/provider/group/netinfo.rb +8 -4
- data/lib/puppet/provider/group/pw.rb +5 -1
- data/lib/puppet/provider/host/netinfo.rb +5 -2
- data/lib/puppet/provider/macauthorization/macauthorization.rb +315 -0
- data/lib/puppet/provider/mcx/mcxcontent.rb +201 -0
- data/lib/puppet/provider/nameservice/directoryservice.rb +210 -107
- data/lib/puppet/provider/nameservice/netinfo.rb +7 -2
- data/lib/puppet/provider/package/appdmg.rb +0 -3
- data/lib/puppet/provider/package/apt.rb +6 -0
- data/lib/puppet/provider/package/rpm.rb +2 -0
- data/lib/puppet/provider/package/yum.rb +5 -1
- data/lib/puppet/provider/package/yumhelper.py +9 -0
- data/lib/puppet/provider/service/base.rb +9 -6
- data/lib/puppet/provider/service/daemontools.rb +25 -15
- data/lib/puppet/provider/service/debian.rb +6 -2
- data/lib/puppet/provider/service/freebsd.rb +5 -2
- data/lib/puppet/provider/service/gentoo.rb +6 -3
- data/lib/puppet/provider/service/init.rb +31 -21
- data/lib/puppet/provider/service/launchd.rb +195 -0
- data/lib/puppet/provider/service/redhat.rb +5 -2
- data/lib/puppet/provider/service/runit.rb +30 -20
- data/lib/puppet/provider/service/smf.rb +7 -4
- data/lib/puppet/provider/ssh_authorized_key/parsed.rb +21 -1
- data/lib/puppet/provider/user/directoryservice.rb +1 -0
- data/lib/puppet/provider/user/netinfo.rb +9 -3
- data/lib/puppet/provider/user/user_role_add.rb +43 -6
- data/lib/puppet/provider/zfs/solaris.rb +45 -0
- data/lib/puppet/provider/zone/solaris.rb +8 -4
- data/lib/puppet/provider/zpool/solaris.rb +116 -0
- data/lib/puppet/rails/database/003_add_environment_to_host.rb +9 -0
- data/lib/puppet/rails/database/schema.rb +1 -0
- data/lib/puppet/rails/host.rb +4 -0
- data/lib/puppet/reference/configuration.rb +1 -1
- data/lib/puppet/reports/tagmail.rb +15 -6
- data/lib/puppet/transaction/change.rb +3 -5
- data/lib/puppet/transportable.rb +1 -0
- data/lib/puppet/type/augeas.rb +155 -0
- data/lib/puppet/type/computer.rb +62 -0
- data/lib/puppet/type/exec.rb +2 -1
- data/lib/puppet/type/file.rb +1 -1
- data/lib/puppet/type/file/ensure.rb +8 -5
- data/lib/puppet/type/file/mode.rb +0 -14
- data/lib/puppet/type/file/owner.rb +32 -64
- data/lib/puppet/type/file/selcontext.rb +3 -8
- data/lib/puppet/type/group.rb +27 -45
- data/lib/puppet/type/k5login.rb +1 -1
- data/lib/puppet/type/macauthorization.rb +141 -0
- data/lib/puppet/type/mcx.rb +115 -0
- data/lib/puppet/type/mount.rb +1 -1
- data/lib/puppet/type/nagios_hostdependency.rb +3 -0
- data/lib/puppet/type/ssh_authorized_key.rb +16 -0
- data/lib/puppet/type/tidy.rb +43 -14
- data/lib/puppet/type/user.rb +25 -1
- data/lib/puppet/type/zfs.rb +51 -0
- data/lib/puppet/type/zone.rb +8 -0
- data/lib/puppet/type/zpool.rb +93 -0
- data/lib/puppet/util.rb +17 -38
- data/lib/puppet/util/file_locking.rb +44 -0
- data/lib/puppet/util/filetype.rb +3 -3
- data/lib/puppet/util/log.rb +1 -16
- data/lib/puppet/util/metric.rb +0 -5
- data/lib/puppet/util/rdoc.rb +85 -0
- data/lib/puppet/util/rdoc/code_objects.rb +219 -0
- data/lib/puppet/util/rdoc/generators/puppet_generator.rb +829 -0
- data/lib/puppet/util/rdoc/generators/template/puppet/puppet.rb +1051 -0
- data/lib/puppet/util/rdoc/parser.rb +437 -0
- data/lib/puppet/util/selinux.rb +135 -63
- data/lib/puppet/util/settings.rb +136 -126
- data/lib/puppet/util/storage.rb +4 -2
- data/spec/Rakefile +91 -0
- data/spec/integration/checksum.rb +47 -0
- data/spec/integration/defaults.rb +47 -0
- data/spec/integration/file_serving/configuration.rb +43 -0
- data/spec/integration/file_serving/content.rb +18 -0
- data/spec/integration/file_serving/metadata.rb +18 -0
- data/spec/integration/indirector/direct_file_server.rb +80 -0
- data/spec/integration/indirector/file_content/file_server.rb +18 -0
- data/spec/integration/indirector/file_metadata/file_server.rb +18 -0
- data/spec/integration/indirector/module_files.rb +57 -0
- data/spec/integration/indirector/node/ldap.rb +15 -0
- data/spec/integration/indirector/rest.rb +464 -0
- data/spec/integration/network/server/mongrel.rb +48 -0
- data/spec/integration/network/server/webrick.rb +48 -0
- data/spec/integration/node.rb +93 -0
- data/spec/integration/node/catalog.rb +54 -0
- data/spec/integration/node/facts.rb +45 -0
- data/spec/integration/provider/package.rb +26 -0
- data/spec/integration/provider/service/init.rb +32 -0
- data/spec/integration/reference/providers.rb +17 -0
- data/spec/integration/reports.rb +14 -0
- data/spec/integration/transaction/report.rb +26 -0
- data/spec/integration/type/package.rb +22 -0
- data/spec/integration/util/file_locking.rb +36 -0
- data/spec/monkey_patches/add_confine_and_runnable_to_rspec_dsl.rb +46 -0
- data/spec/monkey_patches/alias_should_to_must.rb +5 -0
- data/spec/shared_behaviours/file_server_terminus.rb +42 -0
- data/spec/shared_behaviours/file_serving.rb +64 -0
- data/spec/shared_behaviours/memory_terminus.rb +32 -0
- data/spec/spec.opts +5 -0
- data/spec/spec_helper.rb +36 -0
- data/spec/unit/executables/client/certhandler.rb +122 -0
- data/spec/unit/file_serving/configuration.rb +224 -0
- data/spec/unit/file_serving/configuration/parser.rb +135 -0
- data/spec/unit/file_serving/content.rb +71 -0
- data/spec/unit/file_serving/file_base.rb +124 -0
- data/spec/unit/file_serving/fileset.rb +239 -0
- data/spec/unit/file_serving/indirection_hooks.rb +124 -0
- data/spec/unit/file_serving/metadata.rb +187 -0
- data/spec/unit/file_serving/mount.rb +143 -0
- data/spec/unit/file_serving/terminus_helper.rb +76 -0
- data/spec/unit/indirector.rb +152 -0
- data/spec/unit/indirector/catalog/compiler.rb +156 -0
- data/spec/unit/indirector/catalog/yaml.rb +25 -0
- data/spec/unit/indirector/checksum/file.rb +139 -0
- data/spec/unit/indirector/code.rb +33 -0
- data/spec/unit/indirector/direct_file_server.rb +89 -0
- data/spec/unit/indirector/envelope.rb +47 -0
- data/spec/unit/indirector/exec.rb +51 -0
- data/spec/unit/indirector/facts/facter.rb +76 -0
- data/spec/unit/indirector/facts/yaml.rb +26 -0
- data/spec/unit/indirector/file.rb +154 -0
- data/spec/unit/indirector/file_content/file.rb +18 -0
- data/spec/unit/indirector/file_content/file_server.rb +18 -0
- data/spec/unit/indirector/file_content/modules.rb +18 -0
- data/spec/unit/indirector/file_content/rest.rb +11 -0
- data/spec/unit/indirector/file_metadata/file.rb +52 -0
- data/spec/unit/indirector/file_metadata/file_server.rb +18 -0
- data/spec/unit/indirector/file_metadata/modules.rb +42 -0
- data/spec/unit/indirector/file_metadata/rest.rb +9 -0
- data/spec/unit/indirector/file_server.rb +184 -0
- data/spec/unit/indirector/indirection.rb +731 -0
- data/spec/unit/indirector/ldap.rb +143 -0
- data/spec/unit/indirector/memory.rb +29 -0
- data/spec/unit/indirector/module_files.rb +259 -0
- data/spec/unit/indirector/node/exec.rb +69 -0
- data/spec/unit/indirector/node/ldap.rb +424 -0
- data/spec/unit/indirector/node/memory.rb +19 -0
- data/spec/unit/indirector/node/plain.rb +19 -0
- data/spec/unit/indirector/node/rest.rb +13 -0
- data/spec/unit/indirector/node/yaml.rb +25 -0
- data/spec/unit/indirector/plain.rb +29 -0
- data/spec/unit/indirector/report/processor.rb +81 -0
- data/spec/unit/indirector/request.rb +87 -0
- data/spec/unit/indirector/rest.rb +372 -0
- data/spec/unit/indirector/ssl_rsa/file.rb +116 -0
- data/spec/unit/indirector/terminus.rb +245 -0
- data/spec/unit/indirector/yaml.rb +145 -0
- data/spec/unit/module.rb +247 -0
- data/spec/unit/network/client.rb +45 -0
- data/spec/unit/network/client/master.rb +442 -0
- data/spec/unit/network/handler/fileserver.rb +179 -0
- data/spec/unit/network/http.rb +35 -0
- data/spec/unit/network/http/mongrel.rb +117 -0
- data/spec/unit/network/http/mongrel/rest.rb +377 -0
- data/spec/unit/network/http/mongrel/xmlrpc.rb +0 -0
- data/spec/unit/network/http/webrick.rb +127 -0
- data/spec/unit/network/http/webrick/rest.rb +323 -0
- data/spec/unit/network/http/webrick/xmlrpc.rb +0 -0
- data/spec/unit/network/http_pool.rb +238 -0
- data/spec/unit/network/server.rb +316 -0
- data/spec/unit/network/xmlrpc/client.rb +13 -0
- data/spec/unit/node.rb +167 -0
- data/spec/unit/node/catalog.rb +864 -0
- data/spec/unit/node/environment.rb +37 -0
- data/spec/unit/node/facts.rb +44 -0
- data/spec/unit/other/checksum.rb +92 -0
- data/spec/unit/other/pgraph.rb +210 -0
- data/spec/unit/other/transaction.rb +33 -0
- data/spec/unit/other/transbucket.rb +172 -0
- data/spec/unit/other/transobject.rb +92 -0
- data/spec/unit/parameter.rb +24 -0
- data/spec/unit/parser/ast.rb +37 -0
- data/spec/unit/parser/ast/arithmetic_operator.rb +73 -0
- data/spec/unit/parser/ast/astarray.rb +66 -0
- data/spec/unit/parser/ast/boolean_operator.rb +53 -0
- data/spec/unit/parser/ast/collexpr.rb +92 -0
- data/spec/unit/parser/ast/comparison_operator.rb +92 -0
- data/spec/unit/parser/ast/definition.rb +195 -0
- data/spec/unit/parser/ast/function.rb +77 -0
- data/spec/unit/parser/ast/hostclass.rb +148 -0
- data/spec/unit/parser/ast/minus.rb +36 -0
- data/spec/unit/parser/ast/node.rb +125 -0
- data/spec/unit/parser/ast/nop.rb +20 -0
- data/spec/unit/parser/ast/not.rb +30 -0
- data/spec/unit/parser/ast/resource_override.rb +51 -0
- data/spec/unit/parser/ast/resource_reference.rb +63 -0
- data/spec/unit/parser/ast/vardef.rb +47 -0
- data/spec/unit/parser/collector.rb +426 -0
- data/spec/unit/parser/compiler.rb +561 -0
- data/spec/unit/parser/functions.rb +83 -0
- data/spec/unit/parser/functions/inline_template.rb +59 -0
- data/spec/unit/parser/functions/template.rb +62 -0
- data/spec/unit/parser/interpreter.rb +138 -0
- data/spec/unit/parser/lexer.rb +646 -0
- data/spec/unit/parser/parser.rb +228 -0
- data/spec/unit/parser/resource.rb +336 -0
- data/spec/unit/parser/resource/reference.rb +95 -0
- data/spec/unit/parser/scope.rb +87 -0
- data/spec/unit/parser/templatewrapper.rb +129 -0
- data/spec/unit/property.rb +35 -0
- data/spec/unit/property/keyvalue.rb +168 -0
- data/spec/unit/property/list.rb +156 -0
- data/spec/unit/property/ordered_list.rb +64 -0
- data/spec/unit/provider/augeas/augeas.rb +238 -0
- data/spec/unit/provider/confine.rb +78 -0
- data/spec/unit/provider/confine/exists.rb +81 -0
- data/spec/unit/provider/confine/false.rb +53 -0
- data/spec/unit/provider/confine/feature.rb +60 -0
- data/spec/unit/provider/confine/true.rb +53 -0
- data/spec/unit/provider/confine/variable.rb +107 -0
- data/spec/unit/provider/confine_collection.rb +134 -0
- data/spec/unit/provider/confiner.rb +63 -0
- data/spec/unit/provider/group/groupadd.rb +31 -0
- data/spec/unit/provider/group/ldap.rb +105 -0
- data/spec/unit/provider/ldap.rb +248 -0
- data/spec/unit/provider/macauthorization.rb +147 -0
- data/spec/unit/provider/mcx/mcxcontent.rb +175 -0
- data/spec/unit/provider/mount.rb +130 -0
- data/spec/unit/provider/mount/parsed.rb +185 -0
- data/spec/unit/provider/package/apt.rb +138 -0
- data/spec/unit/provider/package/dpkg.rb +163 -0
- data/spec/unit/provider/package/gem.rb +87 -0
- data/spec/unit/provider/package/hpux.rb +52 -0
- data/spec/unit/provider/selboolean.rb +37 -0
- data/spec/unit/provider/selmodule-example.pp +0 -0
- data/spec/unit/provider/selmodule.rb +66 -0
- data/spec/unit/provider/service/daemontools.rb +124 -0
- data/spec/unit/provider/service/launchd.rb +134 -0
- data/spec/unit/provider/service/runit.rb +117 -0
- data/spec/unit/provider/ssh_authorized_key/parsed.rb +102 -0
- data/spec/unit/provider/user/hpux.rb +25 -0
- data/spec/unit/provider/user/ldap.rb +279 -0
- data/spec/unit/provider/user/user_role_add.rb +249 -0
- data/spec/unit/provider/user/useradd.rb +115 -0
- data/spec/unit/provider/zfs/solaris.rb +87 -0
- data/spec/unit/provider/zone/solaris.rb +42 -0
- data/spec/unit/provider/zpool/solaris.rb +179 -0
- data/spec/unit/rails.rb +125 -0
- data/spec/unit/relationship.rb +149 -0
- data/spec/unit/reports.rb +61 -0
- data/spec/unit/resource_reference.rb +73 -0
- data/spec/unit/simple_graph.rb +280 -0
- data/spec/unit/transaction/change.rb +187 -0
- data/spec/unit/transaction/event.rb +25 -0
- data/spec/unit/transaction/report.rb +40 -0
- data/spec/unit/type.rb +64 -0
- data/spec/unit/type/augeas.rb +113 -0
- data/spec/unit/type/computer.rb +82 -0
- data/spec/unit/type/exec.rb +91 -0
- data/spec/unit/type/file.rb +155 -0
- data/spec/unit/type/file/ensure.rb +21 -0
- data/spec/unit/type/file/group.rb +118 -0
- data/spec/unit/type/file/owner.rb +132 -0
- data/spec/unit/type/file/selinux.rb +82 -0
- data/spec/unit/type/group.rb +40 -0
- data/spec/unit/type/macauthorization.rb +78 -0
- data/spec/unit/type/mcx.rb +108 -0
- data/spec/unit/type/mount.rb +219 -0
- data/spec/unit/type/nagios.rb +63 -0
- data/spec/unit/type/noop_metaparam.rb +38 -0
- data/spec/unit/type/package.rb +246 -0
- data/spec/unit/type/resources.rb +27 -0
- data/spec/unit/type/schedule.rb +339 -0
- data/spec/unit/type/selboolean.rb +47 -0
- data/spec/unit/type/selmodule.rb +18 -0
- data/spec/unit/type/service.rb +254 -0
- data/spec/unit/type/ssh_authorized_key.rb +106 -0
- data/spec/unit/type/tidy.rb +68 -0
- data/spec/unit/type/user.rb +260 -0
- data/spec/unit/type/zfs.rb +45 -0
- data/spec/unit/type/zone.rb +20 -0
- data/spec/unit/type/zpool.rb +110 -0
- data/spec/unit/util/checksums.rb +99 -0
- data/spec/unit/util/constant_inflector.rb +70 -0
- data/spec/unit/util/file_locking.rb +115 -0
- data/spec/unit/util/ldap/connection.rb +169 -0
- data/spec/unit/util/ldap/generator.rb +54 -0
- data/spec/unit/util/ldap/manager.rb +654 -0
- data/spec/unit/util/loadedfile.rb +65 -0
- data/spec/unit/util/log.rb +107 -0
- data/spec/unit/util/metric.rb +95 -0
- data/spec/unit/util/nagios_maker.rb +128 -0
- data/spec/unit/util/posix.rb +256 -0
- data/spec/unit/util/resource_template.rb +58 -0
- data/spec/unit/util/selinux.rb +219 -0
- data/spec/unit/util/settings.rb +847 -0
- data/spec/unit/util/storage.rb +248 -0
- data/spec/unit/util/tagging.rb +92 -0
- data/spec/unit/util/uri_helper.rb +41 -0
- data/spec/unit/util/user_attr.rb +47 -0
- data/spec/unit/util/warnings.rb +35 -0
- data/test/certmgr/support.rb +0 -6
- data/test/data/providers/ssh_authorized_key/parsed/authorized_keys +1 -0
- data/test/data/snippets/multilinecomments.pp +6 -0
- data/test/data/snippets/multipleclass.pp +9 -0
- data/test/language/functions.rb +11 -1
- data/test/language/snippets.rb +16 -0
- data/test/lib/puppettest/runnable_test.rb +1 -1
- data/test/network/handler/fileserver.rb +5 -0
- data/test/other/report.rb +0 -4
- data/test/ral/type/resources.rb +2 -19
- data/test/util/settings.rb +4 -4
- data/test/util/storage.rb +0 -24
- data/test/util/utiltest.rb +0 -33
- metadata +319 -26
- data/conf/debian/README.source +0 -2
- data/conf/debian/TODO.Debian +0 -1
- data/conf/debian/changelog +0 -257
- data/conf/debian/compat +0 -1
- data/conf/debian/control +0 -45
- data/conf/debian/copyright +0 -17
- data/conf/debian/docs +0 -1
- data/conf/debian/fileserver.conf +0 -12
- data/conf/debian/puppet.NEWS +0 -63
- data/conf/debian/puppet.conf +0 -8
- data/conf/debian/puppet.dirs +0 -7
- data/conf/debian/puppet.files +0 -6
- data/conf/debian/puppet.init +0 -64
- data/conf/debian/puppet.logrotate +0 -11
- data/conf/debian/puppet.postinst +0 -9
- data/conf/debian/puppet.postrm +0 -21
- data/conf/debian/puppet.preinst +0 -25
- data/conf/debian/puppetmaster.files +0 -4
- data/conf/debian/puppetmaster.init +0 -58
- data/conf/debian/rules +0 -115
- data/conf/debian/watch +0 -2
- data/lib/puppet/type/nagios_hostgroupescalation.rb +0 -3
@@ -0,0 +1,95 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/../../../spec_helper'
|
4
|
+
|
5
|
+
describe Puppet::Parser::Resource::Reference do
|
6
|
+
before do
|
7
|
+
@type = Puppet::Parser::Resource::Reference
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should require a type" do
|
11
|
+
proc { @type.new(:title => "yay") }.should raise_error(Puppet::DevError)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should require a title" do
|
15
|
+
proc { @type.new(:type => "file") }.should raise_error(Puppet::DevError)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should know when it refers to a builtin type" do
|
19
|
+
ref = @type.new(:type => "file", :title => "/tmp/yay")
|
20
|
+
ref.builtin?.should be_true
|
21
|
+
ref.builtintype.should equal(Puppet::Type.type(:file))
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should return a downcased relationship-style resource reference for defined types" do
|
25
|
+
ref = @type.new(:type => "file", :title => "/tmp/yay")
|
26
|
+
ref.to_ref.should == ["file", "/tmp/yay"]
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should return a capitalized relationship-style resource reference for defined types" do
|
30
|
+
ref = @type.new(:type => "whatever", :title => "/tmp/yay")
|
31
|
+
ref.to_ref.should == ["Whatever", "/tmp/yay"]
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should return a resource reference string when asked" do
|
35
|
+
ref = @type.new(:type => "file", :title => "/tmp/yay")
|
36
|
+
ref.to_s.should == "File[/tmp/yay]"
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should canonize resource references" do
|
40
|
+
ref = @type.new(:type => "foo::bar", :title => "/tmp/yay")
|
41
|
+
ref.to_s.should == "Foo::Bar[/tmp/yay]"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe Puppet::Parser::Resource::Reference, " when modeling defined types" do
|
46
|
+
before do
|
47
|
+
@type = Puppet::Parser::Resource::Reference
|
48
|
+
|
49
|
+
@parser = Puppet::Parser::Parser.new :Code => ""
|
50
|
+
@definition = @parser.newdefine "mydefine"
|
51
|
+
@class = @parser.newclass "myclass"
|
52
|
+
@nodedef = @parser.newnode("mynode")[0]
|
53
|
+
@node = Puppet::Node.new("yaynode")
|
54
|
+
|
55
|
+
@compiler = Puppet::Parser::Compiler.new(@node, @parser)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should be able to find defined types" do
|
59
|
+
ref = @type.new(:type => "mydefine", :title => "/tmp/yay", :scope => @compiler.topscope)
|
60
|
+
ref.builtin?.should be_false
|
61
|
+
ref.definedtype.should equal(@definition)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should be able to find classes" do
|
65
|
+
ref = @type.new(:type => "class", :title => "myclass", :scope => @compiler.topscope)
|
66
|
+
ref.builtin?.should be_false
|
67
|
+
ref.definedtype.should equal(@class)
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should be able to find nodes" do
|
71
|
+
ref = @type.new(:type => "node", :title => "mynode", :scope => @compiler.topscope)
|
72
|
+
ref.builtin?.should be_false
|
73
|
+
ref.definedtype.object_id.should == @nodedef.object_id
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should only look for fully qualified classes" do
|
77
|
+
top = @parser.newclass "top"
|
78
|
+
sub = @parser.newclass "other::top"
|
79
|
+
|
80
|
+
scope = @compiler.topscope.class.new(:parent => @compiler.topscope, :namespace => "other", :parser => @parser)
|
81
|
+
|
82
|
+
ref = @type.new(:type => "class", :title => "top", :scope => scope)
|
83
|
+
ref.definedtype.classname.should equal(top.classname)
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should only look for fully qualified definitions" do
|
87
|
+
top = @parser.newdefine "top"
|
88
|
+
sub = @parser.newdefine "other::top"
|
89
|
+
|
90
|
+
scope = @compiler.topscope.class.new(:parent => @compiler.topscope, :namespace => "other", :parser => @parser)
|
91
|
+
|
92
|
+
ref = @type.new(:type => "top", :title => "foo", :scope => scope)
|
93
|
+
ref.definedtype.classname.should equal(top.classname)
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
4
|
+
|
5
|
+
describe Puppet::Parser::Scope do
|
6
|
+
before :each do
|
7
|
+
@scope = Puppet::Parser::Scope.new()
|
8
|
+
@topscope = Puppet::Parser::Scope.new()
|
9
|
+
@scope.stubs(:parent).returns(@topscope)
|
10
|
+
end
|
11
|
+
|
12
|
+
describe Puppet::Parser::Scope, "when setvar is called with append=true" do
|
13
|
+
|
14
|
+
it "should raise error if the variable is already defined in this scope" do
|
15
|
+
@scope.setvar("var","1",nil,nil,false)
|
16
|
+
lambda { @scope.setvar("var","1",nil,nil,true) }.should raise_error(Puppet::ParseError)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "it should lookup current variable value" do
|
20
|
+
@scope.expects(:lookupvar).with("var").returns("2")
|
21
|
+
@scope.setvar("var","1",nil,nil,true)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "it should store the concatenated string '42'" do
|
25
|
+
@topscope.setvar("var","4",nil,nil,false)
|
26
|
+
@scope.setvar("var","2",nil,nil,true)
|
27
|
+
@scope.lookupvar("var").should == "42"
|
28
|
+
end
|
29
|
+
|
30
|
+
it "it should store the concatenated array [4,2]" do
|
31
|
+
@topscope.setvar("var",[4],nil,nil,false)
|
32
|
+
@scope.setvar("var",[2],nil,nil,true)
|
33
|
+
@scope.lookupvar("var").should == [4,2]
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
describe Puppet::Parser::Scope, "when calling number?" do
|
39
|
+
|
40
|
+
it "should return nil if called with anything not a number" do
|
41
|
+
Puppet::Parser::Scope.number?([2]).should be_nil
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should return a Fixnum for a Fixnum" do
|
45
|
+
Puppet::Parser::Scope.number?(2).should be_an_instance_of(Fixnum)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should return a Float for a Float" do
|
49
|
+
Puppet::Parser::Scope.number?(2.34).should be_an_instance_of(Float)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should return 234 for '234'" do
|
53
|
+
Puppet::Parser::Scope.number?("234").should == 234
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should return nil for 'not a number'" do
|
57
|
+
Puppet::Parser::Scope.number?("not a number").should be_nil
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should return 23.4 for '23.4'" do
|
61
|
+
Puppet::Parser::Scope.number?("23.4").should == 23.4
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should return 23.4e13 for '23.4e13'" do
|
65
|
+
Puppet::Parser::Scope.number?("23.4e13").should == 23.4e13
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should understand negative numbers" do
|
69
|
+
Puppet::Parser::Scope.number?("-234").should == -234
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should know how to convert exponential float numbers ala '23e13'" do
|
73
|
+
Puppet::Parser::Scope.number?("23e13").should == 23e13
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should understand hexadecimal numbers" do
|
77
|
+
Puppet::Parser::Scope.number?("0x234").should == 0x234
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should understand octal numbers" do
|
81
|
+
Puppet::Parser::Scope.number?("0755").should == 0755
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
4
|
+
|
5
|
+
describe Puppet::Parser::TemplateWrapper do
|
6
|
+
before(:each) do
|
7
|
+
compiler = stub('compiler', :environment => "foo")
|
8
|
+
parser = stub('parser', :watch_file => true)
|
9
|
+
@scope = stub('scope', :compiler => compiler, :parser => parser, :to_hash => {})
|
10
|
+
@file = "fake_template"
|
11
|
+
Puppet::Module.stubs(:find_template).returns("/tmp/fake_template")
|
12
|
+
FileTest.stubs(:exists?).returns("true")
|
13
|
+
File.stubs(:read).with("/tmp/fake_template").returns("template content")
|
14
|
+
@tw = Puppet::Parser::TemplateWrapper.new(@scope)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should create a new object TemplateWrapper from a scope" do
|
18
|
+
tw = Puppet::Parser::TemplateWrapper.new(@scope)
|
19
|
+
|
20
|
+
tw.should be_a_kind_of(Puppet::Parser::TemplateWrapper)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should check template file existance and read its content" do
|
24
|
+
Puppet::Module.expects(:find_template).with("fake_template", "foo").returns("/tmp/fake_template")
|
25
|
+
FileTest.expects(:exists?).with("/tmp/fake_template").returns(true)
|
26
|
+
File.expects(:read).with("/tmp/fake_template").returns("template content")
|
27
|
+
|
28
|
+
@tw.file = @file
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should turn into a string like template[name] for file based template" do
|
32
|
+
@tw.file = @file
|
33
|
+
@tw.to_s.should eql("template[/tmp/fake_template]")
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should turn into a string like template[inline] for string-based template" do
|
37
|
+
@tw.to_s.should eql("template[inline]")
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should return the processed template contents with a call to result" do
|
41
|
+
template_mock = mock("template", :result => "woot!")
|
42
|
+
File.expects(:read).with("/tmp/fake_template").returns("template contents")
|
43
|
+
ERB.expects(:new).with("template contents", 0, "-").returns(template_mock)
|
44
|
+
|
45
|
+
@tw.file = @file
|
46
|
+
@tw.result.should eql("woot!")
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should return the processed template contents with a call to result and a string" do
|
50
|
+
template_mock = mock("template", :result => "woot!")
|
51
|
+
ERB.expects(:new).with("template contents", 0, "-").returns(template_mock)
|
52
|
+
|
53
|
+
@tw.result("template contents").should eql("woot!")
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should return the contents of a variable if called via method_missing" do
|
57
|
+
@scope.expects(:lookupvar).with("chicken", false).returns("is good")
|
58
|
+
tw = Puppet::Parser::TemplateWrapper.new(@scope)
|
59
|
+
tw.chicken.should eql("is good")
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should throw an exception if a variable is called via method_missing and it does not exist" do
|
63
|
+
@scope.expects(:lookupvar).with("chicken", false).returns(:undefined)
|
64
|
+
tw = Puppet::Parser::TemplateWrapper.new(@scope)
|
65
|
+
lambda { tw.chicken }.should raise_error(Puppet::ParseError)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should allow you to check whether a variable is defined with has_variable?" do
|
69
|
+
@scope.expects(:lookupvar).with("chicken", false).returns("is good")
|
70
|
+
tw = Puppet::Parser::TemplateWrapper.new(@scope)
|
71
|
+
tw.has_variable?("chicken").should eql(true)
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should allow you to check whether a variable is not defined with has_variable?" do
|
75
|
+
@scope.expects(:lookupvar).with("chicken", false).returns(:undefined)
|
76
|
+
tw = Puppet::Parser::TemplateWrapper.new(@scope)
|
77
|
+
tw.has_variable?("chicken").should eql(false)
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should allow you to retrieve the defined classes with classes" do
|
81
|
+
catalog = mock 'catalog', :classes => ["class1", "class2"]
|
82
|
+
@scope.expects(:catalog).returns( catalog )
|
83
|
+
tw = Puppet::Parser::TemplateWrapper.new(@scope)
|
84
|
+
tw.classes().should == ["class1", "class2"]
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should allow you to retrieve all the tags with all_tags" do
|
88
|
+
catalog = mock 'catalog', :tags => ["tag1", "tag2"]
|
89
|
+
@scope.expects(:catalog).returns( catalog )
|
90
|
+
tw = Puppet::Parser::TemplateWrapper.new(@scope)
|
91
|
+
tw.all_tags().should == ["tag1","tag2"]
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should allow you to retrieve the tags defined in the current scope" do
|
95
|
+
@scope.expects(:tags).returns( ["tag1", "tag2"] )
|
96
|
+
tw = Puppet::Parser::TemplateWrapper.new(@scope)
|
97
|
+
tw.tags().should == ["tag1","tag2"]
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should set all of the scope's variables as instance variables" do
|
101
|
+
template_mock = mock("template", :result => "woot!")
|
102
|
+
ERB.expects(:new).with("template contents", 0, "-").returns(template_mock)
|
103
|
+
|
104
|
+
@scope.expects(:to_hash).returns("one" => "foo")
|
105
|
+
@tw.result("template contents")
|
106
|
+
|
107
|
+
@tw.instance_variable_get("@one").should == "foo"
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should not error out if one of the variables is a symbol" do
|
111
|
+
template_mock = mock("template", :result => "woot!")
|
112
|
+
ERB.expects(:new).with("template contents", 0, "-").returns(template_mock)
|
113
|
+
|
114
|
+
@scope.expects(:to_hash).returns(:_timestamp => "1234")
|
115
|
+
@tw.result("template contents")
|
116
|
+
end
|
117
|
+
|
118
|
+
%w{! . ; :}.each do |badchar|
|
119
|
+
it "should translate #{badchar} to _ when setting the instance variables" do
|
120
|
+
template_mock = mock("template", :result => "woot!")
|
121
|
+
ERB.expects(:new).with("template contents", 0, "-").returns(template_mock)
|
122
|
+
|
123
|
+
@scope.expects(:to_hash).returns("one#{badchar}" => "foo")
|
124
|
+
@tw.result("template contents")
|
125
|
+
|
126
|
+
@tw.instance_variable_get("@one_").should == "foo"
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
4
|
+
|
5
|
+
require 'puppet/property'
|
6
|
+
|
7
|
+
describe Puppet::Property do
|
8
|
+
describe "when setting the value" do
|
9
|
+
it "should just set the 'should' value" do
|
10
|
+
@class = Class.new(Puppet::Property)
|
11
|
+
@class.initvars
|
12
|
+
@property = @class.new :resource => mock('resource')
|
13
|
+
|
14
|
+
@property.expects(:should=).with("foo")
|
15
|
+
@property.value = "foo"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "when returning the value" do
|
20
|
+
before do
|
21
|
+
@class = Class.new(Puppet::Property)
|
22
|
+
@class.initvars
|
23
|
+
@property = @class.new :resource => mock('resource')
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should return nil if no value is set" do
|
27
|
+
@property.value.should be_nil
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should return any set 'should' value" do
|
31
|
+
@property.should = "foo"
|
32
|
+
@property.value.should == "foo"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,168 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
Dir.chdir(File.dirname(__FILE__)) { (s = lambda { |f| File.exist?(f) ? require(f) : Dir.chdir("..") { s.call(f) } }).call("spec/spec_helper.rb") }
|
4
|
+
|
5
|
+
require 'puppet/property/keyvalue'
|
6
|
+
|
7
|
+
klass = Puppet::Property::KeyValue
|
8
|
+
|
9
|
+
describe klass do
|
10
|
+
|
11
|
+
it "should be a subclass of Property" do
|
12
|
+
klass.superclass.must == Puppet::Property
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "as an instance" do
|
16
|
+
before do
|
17
|
+
# Wow that's a messy interface to the resource.
|
18
|
+
klass.initvars
|
19
|
+
@resource = stub 'resource', :[]= => nil, :property => nil
|
20
|
+
@property = klass.new(:resource => @resource)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should have a , as default delimiter" do
|
24
|
+
@property.delimiter.should == ";"
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should have a = as default separator" do
|
28
|
+
@property.separator.should == "="
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should have a :membership as default membership" do
|
32
|
+
@property.membership.should == :key_value_membership
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should return the same value passed into should_to_s" do
|
36
|
+
@property.should_to_s({:foo => "baz", :bar => "boo"}) == "foo=baz;bar=boo"
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should return the passed in array values joined with the delimiter from is_to_s" do
|
40
|
+
@property.is_to_s({"foo" => "baz" , "bar" => "boo"}).should == "foo=baz;bar=boo"
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "when calling inclusive?" do
|
44
|
+
it "should use the membership method to look up on the @resource" do
|
45
|
+
@property.expects(:membership).returns(:key_value_membership)
|
46
|
+
@resource.expects(:[]).with(:key_value_membership)
|
47
|
+
@property.inclusive?
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should return true when @resource[membership] == inclusive" do
|
51
|
+
@property.stubs(:membership).returns(:key_value_membership)
|
52
|
+
@resource.stubs(:[]).with(:key_value_membership).returns(:inclusive)
|
53
|
+
@property.inclusive?.must == true
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should return false when @resource[membership] != inclusive" do
|
57
|
+
@property.stubs(:membership).returns(:key_value_membership)
|
58
|
+
@resource.stubs(:[]).with(:key_value_membership).returns(:minimum)
|
59
|
+
@property.inclusive?.must == false
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "when calling process_current_hash" do
|
64
|
+
it "should return {} if hash is :absent" do
|
65
|
+
@property.process_current_hash(:absent).must == {}
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should set every key to nil if inclusive?" do
|
69
|
+
@property.stubs(:inclusive?).returns(true)
|
70
|
+
@property.process_current_hash({:foo => "bar", :do => "re"}).must == { :foo => nil, :do => nil }
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should return the hash if !inclusive?" do
|
74
|
+
@property.stubs(:inclusive?).returns(false)
|
75
|
+
@property.process_current_hash({:foo => "bar", :do => "re"}).must == {:foo => "bar", :do => "re"}
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "when calling should" do
|
80
|
+
it "should return nil if @should is nil" do
|
81
|
+
@property.should.must == nil
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should call process_current_hash" do
|
85
|
+
@property.should = ["foo=baz", "bar=boo"]
|
86
|
+
@property.stubs(:retrieve).returns({:do => "re", :mi => "fa" })
|
87
|
+
@property.expects(:process_current_hash).returns({})
|
88
|
+
@property.should
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should return the hashed values of @should and the nilled values of retrieve if inclusive" do
|
92
|
+
@property.should = ["foo=baz", "bar=boo"]
|
93
|
+
@property.expects(:retrieve).returns({:do => "re", :mi => "fa" })
|
94
|
+
@property.expects(:inclusive?).returns(true)
|
95
|
+
@property.should.must == { :foo => "baz", :bar => "boo", :do => nil, :mi => nil }
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should return the hashed @should + the unique values of retrieve if !inclusive" do
|
99
|
+
@property.should = ["foo=baz", "bar=boo"]
|
100
|
+
@property.expects(:retrieve).returns({:foo => "diff", :do => "re", :mi => "fa"})
|
101
|
+
@property.expects(:inclusive?).returns(false)
|
102
|
+
@property.should.must == { :foo => "baz", :bar => "boo", :do => "re", :mi => "fa" }
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
describe "when calling retrieve" do
|
107
|
+
before do
|
108
|
+
@provider = mock("provider")
|
109
|
+
@property.stubs(:provider).returns(@provider)
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should send 'name' to the provider" do
|
113
|
+
@provider.expects(:send).with(:keys)
|
114
|
+
@property.expects(:name).returns(:keys)
|
115
|
+
@property.retrieve
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should return a hash with the provider returned info" do
|
119
|
+
@provider.stubs(:send).with(:keys).returns({"do" => "re", "mi" => "fa" })
|
120
|
+
@property.stubs(:name).returns(:keys)
|
121
|
+
@property.retrieve == {"do" => "re", "mi" => "fa" }
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should return :absent when the provider returns :absent" do
|
125
|
+
@provider.stubs(:send).with(:keys).returns(:absent)
|
126
|
+
@property.stubs(:name).returns(:keys)
|
127
|
+
@property.retrieve == :absent
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
describe "when calling hashify" do
|
132
|
+
it "should return the array hashified" do
|
133
|
+
@property.hashify(["foo=baz", "bar=boo"]).must == { :foo => "baz", :bar => "boo" }
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
describe "when calling insync?" do
|
138
|
+
before do
|
139
|
+
@provider = mock("provider")
|
140
|
+
@property.stubs(:provider).returns(@provider)
|
141
|
+
@property.stubs(:name).returns(:prop_name)
|
142
|
+
end
|
143
|
+
|
144
|
+
it "should return true unless @should is defined and not nil" do
|
145
|
+
@property.insync?("foo") == true
|
146
|
+
end
|
147
|
+
|
148
|
+
it "should return true if the passed in values is nil" do
|
149
|
+
@property.should = "foo"
|
150
|
+
@property.insync?(nil) == true
|
151
|
+
end
|
152
|
+
|
153
|
+
it "should return true if hashified should value == (retrieved) value passed in" do
|
154
|
+
@provider.stubs(:prop_name).returns({ :foo => "baz", :bar => "boo" })
|
155
|
+
@property.should = ["foo=baz", "bar=boo"]
|
156
|
+
@property.expects(:inclusive?).returns(true)
|
157
|
+
@property.insync?({ :foo => "baz", :bar => "boo" }).must == true
|
158
|
+
end
|
159
|
+
|
160
|
+
it "should return false if prepared value != should value" do
|
161
|
+
@provider.stubs(:prop_name).returns({ "foo" => "bee", "bar" => "boo" })
|
162
|
+
@property.should = ["foo=baz", "bar=boo"]
|
163
|
+
@property.expects(:inclusive?).returns(true)
|
164
|
+
@property.insync?({ "foo" => "bee", "bar" => "boo" }).must == false
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|