diff options
-rw-r--r-- | lib/puppet/type.rb | 32 | ||||
-rwxr-xr-x | spec/integration/type.rb | 22 |
2 files changed, 42 insertions, 12 deletions
diff --git a/lib/puppet/type.rb b/lib/puppet/type.rb index d30033870..6c41d79e3 100644 --- a/lib/puppet/type.rb +++ b/lib/puppet/type.rb @@ -984,7 +984,7 @@ class Type # Retrieve all known instances. Either requires providers or must be overridden. def self.instances - unless defined?(@providers) and ! @providers.empty? + if provider_hash.empty? raise Puppet::DevError, "%s has no providers and has not overridden 'instances'" % self.name end @@ -1489,26 +1489,35 @@ class Type return @defaultprovider end + def self.provider_hash_by_type(type) + @provider_hashes ||= {} + @provider_hashes[type] ||= {} + end + + def self.provider_hash + Puppet::Type.provider_hash_by_type(self.name) + end + # Retrieve a provider by name. def self.provider(name) name = Puppet::Util.symbolize(name) # If we don't have it yet, try loading it. - unless @providers.has_key?(name) + unless provider_hash.has_key?(name) @providerloader.load(name) end - return @providers[name] + return provider_hash[name] end # Just list all of the providers. def self.providers - @providers.keys + provider_hash.keys end def self.validprovider?(name) name = Puppet::Util.symbolize(name) - return (@providers.has_key?(name) && @providers[name].suitable?) + return (provider_hash.has_key?(name) && provider_hash[name].suitable?) end # Create a new provider of a type. This method must be called @@ -1516,7 +1525,7 @@ class Type def self.provide(name, options = {}, &block) name = Puppet::Util.symbolize(name) - if obj = @providers[name] + if obj = provider_hash[name] Puppet.debug "Reloading %s %s provider" % [name, self.name] unprovide(name) end @@ -1544,7 +1553,7 @@ class Type provider = genclass(name, :parent => parent, - :hash => @providers, + :hash => provider_hash, :prefix => "Provider", :block => block, :include => feature_module, @@ -1612,9 +1621,9 @@ class Type end def self.unprovide(name) - if @providers.has_key? name + if provider_hash.has_key? name rmclass(name, - :hash => @providers, + :hash => provider_hash, :prefix => "Provider" ) if @defaultprovider and @defaultprovider.name == name @@ -1625,10 +1634,10 @@ class Type # Return an array of all of the suitable providers. def self.suitableprovider - if @providers.empty? + if provider_hash.empty? providerloader.loadall end - @providers.find_all { |name, provider| + provider_hash.find_all { |name, provider| provider.suitable? }.collect { |name, provider| provider @@ -1790,7 +1799,6 @@ class Type @objects = Hash.new @aliases = Hash.new - @providers = Hash.new @defaults = {} unless defined? @parameters diff --git a/spec/integration/type.rb b/spec/integration/type.rb new file mode 100755 index 000000000..78e8947ec --- /dev/null +++ b/spec/integration/type.rb @@ -0,0 +1,22 @@ +#!/usr/bin/env ruby + +require File.dirname(__FILE__) + '/../spec_helper' + +require 'puppet/type' + +describe Puppet::Type do + it "should not lose its provider list when it is reloaded" do + type = Puppet::Type.newtype(:integration_test) do + newparam(:name) {} + end + + provider = type.provide(:myprovider) {} + + # reload it + type = Puppet::Type.newtype(:integration_test) do + newparam(:name) {} + end + + type.provider(:myprovider).should equal(provider) + end +end |