puppet 0.24.1 → 0.24.2

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 +94 -0
  2. data/Rakefile +0 -4
  3. data/bin/puppet +18 -10
  4. data/bin/puppetd +1 -1
  5. data/bin/puppetdoc +14 -4
  6. data/bin/puppetmasterd +1 -1
  7. data/bin/puppetrun +3 -8
  8. data/bin/ralsh +12 -11
  9. data/conf/freebsd/puppetd +1 -1
  10. data/conf/freebsd/puppetmasterd +1 -1
  11. data/conf/gentoo/puppet/puppet.conf +29 -0
  12. data/conf/namespaceauth.conf +20 -0
  13. data/conf/redhat/puppet.spec +4 -1
  14. data/conf/solaris/smf/puppetd.xml +1 -1
  15. data/conf/solaris/smf/puppetmasterd.xml +1 -1
  16. data/conf/suse/puppet.spec +10 -8
  17. data/examples/root/etc/puppet/{puppetmasterd.conf → puppet.conf} +6 -3
  18. data/ext/logcheck/puppet +7 -0
  19. data/ext/puppet-test +28 -5
  20. data/lib/puppet.rb +2 -1
  21. data/lib/puppet/defaults.rb +12 -5
  22. data/lib/puppet/dsl.rb +43 -45
  23. data/lib/puppet/external/{gratr/rdot.rb → dot.rb} +0 -0
  24. data/lib/puppet/external/nagios.rb +50 -0
  25. data/lib/puppet/external/nagios/base.rb +421 -0
  26. data/lib/puppet/external/nagios/parser.rb +816 -0
  27. data/lib/puppet/file_serving/file_base.rb +16 -3
  28. data/lib/puppet/file_serving/metadata.rb +29 -11
  29. data/lib/puppet/indirector/terminus.rb +1 -0
  30. data/lib/puppet/metatype/closure.rb +4 -0
  31. data/lib/puppet/metatype/evaluation.rb +2 -17
  32. data/lib/puppet/metatype/metaparams.rb +1 -1
  33. data/lib/puppet/network.rb +3 -0
  34. data/lib/puppet/network/client.rb +4 -5
  35. data/lib/puppet/network/client/master.rb +10 -7
  36. data/lib/puppet/network/handler/fileserver.rb +22 -45
  37. data/lib/puppet/network/http_pool.rb +3 -0
  38. data/lib/puppet/network/http_server/mongrel.rb +7 -1
  39. data/lib/puppet/network/http_server/webrick.rb +4 -3
  40. data/lib/puppet/network/xmlrpc/client.rb +12 -1
  41. data/lib/puppet/node/catalog.rb +51 -40
  42. data/lib/puppet/parser/ast.rb +27 -49
  43. data/lib/puppet/parser/ast/astarray.rb +5 -24
  44. data/lib/puppet/parser/ast/caseopt.rb +4 -4
  45. data/lib/puppet/parser/ast/casestatement.rb +4 -5
  46. data/lib/puppet/parser/ast/collection.rb +3 -5
  47. data/lib/puppet/parser/ast/collexpr.rb +3 -5
  48. data/lib/puppet/parser/ast/definition.rb +148 -159
  49. data/lib/puppet/parser/ast/else.rb +2 -3
  50. data/lib/puppet/parser/ast/function.rb +3 -10
  51. data/lib/puppet/parser/ast/hostclass.rb +66 -59
  52. data/lib/puppet/parser/ast/ifstatement.rb +4 -5
  53. data/lib/puppet/parser/ast/leaf.rb +6 -6
  54. data/lib/puppet/parser/ast/node.rb +26 -58
  55. data/lib/puppet/parser/ast/resource.rb +5 -7
  56. data/lib/puppet/parser/ast/resource_defaults.rb +2 -4
  57. data/lib/puppet/parser/ast/resource_override.rb +4 -6
  58. data/lib/puppet/parser/ast/resource_reference.rb +2 -4
  59. data/lib/puppet/parser/ast/resourceparam.rb +2 -4
  60. data/lib/puppet/parser/ast/selector.rb +5 -6
  61. data/lib/puppet/parser/ast/tag.rb +2 -4
  62. data/lib/puppet/parser/ast/vardef.rb +3 -4
  63. data/lib/puppet/parser/collector.rb +5 -5
  64. data/lib/puppet/parser/{compile.rb → compiler.rb} +69 -107
  65. data/lib/puppet/parser/functions.rb +3 -3
  66. data/lib/puppet/parser/interpreter.rb +32 -23
  67. data/lib/puppet/parser/lexer.rb +391 -282
  68. data/lib/puppet/parser/parser.rb +5 -4
  69. data/lib/puppet/parser/parser_support.rb +3 -6
  70. data/lib/puppet/parser/resource.rb +24 -36
  71. data/lib/puppet/parser/resource/param.rb +1 -1
  72. data/lib/puppet/parser/resource/reference.rb +7 -3
  73. data/lib/puppet/parser/scope.rb +12 -7
  74. data/lib/puppet/parser/templatewrapper.rb +1 -1
  75. data/lib/puppet/pgraph.rb +9 -98
  76. data/lib/puppet/provider/interface/redhat.rb +65 -65
  77. data/lib/puppet/provider/mount/parsed.rb +1 -1
  78. data/lib/puppet/provider/naginator.rb +55 -0
  79. data/lib/puppet/provider/nameservice/directoryservice.rb +6 -7
  80. data/lib/puppet/provider/package/fink.rb +0 -2
  81. data/lib/puppet/provider/package/gem.rb +9 -5
  82. data/lib/puppet/provider/package/openbsd.rb +1 -1
  83. data/lib/puppet/provider/package/pkgdmg.rb +3 -8
  84. data/lib/puppet/provider/package/portage.rb +4 -4
  85. data/lib/puppet/provider/package/yumhelper.py +8 -6
  86. data/lib/puppet/provider/parsedfile.rb +7 -1
  87. data/lib/puppet/provider/service/debian.rb +2 -0
  88. data/lib/puppet/provider/service/gentoo.rb +4 -0
  89. data/lib/puppet/provider/service/init.rb +1 -1
  90. data/lib/puppet/provider/sshkey/parsed.rb +2 -0
  91. data/lib/puppet/provider/user/useradd.rb +1 -1
  92. data/lib/puppet/rails.rb +4 -0
  93. data/lib/puppet/rails/database/001_add_created_at_to_all_tables.rb +17 -0
  94. data/lib/puppet/rails/fact_value.rb +4 -0
  95. data/lib/puppet/rails/host.rb +1 -2
  96. data/lib/puppet/rails/param_value.rb +4 -0
  97. data/lib/puppet/rails/resource_tag.rb +4 -0
  98. data/lib/puppet/rails/source_file.rb +4 -1
  99. data/lib/puppet/relationship.rb +5 -1
  100. data/lib/puppet/reports/tagmail.rb +12 -1
  101. data/lib/puppet/resource_reference.rb +1 -1
  102. data/lib/puppet/simple_graph.rb +78 -11
  103. data/lib/puppet/sslcertificates.rb +1 -1
  104. data/lib/puppet/sslcertificates/ca.rb +3 -3
  105. data/lib/puppet/transaction.rb +7 -4
  106. data/lib/puppet/transportable.rb +1 -1
  107. data/lib/puppet/type.rb +3 -10
  108. data/lib/puppet/type/cron.rb +18 -0
  109. data/lib/puppet/type/exec.rb +18 -12
  110. data/lib/puppet/type/{pfile.rb → file.rb} +66 -84
  111. data/lib/puppet/type/file/checksum.rb +271 -0
  112. data/lib/puppet/type/{pfile → file}/content.rb +10 -15
  113. data/lib/puppet/type/{pfile → file}/ensure.rb +15 -8
  114. data/lib/puppet/type/{pfile → file}/group.rb +0 -0
  115. data/lib/puppet/type/{pfile → file}/mode.rb +0 -0
  116. data/lib/puppet/type/{pfile → file}/owner.rb +0 -0
  117. data/lib/puppet/type/{pfile → file}/source.rb +34 -48
  118. data/lib/puppet/type/{pfile → file}/target.rb +0 -0
  119. data/lib/puppet/type/{pfile → file}/type.rb +0 -0
  120. data/lib/puppet/type/{pfilebucket.rb → filebucket.rb} +0 -0
  121. data/lib/puppet/type/host.rb +13 -0
  122. data/lib/puppet/type/mailalias.rb +1 -1
  123. data/lib/puppet/type/nagios_command.rb +3 -0
  124. data/lib/puppet/type/nagios_contact.rb +3 -0
  125. data/lib/puppet/type/nagios_contactgroup.rb +3 -0
  126. data/lib/puppet/type/nagios_host.rb +3 -0
  127. data/lib/puppet/type/nagios_hostextinfo.rb +3 -0
  128. data/lib/puppet/type/nagios_hostgroup.rb +3 -0
  129. data/lib/puppet/type/nagios_hostgroupescalation.rb +3 -0
  130. data/lib/puppet/type/nagios_service.rb +3 -0
  131. data/lib/puppet/type/nagios_servicedependency.rb +3 -0
  132. data/lib/puppet/type/nagios_serviceescalation.rb +3 -0
  133. data/lib/puppet/type/nagios_serviceextinfo.rb +3 -0
  134. data/lib/puppet/type/nagios_timeperiod.rb +3 -0
  135. data/lib/puppet/type/package.rb +4 -12
  136. data/lib/puppet/type/service.rb +9 -0
  137. data/lib/puppet/type/sshkey.rb +3 -3
  138. data/lib/puppet/util/autoload.rb +5 -5
  139. data/lib/puppet/util/checksums.rb +51 -13
  140. data/lib/puppet/util/constant_inflector.rb +14 -0
  141. data/lib/puppet/util/filetype.rb +1 -1
  142. data/lib/puppet/util/graph.rb +3 -9
  143. data/lib/puppet/util/nagios_maker.rb +57 -0
  144. data/lib/puppet/util/settings.rb +19 -16
  145. data/lib/puppet/util/tagging.rb +39 -0
  146. data/test/executables/puppetbin.rb +17 -0
  147. data/test/language/ast.rb +8 -58
  148. data/test/language/ast/casestatement.rb +3 -3
  149. data/test/language/ast/resource.rb +6 -7
  150. data/test/language/ast/resource_reference.rb +12 -12
  151. data/test/language/ast/selector.rb +2 -2
  152. data/test/language/ast/variable.rb +2 -2
  153. data/test/language/functions.rb +24 -24
  154. data/test/language/parser.rb +20 -8
  155. data/test/language/resource.rb +5 -42
  156. data/test/language/scope.rb +21 -37
  157. data/test/language/snippets.rb +7 -0
  158. data/test/lib/puppettest.rb +28 -14
  159. data/test/lib/puppettest/parsertesting.rb +10 -10
  160. data/test/lib/puppettest/support/resources.rb +1 -1
  161. data/test/network/client/master.rb +10 -0
  162. data/test/network/handler/fileserver.rb +51 -49
  163. data/test/network/server/webrick.rb +1 -1
  164. data/test/other/dsl.rb +3 -4
  165. data/test/other/transactions.rb +6 -4
  166. data/test/rails/ast.rb +2 -2
  167. data/test/rails/configuration.rb +1 -1
  168. data/test/rails/railsparameter.rb +2 -0
  169. data/test/rails/railsresource.rb +1 -0
  170. data/test/ral/manager/type.rb +4 -4
  171. data/test/ral/providers/cron/crontab.rb +3 -1
  172. data/test/ral/providers/package.rb +1 -1
  173. data/test/ral/{types → type}/basic.rb +2 -2
  174. data/test/ral/{types → type}/cron.rb +0 -0
  175. data/test/ral/{types → type}/exec.rb +42 -2
  176. data/test/ral/{types → type}/file.rb +34 -79
  177. data/test/ral/{types → type}/file/target.rb +0 -0
  178. data/test/ral/{types → type}/filebucket.rb +0 -0
  179. data/test/ral/{types → type}/fileignoresource.rb +0 -0
  180. data/test/ral/{types → type}/filesources.rb +8 -27
  181. data/test/ral/{types → type}/group.rb +0 -0
  182. data/test/ral/{types → type}/host.rb +16 -0
  183. data/test/ral/{types → type}/mailalias.rb +0 -0
  184. data/test/ral/{types → type}/parameter.rb +0 -0
  185. data/test/ral/{types → type}/port.rb +0 -0
  186. data/test/ral/{types → type}/property.rb +0 -0
  187. data/test/ral/{types → type}/resources.rb +0 -0
  188. data/test/ral/{types → type}/service.rb +0 -0
  189. data/test/ral/{types → type}/sshkey.rb +0 -0
  190. data/test/ral/{types → type}/tidy.rb +1 -0
  191. data/test/ral/{types → type}/user.rb +0 -0
  192. data/test/ral/{types → type}/yumrepo.rb +0 -0
  193. data/test/ral/{types → type}/zone.rb +0 -0
  194. data/test/util/autoload.rb +24 -5
  195. metadata +60 -107
  196. data/conf/gentoo/puppet/puppetca.conf +0 -29
  197. data/conf/gentoo/puppet/puppetd.conf +0 -29
  198. data/conf/gentoo/puppet/puppetmasterd.conf +0 -29
  199. data/examples/root/etc/puppet/puppetd.conf +0 -4
  200. data/lib/puppet/external/gratr.rb +0 -33
  201. data/lib/puppet/external/gratr/adjacency_graph.rb +0 -257
  202. data/lib/puppet/external/gratr/base.rb +0 -34
  203. data/lib/puppet/external/gratr/biconnected.rb +0 -116
  204. data/lib/puppet/external/gratr/chinese_postman.rb +0 -123
  205. data/lib/puppet/external/gratr/common.rb +0 -73
  206. data/lib/puppet/external/gratr/comparability.rb +0 -92
  207. data/lib/puppet/external/gratr/digraph.rb +0 -116
  208. data/lib/puppet/external/gratr/digraph_distance.rb +0 -185
  209. data/lib/puppet/external/gratr/dot.rb +0 -90
  210. data/lib/puppet/external/gratr/edge.rb +0 -145
  211. data/lib/puppet/external/gratr/graph.rb +0 -303
  212. data/lib/puppet/external/gratr/graph_api.rb +0 -83
  213. data/lib/puppet/external/gratr/import.rb +0 -44
  214. data/lib/puppet/external/gratr/labels.rb +0 -90
  215. data/lib/puppet/external/gratr/maximum_flow.rb +0 -64
  216. data/lib/puppet/external/gratr/search.rb +0 -409
  217. data/lib/puppet/external/gratr/strong_components.rb +0 -127
  218. data/lib/puppet/external/gratr/undirected_graph.rb +0 -153
  219. data/lib/puppet/rails/external/tagging/acts_as_taggable.rb +0 -62
  220. data/lib/puppet/rails/external/tagging/init.rb +0 -5
  221. data/lib/puppet/rails/external/tagging/tag.rb +0 -50
  222. data/lib/puppet/rails/external/tagging/tagging.rb +0 -12
  223. data/lib/puppet/rails/puppet_class.rb +0 -6
  224. data/lib/puppet/reference/node_source.rb +0 -9
  225. data/lib/puppet/reference/report.rb +0 -21
  226. data/lib/puppet/type/pfile/checksum.rb +0 -326
  227. data/test/language/ast/definition.rb +0 -166
  228. data/test/language/ast/hostclass.rb +0 -184
  229. data/test/language/compile.rb +0 -569
  230. data/test/language/lexer.rb +0 -276
  231. data/test/lib/mocha.rb +0 -19
  232. data/test/lib/mocha/any_instance_method.rb +0 -35
  233. data/test/lib/mocha/auto_verify.rb +0 -113
  234. data/test/lib/mocha/central.rb +0 -35
  235. data/test/lib/mocha/class_method.rb +0 -62
  236. data/test/lib/mocha/deprecation.rb +0 -22
  237. data/test/lib/mocha/exception_raiser.rb +0 -17
  238. data/test/lib/mocha/expectation.rb +0 -378
  239. data/test/lib/mocha/expectation_error.rb +0 -6
  240. data/test/lib/mocha/infinite_range.rb +0 -25
  241. data/test/lib/mocha/inspect.rb +0 -39
  242. data/test/lib/mocha/instance_method.rb +0 -8
  243. data/test/lib/mocha/is_a.rb +0 -9
  244. data/test/lib/mocha/metaclass.rb +0 -7
  245. data/test/lib/mocha/missing_expectation.rb +0 -27
  246. data/test/lib/mocha/mock.rb +0 -207
  247. data/test/lib/mocha/multiple_yields.rb +0 -20
  248. data/test/lib/mocha/no_yields.rb +0 -11
  249. data/test/lib/mocha/object.rb +0 -110
  250. data/test/lib/mocha/parameter_matchers.rb +0 -9
  251. data/test/lib/mocha/parameter_matchers/all_of.rb +0 -39
  252. data/test/lib/mocha/parameter_matchers/any_of.rb +0 -44
  253. data/test/lib/mocha/parameter_matchers/anything.rb +0 -30
  254. data/test/lib/mocha/parameter_matchers/has_entry.rb +0 -39
  255. data/test/lib/mocha/parameter_matchers/has_key.rb +0 -39
  256. data/test/lib/mocha/parameter_matchers/has_value.rb +0 -39
  257. data/test/lib/mocha/parameter_matchers/includes.rb +0 -37
  258. data/test/lib/mocha/pretty_parameters.rb +0 -28
  259. data/test/lib/mocha/return_values.rb +0 -31
  260. data/test/lib/mocha/setup_and_teardown.rb +0 -23
  261. data/test/lib/mocha/single_return_value.rb +0 -24
  262. data/test/lib/mocha/single_yield.rb +0 -18
  263. data/test/lib/mocha/standalone.rb +0 -32
  264. data/test/lib/mocha/stub.rb +0 -18
  265. data/test/lib/mocha/test_case_adapter.rb +0 -49
  266. data/test/lib/mocha/yield_parameters.rb +0 -31
