Hi Dan,

I'm interested in testing this.  Where is this code available?  And do you have 
an example ENC plugin that uses it?

On Jan 3, 2011, at 1:39 PM, Dan Bode wrote:

>    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.
> 


-- 
To get back my youth I would do anything in the world, except take
exercise, get up early, or be respectable.  -- Oscar Wilde
---------------------------------------------------------------------
Luke Kanies  -|-   http://puppetlabs.com   -|-   +1(615)594-8199




-- 
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