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
@@ -56,14 +56,15 @@ class Puppet::Parser::Resource
56
56
  end
57
57
  end
58
58
 
59
- # Add any metaparams defined in our scope. This actually adds any metaparams
59
+ # Add any metaparams defined in our scope. This actually adds any metaparams
60
60
  # from any parent scope, and there's currently no way to turn that off.
61
61
  def addmetaparams
62
62
  Puppet::Type.eachmetaparam do |name|
63
63
  next if self[name]
64
64
  if val = scope.lookupvar(name.to_s, false)
65
65
  unless val == :undefined
66
- set Param.new(:name => name, :value => val, :source => scope.source)
66
+ set Param.new(:name => name, :value => val,
67
+ :source => scope.source)
67
68
  end
68
69
  end
69
70
  end
@@ -94,6 +95,7 @@ class Puppet::Parser::Resource
94
95
  :title => self.title,
95
96
  :arguments => self.to_hash,
96
97
  :scope => self.scope,
98
+ :virtual => self.virtual,
97
99
  :exported => self.exported
98
100
  )
99
101
  elsif builtin?
@@ -171,6 +173,48 @@ class Puppet::Parser::Resource
171
173
  end
172
174
  end
173
175
 
176
+ def modify_rails(db_resource)
177
+ args = rails_args
178
+ args.each do |param, value|
179
+ db_resource[param] = value unless db_resource[param] == value
180
+ end
181
+
182
+ # Handle file specially
183
+ if (self.file and
184
+ (!db_resource.file or db_resource.file != self.file))
185
+ db_resource.file = self.file
186
+ end
187
+
188
+ updated_params = @params.inject({}) do |hash, ary|
189
+ hash[ary[0].to_s] = ary[1]
190
+ hash
191
+ end
192
+
193
+ db_resource.ar_hash_merge(db_resource.get_params_hash(db_resource.param_values), updated_params,
194
+ :create => Proc.new { |name, parameter|
195
+ parameter.to_rails(db_resource)
196
+ }, :delete => Proc.new { |values|
197
+ values.each { |value| db_resource.param_values.delete(value) }
198
+ }, :modify => Proc.new { |db, mem|
199
+ mem.modify_rails_values(db)
200
+ })
201
+
202
+ updated_tags = tags.inject({}) { |hash, tag|
203
+ hash[tag] = tag
204
+ hash
205
+ }
206
+
207
+ db_resource.ar_hash_merge(db_resource.get_tag_hash(),
208
+ updated_tags,
209
+ :create => Proc.new { |name, tag|
210
+ db_resource.add_resource_tag(tag)
211
+ }, :delete => Proc.new { |rt|
212
+ rt.each { |tag| db_resource.resource_tags.delete(tag) }
213
+ }, :modify => Proc.new { |db, mem|
214
+ # nothing here
215
+ })
216
+ end
217
+
174
218
  # This *significantly* reduces the number of calls to Puppet.[].
175
219
  def paramcheck?
176
220
  unless defined? @@paramcheck
@@ -179,13 +223,13 @@ class Puppet::Parser::Resource
179
223
  @@paramcheck
180
224
  end
181
225
 
182
- # Verify that all passed parameters are valid. This throws an error if there's
183
- # a problem, so we don't have to worry about the return value.
226
+ # Verify that all passed parameters are valid. This throws an error if
227
+ # there's a problem, so we don't have to worry about the return value.
184
228
  def paramcheck(param)
185
229
  param = param.to_s
186
230
  # Now make sure it's a valid argument to our class. These checks
187
- # are organized in order of commonhood -- most types, it's a valid argument
188
- # and paramcheck is enabled.
231
+ # are organized in order of commonhood -- most types, it's a valid
232
+ # argument and paramcheck is enabled.
189
233
  if @ref.typeclass.validattr?(param)
190
234
  true
191
235
  elsif %w{name title}.include?(param) # always allow these
