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.
- data/CHANGELOG +94 -0
- data/Rakefile +0 -4
- data/bin/puppet +18 -10
- data/bin/puppetd +1 -1
- data/bin/puppetdoc +14 -4
- data/bin/puppetmasterd +1 -1
- data/bin/puppetrun +3 -8
- data/bin/ralsh +12 -11
- data/conf/freebsd/puppetd +1 -1
- data/conf/freebsd/puppetmasterd +1 -1
- data/conf/gentoo/puppet/puppet.conf +29 -0
- data/conf/namespaceauth.conf +20 -0
- data/conf/redhat/puppet.spec +4 -1
- data/conf/solaris/smf/puppetd.xml +1 -1
- data/conf/solaris/smf/puppetmasterd.xml +1 -1
- data/conf/suse/puppet.spec +10 -8
- data/examples/root/etc/puppet/{puppetmasterd.conf → puppet.conf} +6 -3
- data/ext/logcheck/puppet +7 -0
- data/ext/puppet-test +28 -5
- data/lib/puppet.rb +2 -1
- data/lib/puppet/defaults.rb +12 -5
- data/lib/puppet/dsl.rb +43 -45
- data/lib/puppet/external/{gratr/rdot.rb → dot.rb} +0 -0
- data/lib/puppet/external/nagios.rb +50 -0
- data/lib/puppet/external/nagios/base.rb +421 -0
- data/lib/puppet/external/nagios/parser.rb +816 -0
- data/lib/puppet/file_serving/file_base.rb +16 -3
- data/lib/puppet/file_serving/metadata.rb +29 -11
- data/lib/puppet/indirector/terminus.rb +1 -0
- data/lib/puppet/metatype/closure.rb +4 -0
- data/lib/puppet/metatype/evaluation.rb +2 -17
- data/lib/puppet/metatype/metaparams.rb +1 -1
- data/lib/puppet/network.rb +3 -0
- data/lib/puppet/network/client.rb +4 -5
- data/lib/puppet/network/client/master.rb +10 -7
- data/lib/puppet/network/handler/fileserver.rb +22 -45
- data/lib/puppet/network/http_pool.rb +3 -0
- data/lib/puppet/network/http_server/mongrel.rb +7 -1
- data/lib/puppet/network/http_server/webrick.rb +4 -3
- data/lib/puppet/network/xmlrpc/client.rb +12 -1
- data/lib/puppet/node/catalog.rb +51 -40
- data/lib/puppet/parser/ast.rb +27 -49
- data/lib/puppet/parser/ast/astarray.rb +5 -24
- data/lib/puppet/parser/ast/caseopt.rb +4 -4
- data/lib/puppet/parser/ast/casestatement.rb +4 -5
- data/lib/puppet/parser/ast/collection.rb +3 -5
- data/lib/puppet/parser/ast/collexpr.rb +3 -5
- data/lib/puppet/parser/ast/definition.rb +148 -159
- data/lib/puppet/parser/ast/else.rb +2 -3
- data/lib/puppet/parser/ast/function.rb +3 -10
- data/lib/puppet/parser/ast/hostclass.rb +66 -59
- data/lib/puppet/parser/ast/ifstatement.rb +4 -5
- data/lib/puppet/parser/ast/leaf.rb +6 -6
- data/lib/puppet/parser/ast/node.rb +26 -58
- data/lib/puppet/parser/ast/resource.rb +5 -7
- data/lib/puppet/parser/ast/resource_defaults.rb +2 -4
- data/lib/puppet/parser/ast/resource_override.rb +4 -6
- data/lib/puppet/parser/ast/resource_reference.rb +2 -4
- data/lib/puppet/parser/ast/resourceparam.rb +2 -4
- data/lib/puppet/parser/ast/selector.rb +5 -6
- data/lib/puppet/parser/ast/tag.rb +2 -4
- data/lib/puppet/parser/ast/vardef.rb +3 -4
- data/lib/puppet/parser/collector.rb +5 -5
- data/lib/puppet/parser/{compile.rb → compiler.rb} +69 -107
- data/lib/puppet/parser/functions.rb +3 -3
- data/lib/puppet/parser/interpreter.rb +32 -23
- data/lib/puppet/parser/lexer.rb +391 -282
- data/lib/puppet/parser/parser.rb +5 -4
- data/lib/puppet/parser/parser_support.rb +3 -6
- data/lib/puppet/parser/resource.rb +24 -36
- data/lib/puppet/parser/resource/param.rb +1 -1
- data/lib/puppet/parser/resource/reference.rb +7 -3
- data/lib/puppet/parser/scope.rb +12 -7
- data/lib/puppet/parser/templatewrapper.rb +1 -1
- data/lib/puppet/pgraph.rb +9 -98
- data/lib/puppet/provider/interface/redhat.rb +65 -65
- data/lib/puppet/provider/mount/parsed.rb +1 -1
- data/lib/puppet/provider/naginator.rb +55 -0
- data/lib/puppet/provider/nameservice/directoryservice.rb +6 -7
- data/lib/puppet/provider/package/fink.rb +0 -2
- data/lib/puppet/provider/package/gem.rb +9 -5
- data/lib/puppet/provider/package/openbsd.rb +1 -1
- data/lib/puppet/provider/package/pkgdmg.rb +3 -8
- data/lib/puppet/provider/package/portage.rb +4 -4
- data/lib/puppet/provider/package/yumhelper.py +8 -6
- data/lib/puppet/provider/parsedfile.rb +7 -1
- data/lib/puppet/provider/service/debian.rb +2 -0
- data/lib/puppet/provider/service/gentoo.rb +4 -0
- data/lib/puppet/provider/service/init.rb +1 -1
- data/lib/puppet/provider/sshkey/parsed.rb +2 -0
- data/lib/puppet/provider/user/useradd.rb +1 -1
- data/lib/puppet/rails.rb +4 -0
- data/lib/puppet/rails/database/001_add_created_at_to_all_tables.rb +17 -0
- data/lib/puppet/rails/fact_value.rb +4 -0
- data/lib/puppet/rails/host.rb +1 -2
- data/lib/puppet/rails/param_value.rb +4 -0
- data/lib/puppet/rails/resource_tag.rb +4 -0
- data/lib/puppet/rails/source_file.rb +4 -1
- data/lib/puppet/relationship.rb +5 -1
- data/lib/puppet/reports/tagmail.rb +12 -1
- data/lib/puppet/resource_reference.rb +1 -1
- data/lib/puppet/simple_graph.rb +78 -11
- data/lib/puppet/sslcertificates.rb +1 -1
- data/lib/puppet/sslcertificates/ca.rb +3 -3
- data/lib/puppet/transaction.rb +7 -4
- data/lib/puppet/transportable.rb +1 -1
- data/lib/puppet/type.rb +3 -10
- data/lib/puppet/type/cron.rb +18 -0
- data/lib/puppet/type/exec.rb +18 -12
- data/lib/puppet/type/{pfile.rb → file.rb} +66 -84
- data/lib/puppet/type/file/checksum.rb +271 -0
- data/lib/puppet/type/{pfile → file}/content.rb +10 -15
- data/lib/puppet/type/{pfile → file}/ensure.rb +15 -8
- data/lib/puppet/type/{pfile → file}/group.rb +0 -0
- data/lib/puppet/type/{pfile → file}/mode.rb +0 -0
- data/lib/puppet/type/{pfile → file}/owner.rb +0 -0
- data/lib/puppet/type/{pfile → file}/source.rb +34 -48
- data/lib/puppet/type/{pfile → file}/target.rb +0 -0
- data/lib/puppet/type/{pfile → file}/type.rb +0 -0
- data/lib/puppet/type/{pfilebucket.rb → filebucket.rb} +0 -0
- data/lib/puppet/type/host.rb +13 -0
- data/lib/puppet/type/mailalias.rb +1 -1
- data/lib/puppet/type/nagios_command.rb +3 -0
- data/lib/puppet/type/nagios_contact.rb +3 -0
- data/lib/puppet/type/nagios_contactgroup.rb +3 -0
- data/lib/puppet/type/nagios_host.rb +3 -0
- data/lib/puppet/type/nagios_hostextinfo.rb +3 -0
- data/lib/puppet/type/nagios_hostgroup.rb +3 -0
- data/lib/puppet/type/nagios_hostgroupescalation.rb +3 -0
- data/lib/puppet/type/nagios_service.rb +3 -0
- data/lib/puppet/type/nagios_servicedependency.rb +3 -0
- data/lib/puppet/type/nagios_serviceescalation.rb +3 -0
- data/lib/puppet/type/nagios_serviceextinfo.rb +3 -0
- data/lib/puppet/type/nagios_timeperiod.rb +3 -0
- data/lib/puppet/type/package.rb +4 -12
- data/lib/puppet/type/service.rb +9 -0
- data/lib/puppet/type/sshkey.rb +3 -3
- data/lib/puppet/util/autoload.rb +5 -5
- data/lib/puppet/util/checksums.rb +51 -13
- data/lib/puppet/util/constant_inflector.rb +14 -0
- data/lib/puppet/util/filetype.rb +1 -1
- data/lib/puppet/util/graph.rb +3 -9
- data/lib/puppet/util/nagios_maker.rb +57 -0
- data/lib/puppet/util/settings.rb +19 -16
- data/lib/puppet/util/tagging.rb +39 -0
- data/test/executables/puppetbin.rb +17 -0
- data/test/language/ast.rb +8 -58
- data/test/language/ast/casestatement.rb +3 -3
- data/test/language/ast/resource.rb +6 -7
- data/test/language/ast/resource_reference.rb +12 -12
- data/test/language/ast/selector.rb +2 -2
- data/test/language/ast/variable.rb +2 -2
- data/test/language/functions.rb +24 -24
- data/test/language/parser.rb +20 -8
- data/test/language/resource.rb +5 -42
- data/test/language/scope.rb +21 -37
- data/test/language/snippets.rb +7 -0
- data/test/lib/puppettest.rb +28 -14
- data/test/lib/puppettest/parsertesting.rb +10 -10
- data/test/lib/puppettest/support/resources.rb +1 -1
- data/test/network/client/master.rb +10 -0
- data/test/network/handler/fileserver.rb +51 -49
- data/test/network/server/webrick.rb +1 -1
- data/test/other/dsl.rb +3 -4
- data/test/other/transactions.rb +6 -4
- data/test/rails/ast.rb +2 -2
- data/test/rails/configuration.rb +1 -1
- data/test/rails/railsparameter.rb +2 -0
- data/test/rails/railsresource.rb +1 -0
- data/test/ral/manager/type.rb +4 -4
- data/test/ral/providers/cron/crontab.rb +3 -1
- data/test/ral/providers/package.rb +1 -1
- data/test/ral/{types → type}/basic.rb +2 -2
- data/test/ral/{types → type}/cron.rb +0 -0
- data/test/ral/{types → type}/exec.rb +42 -2
- data/test/ral/{types → type}/file.rb +34 -79
- data/test/ral/{types → type}/file/target.rb +0 -0
- data/test/ral/{types → type}/filebucket.rb +0 -0
- data/test/ral/{types → type}/fileignoresource.rb +0 -0
- data/test/ral/{types → type}/filesources.rb +8 -27
- data/test/ral/{types → type}/group.rb +0 -0
- data/test/ral/{types → type}/host.rb +16 -0
- data/test/ral/{types → type}/mailalias.rb +0 -0
- data/test/ral/{types → type}/parameter.rb +0 -0
- data/test/ral/{types → type}/port.rb +0 -0
- data/test/ral/{types → type}/property.rb +0 -0
- data/test/ral/{types → type}/resources.rb +0 -0
- data/test/ral/{types → type}/service.rb +0 -0
- data/test/ral/{types → type}/sshkey.rb +0 -0
- data/test/ral/{types → type}/tidy.rb +1 -0
- data/test/ral/{types → type}/user.rb +0 -0
- data/test/ral/{types → type}/yumrepo.rb +0 -0
- data/test/ral/{types → type}/zone.rb +0 -0
- data/test/util/autoload.rb +24 -5
- metadata +60 -107
- data/conf/gentoo/puppet/puppetca.conf +0 -29
- data/conf/gentoo/puppet/puppetd.conf +0 -29
- data/conf/gentoo/puppet/puppetmasterd.conf +0 -29
- data/examples/root/etc/puppet/puppetd.conf +0 -4
- data/lib/puppet/external/gratr.rb +0 -33
- data/lib/puppet/external/gratr/adjacency_graph.rb +0 -257
- data/lib/puppet/external/gratr/base.rb +0 -34
- data/lib/puppet/external/gratr/biconnected.rb +0 -116
- data/lib/puppet/external/gratr/chinese_postman.rb +0 -123
- data/lib/puppet/external/gratr/common.rb +0 -73
- data/lib/puppet/external/gratr/comparability.rb +0 -92
- data/lib/puppet/external/gratr/digraph.rb +0 -116
- data/lib/puppet/external/gratr/digraph_distance.rb +0 -185
- data/lib/puppet/external/gratr/dot.rb +0 -90
- data/lib/puppet/external/gratr/edge.rb +0 -145
- data/lib/puppet/external/gratr/graph.rb +0 -303
- data/lib/puppet/external/gratr/graph_api.rb +0 -83
- data/lib/puppet/external/gratr/import.rb +0 -44
- data/lib/puppet/external/gratr/labels.rb +0 -90
- data/lib/puppet/external/gratr/maximum_flow.rb +0 -64
- data/lib/puppet/external/gratr/search.rb +0 -409
- data/lib/puppet/external/gratr/strong_components.rb +0 -127
- data/lib/puppet/external/gratr/undirected_graph.rb +0 -153
- data/lib/puppet/rails/external/tagging/acts_as_taggable.rb +0 -62
- data/lib/puppet/rails/external/tagging/init.rb +0 -5
- data/lib/puppet/rails/external/tagging/tag.rb +0 -50
- data/lib/puppet/rails/external/tagging/tagging.rb +0 -12
- data/lib/puppet/rails/puppet_class.rb +0 -6
- data/lib/puppet/reference/node_source.rb +0 -9
- data/lib/puppet/reference/report.rb +0 -21
- data/lib/puppet/type/pfile/checksum.rb +0 -326
- data/test/language/ast/definition.rb +0 -166
- data/test/language/ast/hostclass.rb +0 -184
- data/test/language/compile.rb +0 -569
- data/test/language/lexer.rb +0 -276
- data/test/lib/mocha.rb +0 -19
- data/test/lib/mocha/any_instance_method.rb +0 -35
- data/test/lib/mocha/auto_verify.rb +0 -113
- data/test/lib/mocha/central.rb +0 -35
- data/test/lib/mocha/class_method.rb +0 -62
- data/test/lib/mocha/deprecation.rb +0 -22
- data/test/lib/mocha/exception_raiser.rb +0 -17
- data/test/lib/mocha/expectation.rb +0 -378
- data/test/lib/mocha/expectation_error.rb +0 -6
- data/test/lib/mocha/infinite_range.rb +0 -25
- data/test/lib/mocha/inspect.rb +0 -39
- data/test/lib/mocha/instance_method.rb +0 -8
- data/test/lib/mocha/is_a.rb +0 -9
- data/test/lib/mocha/metaclass.rb +0 -7
- data/test/lib/mocha/missing_expectation.rb +0 -27
- data/test/lib/mocha/mock.rb +0 -207
- data/test/lib/mocha/multiple_yields.rb +0 -20
- data/test/lib/mocha/no_yields.rb +0 -11
- data/test/lib/mocha/object.rb +0 -110
- data/test/lib/mocha/parameter_matchers.rb +0 -9
- data/test/lib/mocha/parameter_matchers/all_of.rb +0 -39
- data/test/lib/mocha/parameter_matchers/any_of.rb +0 -44
- data/test/lib/mocha/parameter_matchers/anything.rb +0 -30
- data/test/lib/mocha/parameter_matchers/has_entry.rb +0 -39
- data/test/lib/mocha/parameter_matchers/has_key.rb +0 -39
- data/test/lib/mocha/parameter_matchers/has_value.rb +0 -39
- data/test/lib/mocha/parameter_matchers/includes.rb +0 -37
- data/test/lib/mocha/pretty_parameters.rb +0 -28
- data/test/lib/mocha/return_values.rb +0 -31
- data/test/lib/mocha/setup_and_teardown.rb +0 -23
- data/test/lib/mocha/single_return_value.rb +0 -24
- data/test/lib/mocha/single_yield.rb +0 -18
- data/test/lib/mocha/standalone.rb +0 -32
- data/test/lib/mocha/stub.rb +0 -18
- data/test/lib/mocha/test_case_adapter.rb +0 -49
- 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(
|
12
|
-
|
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(
|
13
|
-
|
14
|
-
|
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 (
|
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.
|
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
|
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.
|
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.
|
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::
|
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?
|
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
|
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
|
-
#
|
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
|
-
|
126
|
-
|
127
|
-
resource =
|
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(
|
145
|
-
|
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, "
|
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[:
|
185
|
+
options[:compiler] = self
|
176
186
|
options[:parser] ||= self.parser
|
177
187
|
scope = Puppet::Parser::Scope.new(options)
|
178
|
-
@scope_graph.add_edge
|
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
|
-
@
|
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 =
|
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.
|
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
|
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.
|
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
|
-
|
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(:
|
391
|
-
@scope_graph.add_vertex
|
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 =
|
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, @
|
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 = @
|
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 =
|
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 =
|
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
|
-
|
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/
|
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
|
-
|
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
|