summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorLuke Kanies <luke@madstop.com>2008-05-15 22:14:02 -0500
committerLuke Kanies <luke@madstop.com>2008-05-15 22:14:02 -0500
commitc9757a689a2ecdcd044ca0355e1ebfa30bb1978f (patch)
tree60f1dd0ccc8dd7968c44b5e5286f492a92bf67d5 /lib
parentac79a79c8d7713068243209f782bf16077dd3d37 (diff)
downloadpuppet-c9757a689a2ecdcd044ca0355e1ebfa30bb1978f.tar.gz
puppet-c9757a689a2ecdcd044ca0355e1ebfa30bb1978f.tar.xz
puppet-c9757a689a2ecdcd044ca0355e1ebfa30bb1978f.zip
Moving the 'confine' handling to separate classes.
Diffstat (limited to 'lib')
-rw-r--r--lib/puppet/provider/confine.rb76
-rw-r--r--lib/puppet/provider/confiner.rb41
2 files changed, 117 insertions, 0 deletions
diff --git a/lib/puppet/provider/confine.rb b/lib/puppet/provider/confine.rb
new file mode 100644
index 000000000..e55ba02ec
--- /dev/null
+++ b/lib/puppet/provider/confine.rb
@@ -0,0 +1,76 @@
+# The class that handles testing whether our providers
+# actually work or not.
+class Puppet::Provider::Confine
+ attr_reader :test, :values, :fact
+
+ def exists?(value)
+ value and FileTest.exist?(value)
+ end
+
+ # Are we a facter comparison?
+ def facter?
+ defined?(@facter)
+ end
+
+ # Retrieve the value from facter
+ def facter_value
+ unless defined?(@facter_value) and @facter_value
+ @facter_value = Facter.value(@fact).to_s.downcase
+ end
+ @facter_value
+ end
+
+ def false?(value)
+ ! value
+ end
+
+ def initialize(test, values)
+ values = [values] unless values.is_a?(Array)
+ @values = values
+
+ if %w{exists false true}.include?(test.to_s)
+ @test = test
+ @method = @test.to_s + "?"
+ else
+ @fact = test
+ @test = :facter
+ @method = "match?"
+ end
+ end
+
+ def match?(value)
+ facter_value == value.to_s.downcase
+ end
+
+ # Collect the results of all of them.
+ def result
+ values.collect { |value| send(@method, value) }
+ end
+
+ def true?(value)
+ # Double negate, so we only get true or false.
+ ! ! value
+ end
+
+ # Test whether our confine matches.
+ def valid?
+ values.each do |value|
+ unless send(@method, value)
+ msg = case test
+ when :false: "false value"
+ when :true: "true value"
+ when :exists: "file %s does not exist" % value
+ when :facter: "facter value '%s' for '%s' not in required list '%s'" % [value, @fact, values.join(",")]
+ end
+ Puppet.debug msg
+ return false
+ end
+ end
+
+ return true
+ ensure
+ # Reset the cache. We want to cache it during a given
+ # run, but across runs.
+ @facter_value = nil
+ end
+end
diff --git a/lib/puppet/provider/confiner.rb b/lib/puppet/provider/confiner.rb
new file mode 100644
index 000000000..b88f1f01b
--- /dev/null
+++ b/lib/puppet/provider/confiner.rb
@@ -0,0 +1,41 @@
+# Manage a collection of confines, returning a boolean or
+# helpful information.
+require 'puppet/provider/confine'
+
+class Puppet::Provider::Confiner
+ def confine(hash)
+ hash.each do |test, values|
+ @confines << Puppet::Provider::Confine.new(test, values)
+ end
+ end
+
+ def initialize
+ @confines = []
+ end
+
+ # Return a hash of the whole confine set, used for the Provider
+ # reference.
+ def result
+ defaults = {
+ :false => 0,
+ :true => 0,
+ :exists => [],
+ :facter => {}
+ }
+ missing = Hash.new { |hash, key| hash[key] = defaults[key] }
+ @confines.each do |confine|
+ case confine.test
+ when :false: missing[confine.test] += confine.result.find_all { |v| v == false }.length
+ when :true: missing[confine.test] += confine.result.find_all { |v| v == true }.length
+ when :exists: confine.result.zip(confine.values).each { |val, f| missing[:exists] << f unless val }
+ when :facter: missing[:facter][confine.fact] = confine.values if confine.result.include?(false)
+ end
+ end
+
+ missing
+ end
+
+ def valid?
+ ! @confines.detect { |c| ! c.valid? }
+ end
+end