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.
Files changed (266) hide show
  1. data/CHANGELOG +156 -0
  2. data/README +2 -2
  3. data/Rakefile +6 -6
  4. data/bin/filebucket +212 -0
  5. data/bin/puppet +2 -0
  6. data/bin/puppetca +2 -4
  7. data/bin/puppetd +16 -15
  8. data/bin/puppetdoc +46 -496
  9. data/bin/puppetmasterd +3 -5
  10. data/bin/puppetrun +8 -3
  11. data/bin/ralsh +271 -0
  12. data/conf/redhat/client.init +1 -1
  13. data/conf/redhat/puppet.spec +13 -2
  14. data/conf/solaris/pkginfo +1 -1
  15. data/ext/puppet-test +374 -0
  16. data/install.rb +40 -31
  17. data/lib/puppet.rb +39 -4
  18. data/lib/puppet/config_stores/rest.rb +60 -0
  19. data/lib/puppet/configuration.rb +312 -17
  20. data/lib/puppet/external/event-loop/event-loop.rb +4 -0
  21. data/lib/puppet/external/gratr/rdot.rb +1 -1
  22. data/lib/puppet/fact_stores/yaml.rb +42 -0
  23. data/lib/puppet/feature/base.rb +4 -1
  24. data/lib/puppet/metatype/attributes.rb +20 -43
  25. data/lib/puppet/metatype/container.rb +1 -36
  26. data/lib/puppet/metatype/evaluation.rb +48 -19
  27. data/lib/puppet/metatype/instances.rb +35 -1
  28. data/lib/puppet/metatype/metaparams.rb +23 -19
  29. data/lib/puppet/metatype/providers.rb +25 -38
  30. data/lib/puppet/network/client/ca.rb +8 -5
  31. data/lib/puppet/network/client/master.rb +59 -17
  32. data/lib/puppet/network/handler.rb +18 -1
  33. data/lib/puppet/network/handler/ca.rb +9 -3
  34. data/lib/puppet/network/handler/facts.rb +70 -0
  35. data/lib/puppet/network/handler/filebucket.rb +4 -1
  36. data/lib/puppet/network/handler/fileserver.rb +65 -21
  37. data/lib/puppet/network/handler/master.rb +6 -3
  38. data/lib/puppet/network/handler/report.rb +12 -26
  39. data/lib/puppet/network/handler/resource.rb +14 -2
  40. data/lib/puppet/network/handler/runner.rb +5 -1
  41. data/lib/puppet/network/handler/status.rb +5 -1
  42. data/lib/puppet/network/server/mongrel.rb +4 -4
  43. data/lib/puppet/network/server/webrick.rb +14 -3
  44. data/lib/puppet/parameter.rb +30 -25
  45. data/lib/puppet/parser/ast.rb +1 -6
  46. data/lib/puppet/parser/ast/component.rb +23 -20
  47. data/lib/puppet/parser/ast/hostclass.rb +7 -11
  48. data/lib/puppet/parser/ast/leaf.rb +4 -1
  49. data/lib/puppet/parser/ast/node.rb +6 -8
  50. data/lib/puppet/parser/functions.rb +7 -4
  51. data/lib/puppet/parser/interpreter.rb +155 -205
  52. data/lib/puppet/parser/lexer.rb +35 -2
  53. data/lib/puppet/parser/parser.rb +705 -612
  54. data/lib/puppet/parser/resource.rb +91 -48
  55. data/lib/puppet/parser/resource/param.rb +52 -29
  56. data/lib/puppet/parser/scope.rb +28 -23
  57. data/lib/puppet/pgraph.rb +26 -21
  58. data/lib/puppet/propertychange.rb +12 -12
  59. data/lib/puppet/provider.rb +102 -31
  60. data/lib/puppet/provider/cron/crontab.rb +7 -8
  61. data/lib/puppet/provider/group/groupadd.rb +4 -4
  62. data/lib/puppet/provider/group/pw.rb +3 -3
  63. data/lib/puppet/provider/mount.rb +8 -8
  64. data/lib/puppet/provider/mount/netinfo.rb +5 -5
  65. data/lib/puppet/provider/mount/parsed.rb +2 -2
  66. data/lib/puppet/provider/nameservice.rb +19 -31
  67. data/lib/puppet/provider/nameservice/netinfo.rb +14 -14
  68. data/lib/puppet/provider/nameservice/objectadd.rb +4 -4
  69. data/lib/puppet/provider/nameservice/pw.rb +4 -4
  70. data/lib/puppet/provider/package.rb +31 -0
  71. data/lib/puppet/provider/package/appdmg.rb +118 -0
  72. data/lib/puppet/provider/package/apple.rb +18 -16
  73. data/lib/puppet/provider/package/apt.rb +13 -15
  74. data/lib/puppet/provider/package/aptitude.rb +5 -3
  75. data/lib/puppet/provider/package/aptrpm.rb +9 -11
  76. data/lib/puppet/provider/package/blastwave.rb +9 -9
  77. data/lib/puppet/provider/package/darwinport.rb +12 -11
  78. data/lib/puppet/provider/package/dpkg.rb +20 -12
  79. data/lib/puppet/provider/package/fink.rb +87 -0
  80. data/lib/puppet/provider/package/freebsd.rb +10 -11
  81. data/lib/puppet/provider/package/gem.rb +15 -15
  82. data/lib/puppet/provider/package/openbsd.rb +12 -17
  83. data/lib/puppet/provider/package/pkgdmg.rb +90 -16
  84. data/lib/puppet/provider/package/portage.rb +20 -14
  85. data/lib/puppet/provider/package/ports.rb +15 -13
  86. data/lib/puppet/provider/package/rpm.rb +20 -23
  87. data/lib/puppet/provider/package/rug.rb +6 -8
  88. data/lib/puppet/provider/package/sun.rb +20 -18
  89. data/lib/puppet/provider/package/sunfreeware.rb +2 -2
  90. data/lib/puppet/provider/package/up2date.rb +6 -10
  91. data/lib/puppet/provider/package/urpmi.rb +51 -0
  92. data/lib/puppet/provider/package/yum.rb +15 -13
  93. data/lib/puppet/provider/parsedfile.rb +53 -63
  94. data/lib/puppet/provider/service/base.rb +13 -15
  95. data/lib/puppet/provider/service/debian.rb +4 -4
  96. data/lib/puppet/provider/service/gentoo.rb +4 -4
  97. data/lib/puppet/provider/service/init.rb +22 -15
  98. data/lib/puppet/provider/service/redhat.rb +6 -6
  99. data/lib/puppet/provider/service/smf.rb +6 -6
  100. data/lib/puppet/provider/user/netinfo.rb +5 -5
  101. data/lib/puppet/provider/user/pw.rb +10 -5
  102. data/lib/puppet/provider/user/useradd.rb +9 -14
  103. data/lib/puppet/provider/zone/solaris.rb +80 -45
  104. data/lib/puppet/rails.rb +3 -34
  105. data/lib/puppet/rails/database/schema.rb +45 -24
  106. data/lib/puppet/rails/fact_value.rb +1 -0
  107. data/lib/puppet/rails/host.rb +69 -40
  108. data/lib/puppet/rails/param_name.rb +3 -8
  109. data/lib/puppet/rails/param_value.rb +2 -1
  110. data/lib/puppet/rails/puppet_class.rb +0 -2
  111. data/lib/puppet/rails/puppet_tag.rb +5 -0
  112. data/lib/puppet/rails/resource.rb +41 -17
  113. data/lib/puppet/rails/resource_tag.rb +4 -0
  114. data/lib/puppet/reference/configuration.rb +149 -0
  115. data/lib/puppet/reference/function.rb +13 -0
  116. data/lib/puppet/reference/network.rb +37 -0
  117. data/lib/puppet/reference/providers.rb +118 -0
  118. data/lib/puppet/reference/report.rb +21 -0
  119. data/lib/puppet/reference/type.rb +152 -0
  120. data/lib/puppet/reports/rrdgraph.rb +21 -7
  121. data/lib/puppet/reports/tagmail.rb +4 -1
  122. data/lib/puppet/sslcertificates.rb +1 -49
  123. data/lib/puppet/sslcertificates/ca.rb +2 -79
  124. data/lib/puppet/sslcertificates/inventory.rb +0 -10
  125. data/lib/puppet/transaction.rb +24 -41
  126. data/lib/puppet/transaction/report.rb +27 -1
  127. data/lib/puppet/type.rb +7 -43
  128. data/lib/puppet/type/component.rb +198 -124
  129. data/lib/puppet/type/cron.rb +51 -42
  130. data/lib/puppet/type/exec.rb +20 -19
  131. data/lib/puppet/type/group.rb +6 -55
  132. data/lib/puppet/type/host.rb +16 -37
  133. data/lib/puppet/type/mount.rb +30 -17
  134. data/lib/puppet/type/notify.rb +7 -8
  135. data/lib/puppet/type/package.rb +44 -80
  136. data/lib/puppet/type/pfile.rb +50 -41
  137. data/lib/puppet/type/pfile/checksum.rb +82 -95
  138. data/lib/puppet/type/pfile/content.rb +21 -25
  139. data/lib/puppet/type/pfile/ensure.rb +32 -30
  140. data/lib/puppet/type/pfile/group.rb +21 -26
  141. data/lib/puppet/type/pfile/mode.rb +25 -32
  142. data/lib/puppet/type/pfile/owner.rb +23 -27
  143. data/lib/puppet/type/pfile/source.rb +42 -33
  144. data/lib/puppet/type/pfile/target.rb +20 -18
  145. data/lib/puppet/type/pfile/type.rb +6 -7
  146. data/lib/puppet/type/pfilebucket.rb +3 -3
  147. data/lib/puppet/type/port.rb +5 -7
  148. data/lib/puppet/type/property.rb +58 -61
  149. data/lib/puppet/type/resources.rb +12 -8
  150. data/lib/puppet/type/schedule.rb +8 -8
  151. data/lib/puppet/type/service.rb +26 -33
  152. data/lib/puppet/type/sshkey.rb +6 -7
  153. data/lib/puppet/type/tidy.rb +41 -35
  154. data/lib/puppet/type/user.rb +34 -67
  155. data/lib/puppet/type/yumrepo.rb +27 -12
  156. data/lib/puppet/type/zone.rb +71 -110
  157. data/lib/puppet/util.rb +46 -61
  158. data/lib/puppet/util/autoload.rb +59 -47
  159. data/lib/puppet/util/config.rb +160 -18
  160. data/lib/puppet/util/config_store.rb +61 -0
  161. data/lib/puppet/util/fact_store.rb +60 -0
  162. data/lib/puppet/util/instance_loader.rb +74 -0
  163. data/lib/puppet/util/loadedfile.rb +5 -8
  164. data/lib/puppet/util/metric.rb +17 -25
  165. data/lib/puppet/util/posix.rb +39 -7
  166. data/lib/puppet/util/provider_features.rb +9 -1
  167. data/lib/puppet/util/rails/collection_merger.rb +16 -1
  168. data/lib/puppet/util/reference.rb +189 -0
  169. data/lib/puppet/util/storage.rb +2 -2
  170. data/lib/puppet/util/subclass_loader.rb +9 -2
  171. data/test/language/ast.rb +4 -148
  172. data/test/language/ast/component.rb +10 -1
  173. data/test/language/collector.rb +1 -191
  174. data/test/language/interpreter.rb +284 -327
  175. data/test/language/lexer.rb +13 -1
  176. data/test/language/node.rb +1 -1
  177. data/test/language/parser.rb +17 -4
  178. data/test/language/resource.rb +67 -101
  179. data/test/language/scope.rb +18 -3
  180. data/test/language/snippets.rb +114 -151
  181. data/test/lib/puppettest.rb +13 -0
  182. data/test/lib/puppettest/exetest.rb +7 -0
  183. data/test/lib/puppettest/fakes.rb +39 -28
  184. data/test/lib/puppettest/railstesting.rb +1 -1
  185. data/test/lib/puppettest/support/assertions.rb +2 -2
  186. data/test/lib/puppettest/support/collection.rb +30 -0
  187. data/test/network/client/ca.rb +27 -1
  188. data/test/network/client/client.rb +3 -3
  189. data/test/network/client/master.rb +102 -1
  190. data/test/network/handler/ca.rb +35 -1
  191. data/test/network/handler/facts.rb +112 -0
  192. data/test/network/handler/fileserver.rb +25 -1
  193. data/test/network/handler/handler.rb +2 -2
  194. data/test/network/handler/master.rb +2 -49
  195. data/test/network/handler/resource.rb +5 -6
  196. data/test/network/server/mongrel_test.rb +65 -0
  197. data/test/network/server/webrick.rb +2 -2
  198. data/test/network/xmlrpc/client.rb +2 -1
  199. data/test/network/xmlrpc/processor.rb +2 -1
  200. data/test/other/pgraph.rb +6 -5
  201. data/test/other/propertychange.rb +11 -12
  202. data/test/other/report.rb +44 -27
  203. data/test/other/transactions.rb +17 -16
  204. data/test/puppet/tc_suidmanager.rb +2 -2
  205. data/test/rails/ast.rb +74 -0
  206. data/test/rails/collection.rb +214 -0
  207. data/test/rails/host.rb +49 -24
  208. data/test/rails/interpreter.rb +91 -0
  209. data/test/rails/railsparameter.rb +22 -11
  210. data/test/rails/railsresource.rb +140 -7
  211. data/test/ral/manager/attributes.rb +37 -13
  212. data/test/ral/manager/instances.rb +82 -0
  213. data/test/ral/manager/provider.rb +60 -22
  214. data/test/ral/manager/type.rb +9 -6
  215. data/test/ral/providers/cron/crontab.rb +59 -7
  216. data/test/ral/providers/group.rb +7 -7
  217. data/test/ral/providers/host/netinfo.rb +5 -6
  218. data/test/ral/providers/host/parsed.rb +4 -4
  219. data/test/ral/providers/mount/parsed.rb +11 -6
  220. data/test/ral/providers/nameservice.rb +2 -2
  221. data/test/ral/providers/package.rb +39 -14
  222. data/test/ral/providers/package/apt.rb +72 -3
  223. data/test/ral/providers/package/aptitude.rb +15 -12
  224. data/test/ral/providers/package/aptrpm.rb +3 -3
  225. data/test/ral/providers/package/dpkg.rb +2 -2
  226. data/test/ral/providers/parsedfile.rb +114 -88
  227. data/test/ral/providers/{parsedport.rb → port/parsed.rb} +1 -1
  228. data/test/ral/providers/provider.rb +93 -13
  229. data/test/ral/providers/service.rb +52 -26
  230. data/test/ral/providers/sshkey/parsed.rb +3 -3
  231. data/test/ral/providers/user.rb +19 -20
  232. data/test/ral/providers/user/useradd.rb +1 -5
  233. data/test/ral/types/cron.rb +49 -36
  234. data/test/ral/types/file.rb +38 -35
  235. data/test/ral/types/file/target.rb +4 -4
  236. data/test/ral/types/filesources.rb +24 -22
  237. data/test/ral/types/group.rb +4 -2
  238. data/test/ral/types/host.rb +17 -10
  239. data/test/ral/types/mount.rb +40 -23
  240. data/test/ral/types/package.rb +62 -5
  241. data/test/ral/types/parameter.rb +2 -2
  242. data/test/ral/types/property.rb +27 -20
  243. data/test/ral/types/resources.rb +4 -16
  244. data/test/ral/types/schedule.rb +2 -2
  245. data/test/ral/types/service.rb +2 -3
  246. data/test/ral/types/sshkey.rb +3 -3
  247. data/test/ral/types/tidy.rb +6 -15
  248. data/test/ral/types/user.rb +17 -17
  249. data/test/ral/types/yumrepo.rb +2 -2
  250. data/test/ral/types/zone.rb +71 -87
  251. data/test/util/autoload.rb +6 -21
  252. data/test/util/config.rb +201 -101
  253. data/test/util/fact_store.rb +67 -0
  254. data/test/util/features.rb +9 -6
  255. data/test/util/instance_loader.rb +53 -0
  256. data/test/util/loadedfile.rb +17 -1
  257. data/test/util/metrics.rb +54 -57
  258. data/test/util/posixtest.rb +8 -11
  259. data/test/util/utiltest.rb +31 -2
  260. metadata +520 -492
  261. data/TODO +0 -4
  262. data/lib/puppet/network/client/logger.rb +0 -6
  263. data/lib/puppet/network/handler/logger.rb +0 -52
  264. data/lib/puppet/rails/database/001_add_indexes.rb +0 -38
  265. data/lib/puppet/type/parsedtype.rb +0 -219
  266. 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 < Test::Unit::TestCase
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.fqname)
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.fqname,
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").parentclass
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").parentclass.fqname)
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).parentclass.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").type)
257
+ assert_equal("mydefine", interp.finddefine("", "mydefine").classname)
501
258
  assert_equal("", mydefine.namespace)
502
- assert_equal("mydefine", mydefine.type)
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.type)
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").type)
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.fqname)
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(interp.findclass("", "base1"),
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").parentclass)
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").parentclass)
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
- name = ARGV[0]
723
+ require 'yaml'
724
+ name = ARGV[0].chomp
725
+ result = {}
726
+
1006
727
  if name =~ /a/
1007
- puts ARGV[0].gsub('a', 'b')
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
- puts [1,2,3].collect { |n| ARGV[0] + n.to_s }.join(' ')
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("bpple\napple1 apple2 apple3\n",
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
- assert_equal({:name => "apple", :classes => %w{apple1 apple2 apple3}, :parentnode => "bpple"},
1049
- node)
1050
-
1051
- assert_nothing_raised { node = interp.nodesearch_external("plum")} # no a's, thus no parent
1052
- assert_equal({:name => "plum", :classes => %w{plum1 plum2 plum3}},
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({:name => "guava", :parentnode => "gubvb"},
1057
- node)
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(Puppet::Parser::AST::Node, node, "did not create node")
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 2334 2007-03-19 23:04:32Z luke $
1046
+ # $Id: interpreter.rb 2597 2007-06-17 21:41:50Z luke $