puppet 0.22.4 → 0.23.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

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
@@ -48,6 +48,32 @@ class Puppet::Transaction::Report
48
48
  def record(metric, object)
49
49
  @records[metric] << object
50
50
  end
51
+
52
+ # Provide a summary of this report.
53
+ def summary
54
+ ret = ""
55
+
56
+ @metrics.sort { |a,b| a[1].label <=> b[1].label }.each do |name, metric|
57
+ ret += "%s:\n" % metric.label
58
+ metric.values.sort { |a,b|
59
+ # sort by label
60
+ if a[0] == :total
61
+ 1
62
+ elsif b[0] == :total
63
+ -1
64
+ else
65
+ a[1] <=> b[1]
66
+ end
67
+ }.each do |name, label, value|
68
+ next if value == 0
69
+ if value.is_a?(Float)
70
+ value = "%0.2f" % value
71
+ end
72
+ ret += " %15s %s\n" % [label + ":", value]
73
+ end
74
+ end
75
+ return ret
76
+ end
51
77
  end
52
78
 
53
- # $Id: report.rb 2246 2007-02-28 17:03:21Z luke $
79
+ # $Id: report.rb 2459 2007-05-04 05:04:29Z luke $
@@ -106,40 +106,6 @@ class Type < Puppet::Element
106
106
  define_method(:validate, &block)
107
107
  #@validate = block
108
108
  end
109
-
110
- # iterate across all children, and then iterate across properties
111
- # we do children first so we're sure that all dependent objects
112
- # are checked first
113
- # we ignore parameters here, because they only modify how work gets
114
- # done, they don't ever actually result in work specifically
115
- def each
116
- # we want to return the properties in the order that each type
117
- # specifies it, because it may (as in the case of File#create)
118
- # be important
119
- if self.class.depthfirst?
120
- @children.each { |child|
121
- yield child
122
- }
123
- end
124
- self.eachproperty { |property|
125
- yield property
126
- }
127
- unless self.class.depthfirst?
128
- @children.each { |child|
129
- yield child
130
- }
131
- end
132
- end
133
-
134
- # Recurse deeply through the tree, but only yield types, not properties.
135
- def delve(&block)
136
- self.each do |obj|
137
- if obj.is_a? Puppet::Type
138
- obj.delve(&block)
139
- end
140
- end
141
- block.call(self)
142
- end
143
109
 
144
110
  # create a log at specified level
145
111
  def log(msg)
@@ -157,7 +123,6 @@ class Type < Puppet::Element
157
123
  public
158
124
 
159
125
  def initvars
160
- @children = []
161
126
  @evalcount = 0
162
127
  @tags = []
163
128
 
@@ -381,20 +346,19 @@ class Type < Puppet::Element
381
346
 
382
347
  # Convert to a transportable object
383
348
  def to_trans(ret = true)
384
- # Retrieve the object, if they tell use to.
385
- if ret
386
- retrieve()
387
- end
388
-
389
349
  trans = TransObject.new(self.title, self.class.name)
390
350
 
391
- properties().each do |property|
392
- trans[property.name] = property.is
351
+ values = retrieve()
352
+ values.each do |name, value|
353
+ trans[name.name] = value
393
354
  end
394
355
 
395
356
  @parameters.each do |name, param|
396
357
  # Avoid adding each instance name as both the name and the namevar
397
358
  next if param.class.isnamevar? and param.value == self.title
359
+
360
+ # We've already got property values
361
+ next if param.is_a?(Puppet::Property)
398
362
  trans[name] = param.value
399
363
  end
400
364
 
@@ -417,4 +381,4 @@ require 'puppet/type/tidy'
417
381
 
418
382
 
419
383
 
420
- # $Id: type.rb 2329 2007-03-19 21:37:52Z luke $
384
+ # $Id: type.rb 2577 2007-06-14 03:39:23Z luke $
@@ -7,153 +7,227 @@ require 'puppet/type'
7
7
  require 'puppet/transaction'
8
8
  require 'puppet/pgraph'
9
9
 
10
- module Puppet
11
- newtype(:component) do
12
- include Enumerable
13
-
14
- newparam(:name) do
15
- desc "The name of the component. Generally optional."
16
- isnamevar
10
+ Puppet::Type.newtype(:component) do
11
+ include Enumerable
12
+ attr_accessor :children
13
+
14
+ newparam(:name) do
15
+ desc "The name of the component. Generally optional."
16
+ isnamevar
17
+ end
18
+
19
+ newparam(:type) do
20
+ desc "The type that this component maps to. Generally some kind of
21
+ class from the language."
22
+
23
+ defaultto "component"
24
+ end
25
+
26
+ # Remove a child from the component.
27
+ def delete(child)
28
+ if @children.include?(child)
29
+ @children.delete(child)
30
+ return true
31
+ else
32
+ return super
17
33
  end
