summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrice Figureau <brice-puppet@daysofwonder.com>2009-02-05 19:55:29 +0100
committerJames Turnbull <james@lovedthanlost.net>2009-02-11 08:51:58 +1100
commit6331bfc9b6dc5140147730b3c4f79fef35265a94 (patch)
treebb615887165ad10933425e9aa5dbeaa7a5c353a6
parent7e036eb761539d58794469ecf14ee7e94d10a5fc (diff)
downloadpuppet-6331bfc9b6dc5140147730b3c4f79fef35265a94.tar.gz
puppet-6331bfc9b6dc5140147730b3c4f79fef35265a94.tar.xz
puppet-6331bfc9b6dc5140147730b3c4f79fef35265a94.zip
Fix #1682 - Resource titles are not flattened as they should
The following manifest: $groups = ["foo", "bar"] $type_groups = ["baz", "quux"] $user_groups = [$groups, $type_groups] notify{ $user_groups: } which outputs: notice: foo notice: //Notify[foobar]/message: defined 'message' as 'foo' notice: baz notice: //Notify[bazquux]/message: defined 'message' as 'baz' is not equivalent to $user_groups = [ ["foo", "bar"], ["baz", "quux"] ] notify{ $user_groups: } which outputs: notice: foo notice: //Notify[foo]/message: defined 'message' as 'foo' notice: baz notice: //Notify[baz]/message: defined 'message' as 'baz' notice: bar notice: //Notify[bar]/message: defined 'message' as 'bar' notice: quux notice: //Notify[quux]/message: defined 'message' as 'quux' Obviously the second one manages to flatten the arrays and not the first one. This changeset adds flattening to the resource titles evaluations in order to be consitent in all cases. Signed-off-by: Brice Figureau <brice-puppet@daysofwonder.com>
-rw-r--r--lib/puppet/parser/ast/resource.rb2
-rwxr-xr-xspec/unit/parser/ast/resource.rb90
2 files changed, 91 insertions, 1 deletions
diff --git a/lib/puppet/parser/ast/resource.rb b/lib/puppet/parser/ast/resource.rb
index 1a07fc585..802410b20 100644
--- a/lib/puppet/parser/ast/resource.rb
+++ b/lib/puppet/parser/ast/resource.rb
@@ -30,7 +30,7 @@ class Resource < AST::ResourceReference
# This is where our implicit iteration takes place; if someone
# passed an array as the name, then we act just like the called us
# many times.
- objtitles.collect { |objtitle|
+ objtitles.flatten.collect { |objtitle|
exceptwrap :type => Puppet::ParseError do
exp = self.exported || scope.resource.exported?
# We want virtual to be true if exported is true. We can't
diff --git a/spec/unit/parser/ast/resource.rb b/spec/unit/parser/ast/resource.rb
new file mode 100755
index 000000000..1546d657f
--- /dev/null
+++ b/spec/unit/parser/ast/resource.rb
@@ -0,0 +1,90 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+describe Puppet::Parser::AST::Resource do
+
+ ast = Puppet::Parser::AST
+
+ before :each do
+ @title = stub_everything 'title'
+ @compiler = stub_everything 'compiler'
+ @scope = Puppet::Parser::Scope.new(:compiler => @compiler)
+ @param1 = stub_everything 'parameter', :is_a? => true
+ @scope.stubs(:resource).returns(stub_everything)
+ @params = ast::ASTArray.new( :children => [@param1])
+ @resource = ast::Resource.new(:title => @title, :type => "Resource", :params => @params )
+ @resource.stubs(:qualified_type).returns("Resource")
+ Puppet::Parser::Resource.stubs(:new).returns(stub_everything)
+ end
+
+ it "should evaluate all its parameters" do
+
+ @param1.expects(:safeevaluate).with(@scope)
+
+ @resource.evaluate(@scope)
+ end
+
+ it "should evaluate its title" do
+
+ @title.expects(:safeevaluate).with(@scope)
+
+ @resource.evaluate(@scope)
+ end
+
+ it "should flatten the titles array" do
+ titles = stub 'titles'
+ title_array = stub 'title_array', :is_a? => true
+
+ titles.stubs(:safeevaluate).with(@scope).returns(title_array)
+
+ title_array.expects(:flatten).returns([])
+
+ @resource.title = titles
+ @resource.evaluate(@scope)
+ end
+
+ it "should create one resource objects per title" do
+ titles = stub 'titles'
+ title_array = stub 'title_array', :is_a? => true
+
+ title_array.stubs(:flatten).returns([@title])
+ titles.stubs(:safeevaluate).with(@scope).returns(title_array)
+
+ Puppet::Parser::Resource.expects(:new).with { |hash| hash[:title] == @title }
+
+ @resource.title = titles
+ @resource.evaluate(@scope)
+ end
+
+ it "should handover resources to the compiler" do
+ resource = stub 'resource'
+ titles = stub 'titles'
+ title_array = stub 'title_array', :is_a? => true
+
+ title_array.stubs(:flatten).returns([@title])
+ titles.stubs(:safeevaluate).with(@scope).returns(title_array)
+ Puppet::Parser::Resource.stubs(:new).returns(resource)
+
+ @compiler.expects(:add_resource).with(@scope, resource)
+
+ @resource.title = titles
+ @resource.evaluate(@scope)
+ end
+
+ it "should return the newly created resources" do
+ resource = stub 'resource'
+ titles = stub 'titles'
+ title_array = stub 'title_array', :is_a? => true
+
+ title_array.stubs(:flatten).returns([@title])
+ titles.stubs(:safeevaluate).with(@scope).returns(title_array)
+ Puppet::Parser::Resource.stubs(:new).returns(resource)
+
+ @compiler.stubs(:add_resource).with(resource)
+
+ @resource.title = titles
+ @resource.evaluate(@scope).should == [resource]
+ end
+end
+