diff options
-rw-r--r-- | lib/puppet/provider.rb | 7 | ||||
-rw-r--r-- | lib/puppet/type.rb | 15 | ||||
-rw-r--r-- | test/types/type.rb | 21 |
3 files changed, 33 insertions, 10 deletions
diff --git a/lib/puppet/provider.rb b/lib/puppet/provider.rb index c303aae2e..16f3ad23a 100644 --- a/lib/puppet/provider.rb +++ b/lib/puppet/provider.rb @@ -79,7 +79,12 @@ class Puppet::Provider # Does this implementation match all of the default requirements? def self.default? if @defaults.find do |fact, value| - Facter[fact].value.to_s.downcase.intern != value.to_s.downcase.intern + fval = Facter.value(fact) + if fval + fval.to_s.downcase.intern != value.to_s.downcase.intern + else + false + end end return false else diff --git a/lib/puppet/type.rb b/lib/puppet/type.rb index 07510faa7..83920bf74 100644 --- a/lib/puppet/type.rb +++ b/lib/puppet/type.rb @@ -425,16 +425,13 @@ class Type < Puppet::Element unless defined? @defaultprovider and @defaultprovider suitable = suitableprovider() - max = 0 - suitable.each do |provider| - if provider.defaultnum > max - max = provider.defaultnum - end - end + # Find which providers are a default for this system. + defaults = suitable.find_all { |provider| provider.default? } - defaults = suitable.find_all do |provider| - provider.defaultnum == max - end + # If we don't have any default we use suitable providers + defaults = suitable if defaults.empty? + max = defaults.collect { |provider| provider.defaultnum }.max + defaults = defaults.find_all { |provider| provider.defaultnum == max } retval = nil if defaults.length > 1 diff --git a/test/types/type.rb b/test/types/type.rb index b87ca2bd5..a98ab26ae 100644 --- a/test/types/type.rb +++ b/test/types/type.rb @@ -685,6 +685,27 @@ end assert_equal(obj, fileobj[path], "Could not retrieve obj by name") end + + # Make sure default providers behave correctly + def test_defaultproviders + # Make a fake type + type = Puppet::Type.newtype(:defaultprovidertest) do + end + + basic = type.provide(:basic) do + defaultfor :operatingsystem => :somethingelse, + :operatingsystemrelease => :yayness + end + + assert_equal(basic, type.defaultprovider) + type.defaultprovider = nil + + greater = type.provide(:greater) do + defaultfor :operatingsystem => Facter.value("operatingsystem") + end + + assert_equal(greater, type.defaultprovider) + end end # $Id$ |