We broke some cases of metaparam compatibility in 0.25.
Most of it was pretty esoteric, but one thing that wasn't working
was relationship metaparams specified on defined resources.

This adds a compatibility method for older clients.

Signed-off-by: Luke Kanies <[email protected]>
---
 lib/puppet/parser/resource.rb |   31 +++++++++++++++++++++++++------
 spec/unit/parser/resource.rb  |   40 +++++++++++++++++++++++++++++++++++++++-
 2 files changed, 64 insertions(+), 7 deletions(-)

diff --git a/lib/puppet/parser/resource.rb b/lib/puppet/parser/resource.rb
index 7218ac0..29b1fb1 100644
--- a/lib/puppet/parser/resource.rb
+++ b/lib/puppet/parser/resource.rb
@@ -17,7 +17,7 @@ class Puppet::Parser::Resource
     include Puppet::Parser::YamlTrimmer
 
     attr_accessor :source, :scope, :rails_id
-    attr_accessor :virtual, :override, :translated
+    attr_accessor :virtual, :override, :translated, :catalog
 
     attr_reader :exported, :evaluated, :params
 
@@ -304,23 +304,42 @@ class Puppet::Parser::Resource
         end
     end
 
+    def add_backward_compatible_relationship_param(name)
+        # Skip metaparams for which we get no value.
+        return unless val = scope.lookupvar(name.to_s, false) and val != 
:undefined
+
+        # The default case: just set the value
+        set_parameter(name, val) and return unless @params[name]
+
+        # For relationship params, though, join the values (a la #446).
+        @params[name].value = [...@params[name].value, val].flatten
+    end
+
     # Add any metaparams defined in our scope. This actually adds any 
metaparams
     # from any parent scope, and there's currently no way to turn that off.
     def add_metaparams
+        compat_mode = metaparam_compatibility_mode?
+
         Puppet::Type.eachmetaparam do |name|
-            next if self.class.relationship_parameter?(name)
-            # Skip metaparams that we already have defined, unless they're 
relationship metaparams.
-            # LAK:NOTE Relationship metaparams get treated specially -- we 
stack them, instead of
-            # overriding.
+            if self.class.relationship_parameter?(name)
+                add_backward_compatible_relationship_param(name) if compat_mode
+                next
+            end
+
             next if @params[name]
 
             # Skip metaparams for which we get no value.
             next unless val = scope.lookupvar(name.to_s, false) and val != 
:undefined
 
-            set_parameter(name, val) and next unless @params[name]
+            set_parameter(name, val)
         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/unit/parser/resource.rb b/spec/unit/parser/resource.rb
index 9eb8b13..0a67c4b 100755
--- a/spec/unit/parser/resource.rb
+++ b/spec/unit/parser/resource.rb
@@ -170,6 +170,24 @@ describe Puppet::Parser::Resource do
             @resource[:owner].should == "other"
         end
 
+        it "should be running in metaparam compatibility mode if running a 
version below 0.25" do
+            catalog = stub 'catalog', :client_version => "0.24.8"
+            @resource.stubs(:catalog).returns catalog
+            @resource.should be_metaparam_compatibility_mode
+        end
+
+        it "should be running in metaparam compatibility mode if running no 
client version is available" do
+            catalog = stub 'catalog', :client_version => nil
+            @resource.stubs(:catalog).returns catalog
+            @resource.should be_metaparam_compatibility_mode
+        end
+
+        it "should not be running in metaparam compatibility mode if running a 
version at or above 0.25" do
+            catalog = stub 'catalog', :client_version => "0.25.0"
+            @resource.stubs(:catalog).returns catalog
+            @resource.should_not be_metaparam_compatibility_mode
+        end
+
         it "should copy metaparams from its scope" do
             @scope.setvar("noop", "true")
 
@@ -187,14 +205,34 @@ describe Puppet::Parser::Resource do
             @resource["noop"].should == "false"
         end
 
-        it "should not copy relationship metaparams" do
+        it "should not copy relationship metaparams when not in metaparam 
compatibility mode" do
             @scope.setvar("require", "bar")
 
+            @resource.stubs(:metaparam_compatibility_mode?).returns false
             @resource.class.publicize_methods(:add_metaparams)  { 
@resource.add_metaparams }
 
             @resource["require"].should be_nil
         end
 
+        it "should copy relationship metaparams when in metaparam 
compatibility mode" do
+            @scope.setvar("require", "bar")
+
+            @resource.stubs(:metaparam_compatibility_mode?).returns true
+            @resource.class.publicize_methods(:add_metaparams)  { 
@resource.add_metaparams }
+
+            @resource["require"].should == "bar"
+        end
+
+        it "should stack relationship metaparams when in metaparam 
compatibility mode" do
+            @resource.set_parameter("require", "foo")
+            @scope.setvar("require", "bar")
+
+            @resource.stubs(:metaparam_compatibility_mode?).returns true
+            @resource.class.publicize_methods(:add_metaparams)  { 
@resource.add_metaparams }
+
+            @resource["require"].should == ["foo", "bar"]
+        end
+
         it "should copy all metaparams that it finds" do
             @scope.setvar("noop", "foo")
             @scope.setvar("schedule", "bar")
-- 
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