@@ -227,7 +271,8 @@ class Puppet::Parser::Resource
227
271
  if Puppet[:trace]
228
272
  puts caller
229
273
  end
230
- msg = "Parameter '%s' is already set on %s" % [param.name, self.to_s]
274
+ msg = "Parameter '%s' is already set on %s" %
275
+ [param.name, self.to_s]
231
276
  if param.source.to_s != ""
232
277
  msg += " by %s" % param.source
233
278
  end
@@ -260,53 +305,30 @@ class Puppet::Parser::Resource
260
305
  def to_hash
261
306
  @params.inject({}) do |hash, ary|
262
307
  param = ary[1]
263
- hash[param.name] = param.value
308
+ # Skip "undef" values.
309
+ if param.value != :undef
310
+ hash[param.name] = param.value
311
+ end
264
312
  hash
265
313
  end
266
314
  end
267
315
 
268
- # Turn our parser resource into a Rails resource.
269
- def to_rails(host, resource = nil)
270
- args = {}
271
- [:type, :title, :line, :exported].each do |param|
272
- # 'type' isn't a valid column name, so we have to use something else.
273
- if param == :type
274
- to = :restype
275
- else
276
- to = param
277
- end
278
- if value = self.send(param)
279
- args[to] = value
280
- end
281
- end
316
+ # Turn our parser resource into a Rails resource.
317
+ def to_rails(host)
318
+ args = rails_args
282
319
 
283
- # If we were passed an object, just make sure all of the attributes are correct.
284
- if resource
285
- # We exist
286
- args.each do |param, value|
287
- v = resource[param]
288
- unless v == value
289
- resource[param] = value
290
- end
291
- end
292
- else
293
- # Else create it anew
294
- resource = host.resources.build(args)
295
- end
320
+ db_resource = host.resources.build(args)
296
321
 
297
- # Handle file and tags specially
298
- [:file, :tags].each do |param|
299
- if self.send(param) and (!resource.send(param) or resource.send(param) != self.send(param))
300
- resource.send(param.to_s + "=", self.send(param))
301
- end
302
- end
322
+ # Handle file specially
323
+ db_resource.file = self.file
303
324
 
304
- # Either way, now add our parameters
305
- updated_params = {}
306
- @params.each { |name, p| updated_params[name.to_s] = p }
307
- resource.collection_merge :param_names, :existing => resource.param_names, :updates => updated_params
325
+ @params.each { |name, param|
326
+ param.to_rails(db_resource)
327
+ }
328
+
329
+ tags.each { |tag| db_resource.add_resource_tag(tag) }
308
330
 
309
- return resource
331
+ return db_resource
310
332
  end
311
333
 
312
334
  def to_s
@@ -334,7 +356,16 @@ class Puppet::Parser::Resource
334
356
  av
335
357
  }
336
358
  end
337
- obj[p.to_s] = v
359
+
360
+ # If the value is an array with only one value, then
361
+ # convert it to a single value. This is largely so that
362
+ # the database interaction doesn't have to worry about
363
+ # whether it returns an array or a string.
364
+ obj[p.to_s] = if v.is_a?(Array) and v.length == 1
365
+ v[0]
366
+ else
367
+ v
368
+ end
338
369
  end
339
370
 
340
371
  obj.file = self.file
@@ -348,6 +379,18 @@ class Puppet::Parser::Resource
348
379
  def virtual?
349
380
  self.virtual
350
381
  end
382
+
383
+ private
384
+ def rails_args
385
+ return [:type, :title, :line, :exported].inject({}) do |hash, param|
386
+ # 'type' isn't a valid column name, so we have to use another name.
387
+ to = (param == :type) ? :restype : param
388
+ if value = self.send(param)
389
+ hash[to] = value
390
+ end
391
+ hash
392
+ end
393
+ end
351
394
  end
352
395
 