@@ -8,10 +8,8 @@ class Puppet::Parser::AST
8
8
  @name = :class
9
9
  attr_accessor :type
10
10
 
11
- def evaluate(hash)
12
- scope = hash[:scope]
13
-
14
- types = @type.safeevaluate(:scope => scope)
11
+ def evaluate(scope)
12
+ types = @type.safeevaluate(scope)
15
13
 
16
14
  types = [types] unless types.is_a? Array
17
15
 
@@ -9,10 +9,9 @@ class Puppet::Parser::AST
9
9
 
10
10
  # Look up our name and value, and store them appropriately. The
11
11
  # lexer strips off the syntax stuff like '$'.
12
- def evaluate(hash)
13
- scope = hash[:scope]
14
- name = @name.safeevaluate(:scope => scope)
15
- value = @value.safeevaluate(:scope => scope)
12
+ def evaluate(scope)
13
+ name = @name.safeevaluate(scope)
14
+ value = @value.safeevaluate(scope)
16
15
 
17
16
  parsewrap do
18
17
  scope.setvar(name,value, @file, @line)
@@ -51,7 +51,7 @@ class Puppet::Parser::Collector
51
51
  search = "(exported=? AND restype=?)"
52
52
  values = [true, @type]
53
53
 
54
- search += " AND (?)" and values << @equery if @equery
54
+ search += " AND (%s)" % @equery if @equery
55
55
 
