[Pkg-puppet-devel] [SCM] Puppet packaging for Debian branch, upstream, updated. puppet-0.24.5-rc3-1601-gf8c1b08
James Turnbull
james at lovedthanlost.net
Fri Jan 15 09:07:09 UTC 2010
The following commit has been merged in the upstream branch:
commit ca56aa7e5849a5489e8d38e29b25ea934caafcd7
Author: Markus Roberts <Markus at reality.com>
Date: Mon Oct 26 23:09:07 2009 -0700
Least kludgy patch for #2675
This makes parameters responsible for the canonicalization of their values and
provides a default (passthrough) implementation. It changes munge to pre-
canonicalize the value and resource references to builtin types to canonicalize
titles (which map to resorce namevars) with the corresponding parameter's
classes's canonicalization.
It adds a canonicalization routine to file paths that normalizes the behaviour
(trailing slashes are ignored) and DRYs up the related code.
Signed-off-by: Markus Roberts <Markus at reality.com>
diff --git a/lib/puppet/parameter.rb b/lib/puppet/parameter.rb
index f408667..58a9147 100644
--- a/lib/puppet/parameter.rb
+++ b/lib/puppet/parameter.rb
@@ -293,6 +293,13 @@ class Puppet::Parameter
define_method(:unmunge, &block)
end
+ # Optionaly convert the value to a canonical form so that it will
+ # be found in hashes, etc. Mostly useful for namevars.
+ def to_canonicalize(&block)
+ metaclass = (class << self; self; end)
+ metaclass.send(:define_method,:canonicalize,&block)
+ end
+
# Mark whether we're the namevar.
def isnamevar
@isnamevar = true
@@ -464,10 +471,19 @@ class Puppet::Parameter
value
end
+ # Assume the value is already in canonical form by default
+ def self.canonicalize(value)
+ value
+ end
+
+ def canonicalize(value)
+ self.class.canonicalize(value)
+ end
+
# A wrapper around our munging that makes sure we raise useful exceptions.
def munge(value)
begin
- ret = unsafe_munge(value)
+ ret = unsafe_munge(canonicalize(value))
rescue Puppet::Error => detail
Puppet.debug "Reraising %s" % detail
raise
diff --git a/lib/puppet/resource/catalog.rb b/lib/puppet/resource/catalog.rb
index 09c0994..f21c820 100644
--- a/lib/puppet/resource/catalog.rb
+++ b/lib/puppet/resource/catalog.rb
@@ -78,7 +78,7 @@ class Puppet::Resource::Catalog < Puppet::SimpleGraph
@resource_table[ref] = resource
# If the name and title differ, set up an alias
- #self.alias(resource, resource.name) if resource.respond_to?(:name) and resource.respond_to?(:title) and resource.name != resource.title
+
if resource.respond_to?(:name) and resource.respond_to?(:title) and resource.name != resource.title
self.alias(resource, resource.name) if resource.isomorphic?
end
diff --git a/lib/puppet/resource/reference.rb b/lib/puppet/resource/reference.rb
index 37522ff..dce4449 100644
--- a/lib/puppet/resource/reference.rb
+++ b/lib/puppet/resource/reference.rb
@@ -20,24 +20,12 @@ class Puppet::Resource::Reference
end
def initialize(argtype, argtitle = nil)
- if argtitle.nil?
- if argtype.is_a?(Puppet::Type)
- self.title = argtype.title
- self.type = argtype.class.name
- else
- self.title = argtype
- if self.title == argtype
- raise ArgumentError, "No title provided and title '%s' is not a valid resource reference" % argtype.inspect
- end
- end
- else
- # This will set @type if it looks like a resource reference.
- self.title = argtitle
-
- # Don't override whatever was done by setting the title.
- self.type ||= argtype
- end
-
+ self.type,self.title =
+ if (argtitle || argtype) =~ /^([^\[\]]+)\[(.+)\]$/m then [ $1, $2 ]
+ elsif argtitle then [ argtype, argtitle ]
+ elsif argtype.is_a?(Puppet::Type) then [ argtype.class.name, argtype.title ]
+ else raise ArgumentError, "No title provided and #{argtype.inspect} is not a valid resource reference"
+ end
@builtin_type = nil
end
@@ -47,15 +35,11 @@ class Puppet::Resource::Reference
return nil
end
- # If the title has square brackets, treat it like a reference and
- # set things appropriately; else, just set it.
def title=(value)
- if value =~ /^([^\[\]]+)\[(.+)\]$/m
- self.type = $1
- @title = $2
- else
- @title = value
+ if @type and klass = Puppet::Type.type(@type.to_s.downcase)
+ value = klass.canonicalize_ref(value)
end
+ @title = value
end
# Canonize the type so we know it's always consistent.
diff --git a/lib/puppet/type.rb b/lib/puppet/type.rb
index ee87c26..2f7b57a 100644
--- a/lib/puppet/type.rb
+++ b/lib/puppet/type.rb
@@ -210,8 +210,8 @@ class Type
end
# Find the namevar
- def self.namevar
- unless defined? @namevar
+ def self.namevar_parameter
+ @namevar_parameter ||= (
params = @parameters.find_all { |param|
param.isnamevar? or param.name == :name
}
@@ -219,12 +219,19 @@ class Type
if params.length > 1
raise Puppet::DevError, "Found multiple namevars for %s" % self.name
elsif params.length == 1
- @namevar = params[0].name
+ params.first
else
raise Puppet::DevError, "No namevar for %s" % self.name
end
- end
- @namevar
+ )
+ end
+
+ def self.namevar
+ @namevar ||= namevar_parameter.name
+ end
+
+ def self.canonicalize_ref(s)
+ namevar_parameter.canonicalize(s)
end
# Create a new parameter. Requires a block and a name, stores it in the
diff --git a/lib/puppet/type/file.rb b/lib/puppet/type/file.rb
index 48fe3ea..f920525 100644
--- a/lib/puppet/type/file.rb
+++ b/lib/puppet/type/file.rb
@@ -46,6 +46,12 @@ module Puppet
unmunge do |value|
File.join( Puppet::FileCollection.collection.path(value[:index]), value[:name] )
end
+
+ to_canonicalize do |s|
+ # Get rid of any duplicate slashes, and remove any trailing slashes unless
+ # the title is just a slash, in which case leave it.
+ s.gsub(/\/+/, "/").sub(/(.)\/$/,'\1')
+ end
end
newparam(:backup) do
@@ -399,11 +405,7 @@ module Puppet
super
- # Get rid of any duplicate slashes, and remove any trailing slashes.
- @title = @title.gsub(/\/+/, "/")
-
- @title.sub!(/\/$/, "") unless @title == "/"
-
+ @title = self.class.canonicalize_ref(@title)
@stat = nil
end
diff --git a/lib/puppet/util/methodhelper.rb b/lib/puppet/util/methodhelper.rb
index 32fca18..ecc9d53 100644
--- a/lib/puppet/util/methodhelper.rb
+++ b/lib/puppet/util/methodhelper.rb
@@ -12,11 +12,10 @@ module Puppet::Util::MethodHelper
def set_options(options)
options.each do |param,value|
method = param.to_s + "="
- begin
+ if respond_to? method
self.send(method, value)
- rescue NoMethodError
- raise ArgumentError, "Invalid parameter %s to object class %s" %
- [param,self.class.to_s]
+ else
+ raise ArgumentError, "Invalid parameter #{param} to object class #{self.class}"
end
end
end
diff --git a/spec/unit/parser/resource/reference.rb b/spec/unit/parser/resource/reference.rb
index 6284e67..a703f92 100755
--- a/spec/unit/parser/resource/reference.rb
+++ b/spec/unit/parser/resource/reference.rb
@@ -40,10 +40,15 @@ describe Puppet::Parser::Resource::Reference do
ref.to_s.should == "File[/tmp/yay]"
end
- it "should canonize resource references" do
+ it "should canonize resource reference types" do
ref = @type.new(:type => "foo::bar", :title => "/tmp/yay")
ref.to_s.should == "Foo::Bar[/tmp/yay]"
end
+
+ it "should canonize resource reference values" do
+ ref = @type.new(:type => "file", :title => "/tmp/yay/")
+ ref.to_s.should == "File[/tmp/yay]"
+ end
end
describe Puppet::Parser::Resource::Reference, " when modeling defined types" do
diff --git a/spec/unit/property.rb b/spec/unit/property.rb
index 26a5765..03b848b 100755
--- a/spec/unit/property.rb
+++ b/spec/unit/property.rb
@@ -101,6 +101,12 @@ describe Puppet::Property do
@property.should.must == [:one, :two]
end
+ it "should munge the canonicalization of the value" do
+ @property.class.to_canonicalize { |x| x.reverse }
+ @property.value = 'data'
+ @property.should.must == 'atad'
+ end
+
it "should return any set value" do
(@property.value = :one).should == :one
end
diff --git a/spec/unit/type/resources.rb b/spec/unit/type/resources.rb
index a3faede..480b6c0 100644
--- a/spec/unit/type/resources.rb
+++ b/spec/unit/type/resources.rb
@@ -8,7 +8,7 @@ resources = Puppet::Type.type(:resources)
describe resources do
describe "when initializing" do
it "should fail if the specified resource type does not exist" do
- Puppet::Type.stubs(:type).with("Resources").returns resources
+ Puppet::Type.stubs(:type).with { |x| x.to_s.downcase == "resources"}.returns resources
Puppet::Type.expects(:type).with("nosuchtype").returns nil
lambda { resources.new :name => "nosuchtype" }.should raise_error(Puppet::Error)
end
--
Puppet packaging for Debian
More information about the Pkg-puppet-devel
mailing list