summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/puppet/parser/resource.rb31
-rwxr-xr-xspec/unit/parser/resource.rb40
2 files changed, 64 insertions, 7 deletions
diff --git a/lib/puppet/parser/resource.rb b/lib/puppet/parser/resource.rb
index 7218ac0c0..29b1fb1ac 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 9eb8b13d9..0a67c4b54 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")