56
56
  # We're going to collect objects from rails, but we don't want any
57
57
  # objects from this host.
@@ -118,20 +118,20 @@ class Puppet::Parser::Collector
118
118
  # If there are no more resources to find, delete this from the list
119
119
  # of collections.
120
120
  if @resources.empty?
121
- @scope.compile.delete_collection(self)
121
+ @scope.compiler.delete_collection(self)
122
122
  end
123
123
 
124
124
  return result
125
125
  end
126
126
 
127
- # Collect just virtual objects, from our local compile.
127
+ # Collect just virtual objects, from our local compiler.
128
128
  def collect_virtual(exported = false)
129
129
  if exported
130
130
  method = :exported?
131
131
  else
132
132
  method = :virtual?
133
133
  end
134
- scope.compile.resources.find_all do |resource|
134
+ scope.compiler.resources.find_all do |resource|
135
135
  resource.type == @type and resource.send(method) and match?(resource)
136
136
  end
137
137
  end
@@ -150,7 +150,7 @@ class Puppet::Parser::Collector
150
150
 
151
151
  resource.exported = false
152
152
 
153
- scope.compile.store_resource(scope, resource)
153
+ scope.compiler.add_resource(scope, resource)
154
154
 
155
155
  return resource
156
156
  end
@@ -1,17 +1,13 @@
1
1
  # Created by Luke A. Kanies on 2007-08-13.
