[Pkg-puppet-devel] [SCM] Puppet packaging for Debian branch, upstream, updated. 2.6.1rc1-141-gcdb2b90

Markus Roberts Markus at reality.com
Mon Aug 16 12:48:00 UTC 2010


The following commit has been merged in the upstream branch:
commit 9778f2a47922a66e59d571c1c98552223a817ce1
Author: Nick Lewis <nick at puppetlabs.com>
Date:   Fri Jul 23 17:04:22 2010 -0700

    [#4242] Fixed recursion due to parents including their children
    
    Resources mark themselves as evaluated to prevent being evaluated
    again. Unfortunately, they were not marking themselves until after
    they had finished being completely evaluated. Thus, there was
    nothing actually stopping recursive evaluations. This patch just
    makes resources mark themselves as evaluated when they start
    evaluating, and adds tests.
    
    The original setting of evaluated was done in an ensure block, so
    this doesn't change the behavior of a resource which fails to
    evaluate. The only places evaluated? is checked aren't affected
    by this change, as they wouldn't want to evaluate it when it's
    already being evaluated anyway.

diff --git a/lib/puppet/parser/resource.rb b/lib/puppet/parser/resource.rb
index c956a11..3c45192 100644
--- a/lib/puppet/parser/resource.rb
+++ b/lib/puppet/parser/resource.rb
@@ -64,6 +64,7 @@ class Puppet::Parser::Resource < Puppet::Resource
 
   # Retrieve the associated definition and evaluate it.
   def evaluate
+    @evaluated = true
     if klass = resource_type and ! builtin_type?
       finish
       return klass.evaluate_code(self)
@@ -72,8 +73,6 @@ class Puppet::Parser::Resource < Puppet::Resource
     else
       self.fail "Cannot find definition #{type}"
     end
-  ensure
-    @evaluated = true
   end
 
   # Mark this resource as both exported and virtual,
diff --git a/spec/unit/parser/functions/include_spec.rb b/spec/unit/parser/functions/include_spec.rb
new file mode 100644
index 0000000..4954ac6
--- /dev/null
+++ b/spec/unit/parser/functions/include_spec.rb
@@ -0,0 +1,50 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+describe "the 'include' function" do
+
+  before :each do
+    Puppet::Node::Environment.stubs(:current).returns(nil)
+    @compiler = Puppet::Parser::Compiler.new(Puppet::Node.new("foo"))
+    @scope = Puppet::Parser::Scope.new(:compiler => @compiler)
+  end
+
+  it "should exist" do
+    Puppet::Parser::Functions.function("include").should == "function_include"
+  end
+
+  it "should include a single class" do
+    inc = "foo"
+    @compiler.expects(:evaluate_classes).with {|klasses,parser,lazy| klasses == [inc]}.returns([inc])
+    @scope.function_include("foo")
+  end
+
+  it "should include multiple classes" do
+    inc = ["foo","bar"]
+    @compiler.expects(:evaluate_classes).with {|klasses,parser,lazy| klasses == inc}.returns(inc)
+    @scope.function_include(["foo","bar"])
+  end
+
+  it "should not lazily evaluate the included class" do
+    @compiler.expects(:evaluate_classes).with {|klasses,parser,lazy| lazy == false}.returns("foo")
+    @scope.function_include("foo")
+  end
+
+  it "should allow a parent to include its child" do
+    @parent_type = Puppet::Resource::Type.new(:hostclass, "parent")
+    @parent_resource = Puppet::Parser::Resource.new(:hostclass, "parent", :scope => @scope)
+    @subscope = @parent_type.subscope(@scope, at parent_resource)
+    @scope.environment.known_resource_types.stubs(:find_hostclass).with{|nses,name| name.downcase == "parent"}.returns(@parent_type)
+
+    @type = Puppet::Resource::Type.new(:hostclass, "foo")
+    @type.stubs(:parent_scope).returns(@subscope)
+    @type.parent = "parent"
+    @resource = Puppet::Parser::Resource.new(:hostclass, "foo", :scope => @subscope)
+    @resource.stubs(:resource_type).returns(@type)
+    @scope.environment.known_resource_types.stubs(:find_hostclass).with{|nses,name| name.downcase == "foo"}.returns(@parent_type)
+    Puppet::Resource.stubs(:new).returns(@resource)
+    Puppet::Parser::Resource.stubs(:new).returns(@resource)
+    lambda { @subscope.function_include("foo") }.should_not raise_error
+  end
+end

-- 
Puppet packaging for Debian



More information about the Pkg-puppet-devel mailing list