This experimental patch is intended to add support for param classes to the
ENC.
The patch does the following:
1. adds the ability to accept attributes to ensure_in_catalog
2. added hash support for a node's classes to accept a hash
Signed-off-by: Dan Bode <[email protected]>
---
lib/puppet/parser/compiler.rb | 17 ++++++++++++++++-
lib/puppet/resource/type.rb | 5 ++++-
spec/unit/parser/compiler_spec.rb | 22 ++++++++++++++++++++++
3 files changed, 42 insertions(+), 2 deletions(-)
diff --git a/lib/puppet/parser/compiler.rb b/lib/puppet/parser/compiler.rb
index c60e1d4..e29bdd7 100644
--- a/lib/puppet/parser/compiler.rb
+++ b/lib/puppet/parser/compiler.rb
@@ -129,6 +129,17 @@ class Puppet::Parser::Compiler
# Evaluate all of the classes specified by the node.
def evaluate_node_classes
+ if @node.classes.class == Hash
+ @node.classes.each do |name, params|
+ params ||= {}
+ # I have to find the hostclass
+ if klass = topscope.find_hostclass(name)
+ #resource = Puppet::Resource::Type.new(:hostclass, name)
+ klass.ensure_in_catalog(topscope, params)
+ end
+ end
+ @node.classes = @node.classes.keys
+ end
evaluate_classes(@node.classes, topscope)
end
@@ -432,7 +443,11 @@ class Puppet::Parser::Compiler
@resources = []
# Make sure any external node classes are in our class list
- @catalog.add_class(*[email protected])
+ if @node.classes.class == Hash
+ @catalog.add_class(*[email protected])
+ else
+ @catalog.add_class(*[email protected])
+ end
end
# Set the node's parameters into the top-scope as variables.
diff --git a/lib/puppet/resource/type.rb b/lib/puppet/resource/type.rb
index d40adc1..80d1133 100644
--- a/lib/puppet/resource/type.rb
+++ b/lib/puppet/resource/type.rb
@@ -143,7 +143,7 @@ class Puppet::Resource::Type
# classes and nodes. No parameters are be supplied--if this is a
# parameterized class, then all parameters take on their default
# values.
- def ensure_in_catalog(scope)
+ def ensure_in_catalog(scope, attributes={})
type == :definition and raise ArgumentError, "Cannot create resources for
defined resource types"
resource_type = type == :hostclass ? :class : :node
@@ -155,6 +155,9 @@ class Puppet::Resource::Type
end
resource = Puppet::Parser::Resource.new(resource_type, name, :scope =>
scope, :source => self)
+ attributes.each do |k,v|
+ resource.set_parameter(k,v)
+ end
instantiate_resource(scope, resource)
scope.compiler.add_resource(scope, resource)
resource
diff --git a/spec/unit/parser/compiler_spec.rb
b/spec/unit/parser/compiler_spec.rb
index 95f3853..f569328 100755
--- a/spec/unit/parser/compiler_spec.rb
+++ b/spec/unit/parser/compiler_spec.rb
@@ -109,6 +109,16 @@ describe Puppet::Parser::Compiler do
compiler.classlist.should include("bar")
end
+ it "should transform node class hashes into a class list" do
+ node = Puppet::Node.new("mynode")
+ @node.classes = {'foo'=>{'one'=>'1'}, 'bar'=>{'two'=>'2'}}
+ node.classes = {'foo'=>{'one'=>'1'}, 'bar'=>{'two'=>'2'}}
+ compiler = Puppet::Parser::Compiler.new(node)
+
+ compiler.classlist.should include("foo")
+ compiler.classlist.should include("bar")
+ end
+
it "should add a 'main' stage to the catalog" do
@compiler.catalog.resource(:stage, :main).should
be_instance_of(Puppet::Parser::Resource)
end
@@ -185,6 +195,18 @@ describe Puppet::Parser::Compiler do
@compiler.class.publicize_methods(:evaluate_node_classes) {
@compiler.evaluate_node_classes }
end
+ it "should evaluate any parameterized classes named in the node" do
+ classes = {'foo'=>{'one'=>'1'}, 'bar'=>{'two'=>'2'}}
+ main = stub 'main'
+ one = stub 'one', :name => "one"
+ three = stub 'three', :name => "three"
+ @node.stubs(:name).returns("whatever")
+ @node.stubs(:classes).returns(classes)
+
+ @compiler.expects(:evaluate_classes).with(classes, @compiler.topscope)
+ @compiler.class.publicize_methods(:evaluate_node_classes) {
@compiler.evaluate_node_classes }
+ end
+
it "should evaluate the main class if it exists" do
compile_stub(:evaluate_main)
main_class = @known_resource_types.add
Puppet::Resource::Type.new(:hostclass, "")
--
1.5.5.6
--
You received this message because you are subscribed to the Google Groups
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/puppet-dev?hl=en.