2
2
  # Copyright (c) 2007. All rights reserved.
3
3
 
4
- require 'puppet/external/gratr/digraph'
5
- require 'puppet/external/gratr/import'
6
- require 'puppet/external/gratr/dot'
7
-
8
4
  require 'puppet/node'
9
5
  require 'puppet/node/catalog'
10
6
  require 'puppet/util/errors'
11
7
 
12
8
  # Maintain a graph of scopes, along with a bunch of data
13
9
  # about the individual catalog we're compiling.
14
- class Puppet::Parser::Compile
10
+ class Puppet::Parser::Compiler
15
11
  include Puppet::Util
16
12
  include Puppet::Util::Errors
17
13
  attr_reader :parser, :node, :facts, :collections, :catalog, :node_scope
@@ -21,6 +17,29 @@ class Puppet::Parser::Compile
21
17
  @collections << coll
22
18
  end
23
19
 
20
+ # Store a resource override.
21
+ def add_override(override)
22
+ # If possible, merge the override in immediately.
23
+ if resource = @catalog.resource(override.ref)
24
+ resource.merge(override)
25
+ else
26
+ # Otherwise, store the override for later; these
27
+ # get evaluated in Resource#finish.
28
+ @resource_overrides[override.ref] << override
29
+ end
30
+ end
31
+
32
+ # Store a resource in our resource table.
33
+ def add_resource(scope, resource)
34
+ # Note that this will fail if the resource is not unique.
35
+ @catalog.add_resource(resource)
36
+
37
+ # And in the resource graph. At some point, this might supercede
38
+ # the global resource table, but the table is a lot faster
39
+ # so it makes sense to maintain for now.
40
+ @catalog.add_edge(scope.resource, resource)
41
+ end
42
+
24
43
  # Do we use nodes found in the code, vs. the external node sources?
