I couldn't find a way to make it compatible with
earlier clients, so the docs specify that
it doesn't work with them, and it helpfully fails.

Signed-off-by: Luke Kanies <[email protected]>
---
 lib/puppet/parser/functions/require.rb       |   16 ++++++++++++++--
 lib/puppet/parser/resource.rb                |   10 +++++-----
 spec/integration/parser/functions/require.rb |    8 +++++---
 spec/unit/parser/functions/require.rb        |   18 ++++++++++--------
 4 files changed, 34 insertions(+), 18 deletions(-)

diff --git a/lib/puppet/parser/functions/require.rb 
b/lib/puppet/parser/functions/require.rb
index 7d73831..dda8cf0 100644
--- a/lib/puppet/parser/functions/require.rb
+++ b/lib/puppet/parser/functions/require.rb
@@ -23,12 +23,24 @@ class depends on the required class.
        file { '/foo': notify => Service[foo] }
     }
 
+Note that this function only works with clients 0.25 and later, and it will
+fail if used with earlier clients.
+
 ") do |vals|
+        if resource.metaparam_compatibility_mode?
+            raise Puppet::ParseError, "The 'require' function is only 
compatible with clients at 0.25 and above"
+        end
+
         send(:function_include, vals)
         vals = [vals] unless vals.is_a?(Array)
 
-        # add a relation from ourselves to each required klass
         vals.each do |klass|
-            compiler.catalog.add_edge(resource, findresource(:class, klass))
+            # This is a bit hackish, in some ways, but it's the only way
+            # to configure a dependency that will make it to the client.
+            # The 'obvious' way is just to add an edge in the catalog,
+            # but that is considered a containment edge, not a dependency
+            # edge, so it usually gets lost on the client.
+            ref = Puppet::Parser::Resource::Reference.new(:type => :class, 
:title => klass)
+            resource.set_parameter(:require, ref)
         end
 end
diff --git a/lib/puppet/parser/resource.rb b/lib/puppet/parser/resource.rb
index 29b1fb1..b8aaf27 100644
--- a/lib/puppet/parser/resource.rb
+++ b/lib/puppet/parser/resource.rb
@@ -175,6 +175,11 @@ class Puppet::Parser::Resource
         end
     end
 
+    # Unless we're running >= 0.25, we're in compat mode.
+    def metaparam_compatibility_mode?
+        ! (catalog and version = catalog.client_version and version = 
version.split(".") and version[0] == "0" and version[1].to_i >= 25)
+    end
+
     # Return the resource name, or the title if no name
     # was specified.
     def name
@@ -335,11 +340,6 @@ class Puppet::Parser::Resource
         end
     end
 
-    # Unless we're running >= 0.25, we're in compat mode.
-    def metaparam_compatibility_mode?
-        ! (catalog and version = catalog.client_version and version = 
version.split(".") and version[0] == "0" and version[1].to_i >= 25)
-    end
-
     def add_scope_tags
         if scope_resource = scope.resource
             tag(*scope_resource.tags)
diff --git a/spec/integration/parser/functions/require.rb 
b/spec/integration/parser/functions/require.rb
index 79ba13d..960594b 100755
--- a/spec/integration/parser/functions/require.rb
+++ b/spec/integration/parser/functions/require.rb
@@ -10,6 +10,7 @@ describe "the require function" do
         @compiler = Puppet::Parser::Compiler.new(@node, @parser)
 
         @compiler.send(:evaluate_main)
+        @compiler.catalog.client_version = "0.25"
         @scope = @compiler.topscope
         # preload our functions
         Puppet::Parser::Functions.function(:include)
@@ -20,10 +21,11 @@ describe "the require function" do
         @parser.newclass("requiredclass")
 
         @scope.function_require("requiredclass")
-
-        
@compiler.catalog.edge?(@scope.resource,@compiler.findresource(:class,"requiredclass")).should
 be_true
+        @scope.resource["require"].should_not be_nil
+        ref = @scope.resource["require"]
+        ref.type.should == "Class"
+        ref.title.should == "requiredclass"
     end
-
 end
 
 describe "the include function" do
diff --git a/spec/unit/parser/functions/require.rb 
b/spec/unit/parser/functions/require.rb
index 67a5bae..801c671 100755
--- a/spec/unit/parser/functions/require.rb
+++ b/spec/unit/parser/functions/require.rb
@@ -7,8 +7,10 @@ describe "the require function" do
     before :each do
         @catalog = stub 'catalog'
         @compiler = stub 'compiler', :catalog => @catalog
+
+        @resource = stub 'resource', :set_parameter => nil, 
:metaparam_compatibility_mode? => false
         @scope = Puppet::Parser::Scope.new()
-        @scope.stubs(:resource).returns("ourselves")
+        @scope.stubs(:resource).returns @resource
         @scope.stubs(:findresource)
         @scope.stubs(:compiler).returns(@compiler)
     end
@@ -18,19 +20,19 @@ describe "the require function" do
     end
 
     it "should delegate to the 'include' puppet function" do
-        @catalog.stubs(:add_edge)
         @scope.expects(:function_include).with("myclass")
 
         @scope.function_require("myclass")
     end
 
-    it "should add a catalog edge from our parent resource to the included 
one" do
-        @scope.stubs(:function_include).with("myclass")
-        @scope.stubs(:findresource).with(:class, 
"myclass").returns("includedclass")
-
-        @catalog.expects(:add_edge).with("ourselves","includedclass")
-
+    it "should set the 'require' prarameter on the resource to a resource 
reference" do
+        @resource.expects(:set_parameter).with { |name, value| name == 
:require and value.is_a?(Puppet::Parser::Resource::Reference) }
+        @scope.stubs(:function_include)
         @scope.function_require("myclass")
     end
 
+    it "should fail if used on a client not at least version 0.25" do
+        @resource.expects(:metaparam_compatibility_mode? => true)
+        lambda { @scope.function_require("myclass") }.should 
raise_error(Puppet::ParseError)
+    end
 end
-- 
1.6.1


--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to