353
- # $Id: resource.rb 2439 2007-04-30 19:21:59Z luke $
396
+ # $Id: resource.rb 2597 2007-06-17 21:41:50Z luke $
@@ -1,4 +1,4 @@
1
- # The parameters we stick in Resources.
1
+ # The parameters we stick in Resources.
2
2
  class Puppet::Parser::Resource::Param
3
3
  attr_accessor :name, :value, :source, :line, :file
4
4
  include Puppet::Util
@@ -15,43 +15,66 @@ class Puppet::Parser::Resource::Param
15
15
  "#<#{self.class} @name => #{self.name}, @value => #{self.value}, @source => #{self.source.type}>"
16
16
  end
17
17
 
18
- # Store this parameter in a Rails db.
19
- def to_rails(res, pn = nil)
18
+ def line_to_i
19
+ return line ? Integer(line) : nil
20
+ end
21
+
22
+ # Store a new parameter in a Rails db.
23
+ def to_rails(db_resource)
20
24
  values = value.is_a?(Array) ? value : [value]
25
+ values = values.map { |v| v.to_s }
21
26
 
22
- values = values.collect { |v| v.to_s }
23
-
24
- unless pn
25
- # We're creating it anew.
26
- pn = res.param_names.build(:name => self.name.to_s)
27
- end
28
-
29
- value_objects = []
27
+ param_name = Puppet::Rails::ParamName.find_or_create_by_name(self.name.to_s)
28
+ line_number = line_to_i()
30
29
 
31
- if l = self.line
32
- pn.line = Integer(l)
33
- end
34
-
35
- oldvals = []
36
-
37
- if pv = pn.param_values
38
- oldvals = pv.collect { |val| val.value }
30
+ return values.collect do |v|
31
+ db_resource.param_values.create(:value => v.to_s,
32
+ :line => line_number,
33
+ :param_name => param_name)
39
34
  end
35
+ end
40
36
 
41
- if oldvals != values
42
- #pn.param_values = values.collect { |v| pn.param_values.build(:value => v.to_s) }
43
- objects = values.collect do |v|
44
- pn.param_values.build(:value => v.to_s)
45
- end
46
- pn.param_values = objects
47
- end
37
+ def modify_rails_values(db_values)
38
+ #dev_warn if db_values.nil? || db_values.empty?
48
39
 
49
- return pn
40
+ values_to_remove(db_values).each { |remove_me|
41
+ Puppet::Rails::ParamValue.delete(remove_me)
42
+ }
43
+ line_number = line_to_i()
44
+ values_to_add(db_values).each { |add_me|
45
+ db_resource = db_values[0].resource
46
+ db_param_name = db_values[0].param_name
47
+ db_resource.param_values.create(:value => add_me.to_s,
48
+ :line => line_number,
49
+ :param_name => db_param_name)
50
+ }
50
51
  end
51
-
52
+
52
53
  def to_s
53
54
  "%s => %s" % [self.name, self.value]
54
55
  end
56
+
57
+ def values_to_remove(db_values)
58
+ values = value.is_a?(Array) ? value : [value]
59
+ values = values.map { |v| v.to_s }
60
+ line_number = line_to_i()
61
+ db_values.collect do |db|
62
+ db unless (db.line == line_number &&
63
+ values.find { |v|
64
+ v == db.value
65
+ } )
66
+ end.compact
67
+ end
68
+
69
+ def values_to_add(db_values)
70
+ values = value.is_a?(Array) ? value : [value]
71
+ values = values.map { |v| v.to_s }
72
+ line_number = line_to_i()
73
+ values.collect do |v|
74
+ v unless db_values.find { |db| (v == db.value &&
75
+ line_number == db.line) }
76
+ end.compact
77
+ end
55
78
  end
56
79
 
57
- # $Id: param.rb 2439 2007-04-30 19:21:59Z luke $
80
+ # $Id: param.rb 2597 2007-06-17 21:41:50Z luke $
@@ -11,21 +11,13 @@ class Puppet::Parser::Scope
11
11
 
12
12
  AST = Puppet::Parser::AST
13
13
 