25
44
  def ast_nodes?
26
45
  parser.nodes.length > 0
@@ -30,10 +49,10 @@ class Puppet::Parser::Compile
30
49
  # the scope in which it was evaluated, so that we can look it up later.
31
50
  def class_set(name, scope)
32
51
  if existing = @class_scopes[name]
33
- if existing.nodescope? or scope.nodescope?
52
+ if existing.nodescope? != scope.nodescope?
34
53
  raise Puppet::ParseError, "Cannot have classes, nodes, or definitions with the same name"
35
54
  else
36
- raise Puppet::DevError, "Somehow evaluated the same class twice"
55
+ raise Puppet::DevError, "Somehow evaluated %s %s twice" % [ existing.nodescope? ? "node" : "class", name]
37
56
  end
38
57
  end
39
58
  @class_scopes[name] = scope
@@ -58,7 +77,7 @@ class Puppet::Parser::Compile
58
77
  return @catalog.classes
59
78
  end
60
79
 
61
- # Compile our catalog. This mostly revolves around finding and evaluating classes.
80
+ # Compiler our catalog. This mostly revolves around finding and evaluating classes.
62
81
  # This is the main entry into our catalog.
63
82
  def compile
64
83
  # Set the client's parameters into the top scope.
@@ -72,10 +91,10 @@ class Puppet::Parser::Compile
72
91
 
73
92
  evaluate_generators()
74
93
 
75
- fail_on_unevaluated()
76
-
77
94
  finish()
78
95
 
96
+ fail_on_unevaluated()
97
+
79
98
  if Puppet[:storeconfigs]
80
99
  store()
