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.