14
- # This doesn't actually work right now.
15
- Puppet.config.setdefaults(:puppet,
16
- :lexical => [false, "Whether to use lexical scoping (vs. dynamic)."],
17
- :templatedir => ["$vardir/templates",
18
- "Where Puppet looks for template files."
19
- ]
20
- )
21
-
22
14
  Puppet::Util.logmethods(self)
23
15
 
24
16
  include Enumerable
25
17
  include Puppet::Util::Errors
26
18
  attr_accessor :parent, :level, :interp, :source, :host
27
19
  attr_accessor :name, :type, :topscope, :base, :keyword
28
- attr_accessor :top, :translated, :exported
20
+ attr_accessor :top, :translated, :exported, :virtual
29
21
 
30
22
  # Whether we behave declaratively. Note that it's a class variable,
31
23
  # so all scopes behave the same.
@@ -56,7 +48,7 @@ class Puppet::Parser::Scope
56
48
  # Is the value true? This allows us to control the definition of truth
57
49
  # in one place.
58
50
  def self.true?(value)
59
- if value == false or value == ""
51
+ if value == false or value == "" or value == :undef
60
52
  return false
61
53
  else
62
54
  return true
@@ -123,8 +115,8 @@ class Puppet::Parser::Scope
123
115
  # that subclasses can set their parent scopes to be the scope of
124
116
  # their parent class.
125
117
  def class_scope(klass)
126
- if klass.respond_to?(:fqname)
127
- @classtable[klass.fqname]
118
+ if klass.respond_to?(:classname)
119
+ @classtable[klass.classname]
128
120
  else
129
121
  @classtable[klass]
130
122
  end
@@ -379,9 +371,7 @@ class Puppet::Parser::Scope
379
371
  return values
380
372
  end
381
373
 
382
- # Look up all of the exported objects of a given type. Just like
383
- # lookupobject, this only searches up through parent classes, not
384
- # the whole scope tree.
374
+ # Look up all of the exported objects of a given type.
385
375
  def lookupexported(type)
386
376
  @definedtable.find_all do |name, r|
387
377
  r.type == type and r.exported?
@@ -406,7 +396,7 @@ class Puppet::Parser::Scope
406
396
  raise Puppet::ParseError, "Could not find class %s" % klassname
407
397
  end
408
398
  unless kscope = class_scope(klass)
409
- raise Puppet::ParseError, "Class %s has not been evaluated so its variables cannot be referenced" % klass.fqname
399
+ raise Puppet::ParseError, "Class %s has not been evaluated so its variables cannot be referenced" % klass.classname
410
400
  end
411
401
  return kscope.lookupvar(shortname, usestring)
412
402
  end
@@ -422,7 +412,11 @@ class Puppet::Parser::Scope
422
412
  end
423
413
  # We can't use "if @symtable[name]" here because the value might be false
424
414
  if @symtable.include?(name)
425
- return @symtable[name]
415
+ if usestring and @symtable[name] == :undef
416
+ return ""
417
+ else
418
+ return @symtable[name]
419
+ end
426
420
  elsif self.parent
427
421
  return @parent.lookupvar(name, usestring)
428
422
  elsif usestring
@@ -459,8 +453,8 @@ class Puppet::Parser::Scope
459
453
  end
460
454
 
461
455
  def setclass?(obj)
462
- if obj.respond_to?(:fqname)
463
- @classtable.has_key?(obj.fqname)
456
+ if obj.respond_to?(:classname)
457
+ @classtable.has_key?(obj.classname)
464
458
  else
465
459
  @classtable[obj]
466
460
  end
@@ -472,11 +466,11 @@ class Puppet::Parser::Scope
472
466
  # can support multiple unrelated classes with the same name.
473
467
  def setclass(obj)
474
468
  if obj.is_a?(AST::HostClass)
475
- unless obj.fqname
469
+ unless obj.classname
476
470
  raise Puppet::DevError, "Got a %s with no fully qualified name" %
477
471
  obj.class