81
100
  end
@@ -88,11 +107,6 @@ class Puppet::Parser::Compile
88
107
  @collections.delete(coll) if @collections.include?(coll)
89
108
  end
90
109
 
91
- # LAK:FIXME There are no tests for this.
92
- def delete_resource(resource)
93
- @resource_table.delete(resource.ref) if @resource_table.include?(resource.ref)
94
- end
95
-
96
110
  # Return the node's environment.
97
111
  def environment
98
112
  unless defined? @environment
@@ -122,15 +136,13 @@ class Puppet::Parser::Compile
122
136
  classes.each do |name|
123
137
  # If we can find the class, then make a resource that will evaluate it.
124
138
  if klass = scope.findclass(name)
125
- # Create a resource to model this class, and then add it to the list
126
- # of resources.
127
- resource = Puppet::Parser::Resource.new(:type => "class", :title => klass.classname, :scope => scope, :source => scope.source)
128
- store_resource(scope, resource)
139
+ found << name and next if class_scope(klass)
140
+
141
+ resource = klass.evaluate(scope)
129
142
 
130
143
  # If they've disabled lazy evaluation (which the :include function does),
131
144
  # then evaluate our resource immediately.
132
145
  resource.evaluate unless lazy_evaluate
133
- @catalog.tag(klass.classname)
134
146
  found << name
135
147
  else
136
148
  Puppet.info "Could not find class %s for %s" % [name, node.name]
@@ -141,10 +153,8 @@ class Puppet::Parser::Compile
141
153
  end
142
154
 
143
155
  # Return a resource by either its ref or its type and title.
144
- def findresource(string, name = nil)
145
- string = "%s[%s]" % [string.capitalize, name] if name
146
-
147
- @resource_table[string]
156
+ def findresource(*args)
157
+ @catalog.resource(*args)
148
158
  end
149
159
 
150
160
  # Set up our compile. We require a parser
@@ -159,7 +169,7 @@ class Puppet::Parser::Compile
159
169
  begin
160
170
  send(param.to_s + "=", value)
161
171
  rescue NoMethodError
162
- raise ArgumentError, "Compile objects do not accept %s" % param
172
+ raise ArgumentError, "Compiler objects do not accept %s" % param
163
173
  end
164
174
  end
165
175
 
@@ -172,10 +182,10 @@ class Puppet::Parser::Compile
172
182
  # its parent to the graph.
173
183
  def newscope(parent, options = {})
174
184
  parent ||= topscope
175
- options[:compile] = self
185
+ options[:compiler] = self
176
186
  options[:parser] ||= self.parser
177
187
  scope = Puppet::Parser::Scope.new(options)
178
- @scope_graph.add_edge!(parent, scope)
188
+ @scope_graph.add_edge(parent, scope)
179
189
  scope
180
190
  end
181
191
 
@@ -196,35 +206,7 @@ class Puppet::Parser::Compile
196
206
 
197
207
  # Return a list of all resources.
198
208
  def resources
199
- @resource_table.values
200
- end
201
-
202
- # Store a resource override.
203
- def store_override(override)
204
- override.override = true
205
-
206
- # If possible, merge the override in immediately.
207
- if resource = @resource_table[override.ref]
208
- resource.merge(override)
209
- else
210
- # Otherwise, store the override for later; these
211
- # get evaluated in Resource#finish.
212
- @resource_overrides[override.ref] << override
213
- end
214
- end
215
-
216
- # Store a resource in our resource table.
217
- def store_resource(scope, resource)
218
- # This might throw an exception
219
- verify_uniqueness(resource)
220
-
221
- # Store it in the global table.
222
- @resource_table[resource.ref] = resource
223
-
224
- # And in the resource graph. At some point, this might supercede
225
- # the global resource table, but the table is a lot faster
226
- # so it makes sense to maintain for now.
227
- @catalog.add_edge!(scope.resource, resource)
209
+ @catalog.vertices
228
210
  end
229
211
 
230
212
  # The top scope is usually the top-level scope, but if we're using AST nodes,
@@ -251,9 +233,7 @@ class Puppet::Parser::Compile
251
233
 
252
234
  # Create a resource to model this node, and then add it to the list
253
235
  # of resources.
254
- resource = Puppet::Parser::Resource.new(:type => "node", :title => astnode.classname, :scope => topscope, :source => topscope.source)
255
- store_resource(topscope, resource)
256
- @catalog.tag(astnode.classname)
236
+ resource = astnode.evaluate(topscope)
257
237
 
258
238
  resource.evaluate
259
239
 
@@ -286,11 +266,15 @@ class Puppet::Parser::Compile
286
266
  def evaluate_definitions
287
267
  exceptwrap do
288
268
  if ary = unevaluated_resources
269
+ evaluated = false
289
270
  ary.each do |resource|
290
- resource.evaluate
271
+ if not resource.virtual?
272
+ resource.evaluate
273
+ evaluated = true
274
+ end
291
275
  end
