When we are checking if a node exists before creating a new one we were also trying to match with regex node names, finding matches where in fact there is no equality.
Signed-off-by: Brice Figureau <[email protected]> --- lib/puppet/parser/loaded_code.rb | 4 ++++ lib/puppet/parser/parser_support.rb | 2 +- spec/unit/parser/loaded_code.rb | 19 ++++++++++++++++++- spec/unit/parser/parser.rb | 2 +- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/lib/puppet/parser/loaded_code.rb b/lib/puppet/parser/loaded_code.rb index 065fcb9..3efd115 100644 --- a/lib/puppet/parser/loaded_code.rb +++ b/lib/puppet/parser/loaded_code.rb @@ -36,6 +36,10 @@ class Puppet::Parser::LoadedCode nil end + def node_exists?(name) + @nodes[check_name(name)] + end + def nodes? @nodes.length > 0 end diff --git a/lib/puppet/parser/parser_support.rb b/lib/puppet/parser/parser_support.rb index dfc14e0..4fe2a5a 100644 --- a/lib/puppet/parser/parser_support.rb +++ b/lib/puppet/parser/parser_support.rb @@ -376,7 +376,7 @@ class Puppet::Parser::Parser doc = lexer.getcomment names.collect do |name| name = AST::HostName.new :value => name unless name.is_a?(AST::HostName) - if other = @loaded_code.node(name) + if other = @loaded_code.node_exists?(name) error("Node %s is already defined at %s:%s; cannot redefine" % [other.name, other.file, other.line]) end name = name.to_s if name.is_a?(Symbol) diff --git a/spec/unit/parser/loaded_code.rb b/spec/unit/parser/loaded_code.rb index ca4b0aa..75f2bc7 100644 --- a/spec/unit/parser/loaded_code.rb +++ b/spec/unit/parser/loaded_code.rb @@ -156,7 +156,24 @@ describe Puppet::Parser::LoadedCode do nameout = Puppet::Parser::AST::HostName.new(:value => "foo") @loader.add_node(namein, "bar") - @loader.node(nameout) == "bar" + @loader.node(nameout).should == "bar" + end + + it "should be able to find node by HostName strict equality" do + namein = Puppet::Parser::AST::HostName.new(:value => "foo") + nameout = Puppet::Parser::AST::HostName.new(:value => "foo") + + @loader.add_node(namein, "bar") + @loader.node_exists?(nameout).should == "bar" + end + + it "should not use node name matching when finding with strict node HostName" do + name1 = Puppet::Parser::AST::HostName.new(:value => "foo") + name2 = Puppet::Parser::AST::HostName.new(:value => Puppet::Parser::AST::Regex.new(:value => /foo/)) + + @loader.add_node(name1, "bar") + @loader.add_node(name2, "baz") + @loader.node_exists?(name1).should == "bar" end it "should return the first matching regex nodename" do diff --git a/spec/unit/parser/parser.rb b/spec/unit/parser/parser.rb index 9127599..842dc19 100755 --- a/spec/unit/parser/parser.rb +++ b/spec/unit/parser/parser.rb @@ -253,7 +253,7 @@ describe Puppet::Parser do end it "should raise an error if the node already exists" do - @loaded_code.stubs(:node).with(@nodename).returns(@node) + @loaded_code.stubs(:node_exists?).with(@nodename).returns(@node) lambda { @parser.newnode(@nodename) }.should raise_error end -- 1.6.4 --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
