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.

Reply via email to