478
472
  end
479
- @classtable[obj.fqname] = self
473
+ @classtable[obj.classname] = self
480
474
  else
481
475
  raise Puppet::DevError, "Invalid class %s" % obj.inspect
482
476
  end
@@ -496,6 +490,13 @@ class Puppet::Parser::Scope
496
490
 
497
491
  @children << obj
498
492
 
493
+ # Mark the resource as virtual or exported, as necessary.
494
+ if self.exported?
495
+ obj.exported = true
496
+ elsif self.virtual?
497
+ obj.virtual = true
498
+ end
499
+
499
500
  # The global table
500
501
  @definedtable[obj.ref] = obj
501
502
 
@@ -633,7 +634,7 @@ class Puppet::Parser::Scope
633
634
  Puppet.debug "got told to tag with %s" % tag.inspect
634
635
  next
635
636
  end
636
- unless tag =~ /^\w[-\w]+$/
637
+ unless tag =~ /^\w[-\w]*$/
637
638
  fail Puppet::ParseError, "Invalid tag %s" % tag.inspect
638
639
  end
639
640
  tag = tag.to_s
@@ -721,6 +722,10 @@ class Puppet::Parser::Scope
721
722
  return ary
722
723
  end
723
724
  end
725
+
726
+ def virtual?
727
+ self.virtual || self.exported?
728
+ end
724
729
  end
725
730
 
726
- # $Id: scope.rb 2418 2007-04-26 19:09:24Z luke $
731
+ # $Id: scope.rb 2562 2007-06-11 21:54:37Z luke $
@@ -48,26 +48,6 @@ class Puppet::PGraph < GRATR::Digraph
48
48
  end
49
49
  end
50
50
 
51
- # Fail in a somewhat informative way if the graph has become cyclic.
52
- def check_cycle(sorted)
53
- return true if sorted.size == size()
54
-
55
- bad = []
56
- vertices.each do |v|
57
- bad << v unless sorted.include?(v)
58
- end
59
-
60
- if bad.length > 0
61
- raise Puppet::Error,
62
- "Found dependency cycle involving %s" % bad.collect do |v|
63
- v.to_s
64
- end.join(", ")
65
- else
66
- raise Puppet::Error,
67
- "Found dependency cycle but could not find the cause"
68
- end
69
- end
70
-
71
51
  # Which resources a given resource depends upon.
72
52
  def dependents(resource)
73
53
  tree_from_vertex2(resource).keys
@@ -185,6 +165,31 @@ class Puppet::PGraph < GRATR::Digraph
185
165
  end
186
166
  end
187
167
 
168
+ # Replace the default method, because we want to throw errors on back edges,
169
+ # not just skip them.
170
+ def topsort(start = nil, &block)
171
+ result = []
172
+ go = true
173
+ cycles = []
174
+ back = Proc.new { |e|
175
+ cycles << e
176
+ go = false
177
+ }
178
+ push = Proc.new { |v| result.unshift(v) if go}
179
+ start ||= vertices[0]
180
+ dfs({:exit_vertex => push, :back_edge => back, :start => start})
181
+ if block_given?
182
+ result.each {|v| yield(v) }
183
+ end
184
+
185
+ if cycles.length > 0
186
+ msg = "Found cycles in the following relationships:"
187
+ cycles.each { |edge| msg += " %s => %s" % [edge.source, edge.target] }
188
+ raise Puppet::Error, msg
189
+ end
190
+ return result
191
+ end
192
+
188
193
  # A different way of walking a tree, and a much faster way than the
189
194
  # one that comes with GRATR.
190
195
  def tree_from_vertex2(start, direction = :out)
@@ -205,4 +210,4 @@ class Puppet::PGraph < GRATR::Digraph
205
210
  end
206
211
  end
207
212
 
208
- # $Id: pgraph.rb 2308 2007-03-19 04:40:25Z luke $
213
+ # $Id: pgraph.rb 2521 2007-05-17 20:57:24Z luke $