summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/puppet/parser/ast/definition.rb114
-rw-r--r--lib/puppet/parser/ast/hostclass.rb19
-rw-r--r--lib/puppet/parser/ast/node.rb8
-rw-r--r--lib/puppet/parser/resource.rb18
-rw-r--r--lib/puppet/parser/resource/reference.rb23
5 files changed, 92 insertions, 90 deletions
diff --git a/lib/puppet/parser/ast/definition.rb b/lib/puppet/parser/ast/definition.rb
index c44f0f903..cd59da8af 100644
--- a/lib/puppet/parser/ast/definition.rb
+++ b/lib/puppet/parser/ast/definition.rb
@@ -27,26 +27,14 @@ class Puppet::Parser::AST
false
end
- def evaluate_resource(hash)
- origscope = hash[:scope]
- title = hash[:title]
- args = symbolize_options(hash[:arguments] || {})
+ def evaluate(options)
+ origscope = options[:scope]
+ resource = options[:resource]
- name = args[:name] || title
-
- exported = hash[:exported]
- virtual = hash[:virtual]
-
- pscope = origscope
- scope = subscope(pscope, title)
-
- if virtual or origscope.virtual?
- scope.virtual = true
- end
-
- if exported or origscope.exported?
- scope.exported = true
- end
+ # Create a new scope.
+ scope = subscope(origscope, resource.title)
+ scope.virtual = true if resource.virtual or origscope.virtual?
+ scope.exported = true if resource.exported or origscope.exported?
# Additionally, add a tag for whatever kind of class
# we are
@@ -54,51 +42,13 @@ class Puppet::Parser::AST
@classname.split(/::/).each { |tag| scope.tag(tag) }
end
- [name, title].each do |str|
+ [resource.name, resource.title].each do |str|
unless str.nil? or str =~ /[^\w]/ or str == ""
scope.tag(str)
end
end
- # define all of the arguments in our local scope
- if self.arguments
- # Verify that all required arguments are either present or
- # have been provided with defaults.
- self.arguments.each { |arg, default|
- arg = symbolize(arg)
- unless args.include?(arg)
- if defined? default and ! default.nil?
- default = default.safeevaluate :scope => scope
- args[arg] = default
- #Puppet.debug "Got default %s for %s in %s" %
- # [default.inspect, arg.inspect, @name.inspect]
- else
- parsefail "Must pass %s to %s of type %s" %
- [arg,title,@classname]
- end
- end
- }
- end
-
- # Set each of the provided arguments as variables in the
- # component's scope.
- args.each { |arg,value|
- unless validattr?(arg)
- parsefail "%s does not accept attribute %s" % [@classname, arg]
- end
-
- exceptwrap do
- scope.setvar(arg.to_s,args[arg])
- end
- }
-
- unless args.include? :title
- scope.setvar("title",title)
- end
-
- unless args.include? :name
- scope.setvar("name",name)
- end
+ set_resource_parameters(scope, resource)
if self.code
return self.code.safeevaluate(:scope => scope)
@@ -130,7 +80,7 @@ class Puppet::Parser::AST
@arguments.each do |arg, defvalue|
next unless Puppet::Type.metaparamclass(arg)
if defvalue
- warnonce "%s is a metaparam; this value will inherit to all contained elements" % arg
+ warnonce "%s is a metaparam; this value will inherit to all contained resources" % arg
else
raise Puppet::ParseError,
"%s is a metaparameter; please choose another name" %
@@ -183,6 +133,7 @@ class Puppet::Parser::AST
}
args[:name] = name if name
+ oldscope = scope
scope = scope.newscope(args)
scope.source = self
@@ -220,7 +171,46 @@ class Puppet::Parser::AST
return false
end
end
+
+ private
+
+ # Set any arguments passed by the resource as variables in the scope.
+ def set_resource_parameters(scope, resource)
+ args = symbolize_options(resource.to_hash || {})
+
+ # Verify that all required arguments are either present or
+ # have been provided with defaults.
+ if self.arguments
+ self.arguments.each { |arg, default|
+ arg = symbolize(arg)
+ unless args.include?(arg)
+ if defined? default and ! default.nil?
+ default = default.safeevaluate :scope => scope
+ args[arg] = default
+ #Puppet.debug "Got default %s for %s in %s" %
+ # [default.inspect, arg.inspect, @name.inspect]
+ else
+ parsefail "Must pass %s to %s of type %s" %
+ [arg,title,@classname]
+ end
+ end
+ }
+ end
+
+ # Set each of the provided arguments as variables in the
+ # definition's scope.
+ args.each { |arg,value|
+ unless validattr?(arg)
+ parsefail "%s does not accept attribute %s" % [@classname, arg]
+ end
+
+ exceptwrap do
+ scope.setvar(arg.to_s, args[arg])
+ end
+ }
+
+ scope.setvar("title", resource.title) unless args.include? :title
+ scope.setvar("name", resource.name) unless args.include? :name
+ end
end
end
-
-# $Id$
diff --git a/lib/puppet/parser/ast/hostclass.rb b/lib/puppet/parser/ast/hostclass.rb
index f3b0602b1..8959dc900 100644
--- a/lib/puppet/parser/ast/hostclass.rb
+++ b/lib/puppet/parser/ast/hostclass.rb
@@ -1,7 +1,7 @@
require 'puppet/parser/ast/definition'
class Puppet::Parser::AST
- # The code associated with a class. This is different from components
+ # The code associated with a class. This is different from definitions
# in that each class is a singleton -- only one will exist for a given
# node.
class HostClass < AST::Definition
@@ -20,14 +20,11 @@ class Puppet::Parser::AST
end
# Evaluate the code associated with this class.
- def evaluate(hash)
- scope = hash[:scope]
- args = hash[:arguments]
-
- # Verify that we haven't already been evaluated, and if we have been evaluated,
- # make sure that we match the class.
+ def evaluate(options)
+ scope = options[:scope]
+ # Verify that we haven't already been evaluated. This is
+ # what provides the singleton aspect.
if existing_scope = scope.class_scope(self)
- #if existing_scope.source.object_id == self.object_id
Puppet.debug "%s class already evaluated" % @type
return nil
end
@@ -40,7 +37,7 @@ class Puppet::Parser::AST
pnames = scope.namespaces
end
- unless hash[:nosubscope]
+ unless options[:nosubscope]
scope = subscope(scope)
end
@@ -62,7 +59,7 @@ class Puppet::Parser::AST
end
end
- def initialize(hash)
+ def initialize(options)
@parentclass = nil
super
end
@@ -76,5 +73,3 @@ class Puppet::Parser::AST
end
end
end
-
-# $Id$
diff --git a/lib/puppet/parser/ast/node.rb b/lib/puppet/parser/ast/node.rb
index b9052168a..695c15f42 100644
--- a/lib/puppet/parser/ast/node.rb
+++ b/lib/puppet/parser/ast/node.rb
@@ -8,10 +8,10 @@ class Puppet::Parser::AST
attr_accessor :name
#def evaluate(scope, facts = {})
- def evaluate(hash)
- scope = hash[:scope]
+ def evaluate(options)
+ scope = options[:scope]
- #pscope = if ! Puppet[:lexical] or hash[:asparent]
+ #pscope = if ! Puppet[:lexical] or options[:asparent]
# @scope
#else
# origscope
@@ -43,7 +43,7 @@ class Puppet::Parser::AST
return scope
end
- def initialize(hash)
+ def initialize(options)
@parentclass = nil
super
diff --git a/lib/puppet/parser/resource.rb b/lib/puppet/parser/resource.rb
index 3940e5fc2..0fdb25748 100644
--- a/lib/puppet/parser/resource.rb
+++ b/lib/puppet/parser/resource.rb
@@ -3,7 +3,6 @@
class Puppet::Parser::Resource
require 'puppet/parser/resource/param'
require 'puppet/parser/resource/reference'
- ResParam = Struct.new :name, :value, :source, :line, :file
include Puppet::Util
include Puppet::Util::MethodHelper
include Puppet::Util::Errors
@@ -52,13 +51,7 @@ class Puppet::Parser::Resource
if klass = @ref.definedtype
finish()
scope.compile.delete_resource(self)
- return klass.evaluate_resource(:scope => scope,
- :type => self.type,
- :title => self.title,
- :arguments => self.to_hash,
- :virtual => self.virtual,
- :exported => self.exported
- )
+ return klass.evaluate(:scope => scope, :resource => self)
elsif builtin?
devfail "Cannot evaluate a builtin type"
else
@@ -188,6 +181,15 @@ class Puppet::Parser::Resource
})
end
+ # Return the resource name, or the title if no name
+ # was specified.
+ def name
+ unless defined? @name
+ @name = self[:name] || self.title
+ end
+ @name
+ end
+
# This *significantly* reduces the number of calls to Puppet.[].
def paramcheck?
unless defined? @@paramcheck
diff --git a/lib/puppet/parser/resource/reference.rb b/lib/puppet/parser/resource/reference.rb
index b19dd2258..0c3b61930 100644
--- a/lib/puppet/parser/resource/reference.rb
+++ b/lib/puppet/parser/resource/reference.rb
@@ -15,7 +15,7 @@ class Puppet::Parser::Resource::Reference
end
end
- self.builtin
+ @builtin
end
def builtintype
@@ -26,13 +26,28 @@ class Puppet::Parser::Resource::Reference
end
end
- # Return the defined type for our obj.
+ # Return the defined type for our obj. This can return classes,
+ # definitions or nodes.
def definedtype
unless defined? @definedtype
- if tmp = @scope.finddefine(self.type)
+ type = self.type.to_s.downcase
+ name = self.title
+ case type
+ when "class": # look for host classes
+ tmp = @scope.findclass(self.title)
+ when "node": # look for node definitions
+ tmp = @scope.parser.nodes[self.title]
+ else # normal definitions
+ # We have to swap these variables around so the errors are right.
+ name = type
+ type = "type"
+ tmp = @scope.finddefine(self.type)
+ end
+
+ if tmp
@definedtype = tmp
else
- fail Puppet::ParseError, "Could not find resource type '%s'" % self.type
+ fail Puppet::ParseError, "Could not find resource %s '%s'" % [type, name]
end
end