summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Smith <tsmith84@gmail.com>2016-03-01 10:54:38 -0800
committerTim Smith <tsmith84@gmail.com>2016-03-01 10:54:38 -0800
commit5d46dd0039303b9bcc1e2b5c664f43a62472ae89 (patch)
treecc6aed8a3950e48130f28365949d20283512a473
parentd719d0f6f27806b2e3c926c73ca7ce12626fc368 (diff)
downloadohai-5d46dd0039303b9bcc1e2b5c664f43a62472ae89.tar.gz
Differentiate between KVM guests and hosts
This has been confirmed using an Openstack guest and host
-rw-r--r--lib/ohai/plugins/linux/virtualization.rb12
-rw-r--r--spec/unit/plugins/linux/virtualization_spec.rb12
2 files changed, 20 insertions, 4 deletions
diff --git a/lib/ohai/plugins/linux/virtualization.rb b/lib/ohai/plugins/linux/virtualization.rb
index 2df6a84c..6777063b 100644
--- a/lib/ohai/plugins/linux/virtualization.rb
+++ b/lib/ohai/plugins/linux/virtualization.rb
@@ -83,11 +83,17 @@ Ohai.plugin(:Virtualization) do
end
end
- # Detect KVM guests via /sys/ data
+ # Detect KVM systems via /sys
+ # guests will have the hypervisor cpu feature that hosts don't have
if File.exist?("/sys/devices/virtual/misc/kvm")
virtualization[:system] = "kvm"
- virtualization[:role] = "guest"
- virtualization[:systems][:kvm] = "guest"
+ if File.read("/proc/cpuinfo") =~ /hypervisor/
+ virtualization[:role] = "guest"
+ virtualization[:systems][:kvm] = "guest"
+ else
+ virtualization[:role] = "host"
+ virtualization[:systems][:kvm] = "host"
+ end
end
# Detect OpenVZ / Virtuozzo.
diff --git a/spec/unit/plugins/linux/virtualization_spec.rb b/spec/unit/plugins/linux/virtualization_spec.rb
index 068a6b2f..1c6d8258 100644
--- a/spec/unit/plugins/linux/virtualization_spec.rb
+++ b/spec/unit/plugins/linux/virtualization_spec.rb
@@ -78,14 +78,24 @@ describe Ohai::System, "Linux virtualization platform" do
end
describe "when we are checking for kvm" do
- it "sets kvm guest if /sys/devices/virtual/misc/kvm exists" do
+ it "sets kvm guest if /sys/devices/virtual/misc/kvm exists & hypervisor cpu feature is present" do
allow(File).to receive(:exist?).with("/sys/devices/virtual/misc/kvm").and_return(true)
+ allow(File).to receive(:read).with("/proc/cpuinfo").and_return("fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon rep_good nopl pni vmx ssse3 cx16 sse4_1 sse4_2 x2apic popcnt hypervisor lahf_lm vnmi ept tsc_adjust")
plugin.run
expect(plugin[:virtualization][:system]).to eq("kvm")
expect(plugin[:virtualization][:role]).to eq("guest")
expect(plugin[:virtualization][:systems][:kvm]).to eq("guest")
end
+ it "sets kvm host if /sys/devices/virtual/misc/kvm exists & hypervisor cpu feature is not present" do
+ allow(File).to receive(:exist?).with("/sys/devices/virtual/misc/kvm").and_return(true)
+ allow(File).to receive(:read).with("/proc/cpuinfo").and_return("fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt lahf_lm ida dtherm tpr_shadow vnmi flexpriority ept vpid")
+ plugin.run
+ expect(plugin[:virtualization][:system]).to eq("kvm")
+ expect(plugin[:virtualization][:role]).to eq("host")
+ expect(plugin[:virtualization][:systems][:kvm]).to eq("host")
+ end
+
it "sets kvm guest if /proc/cpuinfo contains QEMU Virtual CPU" do
expect(File).to receive(:exist?).with("/proc/cpuinfo").and_return(true)
allow(File).to receive(:read).with("/proc/cpuinfo").and_return("QEMU Virtual CPU")