diff options
author | Stefan Schulte <stefan.schulte@taunusstein.net> | 2010-12-23 18:08:37 +0100 |
---|---|---|
committer | Stefan Schulte <stefan.schulte@taunusstein.net> | 2010-12-23 21:49:05 +0100 |
commit | 02b311113df84646406737ccfad961c5b6df4ae8 (patch) | |
tree | 9ef1ec49f00c3df9891bd7a203f5ab05b1bb4dfa /lib/puppet/resource.rb | |
parent | cc1f2b39a65e8b74c8e59a2bf7d8f47a35985ee4 (diff) | |
download | puppet-02b311113df84646406737ccfad961c5b6df4ae8.tar.gz puppet-02b311113df84646406737ccfad961c5b6df4ae8.tar.xz puppet-02b311113df84646406737ccfad961c5b6df4ae8.zip |
(#5605) Prefetch doesnt work with composite keys
The uniqueness_key method of a type or resource object should return a
key that can be used to identify this resource. In fact puppet seldomly
uses this method and instead uses resource[:name] as an identifier.
While this is totally fine for resourcetypes with a single
key_attribute (and resource[:name] returning the namevar), it breaks
things as soon as one creates a type with a composite key (prefetching
for example is broken). To ease the process of replacing calls to
resource[:name] to resource.uniqueness_key, the method uniqueness_key now
just returns name_var if there is only one key_attribute (immitating
self[:name]) and only returns an array of all the values of all the
key_attributes if we have more than one key_attribute.
The resourcehash which is passed to providers in their prefetch method
is now build with uniqueness_key as the hashkey. Because of the new
behaviour of uniqueness_key we hopefully wont break existing providers
while allowing new providers for types with composite keys to implement
correct prefetch methods.
Diffstat (limited to 'lib/puppet/resource.rb')
-rw-r--r-- | lib/puppet/resource.rb | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/lib/puppet/resource.rb b/lib/puppet/resource.rb index 4f0d50750..a52796800 100644 --- a/lib/puppet/resource.rb +++ b/lib/puppet/resource.rb @@ -237,11 +237,16 @@ class Puppet::Resource h = self.to_hash h[namevar] ||= h[:name] h[:name] ||= h[namevar] - h.values_at(*key_attributes.sort_by { |k| k.to_s }) + # Simulate the same behaviour like Type#uniqueness_key + if key_attributes.size == 1 + h[namevar] + else + h.values_at(*key_attributes) + end end def key_attributes - return(resource_type.respond_to? :key_attributes) ? resource_type.key_attributes : [:name] + resource_type.respond_to?(:key_attributes) ? resource_type.key_attributes : [:name] end # Convert our resource to Puppet code. |