summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrice Figureau <brice-puppet@daysofwonder.com>2009-09-15 21:01:48 +0200
committerJames Turnbull <james@lovedthanlost.net>2009-09-17 13:54:55 +1000
commit361c50210172ffe484550a19db3a8d10d86edc09 (patch)
tree24b43a67b76164a852c195cb9b05bc27c6a56a49
parent2283605ba63b39deec30bd71b5d0879630f63e6d (diff)
downloadpuppet-361c50210172ffe484550a19db3a8d10d86edc09.tar.gz
puppet-361c50210172ffe484550a19db3a8d10d86edc09.tar.xz
puppet-361c50210172ffe484550a19db3a8d10d86edc09.zip
Fix #2638 - Allow creating several nodes with matching names
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 <brice-puppet@daysofwonder.com>
-rw-r--r--lib/puppet/parser/loaded_code.rb4
-rw-r--r--lib/puppet/parser/parser_support.rb2
-rw-r--r--spec/unit/parser/loaded_code.rb19
-rwxr-xr-xspec/unit/parser/parser.rb2
4 files changed, 24 insertions, 3 deletions
diff --git a/lib/puppet/parser/loaded_code.rb b/lib/puppet/parser/loaded_code.rb
index 065fcb99c..3efd115bc 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 dfc14e0c9..4fe2a5a0d 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 ca4b0aaca..75f2bc7e2 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 9127599df..842dc1904 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