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
@@ -242,6 +242,18 @@ class TestLexer < Test::Unit::TestCase
242
242
  end
243
243
  end
244
244
  end
245
+
246
+ # Make sure the expected stack works as it should
247
+ def test_expected
248
+ @lexer.string = "[a{"
249
+ expected = @lexer.instance_variable_get("@expected")
250
+ @lexer.scan {}
251
+ assert_equal("}", @lexer.expected, "expected value is wrong")
252
+
253
+ @lexer.string = "}"
254
+ @lexer.scan {}
255
+ assert_equal("]", @lexer.expected, "expected value is wrong after pop")
256
+ end
245
257
  end
246
258
 
247
- # $Id: lexer.rb 2393 2007-04-19 18:34:03Z luke $
259
+ # $Id: lexer.rb 2531 2007-05-25 00:31:28Z luke $
@@ -110,6 +110,6 @@ node default {
110
110
  assert(default,
111
111
  "Did not find default node")
112
112
 
113
- assert_equal("default", default.fqname)
113
+ assert_equal("default", default.classname)
114
114
  end
115
115
  end
@@ -397,7 +397,7 @@ file { "/tmp/yayness":
397
397
  }
398
398
  sub = interp.findclass("", "container::deep::sub")
399
399
  assert(sub, "Could not find sub")
400
- assert_equal("base", sub.parentclass.type)
400
+ assert_equal("base", sub.parentobj.classname)
401
401
 
402
402
  # Now try it with a parent class being a fq class
403
403
  assert_nothing_raised {
@@ -405,7 +405,7 @@ file { "/tmp/yayness":
405
405
  }
406
406
  sub = interp.findclass("", "container::one")
407
407
  assert(sub, "Could not find one")
408
- assert_equal("sub", sub.parentclass.type)
408
+ assert_equal("container::deep::sub", sub.parentobj.classname)
409
409
 
410
410
  # Finally, try including a qualified class
411
411
  assert_nothing_raised("Could not include fully qualified class") {
@@ -431,7 +431,7 @@ file { "/tmp/yayness":
431
431
  assert_nothing_raised do
432
432
  out = parser.parse "Exec { path => '/usr/bin:/usr/sbin' }"
433
433
  assert_instance_of(AST::ASTArray, out)
434
- assert_equal("", parser.interp.findclass("", "").type)
434
+ assert_equal("", parser.interp.findclass("", "").classname)
435
435
  assert_equal("", parser.interp.findclass("", "").namespace)
436
436
  assert_equal(out.object_id, parser.interp.findclass("", "").code.object_id)
437
437
  end
@@ -763,6 +763,19 @@ file { "/tmp/yayness":
763
763
  parser.import("%s/*" % dir)
764
764
  end
765
765
  end
766
+
767
+ # #629 - undef keyword
768
+ def test_undef
769
+ parser = mkparser
770
+ result = nil
771
+ assert_nothing_raised("Could not parse assignment to undef") {
772
+ result = parser.parse %{$variable = undef}
773
+ }
774
+
775
+ children = result.children
776
+ assert_instance_of(AST::VarDef, result.children[0])
777
+ assert_instance_of(AST::Undef, result.children[0].value)
778
+ end
766
779
  end
767
780
 
768
- # $Id: parser.rb 2404 2007-04-20 16:40:47Z luke $
781
+ # $Id: parser.rb 2522 2007-05-17 21:43:51Z luke $
@@ -4,15 +4,14 @@ $:.unshift("../lib").unshift("../../lib") if __FILE__ =~ /\.rb$/
4
4
 
5
5
  require 'puppettest'
6
6
  require 'puppettest/resourcetesting'
7
- require 'puppettest/railstesting'
8
7
 
9
- class TestResource < Test::Unit::TestCase
8
+ class TestResource < PuppetTest::TestCase
10
9
  include PuppetTest
11
10
  include PuppetTest::ParserTesting
12
11
  include PuppetTest::ResourceTesting
13
- include PuppetTest::RailsTesting
14
12
  Parser = Puppet::Parser
15
13
  AST = Parser::AST
14
+ Reference = Puppet::Parser::Resource::Reference
16
15
 
17
16
  def setup
18
17
  super
@@ -133,10 +132,15 @@ class TestResource < Test::Unit::TestCase
133
132
  end
134
133
 
135
134
  def test_to_trans
136
- # First try translating a builtin resource
135
+ # First try translating a builtin resource. Make sure we use some references
136
+ # and arrays, to make sure they translate correctly.
137
+ refs = []
138
+ 4.times { |i| refs << Puppet::Parser::Resource::Reference.new(:title => "file%s" % i, :type => "file") }
137
139
  res = Parser::Resource.new :type => "file", :title => "/tmp",
138
140
  :source => @source, :scope => @scope,
139
- :params => paramify(@source, :owner => "nobody", :mode => "644")
141
+ :params => paramify(@source, :owner => "nobody", :group => %w{you me},
142
+ :require => refs[0], :ignore => %w{svn},
143
+ :subscribe => [refs[1], refs[2]], :notify => [refs[3]])
140
144
 
141
145
  obj = nil
142
146
  assert_nothing_raised do
@@ -149,8 +153,12 @@ class TestResource < Test::Unit::TestCase
149
153
  assert_equal(obj.name, res.title)
150
154
 
151
155
  # TransObjects use strings, resources use symbols
152
- hash = obj.to_hash.inject({}) { |h,a| h[a[0].intern] = a[1]; h }
153
- assert_equal(hash, res.to_hash)
156
+ assert_equal("nobody", obj["owner"], "Single-value string was not passed correctly")
157
+ assert_equal(%w{you me}, obj["group"], "Array of strings was not passed correctly")
158
+ assert_equal("svn", obj["ignore"], "Array with single string was not turned into single value")
159
+ assert_equal(["file", refs[0].title], obj["require"], "Resource reference was not passed correctly")
160
+ assert_equal([["file", refs[1].title], ["file", refs[2].title]], obj["subscribe"], "Array of resource references was not passed correctly")
161
+ assert_equal(["file", refs[3].title], obj["notify"], "Array with single resource reference was not turned into single value")
154
162
  end
155
163
 
156
164
  def test_adddefaults
@@ -360,99 +368,6 @@ class TestResource < Test::Unit::TestCase
360
368
 
361
369
  assert_nil(ref.builtintype, "Component was considered builtin")
362
370
  end
363
- if Puppet.features.rails?
364
-
365
- # Compare a parser resource to a rails resource.
366
- def compare_resources(host, res, updating, options = {})
367
- # to_rails now expects to be passed a resource, else it will create a new one
368
- newobj = host.resources.find_by_restype_and_title(res.type, res.title)
369
- assert_nothing_raised do
370
- newobj = res.to_rails(host, newobj)
371
- end
372
-
373
- assert_instance_of(Puppet::Rails::Resource, newobj)
374
- newobj.save
375
-
376
- if updating
377
- tail = "on update"
378
- else
379
- tail = ""
380
- end
381
-
382
- # Make sure we find our object and only our object
383
- count = 0
384
- obj = nil
385
- Puppet::Rails::Resource.find(:all).each do |obj|
386
- assert_equal(newobj.id, obj.id, "Found object has a different id than generated object %s" % tail)
387
- count += 1
388
- [:title, :restype, :line, :exported].each do |param|
389
- if param == :restype
390
- method = :type
391
- else
392
- method = param
393
- end
394
- assert_equal(res.send(method), obj[param],
395
- "attribute %s was not set correctly in rails %s" % [param, tail])
396
- end
397
- end
398
- assert_equal(1, count, "Got too many resources %s" % tail)
399
- # Now make sure we can find it again
400
- assert_nothing_raised do
401
- obj = Puppet::Rails::Resource.find_by_restype_and_title(
402
- res.type, res.title, :include => :param_names
403
- )
404
- end
405
- assert_instance_of(Puppet::Rails::Resource, obj)
406
-
407
- # Make sure we get the parameters back
408
- params = options[:params] || [obj.param_names.collect { |p| p.name },
409
- res.to_hash.keys].flatten.collect { |n| n.to_s }.uniq
410
-
411
- params.each do |name|
412
- param = obj.param_names.find_by_name(name)
413
- if res[name]
414
- assert(param, "resource did not keep %s %s" % [name, tail])
415
- else
416
- assert(! param, "resource did not delete %s %s" % [name, tail])
417
- end
418
- if param
419
- values = param.param_values.collect { |pv| pv.value }
420
- should = res[param.name]
421
- should = [should] unless should.is_a?(Array)
422
- assert_equal(should, values,
423
- "%s was different %s" % [param.name, tail])
424
- end
425
- end
426
- end
427
-
428
- def test_to_rails
429
- railsteardown
430
- railsinit
431
- res = mkresource :type => "file", :title => "/tmp/testing",
432
- :source => @source, :scope => @scope,
433
- :params => {:owner => "root", :source => ["/tmp/A", "/tmp/B"],
434
- :mode => "755"}
435
-
436
- res.line = 50
437
-
438
- # We also need a Rails Host to store under
439
- host = Puppet::Rails::Host.new(:name => Facter.hostname)
440
-
441
- compare_resources(host, res, false, :params => %w{owner source mode})
442
-
443
- # Now make some changes to our resource. We're removing the mode,
444
- # changing the source, and adding 'check'.
445
- res = mkresource :type => "file", :title => "/tmp/testing",
446
- :source => @source, :scope => @scope,
447
- :params => {:owner => "bin", :source => ["/tmp/A", "/tmp/C"],
448
- :check => "checksum"}
449
-
450
- res.line = 75
451
- res.exported = true
452
-
453
- compare_resources(host, res, true, :params => %w{owner source mode check})
454
- end
455
- end
456
371
 
457
372
  # #472. Really, this still isn't the best behaviour, but at least
458
373
  # it's consistent with what we have elsewhere.
@@ -530,6 +445,57 @@ class TestResource < Test::Unit::TestCase
530
445
  end
531
446
  end
532
447
  end
448
+
449
+ # part of #629 -- the undef keyword. Make sure 'undef' params get skipped.
450
+ def test_undef_and_to_hash
451
+ res = mkresource :type => "file", :title => "/tmp/testing",
452
+ :source => @source, :scope => @scope,
453
+ :params => {:owner => :undef, :mode => "755"}
454
+
455
+ hash = nil
456
+ assert_nothing_raised("Could not convert resource with undef to hash") do
457
+ hash = res.to_hash
458
+ end
459
+
460
+ assert_nil(hash[:owner], "got a value for an undef parameter")
461
+ end
462
+
463
+ # #643 - Make sure virtual defines result in virtual resources
464
+ def test_virtual_defines
465
+ define = @interp.newdefine("yayness",
466
+ :code => resourcedef("file", varref("name"),
467
+ "mode" => "644"))
468
+
469
+ res = mkresource :type => "yayness", :title => "foo", :params => {}
470
+ res.virtual = true
471
+
472
+ result = nil
473
+ assert_nothing_raised("Could not evaluate defined resource") do
474
+ result = res.evaluate
475
+ end
476
+
477
+ scope = res.scope
478
+ newres = scope.findresource("File[foo]")
479
+ assert(newres, "Could not find resource")
480
+
481
+ assert(newres.virtual?, "Virtual defined resource generated non-virtual resources")
482
+
483
+ # Now try it with exported resources
484
+ res = mkresource :type => "yayness", :title => "bar", :params => {}
485
+ res.exported = true
486
+
487
+ result = nil
488
+ assert_nothing_raised("Could not evaluate exported resource") do
489
+ result = res.evaluate
490
+ end
491
+
492
+ scope = res.scope
493
+ newres = scope.findresource("File[bar]")
494
+ assert(newres, "Could not find resource")
495
+
496
+ assert(newres.exported?, "Exported defined resource generated non-exported resources")
497
+ assert(newres.virtual?, "Exported defined resource generated non-virtual resources")
498
+ end
533
499
  end
534
500
 
535
- # $Id: resource.rb 2439 2007-04-30 19:21:59Z luke $
501
+ # $Id: resource.rb 2597 2007-06-17 21:41:50Z luke $
@@ -412,7 +412,7 @@ class TestScope < Test::Unit::TestCase
412
412
 
413
413
  [myclass, otherclass].each do |klass|
414
414
  assert(scope.setclass?(klass),
415
- "%s was not set" % klass.fqname)
415
+ "%s was not set" % klass.classname)
416
416
  end
417
417
  end
418
418
 
@@ -445,6 +445,8 @@ class TestScope < Test::Unit::TestCase
445
445
  "Empty strings considered true")
446
446
  assert_equal(false, Puppet::Parser::Scope.true?(false),
447
447
  "false considered true")
448
+ assert_equal(false, Puppet::Parser::Scope.true?(:undef),
449
+ "undef considered true")
448
450
  end
449
451
 
450
452
  # Verify scope context is handled correctly.
@@ -611,7 +613,7 @@ Host <<||>>"
611
613
  end
612
614
 
613
615
  # Now make sure good tags make it through.
614
- tags = %w{good-tag yaytag GoodTag another_tag}
616
+ tags = %w{good-tag yaytag GoodTag another_tag a ab A}
615
617
  tags.each do |tag|
616
618
  assert_nothing_raised("Tag #{tag} was considered invalid") do
617
619
  scope.tag tag
@@ -745,6 +747,19 @@ Host <<||>>"
745
747
  scope.add_namespace("b")
746
748
  assert_nothing_raised { test.call([["a", "testing"], ["b", "testing"]]) }
747
749
  end
750
+
751
+ # #629 - undef should be "" or :undef
752
+ def test_lookupvar_with_undef
753
+ scope = mkscope
754
+
755
+ scope.setvar("testing", :undef)
756
+
757
+ assert_equal(:undef, scope.lookupvar("testing", false),
758
+ "undef was not returned as :undef when not string")
759
+
760
+ assert_equal("", scope.lookupvar("testing", true),
761
+ "undef was not returned as '' when string")
762
+ end
748
763
  end
749
764
 
750
- # $Id: scope.rb 2418 2007-04-26 19:09:24Z luke $
765
+ # $Id: scope.rb 2523 2007-05-17 21:51:36Z luke $
@@ -13,10 +13,32 @@ class TestSnippets < Test::Unit::TestCase
13
13
  include PuppetTest
14
14
  include ObjectSpace
15
15
 
16
+ def setup
17
+ super
18
+ @file = Puppet::Type.type(:file)
19
+ end
20
+
16
21
  def self.snippetdir
17
22
  PuppetTest.datadir "snippets"
18
23
  end
19
24
 
25
+ def assert_file(path, msg = nil)
26
+ unless file = @file[path]
27
+ msg ||= "Could not find file %s" % path
28
+ raise msg
29
+ end
30
+ end
31
+
32
+ def assert_mode_equal(mode, path)
33
+ unless file = @file[path]
34
+ raise "Could not find file %s" % path
35
+ end
36
+
37
+ unless mode == file.should(:mode)
38
+ raise "Mode for %s is incorrect: %o vs %o" % [path, mode, file.should(:mode)]
39
+ end
40
+ end
41
+
20
42
  def snippet(name)
21
43
  File.join(self.class.snippetdir, name)
22
44
  end
@@ -151,73 +173,57 @@ class TestSnippets < Test::Unit::TestCase
151
173
 
152
174
  def snippet_filecreate
153
175
  %w{a b c d}.each { |letter|
154
- file = "/tmp/create%stest" % letter
155
- Puppet.info "testing %s" % file
156
- assert(Puppet.type(:file)[file], "File %s does not exist" % file)
157
- assert(FileTest.exists?(file))
158
- @@tmpfiles << file
159
- }
160
- %w{a b}.each { |letter|
161
- file = "/tmp/create%stest" % letter
162
- assert(File.stat(file).mode & 007777 == 0755)
176
+ path = "/tmp/create%stest" % letter
177
+ assert_file(path)
178
+ if %w{a b}.include?(letter)
179
+ assert_mode_equal(0755, path)
180
+ end
163
181
  }
164
182
  end
165
183
 
166
184
  def snippet_simpledefaults
167
- file = "/tmp/defaulttest"
168
- @@tmpfiles << file
169
- assert(FileTest.exists?(file), "File %s does not exist" % file)
170
- assert(File.stat(file).mode & 007777 == 0755)
185
+ path = "/tmp/defaulttest"
186
+ assert_file(path)
187
+ assert_mode_equal(0755, path)
171
188
  end
172
189
 
173
190
  def snippet_simpleselector
174
191
  files = %w{a b c d}.collect { |letter|
175
- "/tmp/snippetselect%stest" % letter
176
- }
177
- @@tmpfiles += files
178
-
179
- files.each { |file|
180
- assert(FileTest.exists?(file), "File %s does not exist" % file)
181
- assert(File.stat(file).mode & 007777 == 0755,
182
- "File %s is the incorrect mode" % file)
183
- @@tmpfiles << file
192
+ path = "/tmp/snippetselect%stest" % letter
193
+ assert_file(path)
194
+ assert_mode_equal(0755, path)
184
195
  }
185
196
  end
186
197
 
187
198
  def snippet_classpathtest
188
- file = "/tmp/classtest"
189
- @@tmpfiles << file
190
-
191
- assert(FileTest.exists?(file))
199
+ path = "/tmp/classtest"
192
200
 
193
- obj = nil
194
- assert_nothing_raised {
195
- obj = Puppet.type(:file)[file]
196
- }
201
+ file = @file[path]
202
+ assert(file, "did not create file %s" % path)
197
203
 
198
204
  assert_nothing_raised {
199
205
  assert_equal(
200
206
  "//testing/component[componentname]/File[/tmp/classtest]",
201
- obj.path)
202
- #Puppet.err obj.path
207
+ file.path)
203
208
  }
204
209
  end
205
210
 
206
211
  def snippet_argumentdefaults
207
- file1 = "/tmp/argumenttest1"
208
- file2 = "/tmp/argumenttest2"
209
- @@tmpfiles << file1
210
- @@tmpfiles << file2
212
+ path1 = "/tmp/argumenttest1"
213
+ path2 = "/tmp/argumenttest2"
211
214
 
212
- assert(FileTest.exists?(file1))
213
- assert(File.stat(file1).mode & 007777 == 0755)
214
-
215
- assert(FileTest.exists?(file2))
216
- assert(File.stat(file2).mode & 007777 == 0644)
215
+ file1 = @file[path1]
216
+ file2 = @file[path2]
217
+
218
+ assert_file(path1)
219
+ assert_mode_equal(0755, path1)
220
+
221
+ assert_file(path2)
222
+ assert_mode_equal(0644, path2)
217
223
  end
218
224
 
219
225
  def snippet_casestatement
220
- files = %w{
226
+ paths = %w{
221
227
  /tmp/existsfile
222
228
  /tmp/existsfile2
223
229
  /tmp/existsfile3
@@ -225,32 +231,29 @@ class TestSnippets < Test::Unit::TestCase
225
231
  /tmp/existsfile5
226
232
  }
227
233
 
228
- files.each { |file|
229
- assert(FileTest.exists?(file), "File %s is missing" % file)
230
- assert(File.stat(file).mode & 007777 == 0755, "File %s is not 755" % file)
234
+ paths.each { |path|
235
+ file = @file[path]
236
+ assert(file, "File %s is missing" % path)
237
+ assert_mode_equal(0755, path)
231
238
  }
232
239
  end
233
240
 
234
241
  def snippet_implicititeration
235
- files = %w{a b c d e f g h}.collect { |l| "/tmp/iteration%stest" % l }
236
-
237
- files.each { |file|
238
- @@tmpfiles << file
239
- assert(FileTest.exists?(file), "File %s does not exist" % file)
240
- assert(File.stat(file).mode & 007777 == 0755,
241
- "File %s is not 755" % file)
242
+ paths = %w{a b c d e f g h}.collect { |l| "/tmp/iteration%stest" % l }
242
243
 
244
+ paths.each { |path|
245
+ file = @file[path]
246
+ assert_file(path)
247
+ assert_mode_equal(0755, path)
243
248
  }
244
249
  end
245
250
 
246
251
  def snippet_multipleinstances
247
- files = %w{a b c}.collect { |l| "/tmp/multipleinstances%s" % l }
252
+ paths = %w{a b c}.collect { |l| "/tmp/multipleinstances%s" % l }
248
253
 
249
- files.each { |file|
250
- @@tmpfiles << file
251
- assert(FileTest.exists?(file), "File %s does not exist" % file)
252
- assert(File.stat(file).mode & 007777 == 0755,
253
- "File %s is not 755" % file)
254
+ paths.each { |path|
255
+ assert_file(path)
256
+ assert_mode_equal(0755, path)
254
257
 
255
258
  }
256
259
  end
@@ -258,26 +261,23 @@ class TestSnippets < Test::Unit::TestCase
258
261
  def snippet_namevartest
259
262
  file = "/tmp/testfiletest"
260
263
  dir = "/tmp/testdirtest"
261
- @@tmpfiles << file
262
- @@tmpfiles << dir
263
- assert(FileTest.file?(file), "File %s does not exist" % file)
264
- assert(FileTest.directory?(dir), "Directory %s does not exist" % dir)
264
+ assert_file(file)
265
+ assert_file(dir)
266
+ assert_equal(:directory, @file[dir].should(:ensure), "Directory is not set to be a directory")
265
267
  end
266
268
 
267
269
  def snippet_scopetest
268
270
  file = "/tmp/scopetest"
269
- @@tmpfiles << file
270
- assert(FileTest.file?(file), "File %s does not exist" % file)
271
- assert(File.stat(file).mode & 007777 == 0755,
272
- "File %s is not 755" % file)
271
+ assert_file(file)
272
+ assert_mode_equal(0755, file)
273
273
  end
274
274
 
275
275
  def snippet_failmissingexecpath
276
276
  file = "/tmp/exectesting1"
277
277
  execfile = "/tmp/execdisttesting"
278
- @@tmpfiles << file
279
- @@tmpfiles << execfile
280
- assert(!FileTest.exists?(execfile), "File %s exists" % execfile)
278
+ assert_file(file)
279
+
280
+ assert_nil(Puppet::Type.type(:exec)["exectest"], "invalid exec was created")
281
281
  end
282
282
 
283
283
  def snippet_selectorvalues
@@ -287,10 +287,8 @@ class TestSnippets < Test::Unit::TestCase
287
287
  }
288
288
 
289
289
  files.each { |f|
290
- @@tmpfiles << f
291
- assert(FileTest.exists?(f), "File %s does not exist" % f)
292
- assert(File.stat(f).mode & 007777 == 0755,
293
- "File %s is not 755" % f)
290
+ assert_file(f)
291
+ assert_mode_equal(0755, f)
294
292
  }
295
293
  end
296
294
 
@@ -301,66 +299,56 @@ class TestSnippets < Test::Unit::TestCase
301
299
  }
302
300
 
303
301
  files.each { |f|
304
- @@tmpfiles << f
305
- assert(FileTest.exists?(f), "File %s does not exist" % f)
306
- assert(File.stat(f).mode & 007777 == 0755,
307
- "File %s is not 755" % f)
302
+ assert_file(f)
303
+ assert_mode_equal(0755, f)
308
304
  }
309
305
  end
310
306
 
311
307
  def snippet_falsevalues
312
308
  file = "/tmp/falsevaluesfalse"
313
- @@tmpfiles << file
314
- assert(FileTest.exists?(file), "File %s does not exist" % file)
309
+ assert_file(file)
315
310
  end
316
311
 
317
312
  def disabled_snippet_classargtest
318
313
  [1,2].each { |num|
319
314
  file = "/tmp/classargtest%s" % num
320
- @@tmpfiles << file
321
- assert(FileTest.file?(file), "File %s does not exist" % file)
322
- assert(File.stat(file).mode & 007777 == 0755,
323
- "File %s is not 755" % file)
315
+ assert_file(file)
316
+ assert_mode_equal(0755, file)
324
317
  }
325
318
  end
326
319
 
327
320
  def snippet_classheirarchy
328
321
  [1,2,3].each { |num|
329
322
  file = "/tmp/classheir%s" % num
330
- @@tmpfiles << file
331
- assert(FileTest.file?(file), "File %s does not exist" % file)
332
- assert(File.stat(file).mode & 007777 == 0755,
333
- "File %s is not 755" % file)
323
+ assert_file(file)
324
+ assert_mode_equal(0755, file)
334
325
  }
335
326
  end
336
327
 
337
328
  def snippet_singleary
338
329
  [1,2,3,4].each { |num|
339
330
  file = "/tmp/singleary%s" % num
340
- @@tmpfiles << file
341
- assert(FileTest.file?(file), "File %s does not exist" % file)
331
+ assert_file(file)
342
332
  }
343
333
  end
344
334
 
345
335
  def snippet_classincludes
346
336
  [1,2,3].each { |num|
347
337
  file = "/tmp/classincludes%s" % num
348
- @@tmpfiles << file
349
- assert(FileTest.file?(file), "File %s does not exist" % file)
350
- assert(File.stat(file).mode & 007777 == 0755,
351
- "File %s is not 755" % file)
338
+ assert_file(file)
339
+ assert_mode_equal(0755, file)
352
340
  }
353
341
  end
354
342
 
355
343
  def snippet_componentmetaparams
356
344
  ["/tmp/component1", "/tmp/component2"].each { |file|
357
- assert(FileTest.file?(file), "File %s does not exist" % file)
345
+ assert_file(file)
358
346
  }
359
347
  end
360
348
 
361
349
  def snippet_aliastest
362
350
  %w{/tmp/aliastest /tmp/aliastest2 /tmp/aliastest3}.each { |file|
363
- assert(FileTest.file?(file), "File %s does not exist" % file)
351
+ assert_file(file)
364
352
  }
365
353
  end
366
354
 
@@ -369,17 +357,14 @@ class TestSnippets < Test::Unit::TestCase
369
357
  2 => 'some "\yayness\"'
370
358
  }.each { |count, str|
371
359
  path = "/tmp/singlequote%s" % count
372
- assert(FileTest.exists?(path), "File %s is missing" % path)
373
- text = File.read(path)
374
-
375
- assert_equal(str, text)
360
+ assert_file(path)
361
+ assert_equal(str, @file[path].should(:content))
376
362
  }
377
363
  end
378
364
 
379
365
  # There's no way to actually retrieve the list of classes from the
380
366
  # transaction.
381
367
  def snippet_tag
382
- @@tmpfiles << "/tmp/settestingness"
383
368
  end
384
369
 
385
370
  # Make sure that set tags are correctly in place, yo.
@@ -388,25 +373,21 @@ class TestSnippets < Test::Unit::TestCase
388
373
  "both" => false, "bothtrue" => true, "define" => true}
389
374
 
390
375
  tags.each do |tag, retval|
391
- @@tmpfiles << "/tmp/tagged#{tag}true"
392
- @@tmpfiles << "/tmp/tagged#{tag}false"
393
-
394
- assert(FileTest.exists?("/tmp/tagged#{tag}#{retval.to_s}"),
395
- "'tagged' did not return %s with %s" % [retval, tag])
376
+ assert_file("/tmp/tagged#{tag}#{retval.to_s}")
396
377
  end
397
378
  end
398
379
 
399
380
  def snippet_defineoverrides
400
381
  file = "/tmp/defineoverrides1"
401
- assert(FileTest.exists?(file), "File does not exist")
402
- assert_equal(0755, filemode(file))
382
+ assert_file(file)
383
+ assert_mode_equal(0755, file)
403
384
  end
404
385
 
405
386
  def snippet_deepclassheirarchy
406
387
  5.times { |i|
407
388
  i += 1
408
389
  file = "/tmp/deepclassheir%s" % i
409
- assert(FileTest.exists?(file), "File %s does not exist" % file)
390
+ assert_file(file)
410
391
  }
411
392
  end
412
393
 
@@ -415,70 +396,56 @@ class TestSnippets < Test::Unit::TestCase
415
396
  end
416
397
 
417
398
  def snippet_emptyexec
418
- assert(FileTest.exists?("/tmp/emptyexectest"),
419
- "Empty exec was ignored")
420
-
421
- @@tmpfiles << "/tmp/emptyexextest"
399
+ assert(Puppet::Type.type(:exec)["touch /tmp/emptyexectest"],
400
+ "Did not create exec")
422
401
  end
423
402
 
424
403
  def snippet_multisubs
425
404
  path = "/tmp/multisubtest"
426
- assert(FileTest.exists?(path), "Did not create file")
427
- assert_equal("sub2", File.read(path), "sub2 did not override content")
428
- assert_equal(0755, filemode(path), "sub1 did not override mode")
405
+ assert_file(path)
406
+ file = @file[path]
407
+ assert_equal("sub2", file.should(:content), "sub2 did not override content")
408
+ assert_mode_equal(0755, path)
429
409
  end
430
410
 
431
411
  def snippet_collection
432
- assert(FileTest.exists?("/tmp/colltest1"), "Did not collect file")
433
- assert(! FileTest.exists?("/tmp/colltest2"), "Incorrectly collected file")
412
+ assert_file("/tmp/colltest1")
413
+ assert_nil(@file["/tmp/colltest2"], "Incorrectly collected file")
434
414
  end
435
415
 
436
416
  def snippet_virtualresources
437
417
  %w{1 2 3 4}.each do |num|
438
- assert(FileTest.exists?("/tmp/virtualtest#{num}"),
439
- "Did not collect file #{num}")
418
+ assert_file("/tmp/virtualtest#{num}")
440
419
  end
441
420
  end
442
421
 
443
422
  def snippet_componentrequire
444
423
  %w{1 2}.each do |num|
445
- assert(FileTest.exists?("/tmp/testing_component_requires#{num}"),
424
+ assert_file("/tmp/testing_component_requires#{num}",
446
425
  "#{num} does not exist")
447
- end
426
+ end
448
427
  end
449
428
 
450
429
  def snippet_realize_defined_types
451
- assert(FileTest.exists?("/tmp/realize_defined_test1"),
452
- "Did not make file from realized defined type")
453
- assert(FileTest.exists?("/tmp/realize_defined_test2"),
454
- "Did not make file from realized file inside defined type")
430
+ assert_file("/tmp/realize_defined_test1")
431
+ assert_file("/tmp/realize_defined_test2")
455
432
  end
456
433
 
457
434
  def snippet_fqparents
458
- assert(FileTest.exists?("/tmp/fqparent1"),
459
- "Did not make file from parent class")
460
- assert(FileTest.exists?("/tmp/fqparent2"),
461
- "Did not make file from subclass")
435
+ assert_file("/tmp/fqparent1", "Did not make file from parent class")
436
+ assert_file("/tmp/fqparent2", "Did not make file from subclass")
462
437
  end
463
438
 
464
439
  def snippet_fqdefinition
465
- assert(FileTest.exists?("/tmp/fqdefinition"),
440
+ assert_file("/tmp/fqdefinition",
466
441
  "Did not make file from fully-qualified definition")
467
442
  end
468
443
 
469
- def snippet_dirchmod
470
- dirs = %w{a b}.collect { |letter|
471
- "/tmp/dirchmodtest%s" % letter
472
- }
473
-
474
- @@tmpfiles << dirs
475
-
476
- dirs.each { |dir|
477
- assert(FileTest.directory?(dir))
478
- }
479
-
480
- assert(File.stat("/tmp/dirchmodtesta").mode & 007777 == 0755)
481
- assert(File.stat("/tmp/dirchmodtestb").mode & 007777 == 0700)
444
+ def snippet_subclass_name_duplication
445
+ assert_file("/tmp/subclass_name_duplication1",
446
+ "Did not make first file from duplicate subclass names")
447
+ assert_file("/tmp/subclass_name_duplication2",
448
+ "Did not make second file from duplicate subclass names")
482
449
  end
483
450
 
484
451
  # Iterate across each of the snippets and create a test.
@@ -517,9 +484,9 @@ class TestSnippets < Test::Unit::TestCase
517
484
  assert_nothing_raised {
518
485
  client.getconfig()
519
486
  }
520
- assert_nothing_raised {
521
- trans = client.apply()
522
- }
487
+ #assert_nothing_raised {
488
+ # trans = client.apply()
489
+ #}
523
490
 
524
491
  Puppet::Type.eachtype { |type|
525
492
  type.each { |obj|
@@ -529,10 +496,6 @@ class TestSnippets < Test::Unit::TestCase
529
496
  # assert(obj.parent, "%s has no parent" % obj.name)
530
497
  #end
531
498
  assert(obj.name)
532
-
533
- if obj.is_a?(Puppet.type(:file))
534
- @@tmpfiles << obj[:path]
535
- end
536
499
  }
537
500
  }
538
501
  assert_nothing_raised {
@@ -546,4 +509,4 @@ class TestSnippets < Test::Unit::TestCase
546
509
  }
547
510
  end
548
511
 
549
- # $Id: snippets.rb 2259 2007-03-06 19:03:05Z luke $
512
+ # $Id: snippets.rb 2463 2007-05-04 23:09:34Z luke $