summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/puppet/provider.rb7
-rw-r--r--lib/puppet/type.rb15
-rw-r--r--test/types/type.rb21
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$