summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Nasrat <pnasrat@googlemail.com>2009-05-28 08:15:01 +0100
committerPaul Nasrat <pnasrat@googlemail.com>2009-07-16 14:17:18 +0100
commitc02d3b66eb2878968befea64c3a3ab69dc9e5de8 (patch)
tree3127d620164a612a64e754c5a4ce0b0f49733fa1
parent545f3c1405451afecb1e79bd34e15640322162e2 (diff)
downloadfacter-c02d3b66eb2878968befea64c3a3ab69dc9e5de8.tar.gz
facter-c02d3b66eb2878968befea64c3a3ab69dc9e5de8.tar.xz
facter-c02d3b66eb2878968befea64c3a3ab69dc9e5de8.zip
Issue #2292 Add tests for virtual facts
Add tests and utility for virtual fact detection
-rw-r--r--lib/facter/util/virtual.rb27
-rw-r--r--lib/facter/virtual.rb35
-rw-r--r--spec/unit/util/virtual_spec.rb60
-rw-r--r--spec/unit/virtual_spec.rb49
4 files changed, 147 insertions, 24 deletions
diff --git a/lib/facter/util/virtual.rb b/lib/facter/util/virtual.rb
new file mode 100644
index 0000000..8db57a3
--- /dev/null
+++ b/lib/facter/util/virtual.rb
@@ -0,0 +1,27 @@
+module Facter::Util::Virtual
+ def self.openvz?
+ FileTest.exists?("/proc/vz/veinfo")
+ end
+
+ def self.openvz_type
+ return nil unless self.openvz?
+ if FileTest.exists?("/proc/vz/version")
+ result = "openvzhn"
+ else
+ result = "openvzve"
+ end
+ end
+
+ def self.zone?
+ z = Facter::Util::Resolution.exec("/sbin/zonename")
+ return false unless z
+ return z.chomp != 'global'
+ end
+
+ def self.vserver?
+ return false unless FileTest.exists?("/proc/self/status")
+ txt = File.read("/proc/self/status")
+ return true if txt =~ /^(s_context|VxID):[[:blank:]]*[1-9]/
+ return false
+ end
+end
diff --git a/lib/facter/virtual.rb b/lib/facter/virtual.rb
index 72bfe51..299ebb4 100644
--- a/lib/facter/virtual.rb
+++ b/lib/facter/virtual.rb
@@ -1,32 +1,19 @@
+require 'facter/util/virtual'
+
Facter.add("virtual") do
confine :kernel => %w{Linux FreeBSD OpenBSD SunOS}
result = "physical"
setcode do
- require 'thread'
- if FileTest.exists?("/sbin/zonename")
- z = %x{"/sbin/zonename"}.chomp
- if z != 'global'
- result = 'zone'
- end
- end
+ result = "zone" if Facter::Util::Virtual.zone?
- if FileTest.exists?("/proc/vz/veinfo")
- if FileTest.exists?("/proc/vz/version")
- result = "openvzhn"
- else
- result = "openvzve"
- end
+ if Facter::Util::Virtual.openvz?
+ result = Facter::Util::Virtual.openvz_type()
end
- if FileTest.exists?("/proc/self/status")
- txt = File.read("/proc/self/status")
- if txt =~ /^(s_context|VxID):[[:blank:]]*[1-9]/
- result = "vserver"
- end
- end
+ result = "vserver" if Facter::Util::Virtual.vserver?
if FileTest.exists?("/proc/virtual")
result = "vserver_host"
@@ -34,19 +21,19 @@ Facter.add("virtual") do
# new Xen domains have this in dom0 not domu :(
if FileTest.exists?("/proc/sys/xen/independent_wallclock")
- result = "xenu"
+ result = "xenu"
end
if FileTest.exists?("/sys/bus/xen")
- result = "xenu"
+ result = "xenu"
end
if FileTest.exists?("/proc/xen/capabilities")
txt = File.read("/proc/xen/capabilities")
if txt =~ /control_d/i
- result = "xen0"
+ result = "xen0"
end
end
-
+
if result == "physical"
output = Facter::Util::Resolution.exec('lspci')
if not output.nil?
@@ -86,7 +73,7 @@ Facter.add("is_virtual") do
setcode do
case Facter.value(:virtual)
- when "xenu", "openvzve", "vmware"
+ when "xenu", "openvzve", "vmware"
true
else
false
diff --git a/spec/unit/util/virtual_spec.rb b/spec/unit/util/virtual_spec.rb
new file mode 100644
index 0000000..3552c45
--- /dev/null
+++ b/spec/unit/util/virtual_spec.rb
@@ -0,0 +1,60 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+require 'facter/util/virtual'
+
+describe Facter::Util::Virtual do
+
+ after do
+ Facter.clear
+ end
+ it "should detect openvz" do
+ FileTest.stubs(:exists?).with("/proc/vz/veinfo").returns(true)
+ Facter::Util::Virtual.should be_openvz
+ end
+
+ it "should identify openvzhn when version file exists" do
+ Facter::Util::Virtual.stubs(:openvz?).returns(true)
+ FileTest.stubs(:exists?).with("/proc/vz/version").returns(true)
+ Facter::Util::Virtual.openvz_type().should == "openvzhn"
+ end
+
+ it "should identify openvzve when no version file exists" do
+ Facter::Util::Virtual.stubs(:openvz?).returns(true)
+ FileTest.stubs(:exists?).with("/proc/vz/version").returns(false)
+ Facter::Util::Virtual.openvz_type().should == "openvzve"
+ end
+
+ it "should identify Solaris zones when non-global zone" do
+ Facter::Util::Resolution.stubs(:exec).with("/sbin/zonename").returns("somezone")
+ Facter::Util::Virtual.should be_zone
+ end
+
+ it "should not identify Solaris zones when global zone" do
+ Facter::Util::Resolution.stubs(:exec).with("/sbin/zonename").returns("global")
+ Facter::Util::Virtual.should_not be_zone
+ end
+
+ it "should not detect vserver if no self status" do
+ FileTest.stubs(:exists?).with("/proc/self/status").returns(false)
+ Facter::Util::Virtual.should_not be_vserver
+ end
+
+ it "should detect vserver when vxid present in process status" do
+ FileTest.stubs(:exists?).with("/proc/self/status").returns(true)
+ File.stubs(:read).with("/proc/self/status").returns("VxID: 42\n")
+ Facter::Util::Virtual.should be_vserver
+ end
+
+ it "should detect vserver when s_context present in process status" do
+ FileTest.stubs(:exists?).with("/proc/self/status").returns(true)
+ File.stubs(:read).with("/proc/self/status").returns("s_context: 42\n")
+ Facter::Util::Virtual.should be_vserver
+ end
+
+ it "should not detect vserver when vserver flags not present in process status" do
+ FileTest.stubs(:exists?).with("/proc/self/status").returns(true)
+ File.stubs(:read).with("/proc/self/status").returns("wibble: 42\n")
+ Facter::Util::Virtual.should_not be_vserver
+ end
+
+end
diff --git a/spec/unit/virtual_spec.rb b/spec/unit/virtual_spec.rb
new file mode 100644
index 0000000..68cd258
--- /dev/null
+++ b/spec/unit/virtual_spec.rb
@@ -0,0 +1,49 @@
+require File.dirname(__FILE__) + '/../spec_helper'
+
+require 'facter'
+require 'facter/util/virtual'
+
+describe "Virtual fact" do
+
+ after do
+ Facter.clear
+ end
+
+ it "should be zone on Solaris when a zone" do
+ Facter.fact(:kernel).stubs(:value).returns("SunOS")
+ Facter::Util::Virtual.stubs(:zone?).returns(true)
+ Facter.fact(:virtual).value.should == "zone"
+ end
+
+end
+
+describe "is_virtual fact" do
+
+ after do
+ Facter.clear
+ end
+
+ it "should be virtual when running on xen" do
+ Facter.fact(:kernel).stubs(:value).returns("Linux")
+ Facter.fact(:virtual).stubs(:value).returns("xenu")
+ Facter.fact(:is_virtual).value.should == true
+ end
+
+ it "should be false when running on xen0" do
+ Facter.fact(:kernel).stubs(:value).returns("Linux")
+ Facter.fact(:virtual).stubs(:value).returns("xen0")
+ Facter.fact(:is_virtual).value.should == false
+ end
+
+ it "should be true when running on vmware" do
+ Facter.fact(:kernel).stubs(:value).returns("Linux")
+ Facter.fact(:virtual).stubs(:value).returns("vmware")
+ Facter.fact(:is_virtual).value.should == true
+ end
+
+ it "should be true when running on openvz" do
+ Facter.fact(:kernel).stubs(:value).returns("Linux")
+ Facter.fact(:virtual).stubs(:value).returns("openvzve")
+ Facter.fact(:is_virtual).value.should == true
+ end
+end