34
+ end
18
35
 
19
- newparam(:type) do
20
- desc "The type that this component maps to. Generally some kind of
21
- class from the language."
22
-
23
- defaultto "component"
36
+ # Recurse deeply through the tree, but only yield types, not properties.
37
+ def delve(&block)
38
+ self.each do |obj|
39
+ if obj.is_a?(self.class)
40
+ obj.delve(&block)
41
+ end
24
42
  end
25
-
26
- # Remove a child from the component.
27
- def delete(child)
28
- if @children.include?(child)
29
- @children.delete(child)
30
- return true
43
+ block.call(self)
44
+ end
45
+
46
+ # Return each child in turn.
47
+ def each
48
+ @children.each { |child| yield child }
49
+ end
50
+
51
+ # flatten all children, sort them, and evaluate them in order
52
+ # this is only called on one component over the whole system
53
+ # this also won't work with scheduling, but eh
54
+ def evaluate
55
+ self.finalize unless self.finalized?
56
+ transaction = Puppet::Transaction.new(self)
57
+ transaction.component = self
58
+ return transaction
59
+ end
60
+
61
+ # Do all of the polishing off, mostly doing autorequires and making
62
+ # dependencies. This will get run once on the top-level component,
63
+ # and it will do everything necessary.
64
+ def finalize
65
+ started = {}
66
+ finished = {}
67
+
68
+ # First do all of the finish work, which mostly involves
69
+ self.delve do |object|
70
+ # Make sure we don't get into loops
71
+ if started.has_key?(object)
72
+ debug "Already finished %s" % object.title
73
+ next
31
74
  else
32
- return false
75
+ started[object] = true
76
+ end
77
+ unless finished.has_key?(object)
78
+ object.finish
79
+ finished[object] = true
33
80
  end
34
81
  end
35
82
 
36
- # Return each child in turn.
37
- def each
38
- @children.each { |child| yield child }
39
- end
83
+ @finalized = true
84
+ end
40
85
 
41
- # flatten all children, sort them, and evaluate them in order
42
- # this is only called on one component over the whole system
43
- # this also won't work with scheduling, but eh
44
- def evaluate
45
- self.finalize unless self.finalized?
46
- transaction = Puppet::Transaction.new(self)
47
- transaction.component = self
48
- return transaction
86
+ def finalized?
87
+ if defined? @finalized
88
+ return @finalized
89
+ else
90
+ return false
49
91
  end
50
-
51
- # Do all of the polishing off, mostly doing autorequires and making
52
- # dependencies. This will get run once on the top-level component,
53
- # and it will do everything necessary.
54
- def finalize
55
- started = {}
56
- finished = {}
57
-
58
- # First do all of the finish work, which mostly involves
59
- self.delve do |object|
60
- # Make sure we don't get into loops
61
- if started.has_key?(object)
62
- debug "Already finished %s" % object.title
63
- next
64
- else
65
- started[object] = true
66
- end
67
- unless finished.has_key?(object)
68
- object.finish
69
- finished[object] = true
70
- end
71
- end
72
-
73
- @finalized = true
92
+ end
93
+
94
+ # Initialize a new component
95
+ def initialize(args)
96
+ @children = []
97
+ super(args)
98
+ end
99
+
100
+ def initvars
101
+ super
102
+ @children = []
103
+ end
104
+
105
+ def parent=(parent)
106
+ if self.parentof?(parent)
107
+ devfail "%s[%s] is already the parent of %s[%s]" %
108
+ [self.class.name, self.title, parent.class.name, parent.title]
74
109
  end
75
-
76
- def finalized?
77
- if defined? @finalized
78
- return @finalized
79
- else
80
- return false
81
- end
110
+ @parent = parent
111
+ end
112
+
113
+ # Add a hook for testing for recursion.
114
+ def parentof?(child)
115
+ if super(child)
116
+ return true
117
+ elsif @children.include?(child)
118
+ debug "child is already in children array"
119
+ return true
120
+ else
121
+ return false
82
122
  end
123
+ end
83
124
 
84
- # Initialize a new component
85
- def initialize(args)
125
+ def push(*childs)
126
+ unless defined? @children
86
127
  @children = []
87
- super(args)
88
128
  end
