puppet 0.22.4 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +156 -0
- data/README +2 -2
- data/Rakefile +6 -6
- data/bin/filebucket +212 -0
- data/bin/puppet +2 -0
- data/bin/puppetca +2 -4
- data/bin/puppetd +16 -15
- data/bin/puppetdoc +46 -496
- data/bin/puppetmasterd +3 -5
- data/bin/puppetrun +8 -3
- data/bin/ralsh +271 -0
- data/conf/redhat/client.init +1 -1
- data/conf/redhat/puppet.spec +13 -2
- data/conf/solaris/pkginfo +1 -1
- data/ext/puppet-test +374 -0
- data/install.rb +40 -31
- data/lib/puppet.rb +39 -4
- data/lib/puppet/config_stores/rest.rb +60 -0
- data/lib/puppet/configuration.rb +312 -17
- data/lib/puppet/external/event-loop/event-loop.rb +4 -0
- data/lib/puppet/external/gratr/rdot.rb +1 -1
- data/lib/puppet/fact_stores/yaml.rb +42 -0
- data/lib/puppet/feature/base.rb +4 -1
- data/lib/puppet/metatype/attributes.rb +20 -43
- data/lib/puppet/metatype/container.rb +1 -36
- data/lib/puppet/metatype/evaluation.rb +48 -19
- data/lib/puppet/metatype/instances.rb +35 -1
- data/lib/puppet/metatype/metaparams.rb +23 -19
- data/lib/puppet/metatype/providers.rb +25 -38
- data/lib/puppet/network/client/ca.rb +8 -5
- data/lib/puppet/network/client/master.rb +59 -17
- data/lib/puppet/network/handler.rb +18 -1
- data/lib/puppet/network/handler/ca.rb +9 -3
- data/lib/puppet/network/handler/facts.rb +70 -0
- data/lib/puppet/network/handler/filebucket.rb +4 -1
- data/lib/puppet/network/handler/fileserver.rb +65 -21
- data/lib/puppet/network/handler/master.rb +6 -3
- data/lib/puppet/network/handler/report.rb +12 -26
- data/lib/puppet/network/handler/resource.rb +14 -2
- data/lib/puppet/network/handler/runner.rb +5 -1
- data/lib/puppet/network/handler/status.rb +5 -1
- data/lib/puppet/network/server/mongrel.rb +4 -4
- data/lib/puppet/network/server/webrick.rb +14 -3
- data/lib/puppet/parameter.rb +30 -25
- data/lib/puppet/parser/ast.rb +1 -6
- data/lib/puppet/parser/ast/component.rb +23 -20
- data/lib/puppet/parser/ast/hostclass.rb +7 -11
- data/lib/puppet/parser/ast/leaf.rb +4 -1
- data/lib/puppet/parser/ast/node.rb +6 -8
- data/lib/puppet/parser/functions.rb +7 -4
- data/lib/puppet/parser/interpreter.rb +155 -205
- data/lib/puppet/parser/lexer.rb +35 -2
- data/lib/puppet/parser/parser.rb +705 -612
- data/lib/puppet/parser/resource.rb +91 -48
- data/lib/puppet/parser/resource/param.rb +52 -29
- data/lib/puppet/parser/scope.rb +28 -23
- data/lib/puppet/pgraph.rb +26 -21
- data/lib/puppet/propertychange.rb +12 -12
- data/lib/puppet/provider.rb +102 -31
- data/lib/puppet/provider/cron/crontab.rb +7 -8
- data/lib/puppet/provider/group/groupadd.rb +4 -4
- data/lib/puppet/provider/group/pw.rb +3 -3
- data/lib/puppet/provider/mount.rb +8 -8
- data/lib/puppet/provider/mount/netinfo.rb +5 -5
- data/lib/puppet/provider/mount/parsed.rb +2 -2
- data/lib/puppet/provider/nameservice.rb +19 -31
- data/lib/puppet/provider/nameservice/netinfo.rb +14 -14
- data/lib/puppet/provider/nameservice/objectadd.rb +4 -4
- data/lib/puppet/provider/nameservice/pw.rb +4 -4
- data/lib/puppet/provider/package.rb +31 -0
- data/lib/puppet/provider/package/appdmg.rb +118 -0
- data/lib/puppet/provider/package/apple.rb +18 -16
- data/lib/puppet/provider/package/apt.rb +13 -15
- data/lib/puppet/provider/package/aptitude.rb +5 -3
- data/lib/puppet/provider/package/aptrpm.rb +9 -11
- data/lib/puppet/provider/package/blastwave.rb +9 -9
- data/lib/puppet/provider/package/darwinport.rb +12 -11
- data/lib/puppet/provider/package/dpkg.rb +20 -12
- data/lib/puppet/provider/package/fink.rb +87 -0
- data/lib/puppet/provider/package/freebsd.rb +10 -11
- data/lib/puppet/provider/package/gem.rb +15 -15
- data/lib/puppet/provider/package/openbsd.rb +12 -17
- data/lib/puppet/provider/package/pkgdmg.rb +90 -16
- data/lib/puppet/provider/package/portage.rb +20 -14
- data/lib/puppet/provider/package/ports.rb +15 -13
- data/lib/puppet/provider/package/rpm.rb +20 -23
- data/lib/puppet/provider/package/rug.rb +6 -8
- data/lib/puppet/provider/package/sun.rb +20 -18
- data/lib/puppet/provider/package/sunfreeware.rb +2 -2
- data/lib/puppet/provider/package/up2date.rb +6 -10
- data/lib/puppet/provider/package/urpmi.rb +51 -0
- data/lib/puppet/provider/package/yum.rb +15 -13
- data/lib/puppet/provider/parsedfile.rb +53 -63
- data/lib/puppet/provider/service/base.rb +13 -15
- data/lib/puppet/provider/service/debian.rb +4 -4
- data/lib/puppet/provider/service/gentoo.rb +4 -4
- data/lib/puppet/provider/service/init.rb +22 -15
- data/lib/puppet/provider/service/redhat.rb +6 -6
- data/lib/puppet/provider/service/smf.rb +6 -6
- data/lib/puppet/provider/user/netinfo.rb +5 -5
- data/lib/puppet/provider/user/pw.rb +10 -5
- data/lib/puppet/provider/user/useradd.rb +9 -14
- data/lib/puppet/provider/zone/solaris.rb +80 -45
- data/lib/puppet/rails.rb +3 -34
- data/lib/puppet/rails/database/schema.rb +45 -24
- data/lib/puppet/rails/fact_value.rb +1 -0
- data/lib/puppet/rails/host.rb +69 -40
- data/lib/puppet/rails/param_name.rb +3 -8
- data/lib/puppet/rails/param_value.rb +2 -1
- data/lib/puppet/rails/puppet_class.rb +0 -2
- data/lib/puppet/rails/puppet_tag.rb +5 -0
- data/lib/puppet/rails/resource.rb +41 -17
- data/lib/puppet/rails/resource_tag.rb +4 -0
- data/lib/puppet/reference/configuration.rb +149 -0
- data/lib/puppet/reference/function.rb +13 -0
- data/lib/puppet/reference/network.rb +37 -0
- data/lib/puppet/reference/providers.rb +118 -0
- data/lib/puppet/reference/report.rb +21 -0
- data/lib/puppet/reference/type.rb +152 -0
- data/lib/puppet/reports/rrdgraph.rb +21 -7
- data/lib/puppet/reports/tagmail.rb +4 -1
- data/lib/puppet/sslcertificates.rb +1 -49
- data/lib/puppet/sslcertificates/ca.rb +2 -79
- data/lib/puppet/sslcertificates/inventory.rb +0 -10
- data/lib/puppet/transaction.rb +24 -41
- data/lib/puppet/transaction/report.rb +27 -1
- data/lib/puppet/type.rb +7 -43
- data/lib/puppet/type/component.rb +198 -124
- data/lib/puppet/type/cron.rb +51 -42
- data/lib/puppet/type/exec.rb +20 -19
- data/lib/puppet/type/group.rb +6 -55
- data/lib/puppet/type/host.rb +16 -37
- data/lib/puppet/type/mount.rb +30 -17
- data/lib/puppet/type/notify.rb +7 -8
- data/lib/puppet/type/package.rb +44 -80
- data/lib/puppet/type/pfile.rb +50 -41
- data/lib/puppet/type/pfile/checksum.rb +82 -95
- data/lib/puppet/type/pfile/content.rb +21 -25
- data/lib/puppet/type/pfile/ensure.rb +32 -30
- data/lib/puppet/type/pfile/group.rb +21 -26
- data/lib/puppet/type/pfile/mode.rb +25 -32
- data/lib/puppet/type/pfile/owner.rb +23 -27
- data/lib/puppet/type/pfile/source.rb +42 -33
- data/lib/puppet/type/pfile/target.rb +20 -18
- data/lib/puppet/type/pfile/type.rb +6 -7
- data/lib/puppet/type/pfilebucket.rb +3 -3
- data/lib/puppet/type/port.rb +5 -7
- data/lib/puppet/type/property.rb +58 -61
- data/lib/puppet/type/resources.rb +12 -8
- data/lib/puppet/type/schedule.rb +8 -8
- data/lib/puppet/type/service.rb +26 -33
- data/lib/puppet/type/sshkey.rb +6 -7
- data/lib/puppet/type/tidy.rb +41 -35
- data/lib/puppet/type/user.rb +34 -67
- data/lib/puppet/type/yumrepo.rb +27 -12
- data/lib/puppet/type/zone.rb +71 -110
- data/lib/puppet/util.rb +46 -61
- data/lib/puppet/util/autoload.rb +59 -47
- data/lib/puppet/util/config.rb +160 -18
- data/lib/puppet/util/config_store.rb +61 -0
- data/lib/puppet/util/fact_store.rb +60 -0
- data/lib/puppet/util/instance_loader.rb +74 -0
- data/lib/puppet/util/loadedfile.rb +5 -8
- data/lib/puppet/util/metric.rb +17 -25
- data/lib/puppet/util/posix.rb +39 -7
- data/lib/puppet/util/provider_features.rb +9 -1
- data/lib/puppet/util/rails/collection_merger.rb +16 -1
- data/lib/puppet/util/reference.rb +189 -0
- data/lib/puppet/util/storage.rb +2 -2
- data/lib/puppet/util/subclass_loader.rb +9 -2
- data/test/language/ast.rb +4 -148
- data/test/language/ast/component.rb +10 -1
- data/test/language/collector.rb +1 -191
- data/test/language/interpreter.rb +284 -327
- data/test/language/lexer.rb +13 -1
- data/test/language/node.rb +1 -1
- data/test/language/parser.rb +17 -4
- data/test/language/resource.rb +67 -101
- data/test/language/scope.rb +18 -3
- data/test/language/snippets.rb +114 -151
- data/test/lib/puppettest.rb +13 -0
- data/test/lib/puppettest/exetest.rb +7 -0
- data/test/lib/puppettest/fakes.rb +39 -28
- data/test/lib/puppettest/railstesting.rb +1 -1
- data/test/lib/puppettest/support/assertions.rb +2 -2
- data/test/lib/puppettest/support/collection.rb +30 -0
- data/test/network/client/ca.rb +27 -1
- data/test/network/client/client.rb +3 -3
- data/test/network/client/master.rb +102 -1
- data/test/network/handler/ca.rb +35 -1
- data/test/network/handler/facts.rb +112 -0
- data/test/network/handler/fileserver.rb +25 -1
- data/test/network/handler/handler.rb +2 -2
- data/test/network/handler/master.rb +2 -49
- data/test/network/handler/resource.rb +5 -6
- data/test/network/server/mongrel_test.rb +65 -0
- data/test/network/server/webrick.rb +2 -2
- data/test/network/xmlrpc/client.rb +2 -1
- data/test/network/xmlrpc/processor.rb +2 -1
- data/test/other/pgraph.rb +6 -5
- data/test/other/propertychange.rb +11 -12
- data/test/other/report.rb +44 -27
- data/test/other/transactions.rb +17 -16
- data/test/puppet/tc_suidmanager.rb +2 -2
- data/test/rails/ast.rb +74 -0
- data/test/rails/collection.rb +214 -0
- data/test/rails/host.rb +49 -24
- data/test/rails/interpreter.rb +91 -0
- data/test/rails/railsparameter.rb +22 -11
- data/test/rails/railsresource.rb +140 -7
- data/test/ral/manager/attributes.rb +37 -13
- data/test/ral/manager/instances.rb +82 -0
- data/test/ral/manager/provider.rb +60 -22
- data/test/ral/manager/type.rb +9 -6
- data/test/ral/providers/cron/crontab.rb +59 -7
- data/test/ral/providers/group.rb +7 -7
- data/test/ral/providers/host/netinfo.rb +5 -6
- data/test/ral/providers/host/parsed.rb +4 -4
- data/test/ral/providers/mount/parsed.rb +11 -6
- data/test/ral/providers/nameservice.rb +2 -2
- data/test/ral/providers/package.rb +39 -14
- data/test/ral/providers/package/apt.rb +72 -3
- data/test/ral/providers/package/aptitude.rb +15 -12
- data/test/ral/providers/package/aptrpm.rb +3 -3
- data/test/ral/providers/package/dpkg.rb +2 -2
- data/test/ral/providers/parsedfile.rb +114 -88
- data/test/ral/providers/{parsedport.rb → port/parsed.rb} +1 -1
- data/test/ral/providers/provider.rb +93 -13
- data/test/ral/providers/service.rb +52 -26
- data/test/ral/providers/sshkey/parsed.rb +3 -3
- data/test/ral/providers/user.rb +19 -20
- data/test/ral/providers/user/useradd.rb +1 -5
- data/test/ral/types/cron.rb +49 -36
- data/test/ral/types/file.rb +38 -35
- data/test/ral/types/file/target.rb +4 -4
- data/test/ral/types/filesources.rb +24 -22
- data/test/ral/types/group.rb +4 -2
- data/test/ral/types/host.rb +17 -10
- data/test/ral/types/mount.rb +40 -23
- data/test/ral/types/package.rb +62 -5
- data/test/ral/types/parameter.rb +2 -2
- data/test/ral/types/property.rb +27 -20
- data/test/ral/types/resources.rb +4 -16
- data/test/ral/types/schedule.rb +2 -2
- data/test/ral/types/service.rb +2 -3
- data/test/ral/types/sshkey.rb +3 -3
- data/test/ral/types/tidy.rb +6 -15
- data/test/ral/types/user.rb +17 -17
- data/test/ral/types/yumrepo.rb +2 -2
- data/test/ral/types/zone.rb +71 -87
- data/test/util/autoload.rb +6 -21
- data/test/util/config.rb +201 -101
- data/test/util/fact_store.rb +67 -0
- data/test/util/features.rb +9 -6
- data/test/util/instance_loader.rb +53 -0
- data/test/util/loadedfile.rb +17 -1
- data/test/util/metrics.rb +54 -57
- data/test/util/posixtest.rb +8 -11
- data/test/util/utiltest.rb +31 -2
- metadata +520 -492
- data/TODO +0 -4
- data/lib/puppet/network/client/logger.rb +0 -6
- data/lib/puppet/network/handler/logger.rb +0 -52
- data/lib/puppet/rails/database/001_add_indexes.rb +0 -38
- data/lib/puppet/type/parsedtype.rb +0 -219
- data/test/network/handler/logger.rb +0 -183
|
@@ -8,21 +8,19 @@ require 'puppet'
|
|
|
8
8
|
require 'puppet/parser/interpreter'
|
|
9
9
|
require 'puppet/parser/parser'
|
|
10
10
|
require 'puppet/network/client'
|
|
11
|
-
require 'puppet/rails'
|
|
12
11
|
require 'puppettest'
|
|
13
12
|
require 'puppettest/resourcetesting'
|
|
14
13
|
require 'puppettest/parsertesting'
|
|
15
14
|
require 'puppettest/servertest'
|
|
16
|
-
require 'puppettest/railstesting'
|
|
17
15
|
require 'timeout'
|
|
18
16
|
|
|
19
|
-
class TestInterpreter <
|
|
17
|
+
class TestInterpreter < PuppetTest::TestCase
|
|
20
18
|
include PuppetTest
|
|
21
19
|
include PuppetTest::ServerTest
|
|
22
20
|
include PuppetTest::ParserTesting
|
|
23
21
|
include PuppetTest::ResourceTesting
|
|
24
|
-
include PuppetTest::RailsTesting
|
|
25
22
|
AST = Puppet::Parser::AST
|
|
23
|
+
NodeDef = Puppet::Parser::Interpreter::NodeDef
|
|
26
24
|
|
|
27
25
|
# create a simple manifest that uses nodes to create a file
|
|
28
26
|
def mknodemanifest(node, file)
|
|
@@ -76,199 +74,6 @@ class TestInterpreter < Test::Unit::TestCase
|
|
|
76
74
|
assert(config != newconfig, "Configs are somehow the same")
|
|
77
75
|
end
|
|
78
76
|
|
|
79
|
-
if Puppet.features.rails?
|
|
80
|
-
def test_hoststorage
|
|
81
|
-
assert_nothing_raised {
|
|
82
|
-
Puppet[:storeconfigs] = true
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
file = tempfile()
|
|
86
|
-
File.open(file, "w") { |f|
|
|
87
|
-
f.puts "file { \"/etc\": owner => root }"
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
interp = nil
|
|
91
|
-
assert_nothing_raised {
|
|
92
|
-
interp = Puppet::Parser::Interpreter.new(
|
|
93
|
-
:Manifest => file,
|
|
94
|
-
:UseNodes => false,
|
|
95
|
-
:ForkSave => false
|
|
96
|
-
)
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
facts = {}
|
|
100
|
-
Facter.each { |fact, val| facts[fact] = val }
|
|
101
|
-
|
|
102
|
-
objects = nil
|
|
103
|
-
assert_nothing_raised {
|
|
104
|
-
objects = interp.run(facts["hostname"], facts)
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
obj = Puppet::Rails::Host.find_by_name(facts["hostname"])
|
|
108
|
-
assert(obj, "Could not find host object")
|
|
109
|
-
end
|
|
110
|
-
else
|
|
111
|
-
$stderr.puts "No ActiveRecord -- skipping collection tests"
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
if Facter["domain"].value == "madstop.com"
|
|
115
|
-
|
|
116
|
-
# Only test ldap stuff on luke's network, since that's the only place we
|
|
117
|
-
# have data for.
|
|
118
|
-
if Puppet.features.ldap?
|
|
119
|
-
def ldapconnect
|
|
120
|
-
|
|
121
|
-
@ldap = LDAP::Conn.new("ldap", 389)
|
|
122
|
-
@ldap.set_option( LDAP::LDAP_OPT_PROTOCOL_VERSION, 3 )
|
|
123
|
-
@ldap.simple_bind("", "")
|
|
124
|
-
|
|
125
|
-
return @ldap
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
def ldaphost(node)
|
|
129
|
-
parent = nil
|
|
130
|
-
classes = nil
|
|
131
|
-
@ldap.search( "ou=hosts, dc=madstop, dc=com", 2,
|
|
132
|
-
"(&(objectclass=puppetclient)(cn=%s))" % node
|
|
133
|
-
) do |entry|
|
|
134
|
-
parent = entry.vals("parentnode").shift
|
|
135
|
-
classes = entry.vals("puppetclass") || []
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
return parent, classes
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
def test_ldapsearch
|
|
142
|
-
Puppet[:ldapbase] = "ou=hosts, dc=madstop, dc=com"
|
|
143
|
-
Puppet[:ldapnodes] = true
|
|
144
|
-
|
|
145
|
-
ldapconnect()
|
|
146
|
-
|
|
147
|
-
interp = mkinterp :NodeSources => [:ldap, :code]
|
|
148
|
-
|
|
149
|
-
# Make sure we get nil and nil back when we search for something missing
|
|
150
|
-
parent, classes = nil
|
|
151
|
-
assert_nothing_raised do
|
|
152
|
-
parent, classes = interp.ldapsearch("nosuchhost")
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
assert_nil(parent, "Got a parent for a non-existent host")
|
|
156
|
-
assert_nil(classes, "Got classes for a non-existent host")
|
|
157
|
-
|
|
158
|
-
# Make sure we can find 'culain' in ldap
|
|
159
|
-
assert_nothing_raised do
|
|
160
|
-
parent, classes = interp.ldapsearch("culain")
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
realparent, realclasses = ldaphost("culain")
|
|
164
|
-
assert_equal(realparent, parent)
|
|
165
|
-
assert_equal(realclasses, classes)
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
def test_ldapnodes
|
|
169
|
-
Puppet[:ldapbase] = "ou=hosts, dc=madstop, dc=com"
|
|
170
|
-
Puppet[:ldapnodes] = true
|
|
171
|
-
|
|
172
|
-
ldapconnect()
|
|
173
|
-
|
|
174
|
-
interp = mkinterp :NodeSources => [:ldap, :code]
|
|
175
|
-
|
|
176
|
-
# culain uses basenode, so create that
|
|
177
|
-
basenode = interp.newnode([:basenode])[0]
|
|
178
|
-
|
|
179
|
-
# Make sure we get nothing for nonexistent hosts
|
|
180
|
-
none = nil
|
|
181
|
-
assert_nothing_raised do
|
|
182
|
-
none = interp.nodesearch_ldap("nosuchhost")
|
|
183
|
-
end
|
|
184
|
-
|
|
185
|
-
assert_nil(none, "Got a node for a non-existent host")
|
|
186
|
-
|
|
187
|
-
# Make sure we can find 'culain' in ldap
|
|
188
|
-
culain = nil
|
|
189
|
-
assert_nothing_raised do
|
|
190
|
-
culain = interp.nodesearch_ldap("culain")
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
assert(culain, "Did not find culain in ldap")
|
|
194
|
-
|
|
195
|
-
assert_nothing_raised do
|
|
196
|
-
assert_equal(basenode.fqname.to_s, culain.parentclass.fqname.to_s,
|
|
197
|
-
"Did not get parent class")
|
|
198
|
-
end
|
|
199
|
-
end
|
|
200
|
-
|
|
201
|
-
if Puppet::Util::SUIDManager.uid == 0 and Facter["hostname"].value == "culain"
|
|
202
|
-
def test_ldapreconnect
|
|
203
|
-
Puppet[:ldapbase] = "ou=hosts, dc=madstop, dc=com"
|
|
204
|
-
Puppet[:ldapnodes] = true
|
|
205
|
-
|
|
206
|
-
interp = nil
|
|
207
|
-
assert_nothing_raised {
|
|
208
|
-
interp = Puppet::Parser::Interpreter.new(
|
|
209
|
-
:Manifest => mktestmanifest()
|
|
210
|
-
)
|
|
211
|
-
}
|
|
212
|
-
hostname = "culain.madstop.com"
|
|
213
|
-
|
|
214
|
-
# look for our host
|
|
215
|
-
assert_nothing_raised {
|
|
216
|
-
parent, classes = interp.nodesearch_ldap(hostname)
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
# Now restart ldap
|
|
220
|
-
system("/etc/init.d/slapd restart 2>/dev/null >/dev/null")
|
|
221
|
-
sleep(1)
|
|
222
|
-
|
|
223
|
-
# and look again
|
|
224
|
-
assert_nothing_raised {
|
|
225
|
-
parent, classes = interp.nodesearch_ldap(hostname)
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
# Now stop ldap
|
|
229
|
-
system("/etc/init.d/slapd stop 2>/dev/null >/dev/null")
|
|
230
|
-
cleanup do
|
|
231
|
-
system("/etc/init.d/slapd start 2>/dev/null >/dev/null")
|
|
232
|
-
end
|
|
233
|
-
|
|
234
|
-
# And make sure we actually fail here
|
|
235
|
-
assert_raise(Puppet::Error) {
|
|
236
|
-
parent, classes = interp.nodesearch_ldap(hostname)
|
|
237
|
-
}
|
|
238
|
-
end
|
|
239
|
-
else
|
|
240
|
-
$stderr.puts "Run as root for ldap reconnect tests"
|
|
241
|
-
end
|
|
242
|
-
end
|
|
243
|
-
else
|
|
244
|
-
$stderr.puts "Not in madstop.com; skipping ldap tests"
|
|
245
|
-
end
|
|
246
|
-
|
|
247
|
-
# Test that node info and default node info in different sources isn't
|
|
248
|
-
# bad.
|
|
249
|
-
def test_multiple_nodesources
|
|
250
|
-
|
|
251
|
-
# Create another node source
|
|
252
|
-
Puppet::Parser::Interpreter.send(:define_method, :nodesearch_multi) do |*names|
|
|
253
|
-
if names[0] == "default"
|
|
254
|
-
gennode("default", {:facts => {}})
|
|
255
|
-
else
|
|
256
|
-
nil
|
|
257
|
-
end
|
|
258
|
-
end
|
|
259
|
-
|
|
260
|
-
interp = mkinterp :NodeSources => [:multi, :code]
|
|
261
|
-
|
|
262
|
-
interp.newnode(["node"])
|
|
263
|
-
|
|
264
|
-
obj = nil
|
|
265
|
-
assert_nothing_raised do
|
|
266
|
-
obj = interp.nodesearch("node")
|
|
267
|
-
end
|
|
268
|
-
assert(obj, "Did not find node")
|
|
269
|
-
assert_equal("node", obj.fqname)
|
|
270
|
-
end
|
|
271
|
-
|
|
272
77
|
# Make sure searchnode behaves as we expect.
|
|
273
78
|
def test_nodesearch
|
|
274
79
|
# We use two sources here to catch a weird bug where the default
|
|
@@ -298,14 +103,14 @@ class TestInterpreter < Test::Unit::TestCase
|
|
|
298
103
|
assert_nothing_raised do
|
|
299
104
|
default = interp.nodesearch("nosuchnode")
|
|
300
105
|
assert(default, "Did not find default node")
|
|
301
|
-
assert_equal("default", default.
|
|
106
|
+
assert_equal("default", default.classname)
|
|
302
107
|
end
|
|
303
108
|
|
|
304
109
|
# Now make sure the longest match always wins
|
|
305
110
|
node = interp.nodesearch(*%w{node2 node2.domain.com})
|
|
306
111
|
|
|
307
112
|
assert(node, "Did not find node2")
|
|
308
|
-
assert_equal("node2.domain.com", node.
|
|
113
|
+
assert_equal("node2.domain.com", node.classname,
|
|
309
114
|
"Did not get longest match")
|
|
310
115
|
end
|
|
311
116
|
|
|
@@ -379,14 +184,14 @@ class TestInterpreter < Test::Unit::TestCase
|
|
|
379
184
|
|
|
380
185
|
# Make sure trying to get the parentclass throws an error
|
|
381
186
|
assert_raise(Puppet::ParseError) do
|
|
382
|
-
interp.nodesearch_code("simplenode").
|
|
187
|
+
interp.nodesearch_code("simplenode").parentobj
|
|
383
188
|
end
|
|
384
189
|
|
|
385
190
|
# Now define the parent node
|
|
386
191
|
interp.newnode(:foo)
|
|
387
192
|
|
|
388
193
|
# And make sure we get things back correctly
|
|
389
|
-
assert_equal("foo", interp.nodesearch_code("simplenode").
|
|
194
|
+
assert_equal("foo", interp.nodesearch_code("simplenode").parentobj.classname)
|
|
390
195
|
assert_nil(interp.nodesearch_code("simplenode").code)
|
|
391
196
|
|
|
392
197
|
# Now make sure that trying to redefine it throws an error.
|
|
@@ -402,7 +207,7 @@ class TestInterpreter < Test::Unit::TestCase
|
|
|
402
207
|
|
|
403
208
|
names.each do |name|
|
|
404
209
|
assert_equal(:yay, interp.nodesearch_code(name).code)
|
|
405
|
-
assert_equal("foo", interp.nodesearch_code(name).
|
|
210
|
+
assert_equal("foo", interp.nodesearch_code(name).parentobj.name)
|
|
406
211
|
# Now make sure that trying to redefine it throws an error.
|
|
407
212
|
assert_raise(Puppet::ParseError) {
|
|
408
213
|
interp.newnode(name, {})
|
|
@@ -410,54 +215,6 @@ class TestInterpreter < Test::Unit::TestCase
|
|
|
410
215
|
end
|
|
411
216
|
end
|
|
412
217
|
|
|
413
|
-
# Make sure we're correctly generating a node definition.
|
|
414
|
-
def test_gennode
|
|
415
|
-
interp = mkinterp
|
|
416
|
-
|
|
417
|
-
interp.newnode "base"
|
|
418
|
-
interp.newclass "yaytest"
|
|
419
|
-
|
|
420
|
-
# Go through the different iterations:
|
|
421
|
-
[
|
|
422
|
-
[nil, "yaytest"],
|
|
423
|
-
[nil, ["yaytest"]],
|
|
424
|
-
[nil, nil],
|
|
425
|
-
[nil, []],
|
|
426
|
-
["base", nil],
|
|
427
|
-
["base", []],
|
|
428
|
-
["base", "yaytest"],
|
|
429
|
-
["base", ["yaytest"]]
|
|
430
|
-
].each do |parent, classes|
|
|
431
|
-
node = nil
|
|
432
|
-
assert_nothing_raised {
|
|
433
|
-
node = interp.gennode("nodeA", :classes => classes,
|
|
434
|
-
:parentnode => parent)
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
assert_instance_of(Puppet::Parser::AST::Node, node)
|
|
438
|
-
|
|
439
|
-
assert_equal("nodeA", node.name)
|
|
440
|
-
|
|
441
|
-
scope = mkscope :interp => interp
|
|
442
|
-
|
|
443
|
-
assert_nothing_raised do
|
|
444
|
-
node.evaluate :scope => scope
|
|
445
|
-
end
|
|
446
|
-
|
|
447
|
-
# If there's a parent, make sure it got evaluated
|
|
448
|
-
if parent
|
|
449
|
-
assert(scope.classlist.include?("base"),
|
|
450
|
-
"Did not evaluate parent node")
|
|
451
|
-
end
|
|
452
|
-
|
|
453
|
-
# If there are classes make sure they got evaluated
|
|
454
|
-
if classes == ["yaytest"] or classes == "yaytest"
|
|
455
|
-
assert(scope.classlist.include?("yaytest"),
|
|
456
|
-
"Did not evaluate class")
|
|
457
|
-
end
|
|
458
|
-
end
|
|
459
|
-
end
|
|
460
|
-
|
|
461
218
|
def test_fqfind
|
|
462
219
|
interp = mkinterp
|
|
463
220
|
|
|
@@ -497,9 +254,9 @@ class TestInterpreter < Test::Unit::TestCase
|
|
|
497
254
|
|
|
498
255
|
mydefine = interp.finddefine("", "mydefine")
|
|
499
256
|
assert(mydefine, "Could not find definition")
|
|
500
|
-
assert_equal("mydefine", interp.finddefine("", "mydefine").
|
|
257
|
+
assert_equal("mydefine", interp.finddefine("", "mydefine").classname)
|
|
501
258
|
assert_equal("", mydefine.namespace)
|
|
502
|
-
assert_equal("mydefine", mydefine.
|
|
259
|
+
assert_equal("mydefine", mydefine.classname)
|
|
503
260
|
|
|
504
261
|
assert_raise(Puppet::ParseError) do
|
|
505
262
|
interp.newdefine("mydefine", :code => :yay,
|
|
@@ -517,8 +274,7 @@ class TestInterpreter < Test::Unit::TestCase
|
|
|
517
274
|
"Could not find other::mydefine")
|
|
518
275
|
assert_equal(:other, other.code)
|
|
519
276
|
assert_equal("other", other.namespace)
|
|
520
|
-
assert_equal("mydefine", other.
|
|
521
|
-
assert_equal("other::mydefine", other.fqname)
|
|
277
|
+
assert_equal("other::mydefine", other.classname)
|
|
522
278
|
end
|
|
523
279
|
|
|
524
280
|
def test_newclass
|
|
@@ -543,7 +299,7 @@ class TestInterpreter < Test::Unit::TestCase
|
|
|
543
299
|
assert(klass, "Did not return class")
|
|
544
300
|
|
|
545
301
|
assert(interp.findclass("", "myclass"), "Could not find definition")
|
|
546
|
-
assert_equal("myclass", interp.findclass("", "myclass").
|
|
302
|
+
assert_equal("myclass", interp.findclass("", "myclass").classname)
|
|
547
303
|
assert_equal(%w{original code},
|
|
548
304
|
interp.findclass("", "myclass").code.evaluate(:scope => scope))
|
|
549
305
|
|
|
@@ -556,9 +312,8 @@ class TestInterpreter < Test::Unit::TestCase
|
|
|
556
312
|
other = interp.findclass("other", "myclass")
|
|
557
313
|
assert(other, "Could not find class")
|
|
558
314
|
assert(interp.findclass("", "other::myclass"), "Could not find class")
|
|
559
|
-
assert_equal("other::myclass", other.
|
|
315
|
+
assert_equal("other::myclass", other.classname)
|
|
560
316
|
assert_equal("other::myclass", other.namespace)
|
|
561
|
-
assert_equal("myclass", other.type)
|
|
562
317
|
assert_equal(%w{something diff},
|
|
563
318
|
interp.findclass("other", "myclass").code.evaluate(:scope => scope))
|
|
564
319
|
|
|
@@ -657,9 +412,11 @@ class TestInterpreter < Test::Unit::TestCase
|
|
|
657
412
|
interp.newclass("sub", :parent => "base1")
|
|
658
413
|
}
|
|
659
414
|
|
|
660
|
-
# Make sure we get the right parent class, and make sure it's an object.
|
|
661
|
-
assert_equal(
|
|
415
|
+
# Make sure we get the right parent class, and make sure it's not an object.
|
|
416
|
+
assert_equal("base1",
|
|
662
417
|
interp.findclass("", "sub").parentclass)
|
|
418
|
+
assert_equal(interp.findclass("", "base1"),
|
|
419
|
+
interp.findclass("", "sub").parentobj)
|
|
663
420
|
|
|
664
421
|
# Now make sure we get a failure if we try to conflict.
|
|
665
422
|
assert_raise(Puppet::ParseError) {
|
|
@@ -668,13 +425,13 @@ class TestInterpreter < Test::Unit::TestCase
|
|
|
668
425
|
|
|
669
426
|
# Make sure that failure didn't screw us up in any way.
|
|
670
427
|
assert_equal(interp.findclass("", "base1"),
|
|
671
|
-
interp.findclass("", "sub").
|
|
428
|
+
interp.findclass("", "sub").parentobj)
|
|
672
429
|
# But make sure we can create a class with a fq parent
|
|
673
430
|
assert_nothing_raised {
|
|
674
431
|
interp.newclass("another", :parent => "one::two::three")
|
|
675
432
|
}
|
|
676
433
|
assert_equal(interp.findclass("", "one::two::three"),
|
|
677
|
-
interp.findclass("", "another").
|
|
434
|
+
interp.findclass("", "another").parentobj)
|
|
678
435
|
|
|
679
436
|
end
|
|
680
437
|
|
|
@@ -955,45 +712,6 @@ class TestInterpreter < Test::Unit::TestCase
|
|
|
955
712
|
assert(found.include?("/tmp/klass1"), "Did not evaluate klass1")
|
|
956
713
|
assert(found.include?("/tmp/klass2"), "Did not evaluate klass2")
|
|
957
714
|
end
|
|
958
|
-
|
|
959
|
-
if Puppet.features.rails?
|
|
960
|
-
# We need to make sure finished objects are stored in the db.
|
|
961
|
-
def test_finish_before_store
|
|
962
|
-
railsinit
|
|
963
|
-
interp = mkinterp
|
|
964
|
-
|
|
965
|
-
node = interp.newnode ["myhost"], :code => AST::ASTArray.new(:children => [
|
|
966
|
-
resourcedef("file", "/tmp/yay", :group => "root"),
|
|
967
|
-
defaultobj("file", :owner => "root")
|
|
968
|
-
])
|
|
969
|
-
|
|
970
|
-
interp.newclass "myclass", :code => AST::ASTArray.new(:children => [
|
|
971
|
-
])
|
|
972
|
-
|
|
973
|
-
interp.newclass "sub", :parent => "myclass",
|
|
974
|
-
:code => AST::ASTArray.new(:children => [
|
|
975
|
-
resourceoverride("file", "/tmp/yay", :owner => "root")
|
|
976
|
-
]
|
|
977
|
-
)
|
|
978
|
-
|
|
979
|
-
# Now do the rails crap
|
|
980
|
-
Puppet[:storeconfigs] = true
|
|
981
|
-
|
|
982
|
-
interp.evaluate("myhost", {})
|
|
983
|
-
|
|
984
|
-
# And then retrieve the object from rails
|
|
985
|
-
res = Puppet::Rails::Resource.find_by_restype_and_title("file", "/tmp/yay")
|
|
986
|
-
|
|
987
|
-
assert(res, "Did not get resource from rails")
|
|
988
|
-
|
|
989
|
-
param = res.param_names.find_by_name("owner", :include => :param_values)
|
|
990
|
-
|
|
991
|
-
assert(param, "Did not find owner param")
|
|
992
|
-
|
|
993
|
-
pvalue = param.param_values.find_by_value("root")
|
|
994
|
-
assert_equal("root", pvalue[:value])
|
|
995
|
-
end
|
|
996
|
-
end
|
|
997
715
|
|
|
998
716
|
def mk_node_mapper
|
|
999
717
|
# First, make sure our nodesearch command works as we expect
|
|
@@ -1002,17 +720,19 @@ class TestInterpreter < Test::Unit::TestCase
|
|
|
1002
720
|
ruby = %x{which ruby}.chomp
|
|
1003
721
|
File.open(mapper, "w") { |f|
|
|
1004
722
|
f.puts "#!#{ruby}
|
|
1005
|
-
|
|
723
|
+
require 'yaml'
|
|
724
|
+
name = ARGV[0].chomp
|
|
725
|
+
result = {}
|
|
726
|
+
|
|
1006
727
|
if name =~ /a/
|
|
1007
|
-
|
|
1008
|
-
else
|
|
1009
|
-
puts ''
|
|
728
|
+
result[:parameters] = {'one' => ARGV[0] + '1', 'two' => ARGV[0] + '2'}
|
|
1010
729
|
end
|
|
730
|
+
|
|
1011
731
|
if name =~ /p/
|
|
1012
|
-
|
|
1013
|
-
else
|
|
1014
|
-
puts ''
|
|
732
|
+
result['classes'] = [1,2,3].collect { |n| ARGV[0] + n.to_s }
|
|
1015
733
|
end
|
|
734
|
+
|
|
735
|
+
puts YAML.dump(result)
|
|
1016
736
|
"
|
|
1017
737
|
}
|
|
1018
738
|
File.chmod(0755, mapper)
|
|
@@ -1022,18 +742,10 @@ class TestInterpreter < Test::Unit::TestCase
|
|
|
1022
742
|
def test_nodesearch_external
|
|
1023
743
|
interp = mkinterp
|
|
1024
744
|
|
|
1025
|
-
# Make a fake gennode method
|
|
1026
|
-
class << interp
|
|
1027
|
-
def gennode(name, args, source)
|
|
1028
|
-
args[:name] = name
|
|
1029
|
-
return args
|
|
1030
|
-
end
|
|
1031
|
-
end
|
|
1032
|
-
|
|
1033
745
|
mapper = mk_node_mapper
|
|
1034
746
|
# Make sure it gives the right response
|
|
1035
|
-
assert_equal(
|
|
1036
|
-
%x{#{mapper} apple})
|
|
747
|
+
assert_equal({'classes' => %w{apple1 apple2 apple3}, :parameters => {"one" => "apple1", "two" => "apple2"}},
|
|
748
|
+
YAML.load(%x{#{mapper} apple}))
|
|
1037
749
|
|
|
1038
750
|
# First make sure we get nil back by default
|
|
1039
751
|
assert_nothing_raised {
|
|
@@ -1043,23 +755,29 @@ class TestInterpreter < Test::Unit::TestCase
|
|
|
1043
755
|
assert_nothing_raised { Puppet[:external_nodes] = mapper }
|
|
1044
756
|
|
|
1045
757
|
node = nil
|
|
758
|
+
# Both 'a' and 'p', so we get classes and parameters
|
|
1046
759
|
assert_nothing_raised { node = interp.nodesearch_external("apple") }
|
|
760
|
+
assert_equal("apple", node.name, "node name was not set correctly for apple")
|
|
761
|
+
assert_equal(%w{apple1 apple2 apple3}, node.classes, "node classes were not set correctly for apple")
|
|
762
|
+
assert_equal( {"one" => "apple1", "two" => "apple2"}, node.parameters, "node parameters were not set correctly for apple")
|
|
1047
763
|
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
assert_equal({
|
|
1053
|
-
node)
|
|
764
|
+
# A 'p' but no 'a', so we only get classes
|
|
765
|
+
assert_nothing_raised { node = interp.nodesearch_external("plum") }
|
|
766
|
+
assert_equal("plum", node.name, "node name was not set correctly for plum")
|
|
767
|
+
assert_equal(%w{plum1 plum2 plum3}, node.classes, "node classes were not set correctly for plum")
|
|
768
|
+
assert_equal({}, node.parameters, "node parameters were not set correctly for plum")
|
|
1054
769
|
|
|
770
|
+
# An 'a' but no 'p', so we only get parameters.
|
|
1055
771
|
assert_nothing_raised { node = interp.nodesearch_external("guava")} # no p's, thus no classes
|
|
1056
|
-
assert_equal(
|
|
1057
|
-
|
|
772
|
+
assert_equal("guava", node.name, "node name was not set correctly for guava")
|
|
773
|
+
assert_equal([], node.classes, "node classes were not set correctly for guava")
|
|
774
|
+
assert_equal({"one" => "guava1", "two" => "guava2"}, node.parameters, "node parameters were not set correctly for guava")
|
|
1058
775
|
|
|
1059
776
|
assert_nothing_raised { node = interp.nodesearch_external("honeydew")} # neither, thus nil
|
|
1060
777
|
assert_nil(node)
|
|
1061
778
|
end
|
|
1062
779
|
|
|
780
|
+
# A wrapper test, to make sure we're correctly calling the external search method.
|
|
1063
781
|
def test_nodesearch_external_functional
|
|
1064
782
|
mapper = mk_node_mapper
|
|
1065
783
|
|
|
@@ -1070,7 +788,7 @@ class TestInterpreter < Test::Unit::TestCase
|
|
|
1070
788
|
assert_nothing_raised do
|
|
1071
789
|
node = interp.nodesearch("apple")
|
|
1072
790
|
end
|
|
1073
|
-
assert_instance_of(
|
|
791
|
+
assert_instance_of(NodeDef, node, "did not create node")
|
|
1074
792
|
end
|
|
1075
793
|
|
|
1076
794
|
def test_check_resource_collections
|
|
@@ -1084,6 +802,245 @@ class TestInterpreter < Test::Unit::TestCase
|
|
|
1084
802
|
interp.check_resource_collections(scope)
|
|
1085
803
|
end
|
|
1086
804
|
end
|
|
805
|
+
|
|
806
|
+
def test_nodedef
|
|
807
|
+
interp = mkinterp
|
|
808
|
+
interp.newclass("base")
|
|
809
|
+
interp.newclass("sub", :parent => "base")
|
|
810
|
+
interp.newclass("other")
|
|
811
|
+
|
|
812
|
+
node = nil
|
|
813
|
+
assert_nothing_raised("Could not create a node definition") do
|
|
814
|
+
node = NodeDef.new :name => "yay", :classes => "sub", :parameters => {"one" => "two", "three" => "four"}
|
|
815
|
+
end
|
|
816
|
+
|
|
817
|
+
scope = mkscope :interp => interp
|
|
818
|
+
assert_nothing_raised("Could not evaluate the node definition") do
|
|
819
|
+
node.evaluate(:scope => scope)
|
|
820
|
+
end
|
|
821
|
+
|
|
822
|
+
assert_equal("two", scope.lookupvar("one"), "NodeDef did not set variable")
|
|
823
|
+
assert_equal("four", scope.lookupvar("three"), "NodeDef did not set variable")
|
|
824
|
+
|
|
825
|
+
assert(scope.classlist.include?("sub"), "NodeDef did not evaluate class")
|
|
826
|
+
assert(scope.classlist.include?("base"), "NodeDef did not evaluate base class")
|
|
827
|
+
|
|
828
|
+
# Now try a node def with multiple classes
|
|
829
|
+
assert_nothing_raised("Could not create a node definition") do
|
|
830
|
+
node = NodeDef.new :name => "yay", :classes => %w{sub other base}, :parameters => {"one" => "two", "three" => "four"}
|
|
831
|
+
end
|
|
832
|
+
|
|
833
|
+
scope = mkscope :interp => interp
|
|
834
|
+
assert_nothing_raised("Could not evaluate the node definition") do
|
|
835
|
+
node.evaluate(:scope => scope)
|
|
836
|
+
end
|
|
837
|
+
|
|
838
|
+
assert_equal("two", scope.lookupvar("one"), "NodeDef did not set variable")
|
|
839
|
+
assert_equal("four", scope.lookupvar("three"), "NodeDef did not set variable")
|
|
840
|
+
|
|
841
|
+
assert(scope.classlist.include?("sub"), "NodeDef did not evaluate class")
|
|
842
|
+
assert(scope.classlist.include?("other"), "NodeDef did not evaluate other class")
|
|
843
|
+
|
|
844
|
+
# And a node def with no params
|
|
845
|
+
assert_nothing_raised("Could not create a node definition with no params") do
|
|
846
|
+
node = NodeDef.new :name => "yay", :classes => %w{sub other base}
|
|
847
|
+
end
|
|
848
|
+
|
|
849
|
+
scope = mkscope :interp => interp
|
|
850
|
+
assert_nothing_raised("Could not evaluate the node definition") do
|
|
851
|
+
node.evaluate(:scope => scope)
|
|
852
|
+
end
|
|
853
|
+
|
|
854
|
+
assert(scope.classlist.include?("sub"), "NodeDef did not evaluate class")
|
|
855
|
+
assert(scope.classlist.include?("other"), "NodeDef did not evaluate other class")
|
|
856
|
+
end
|
|
857
|
+
|
|
858
|
+
def test_ldapnodes
|
|
859
|
+
interp = mkinterp
|
|
860
|
+
|
|
861
|
+
nodetable = {}
|
|
862
|
+
|
|
863
|
+
# Override the ldapsearch definition, so we don't have to actually set it up.
|
|
864
|
+
interp.meta_def(:ldapsearch) do |name|
|
|
865
|
+
nodetable[name]
|
|
866
|
+
end
|
|
867
|
+
|
|
868
|
+
# Make sure we get nothing for nonexistent hosts
|
|
869
|
+
node = nil
|
|
870
|
+
assert_nothing_raised do
|
|
871
|
+
node = interp.nodesearch_ldap("nosuchhost")
|
|
872
|
+
end
|
|
873
|
+
|
|
874
|
+
assert_nil(node, "Got a node for a non-existent host")
|
|
875
|
+
|
|
876
|
+
# Now add a base node with some classes and parameters
|
|
877
|
+
nodetable["base"] = [nil, %w{one two}, {"base" => "true"}]
|
|
878
|
+
|
|
879
|
+
assert_nothing_raised do
|
|
880
|
+
node = interp.nodesearch_ldap("base")
|
|
881
|
+
end
|
|
882
|
+
|
|
883
|
+
assert_instance_of(NodeDef, node, "Did not get node from ldap nodesearch")
|
|
884
|
+
assert_equal("base", node.name, "node name was not set")
|
|
885
|
+
|
|
886
|
+
assert_equal(%w{one two}, node.classes, "node classes were not set")
|
|
887
|
+
assert_equal({"base" => "true"}, node.parameters, "node parameters were not set")
|
|
888
|
+
|
|
889
|
+
# Now use a different with this as the base
|
|
890
|
+
nodetable["middle"] = ["base", %w{three}, {"center" => "boo"}]
|
|
891
|
+
assert_nothing_raised do
|
|
892
|
+
node = interp.nodesearch_ldap("middle")
|
|
893
|
+
end
|
|
894
|
+
|
|
895
|
+
assert_instance_of(NodeDef, node, "Did not get node from ldap nodesearch")
|
|
896
|
+
assert_equal("middle", node.name, "node name was not set")
|
|
897
|
+
|
|
898
|
+
assert_equal(%w{one two three}.sort, node.classes.sort, "node classes were not set correctly with a parent node")
|
|
899
|
+
assert_equal({"base" => "true", "center" => "boo"}, node.parameters, "node parameters were not set correctly with a parent node")
|
|
900
|
+
|
|
901
|
+
# And one further, to make sure we fully recurse
|
|
902
|
+
nodetable["top"] = ["middle", %w{four five}, {"master" => "far"}]
|
|
903
|
+
assert_nothing_raised do
|
|
904
|
+
node = interp.nodesearch_ldap("top")
|
|
905
|
+
end
|
|
906
|
+
|
|
907
|
+
assert_instance_of(NodeDef, node, "Did not get node from ldap nodesearch")
|
|
908
|
+
assert_equal("top", node.name, "node name was not set")
|
|
909
|
+
|
|
910
|
+
assert_equal(%w{one two three four five}.sort, node.classes.sort, "node classes were not set correctly with the top node")
|
|
911
|
+
assert_equal({"base" => "true", "center" => "boo", "master" => "far"}, node.parameters, "node parameters were not set correctly with the top node")
|
|
912
|
+
end
|
|
913
|
+
end
|
|
914
|
+
|
|
915
|
+
class LdapNodeTest < PuppetTest::TestCase
|
|
916
|
+
include PuppetTest
|
|
917
|
+
include PuppetTest::ServerTest
|
|
918
|
+
include PuppetTest::ParserTesting
|
|
919
|
+
include PuppetTest::ResourceTesting
|
|
920
|
+
AST = Puppet::Parser::AST
|
|
921
|
+
NodeDef = Puppet::Parser::Interpreter::NodeDef
|
|
922
|
+
confine "LDAP is not available" => Puppet.features.ldap?
|
|
923
|
+
confine "No LDAP test data for networks other than Luke's" => Facter.value(:domain) == "madstop.com"
|
|
924
|
+
def ldapconnect
|
|
925
|
+
|
|
926
|
+
@ldap = LDAP::Conn.new("ldap", 389)
|
|
927
|
+
@ldap.set_option( LDAP::LDAP_OPT_PROTOCOL_VERSION, 3 )
|
|
928
|
+
@ldap.simple_bind("", "")
|
|
929
|
+
|
|
930
|
+
return @ldap
|
|
931
|
+
end
|
|
932
|
+
|
|
933
|
+
def ldaphost(name)
|
|
934
|
+
node = NodeDef.new(:name => name)
|
|
935
|
+
parent = nil
|
|
936
|
+
found = false
|
|
937
|
+
@ldap.search( "ou=hosts, dc=madstop, dc=com", 2,
|
|
938
|
+
"(&(objectclass=puppetclient)(cn=%s))" % name
|
|
939
|
+
) do |entry|
|
|
940
|
+
node.classes = entry.vals("puppetclass") || []
|
|
941
|
+
node.parameters = entry.to_hash.inject({}) do |hash, ary|
|
|
942
|
+
if ary[1].length == 1
|
|
943
|
+
hash[ary[0]] = ary[1].shift
|
|
944
|
+
else
|
|
945
|
+
hash[ary[0]] = ary[1]
|
|
946
|
+
end
|
|
947
|
+
hash
|
|
948
|
+
end
|
|
949
|
+
parent = node.parameters["parentnode"]
|
|
950
|
+
found = true
|
|
951
|
+
end
|
|
952
|
+
raise "Could not find node %s" % name unless found
|
|
953
|
+
|
|
954
|
+
return node, parent
|
|
955
|
+
end
|
|
956
|
+
|
|
957
|
+
def test_ldapsearch
|
|
958
|
+
Puppet[:ldapbase] = "ou=hosts, dc=madstop, dc=com"
|
|
959
|
+
Puppet[:ldapnodes] = true
|
|
960
|
+
|
|
961
|
+
ldapconnect()
|
|
962
|
+
|
|
963
|
+
interp = mkinterp :NodeSources => [:ldap, :code]
|
|
964
|
+
|
|
965
|
+
# Make sure we get nil and nil back when we search for something missing
|
|
966
|
+
parent, classes, parameters = nil
|
|
967
|
+
assert_nothing_raised do
|
|
968
|
+
parent, classes, parameters = interp.ldapsearch("nosuchhost")
|
|
969
|
+
end
|
|
970
|
+
|
|
971
|
+
assert_nil(parent, "Got a parent for a non-existent host")
|
|
972
|
+
assert_nil(classes, "Got classes for a non-existent host")
|
|
973
|
+
|
|
974
|
+
# Make sure we can find 'culain' in ldap
|
|
975
|
+
assert_nothing_raised do
|
|
976
|
+
parent, classes, parameters = interp.ldapsearch("culain")
|
|
977
|
+
end
|
|
978
|
+
|
|
979
|
+
node, realparent = ldaphost("culain")
|
|
980
|
+
assert_equal(realparent, parent, "did not get correct parent node from ldap")
|
|
981
|
+
assert_equal(node.classes, classes, "did not get correct ldap classes from ldap")
|
|
982
|
+
assert_equal(node.parameters, parameters, "did not get correct ldap parameters from ldap")
|
|
983
|
+
|
|
984
|
+
# Now compare when we specify the attributes to get.
|
|
985
|
+
Puppet[:ldapattrs] = "cn"
|
|
986
|
+
assert_nothing_raised do
|
|
987
|
+
parent, classes, parameters = interp.ldapsearch("culain")
|
|
988
|
+
end
|
|
989
|
+
assert_equal(realparent, parent, "did not get correct parent node from ldap")
|
|
990
|
+
assert_equal(node.classes, classes, "did not get correct ldap classes from ldap")
|
|
991
|
+
|
|
992
|
+
list = %w{cn puppetclass parentnode dn}
|
|
993
|
+
should = node.parameters.inject({}) { |h, a| h[a[0]] = a[1] if list.include?(a[0]); h }
|
|
994
|
+
assert_equal(should, parameters, "did not get correct ldap parameters from ldap")
|
|
995
|
+
end
|
|
996
|
+
end
|
|
997
|
+
|
|
998
|
+
class LdapReconnectTests < PuppetTest::TestCase
|
|
999
|
+
include PuppetTest
|
|
1000
|
+
include PuppetTest::ServerTest
|
|
1001
|
+
include PuppetTest::ParserTesting
|
|
1002
|
+
include PuppetTest::ResourceTesting
|
|
1003
|
+
AST = Puppet::Parser::AST
|
|
1004
|
+
NodeDef = Puppet::Parser::Interpreter::NodeDef
|
|
1005
|
+
confine "Not running on culain as root" => (Puppet::Util::SUIDManager.uid == 0 and Facter.value("hostname") == "culain")
|
|
1006
|
+
|
|
1007
|
+
def test_ldapreconnect
|
|
1008
|
+
Puppet[:ldapbase] = "ou=hosts, dc=madstop, dc=com"
|
|
1009
|
+
Puppet[:ldapnodes] = true
|
|
1010
|
+
|
|
1011
|
+
interp = nil
|
|
1012
|
+
assert_nothing_raised {
|
|
1013
|
+
interp = Puppet::Parser::Interpreter.new(
|
|
1014
|
+
:Manifest => mktestmanifest()
|
|
1015
|
+
)
|
|
1016
|
+
}
|
|
1017
|
+
hostname = "culain.madstop.com"
|
|
1018
|
+
|
|
1019
|
+
# look for our host
|
|
1020
|
+
assert_nothing_raised {
|
|
1021
|
+
parent, classes = interp.nodesearch_ldap(hostname)
|
|
1022
|
+
}
|
|
1023
|
+
|
|
1024
|
+
# Now restart ldap
|
|
1025
|
+
system("/etc/init.d/slapd restart 2>/dev/null >/dev/null")
|
|
1026
|
+
sleep(1)
|
|
1027
|
+
|
|
1028
|
+
# and look again
|
|
1029
|
+
assert_nothing_raised {
|
|
1030
|
+
parent, classes = interp.nodesearch_ldap(hostname)
|
|
1031
|
+
}
|
|
1032
|
+
|
|
1033
|
+
# Now stop ldap
|
|
1034
|
+
system("/etc/init.d/slapd stop 2>/dev/null >/dev/null")
|
|
1035
|
+
cleanup do
|
|
1036
|
+
system("/etc/init.d/slapd start 2>/dev/null >/dev/null")
|
|
1037
|
+
end
|
|
1038
|
+
|
|
1039
|
+
# And make sure we actually fail here
|
|
1040
|
+
assert_raise(Puppet::Error) {
|
|
1041
|
+
parent, classes = interp.nodesearch_ldap(hostname)
|
|
1042
|
+
}
|
|
1043
|
+
end
|
|
1087
1044
|
end
|
|
1088
1045
|
|
|
1089
|
-
# $Id: interpreter.rb
|
|
1046
|
+
# $Id: interpreter.rb 2597 2007-06-17 21:41:50Z luke $
|