292
276
  # If we evaluated, let the loop know.
293
- return true
277
+ return evaluated
294
278
  else
295
279
  return false
296
280
  end
@@ -310,6 +294,9 @@ class Puppet::Parser::Compile
310
294
  done = false if evaluate_collections
311
295
  done = false if evaluate_definitions
312
296
  break if done
297
+
298
+ count += 1
299
+
313
300
  if count > 1000
314
301
  raise Puppet::ParseError, "Somehow looped more than 1000 times while evaluating host catalog"
315
302
  end
@@ -323,9 +310,7 @@ class Puppet::Parser::Compile
323
310
  @main_resource = Puppet::Parser::Resource.new(:type => "class", :title => :main, :scope => @topscope, :source => @main)
324
311
  @topscope.resource = @main_resource
325
312
 
326
- @catalog.add_vertex!(@main_resource)
327
-
328
- @resource_table["Class[main]"] = @main_resource
313
+ @catalog.add_resource(@main_resource)
329
314
 
330
315
  @main_resource.evaluate
331
316
  end
@@ -381,14 +366,28 @@ class Puppet::Parser::Compile
381
366
  # Make sure all of our resources and such have done any last work
382
367
  # necessary.
383
368
  def finish
384
- @resource_table.each { |name, resource| resource.finish if resource.respond_to?(:finish) }
369
+ #@catalog.resources.each do |name|
370
+ @catalog.vertices.each do |resource|
371
+ # Add in any resource overrides.
372
+ if overrides = resource_overrides(resource)
373
+ overrides.each do |over|
374
+ resource.merge(over)
375
+ end
376
+
377
+ # Remove the overrides, so that the configuration knows there
378
+ # are none left.
379
+ overrides.clear
380
+ end
381
+
382
+ resource.finish if resource.respond_to?(:finish)
383
+ end
385
384
  end
386
385
 
387
386
  # Initialize the top-level scope, class, and resource.
388
387
  def init_main
389
388
  # Create our initial scope and a resource that will evaluate main.
390
- @topscope = Puppet::Parser::Scope.new(:compile => self, :parser => self.parser)
391
- @scope_graph.add_vertex!(@topscope)
389
+ @topscope = Puppet::Parser::Scope.new(:compiler => self, :parser => self.parser)
390
+ @scope_graph.add_vertex(@topscope)
392
391
  end
393
392
 
394
393
  # Set up all of our internal variables.
@@ -397,9 +396,6 @@ class Puppet::Parser::Compile
397
396
  # be used by top scopes and node scopes.
398
397
  @class_scopes = {}
399
398
 
400
- # The table for all defined resources.
401
- @resource_table = {}
402
-
403
399
  # The list of objects that will available for export.
404
400
  @exported_resources = {}
405
401
 
@@ -413,11 +409,8 @@ class Puppet::Parser::Compile
413
409
  # but they each refer back to the scope that created them.
414
410
  @collections = []
415
411
 
416
- # A list of tags we've generated; most class names.
417
- @tags = []
418
-
419
412
  # A graph for maintaining scope relationships.
420
- @scope_graph = GRATR::Digraph.new
413
+ @scope_graph = Puppet::SimpleGraph.new
421
414
 
422
415
  # For maintaining the relationship between scopes and their resources.
423
416
  @catalog = Puppet::Node::Catalog.new(@node.name)
@@ -444,7 +437,7 @@ class Puppet::Parser::Compile
444
437
 
445
438
  # We used to have hooks here for forking and saving, but I don't
446
439
  # think it's worth retaining at this point.
447
- store_to_active_record(@node, @resource_table.values)
440
+ store_to_active_record(@node, @catalog.vertices)
448
441
  end
449
442
 
450
443
  # Do the actual storage.
@@ -467,9 +460,7 @@ class Puppet::Parser::Compile
467
460
  # Return an array of all of the unevaluated resources. These will be definitions,
468
461
  # which need to get evaluated into native resources.
469
462
  def unevaluated_resources
470
- ary = @resource_table.find_all do |name, object|
471
- ! object.builtin? and ! object.evaluated?
472
- end.collect { |name, object| object }
463
+ ary = @catalog.vertices.reject { |resource| resource.builtin? or resource.evaluated? }
473
464
 
474
465
  if ary.empty?
475
466
  return nil
@@ -477,33 +468,4 @@ class Puppet::Parser::Compile
477
468
  return ary
478
469
  end
479
470
  end
