summaryrefslogtreecommitdiffstats
path: root/lib/puppet/parser
diff options
context:
space:
mode:
authorLuke Kanies <luke@madstop.com>2007-09-03 18:01:00 -0500
committerLuke Kanies <luke@madstop.com>2007-09-03 18:01:00 -0500
commitb021587e309f237bd16bd4f5cc51e79266cbd222 (patch)
treeb46de15108c7f1fcf50b67a54bcb8f528854e566 /lib/puppet/parser
parent25f6d7c521cb0189cf691fb1c4bce4b675568300 (diff)
downloadpuppet-b021587e309f237bd16bd4f5cc51e79266cbd222.tar.gz
puppet-b021587e309f237bd16bd4f5cc51e79266cbd222.tar.xz
puppet-b021587e309f237bd16bd4f5cc51e79266cbd222.zip
Doing a small amount of refactoring, toward being able to use Parser resources to evaluate classes and nodes, not just definitions. This will hopefully simplify some of the parsing work, and it will enable the use of a Configuration object that more completely models a configuration.
Diffstat (limited to 'lib/puppet/parser')
-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