I know I assigned the bug to Luke, but I had 5 spare minutes tonight, and
wanted to try to solve this as this is affecting me.
So far it seems to work fine.
Please comment and review,
Brice

Original commit msg:
While evaluating the AST, catalog vertices are not always ordered
the same way on different run, leading to some tags (which should
have been applied in evaluation order) to not be associated with
some underlying resources.

This changeset change all accesses to resources inside the compiler
to always use an ordered (in evaluation order) list of added
resources.


Signed-off-by: Brice Figureau <brice-pup...@daysofwonder.com>
---
 lib/puppet/parser/compiler.rb |   19 ++++++++++---------
 spec/unit/parser/compiler.rb  |   27 ++++++++++++++++++++++++++-
 2 files changed, 36 insertions(+), 10 deletions(-)

diff --git a/lib/puppet/parser/compiler.rb b/lib/puppet/parser/compiler.rb
index 9f5548d..7dcd502 100644
--- a/lib/puppet/parser/compiler.rb
+++ b/lib/puppet/parser/compiler.rb
@@ -10,7 +10,7 @@ require 'puppet/util/errors'
 class Puppet::Parser::Compiler
     include Puppet::Util
     include Puppet::Util::Errors
-    attr_reader :parser, :node, :facts, :collections, :catalog, :node_scope
+    attr_reader :parser, :node, :facts, :collections, :catalog, :node_scope, 
:resources
 
     # Add a collection to the global list.
     def add_collection(coll)
@@ -31,6 +31,8 @@ class Puppet::Parser::Compiler
 
     # Store a resource in our resource table.
     def add_resource(scope, resource)
+        @resources << resource
+
         # Note that this will fail if the resource is not unique.
         @catalog.add_resource(resource)
 
@@ -204,11 +206,6 @@ class Puppet::Parser::Compiler
         @resource_overrides[resource.ref]
     end
 
-    # Return a list of all resources.
-    def resources
-        @catalog.vertices
-    end
-
     # The top scope is usually the top-level scope, but if we're using AST 
nodes,
     # then it is instead the node's scope.
     def topscope
@@ -310,6 +307,7 @@ class Puppet::Parser::Compiler
         @main_resource = Puppet::Parser::Resource.new(:type => "class", :title 
=> :main, :scope => @topscope, :source => @main)
         @topscope.resource = @main_resource
 
+        @resources << @main_resource
         @catalog.add_resource(@main_resource)
 
         @main_resource.evaluate
@@ -366,7 +364,7 @@ class Puppet::Parser::Compiler
     # Make sure all of our resources and such have done any last work
     # necessary.
     def finish
-        @catalog.vertices.each do |resource|
+        resources.each do |resource|
             # Add in any resource overrides.
             if overrides = resource_overrides(resource)
                 overrides.each do |over|
@@ -414,6 +412,9 @@ class Puppet::Parser::Compiler
         # For maintaining the relationship between scopes and their resources.
         @catalog = Puppet::Resource::Catalog.new(@node.name)
         @catalog.version = @parser.version
+
+        # local resource array to maintain resource ordering
+        @resources = []
     end
 
     # Set the node's parameters into the top-scope as variables.
@@ -436,7 +437,7 @@ class Puppet::Parser::Compiler
 
         # We used to have hooks here for forking and saving, but I don't
         # think it's worth retaining at this point.
-        store_to_active_record(@node, @catalog.vertices)
+        store_to_active_record(@node, resources)
     end
 
     # Do the actual storage.
@@ -459,7 +460,7 @@ class Puppet::Parser::Compiler
     # Return an array of all of the unevaluated resources.  These will be 
definitions,
     # which need to get evaluated into native resources.
     def unevaluated_resources
-        ary = @catalog.vertices.reject { |resource| resource.builtin? or 
resource.evaluated?  }
+        ary = resources.reject { |resource| resource.builtin? or 
resource.evaluated?  }
 
         if ary.empty?
             return nil
diff --git a/spec/unit/parser/compiler.rb b/spec/unit/parser/compiler.rb
index f36b6fd..855a8c7 100755
--- a/spec/unit/parser/compiler.rb
+++ b/spec/unit/parser/compiler.rb
@@ -239,6 +239,31 @@ describe Puppet::Parser::Compiler do
             @compiler.send(:finish)
         end
 
+        it "should call finish() in add_resource order" do
+            resources = sequence('resources')
+
+            resource1 = Puppet::Parser::Resource.new :scope => @scope, :type 
=> "file", :title => "finish1"
+            resource1.expects(:finish).in_sequence(resources)
+
+            @compiler.add_resource(@scope, resource1)
+
+            resource2 = Puppet::Parser::Resource.new :scope => @scope, :type 
=> "file", :title => "finish2"
+            resource2.expects(:finish).in_sequence(resources)
+
+            @compiler.add_resource(@scope, resource2)
+
+            @compiler.send(:finish)
+        end
+
+        it "should return added resources in add order" do
+            resource1 = stub "1", :ref => "File[yay]"
+            @compiler.add_resource(@scope, resource1)
+            resource2 = stub "2", :ref => "File[youpi]"
+            @compiler.add_resource(@scope, resource2)
+
+            @compiler.resources.should == [resource1, resource2]
+        end
+
         it "should add resources that do not conflict with existing resources" 
do
             resource = stub "noconflict", :ref => "File[yay]"
             @compiler.add_resource(@scope, resource)
@@ -484,7 +509,7 @@ describe Puppet::Parser::Compiler do
             Puppet.features.expects(:rails?).returns(true)
             Puppet::Rails.expects(:connect)
 
-            @compiler.catalog.expects(:vertices).returns(:resources)
+            @compiler.expects(:resources).returns(:resources)
 
             @compiler.expects(:store_to_active_record).with(@node, :resources)
             @compiler.send(:store)
-- 
1.6.0.2


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to puppet-dev@googlegroups.com
To unsubscribe from this group, send email to 
puppet-dev+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to