480
-
481
- # Verify that the given resource isn't defined elsewhere.
482
- def verify_uniqueness(resource)
483
- # Short-curcuit the common case,
484
- unless existing_resource = @resource_table[resource.ref]
485
- return true
486
- end
487
-
488
- if typeclass = Puppet::Type.type(resource.type) and ! typeclass.isomorphic?
489
- Puppet.info "Allowing duplicate %s" % typeclass.name
490
- return true
491
- end
492
-
493
- # Either it's a defined type, which are never
494
- # isomorphic, or it's a non-isomorphic type, so
495
- # we should throw an exception.
496
- msg = "Duplicate definition: %s is already defined" % resource.ref
497
-
498
- if existing_resource.file and existing_resource.line
499
- msg << " in file %s at line %s" %
500
- [existing_resource.file, existing_resource.line]
501
- end
502
-
503
- if resource.line or resource.file
504
- msg << "; cannot redefine"
505
- end
506
-
507
- raise Puppet::ParseError.new(msg)
508
- end
509
471
  end
@@ -111,7 +111,7 @@ module Functions
111
111
  vals = [vals] unless vals.is_a?(Array)
112
112
 
113
113
  # The 'false' disables lazy evaluation.
114
- klasses = compile.evaluate_classes(vals, self, false)
114
+ klasses = compiler.evaluate_classes(vals, self, false)
115
115
 
116
116
  missing = vals.find_all do |klass|
117
117
  ! klasses.include?(klass)
@@ -146,7 +146,7 @@ module Functions
146
146
  tells you whether the current container is tagged with the specified tags.
147
147
  The tags are ANDed, so that all of the specified tags must be included for
148
148
  the function to return true.") do |vals|
149
- configtags = compile.catalog.tags
149
+ configtags = compiler.catalog.tags
150
150
  resourcetags = resource.tags
151
151
 
152
152
  retval = true
@@ -235,7 +235,7 @@ module Functions
235
235
  vals = [vals] unless vals.is_a?(Array)
236
236
  coll.resources = vals
237
237
 
238
- compile.add_collection(coll)
238
+ compiler.add_collection(coll)
239
239
  end
240
240
 
241
241
  newfunction(:search, :doc => "Add another namespace for this class to search.
@@ -3,7 +3,7 @@ require 'timeout'
3
3
  require 'puppet/rails'
4
4
  require 'puppet/util/methodhelper'
5
5
  require 'puppet/parser/parser'
6
- require 'puppet/parser/compile'
6
+ require 'puppet/parser/compiler'
7
7
  require 'puppet/parser/scope'
8
8
 
9
9
  # The interpreter is a very simple entry-point class that
@@ -24,8 +24,13 @@ class Puppet::Parser::Interpreter
24
24
 
25
25
  # evaluate our whole tree
26
26
  def compile(node)
27
- raise Puppet::ParseError, "Could not parse configuration; cannot compile" unless env_parser = parser(node.environment)
28
- return Puppet::Parser::Compile.new(node, env_parser).compile
27
+ raise Puppet::ParseError, "Could not parse configuration; cannot compile on node %s" % node.name unless env_parser = parser(node.environment)
28
+ begin
29
+ return Puppet::Parser::Compiler.new(node, env_parser).compile
30
+ rescue => detail
31
+ puts detail.backtrace if Puppet[:trace]
32
+ raise Puppet::Error, detail.to_s + " on node %s" % node.name
33
+ end
29
34
  end
30
35
 
31
36
  # create our interpreter
@@ -42,6 +47,30 @@ class Puppet::Parser::Interpreter
42
47
  @parsers = {}
43
48
  end
44
49
 
50
+ # Return the parser for a specific environment.
51
+ def parser(environment)
52
+ if ! @parsers[environment] or @parsers[environment].reparse?
53
+ # This will throw an exception if it does not succeed. We only
54
+ # want to get rid of the old parser if we successfully create a new
55
+ # one.
56
+ begin
57
+ tmp = create_parser(environment)
58
+ @parsers[environment].clear if @parsers[environment]
59
+ @parsers[environment] = tmp
60
+ rescue => detail
61
+ # If a parser already exists, than assume that we logged the
62
+ # exception elsewhere and reuse the parser. If one doesn't
63
+ # exist, then reraise.
64
+ if @parsers[environment]
65
+ Puppet.err detail
66
+ else
67
+ raise detail
68
+ end
69
+ end
70
+ end
71
+ @parsers[environment]
72
+ end
73
+
45
74
  private
46
75
 
47
76
  # Create a new parser object and pre-parse the configuration.
@@ -67,24 +96,4 @@ class Puppet::Parser::Interpreter
67
96
  raise error
68
97
  end
69
98
  end
70
-
71
- # Return the parser for a specific environment.
72
- def parser(environment)
73
- if ! @parsers[environment] or @parsers[environment].reparse?
74
- # This will throw an exception if it does not succeed. We only
75
- # want to get rid of the old parser if we successfully create a new
76
- # one.
77
- begin
78
- tmp = create_parser(environment)
79
- @parsers[environment].clear if @parsers[environment]
80
- @parsers[environment] = tmp
81
- rescue => detail
82
- # If a parser already exists, than assume that we logged the
83
- # exception elsewhere and reuse the parser. If one doesn't
84
- # exist, then reraise.
85
- raise detail unless @parsers[environment]
86
- end
87
- end
88
- @parsers[environment]
89
- end
90
99
  end