diff options
author | Paul Nasrat <pnasrat@googlemail.com> | 2009-05-28 08:15:01 +0100 |
---|---|---|
committer | Paul Nasrat <pnasrat@googlemail.com> | 2009-07-16 14:17:18 +0100 |
commit | c02d3b66eb2878968befea64c3a3ab69dc9e5de8 (patch) | |
tree | 3127d620164a612a64e754c5a4ce0b0f49733fa1 | |
parent | 545f3c1405451afecb1e79bd34e15640322162e2 (diff) | |
download | facter-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.rb | 27 | ||||
-rw-r--r-- | lib/facter/virtual.rb | 35 | ||||
-rw-r--r-- | spec/unit/util/virtual_spec.rb | 60 | ||||
-rw-r--r-- | spec/unit/virtual_spec.rb | 49 |
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 |