diff options
author | Markus Roberts <Markus@reality.com> | 2010-07-24 14:48:13 -0700 |
---|---|---|
committer | Markus Roberts <Markus@reality.com> | 2010-07-24 23:39:14 -0700 |
commit | 59a23d69c20a8ab1f7dc9ff1d109305f9027641c (patch) | |
tree | 14df249a73f45d5627d0069c619b270f4e24d1e8 | |
parent | 865282ae7b9332fdbdfa51b2814755b8a13d244b (diff) | |
download | puppet-59a23d69c20a8ab1f7dc9ff1d109305f9027641c.tar.gz puppet-59a23d69c20a8ab1f7dc9ff1d109305f9027641c.tar.xz puppet-59a23d69c20a8ab1f7dc9ff1d109305f9027641c.zip |
Fix for #3382 -- Empty classes as graph placeholders
As Brice discovered, the problem was that we simply ignored empty classes in
the graph when determining application order. This patch instead replaces them
with a resource of a new type which we've frequently noted the (internal) need
for: a whit, the smallest possible resource, which has no properties or other
semantics apart from its existence and its name.
This resource then ensures application order through the normal mechanisms.
-rw-r--r-- | lib/puppet/simple_graph.rb | 9 | ||||
-rw-r--r-- | lib/puppet/type/whit.rb | 7 | ||||
-rwxr-xr-x | spec/unit/simple_graph_spec.rb | 14 |
3 files changed, 23 insertions, 7 deletions
diff --git a/lib/puppet/simple_graph.rb b/lib/puppet/simple_graph.rb index 945b1beb3..55b39fadf 100644 --- a/lib/puppet/simple_graph.rb +++ b/lib/puppet/simple_graph.rb @@ -318,16 +318,15 @@ class Puppet::SimpleGraph # to container leaves, but that would result in many more # relationships. stage_class = Puppet::Type.type(:stage) + whit_class = Puppet::Type.type(:whit) containers = other.topsort.find_all { |v| (v.is_a?(type) or v.is_a?(stage_class)) and vertex?(v) } containers.each do |container| # Get the list of children from the other graph. children = other.adjacent(container, :direction => :out) - # Just remove the container if it's empty. - if children.empty? - remove_vertex!(container) - next - end + # MQR TODO: Luke suggests that it should be possible to refactor the system so that + # container nodes are retained, thus obviating the need for the whit. + children = [whit_class.new(:name => container.name, :catalog => other)] if children.empty? # First create new edges for each of the :in edges [:in, :out].each do |dir| diff --git a/lib/puppet/type/whit.rb b/lib/puppet/type/whit.rb new file mode 100644 index 000000000..6e5ba9eab --- /dev/null +++ b/lib/puppet/type/whit.rb @@ -0,0 +1,7 @@ +Puppet::Type.newtype(:whit) do + desc "The smallest possible resource type, for when you need a resource and naught else." + + newparam :name do + desc "The name of the whit, because it must have one." + end +end diff --git a/spec/unit/simple_graph_spec.rb b/spec/unit/simple_graph_spec.rb index 83e674139..2ca8888c5 100755 --- a/spec/unit/simple_graph_spec.rb +++ b/spec/unit/simple_graph_spec.rb @@ -439,7 +439,8 @@ describe Puppet::SimpleGraph do @middle = Container.new("middle", ["e", "f", @two]) @top = Container.new("top", ["g", "h", @middle, @one, @three]) @empty = Container.new("empty", []) - + + @whit = Puppet::Type.type(:whit) @stage = Puppet::Type.type(:stage).new(:name => "foo") @contgraph = @top.to_graph @@ -499,8 +500,17 @@ describe Puppet::SimpleGraph do end end + it "should contain a whit-resource to mark the place held by the empty container" do + @depgraph.vertices.find_all { |v| v.is_a?(@whit) }.length.should == 1 + end + + it "should replace edges to empty containers with edges to their residual whit" do + emptys_whit = @depgraph.vertices.find_all { |v| v.is_a?(@whit) }.first + @depgraph.should be_edge("c", emptys_whit) + end + it "should no longer contain anything but the non-container objects" do - @depgraph.vertices.find_all { |v| ! v.is_a?(String) }.should be_empty + @depgraph.vertices.find_all { |v| ! v.is_a?(String) and ! v.is_a?(@whit)}.should be_empty end it "should copy labels" do |