89
-
90
- # Component paths are special because they function as containers.
91
- def pathbuilder
92
- tmp = []
93
- if defined? @parent and @parent
94
- tmp += [@parent.pathbuilder, self.title]
129
+ childs.each { |child|
130
+ # Make sure we don't have any loops here.
131
+ if parentof?(child)
132
+ devfail "Already the parent of %s[%s]" % [child.class.name, child.title]
133
+ end
134
+ unless child.is_a?(Puppet::Element)
135
+ self.debug "Got object of type %s" % child.class
136
+ self.devfail(
137
+ "Containers can only contain Puppet::Elements, not %s" %
138
+ child.class
139
+ )
140
+ end
141
+ @children.push(child)
142
+ child.parent = self
143
+ }
144
+ end
145
+
146
+ # Component paths are special because they function as containers.
147
+ def pathbuilder
148
+ tmp = []
149
+ if defined? @parent and @parent
150
+ tmp += [@parent.pathbuilder, self.title]
151
+ else
152
+ # The top-level name is always main[top], so we don't bother with
153
+ # that.
154
+ if self.title == "main[top]"
155
+ tmp << "" # This empty field results in "//" in the path
95
156
  else
96
- # The top-level name is always main[top], so we don't bother with
97
- # that.
98
- if self.title == "main[top]"
99
- tmp << "" # This empty field results in "//" in the path
100
- else
101
- tmp << self.title
102
- end
157
+ tmp << self.title
103
158
  end
104
-
105
- tmp
106
159
  end
107
-
108
- # We have a different way of setting the title
109
- def title
110
- unless defined? @title
111
- if self[:type] == self[:name] # this is the case for classes
112
- @title = self[:type]
113
- elsif self[:name] =~ /\[.+\]/ # most components already have ref info in the name
114
- @title = self[:name]
115
- else # else, set it up
116
- @title = "%s[%s]" % [self[:type].capitalize, self[:name]]
117
- end
160
+
161
+ tmp
162
+ end
163
+
164
+ # Remove an object. The argument determines whether the object's
165
+ # subscriptions get eliminated, too.
166
+ def remove(rmdeps = true)
167
+ # Our children remove themselves from our @children array (else the object
168
+ # we called this on at the top would not be removed), so we duplicate the
169
+ # array and iterate over that. If we don't do this, only half of the
170
+ # objects get removed.
171
+ @children.dup.each { |child|
172
+ child.remove(rmdeps)
173
+ }
174
+
175
+ @children.clear
176
+
177
+ # Get rid of params and provider, too.
178
+ super
179
+
180
+ @parent = nil
181
+ end
182
+
183
+ # We have a different way of setting the title
184
+ def title
185
+ unless defined? @title
186
+ if self[:type] == self[:name] # this is the case for classes
187
+ @title = self[:type]
188
+ elsif self[:name] =~ /\[.+\]/ # most components already have ref info in the name
189
+ @title = self[:name]
190
+ else # else, set it up
191
+ @title = "%s[%s]" % [self[:type].capitalize, self[:name]]
118
192
  end
119
- return @title
120
- end
121
-
122
- def refresh
123
- @children.collect { |child|
124
- if child.respond_to?(:refresh)
125
- child.refresh
126
- child.log "triggering %s" % :refresh
127
- end
128
- }
129
193
  end
194
+ return @title
195
+ end
196
+
197
+ def refresh
198
+ @children.collect { |child|
199
+ if child.respond_to?(:refresh)
200
+ child.refresh
201
+ child.log "triggering %s" % :refresh
202
+ end
203
+ }
204
+ end
205
+
206
+ # Convert to a graph object with all of the container info.
207
+ def to_graph
208
+ graph = Puppet::PGraph.new
130
209
 
131
- # Convert to a graph object with all of the container info.
132
- def to_graph
133
- graph = Puppet::PGraph.new
134
-
135
- delver = proc do |obj|
136
- obj.each do |child|
137
- if child.is_a?(Puppet::Type)
138
- graph.add_edge!(obj, child)
139
- delver.call(child)
140
- end
210
+ delver = proc do |obj|
211
+ obj.each do |child|
212
+ graph.add_edge!(obj, child)
213
+ if child.is_a?(self.class)
214
+ delver.call(child)
141
215
  end
142
216
  end
143
-
144
- delver.call(self)
145
-
146
- return graph
147
217
  end
148
-
149
- def to_s
150
- if self.title =~ /\[/
151
- return self.title
152
- else
153
- return "component(%s)" % self.title
154
- end
218
+
219
+ delver.call(self)
220
+
221
+ return graph
222
+ end
223
+
224
+ def to_s
225
+ if self.title =~ /\[/
226
+ return self.title
227
+ else
228
+ return "component(%s)" % self.title
155
229
  end
156
- end
230
+ end
157
231
  end
158
232
 
159
- # $Id: component.rb 2052 2007-01-05 17:09:04Z luke $
233
+ # $Id: component.rb 2499 2007-05-09 21:30:44Z luke $