summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Smith <tsmith84@gmail.com>2015-11-27 13:27:48 -0800
committerTim Smith <tsmith84@gmail.com>2015-11-27 18:03:40 -0800
commitdbc5c406df19f0d2bbcca364d1f3d36957d04c81 (patch)
tree7879a69c63c3bbddf80ecb07a8be8f946c5125c0
parentebeb43911a65a39ab0b5ffb49e2f9eae7dfe61f4 (diff)
downloadohai-dbc5c406df19f0d2bbcca364d1f3d36957d04c81.tar.gz
Move dmidecode parsing into a mixin to dedupe code
-rw-r--r--lib/ohai/mixin/dmi_decode.rb45
-rw-r--r--lib/ohai/plugins/bsd/virtualization.rb72
-rw-r--r--lib/ohai/plugins/linux/virtualization.rb45
-rw-r--r--spec/unit/plugins/bsd/virtualization_spec.rb7
-rw-r--r--spec/unit/plugins/linux/virtualization_spec.rb10
5 files changed, 83 insertions, 96 deletions
diff --git a/lib/ohai/mixin/dmi_decode.rb b/lib/ohai/mixin/dmi_decode.rb
new file mode 100644
index 00000000..625b6c90
--- /dev/null
+++ b/lib/ohai/mixin/dmi_decode.rb
@@ -0,0 +1,45 @@
+#
+# Author:: Tim Smith <tsmith@chef.io>
+# Copyright:: Copyright (c) 2015 Chef Software, Inc.
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# http://www.dmo.ca/blog/detecting-virtualization-on-linux
+module ::Ohai::Mixin::DmiDecode
+ def determine_guest(dmi_data)
+ dmi_data.each_line do |line|
+ case line
+ when /Manufacturer: Microsoft/
+ if dmi_data =~ /Product Name: Virtual Machine/
+ if dmi_data =~ /Version: VS2005R2/
+ return 'virtualpc'
+ else
+ return 'virtualserver'
+ end
+ end
+ when /Manufacturer: VMware/
+ return 'vmware'
+ when /Manufacturer: Xen/
+ return 'xen'
+ when /Product Name: VirtualBox/
+ return 'vbox'
+ when /Product Name: OpenStack/
+ return 'openstack'
+ when /Manufacturer: QEMU|Product Name: (KVM|RHEV)/
+ return 'kvm'
+ end
+ end
+ return nil
+ end
+end
diff --git a/lib/ohai/plugins/bsd/virtualization.rb b/lib/ohai/plugins/bsd/virtualization.rb
index c199036f..5317fa9e 100644
--- a/lib/ohai/plugins/bsd/virtualization.rb
+++ b/lib/ohai/plugins/bsd/virtualization.rb
@@ -16,17 +16,31 @@
# limitations under the License.
#
+require 'ohai/mixin/dmi_decode'
+
+include Ohai::Mixin::DmiDecode
+
Ohai.plugin(:Virtualization) do
provides 'virtualization'
collect_data(:freebsd, :openbsd, :netbsd, :dragonflybsd) do
+
virtualization Mash.new unless virtualization
virtualization[:systems] = Mash.new unless virtualization[:systems]
+ # detect when in a jail or when a jail is actively running (not in stopped state)
so = shell_out("sysctl -n security.jail.jailed")
if so.stdout.split($/)[0].to_i == 1
virtualization[:system] = "jail"
virtualization[:role] = "guest"
+ virtualization[:systems][:jail] = 'guest'
+ end
+
+ so = shell_out('jls -n')
+ if (so.stdout || '').lines.count >= 1
+ virtualization[:system] = 'jail'
+ virtualization[:role] = 'host'
+ virtualization[:systems][:jail] = 'host'
end
# detect from modules
@@ -44,68 +58,22 @@ Ohai.plugin(:Virtualization) do
end
end
- # XXX doesn't work when jail is there but not running (ezjail-admin stop)
- so = shell_out('jls -n')
- if (so.stdout || '').lines.count >= 1
- virtualization[:system] = 'jail'
- virtualization[:role] = 'host'
- virtualization[:systems][:jail] = 'host'
- end
-
- # KVM Host support for FreeBSD is in development
- # http://feanor.sssup.it/~fabio/freebsd/lkvm/
-
# Detect KVM/QEMU from cpu, report as KVM
# hw.model: QEMU Virtual CPU version 0.9.1
so = shell_out('sysctl -n hw.model')
- if so.stdout.split($INPUT_RECORD_SEPARATOR)[0] =~ /QEMU Virtual CPU|Common KVM processor|Common 32-bit KVM processor/
+ if so.stdout.split($/)[0] =~ /QEMU Virtual CPU|Common KVM processor|Common 32-bit KVM processor/
virtualization[:system] = 'kvm'
virtualization[:role] = 'guest'
virtualization[:systems][:kvm] = 'guest'
end
- # http://www.dmo.ca/blog/detecting-virtualization-on-linux
+ # parse dmidecode to discover various virtualization guests
if File.exist?('/usr/local/sbin/dmidecode') || File.exist?('/usr/pkg/sbin/dmidecode')
- so = shell_out('dmidecode')
- case so.stdout
- when /Manufacturer: Microsoft/
- if so.stdout =~ /Product Name: Virtual Machine/
- if so.stdout =~ /Version: VS2005R2/
- virtualization[:system] = 'virtualserver'
- virtualization[:role] = 'guest'
- virtualization[:systems][:virtualserver] = 'guest'
- else
- virtualization[:system] = 'virtualpc'
- virtualization[:role] = 'guest'
- virtualization[:systems][:virtualpc] = 'guest'
- end
- end
- when /Manufacturer: VMware/
- if so.stdout =~ /Product Name: VMware Virtual Platform/
- virtualization[:system] = 'vmware'
- virtualization[:role] = 'guest'
- virtualization[:systems][:vmware] = 'guest'
- end
- when /Manufacturer: Xen/
- if so.stdout =~ /Product Name: HVM domU/
- virtualization[:system] = 'xen'
- virtualization[:role] = 'guest'
- virtualization[:systems][:xen] = 'guest'
- end
- when /Manufacturer: Oracle Corporation/
- if so.stdout =~ /Product Name: VirtualBox/
- virtualization[:system] = 'vbox'
- virtualization[:role] = 'guest'
- virtualization[:systems][:vbox] = 'guest'
- end
- when /Product Name: OpenStack/
- virtualization[:system] = 'openstack'
- virtualization[:role] = 'guest'
- virtualization[:systems][:openstack] = 'guest'
- when /Manufacturer: QEMU|Product Name: (KVM|RHEV)/
- virtualization[:system] = 'kvm'
+ guest = determine_guest(shell_out('dmidecode').stdout)
+ if guest
+ virtualization[:system] = guest
virtualization[:role] = 'guest'
- virtualization[:systems][:kvm] = 'guest'
+ virtualization[:systems][guest.to_sym] = 'guest'
end
end
end
diff --git a/lib/ohai/plugins/linux/virtualization.rb b/lib/ohai/plugins/linux/virtualization.rb
index fb433824..c53c06ae 100644
--- a/lib/ohai/plugins/linux/virtualization.rb
+++ b/lib/ohai/plugins/linux/virtualization.rb
@@ -17,8 +17,10 @@
#
require 'ohai/util/file_helper'
+require 'ohai/mixin/dmi_decode'
include Ohai::Util::FileHelper
+include Ohai::Mixin::DmiDecode
Ohai.plugin(:Virtualization) do
provides "virtualization"
@@ -114,44 +116,13 @@ Ohai.plugin(:Virtualization) do
end
end
- # http://www.dmo.ca/blog/detecting-virtualization-on-linux
+ # parse dmidecode to discover various virtualization guests
if File.exists?("/usr/sbin/dmidecode")
- so = shell_out("dmidecode")
- case so.stdout
- when /Manufacturer: Microsoft/
- if so.stdout =~ /Product Name: Virtual Machine/
- virtualization[:system] = "virtualpc"
- virtualization[:role] = "guest"
- virtualization[:systems][:virtualpc] = "guest"
- end
- when /Manufacturer: VMware/
- if so.stdout =~ /Product Name: VMware Virtual Platform/
- virtualization[:system] = "vmware"
- virtualization[:role] = "guest"
- virtualization[:systems][:vmware] = "guest"
- end
- when /Manufacturer: Xen/
- if so.stdout =~ /Product Name: HVM domU/
- virtualization[:system] = "xen"
- virtualization[:role] = "guest"
- virtualization[:systems][:xen] = "guest"
- end
- when /Manufacturer: Oracle Corporation/
- if so.stdout =~ /Product Name: VirtualBox/
- virtualization[:system] = "vbox"
- virtualization[:role] = "guest"
- virtualization[:systems][:vbox] = "guest"
- end
- when /Product Name: OpenStack/
- virtualization[:system] = "openstack"
- virtualization[:role] = "guest"
- virtualization[:systems][:openstack] = "guest"
- when /Manufacturer: QEMU|Product Name: (KVM|RHEV)/
- virtualization[:system] = "kvm"
- virtualization[:role] = "guest"
- virtualization[:systems][:kvm] = "guest"
- else
- nil
+ guest = determine_guest(shell_out('dmidecode').stdout)
+ if guest
+ virtualization[:system] = guest
+ virtualization[:role] = 'guest'
+ virtualization[:systems][guest.to_sym] = 'guest'
end
end
diff --git a/spec/unit/plugins/bsd/virtualization_spec.rb b/spec/unit/plugins/bsd/virtualization_spec.rb
index b2b396cf..355df67f 100644
--- a/spec/unit/plugins/bsd/virtualization_spec.rb
+++ b/spec/unit/plugins/bsd/virtualization_spec.rb
@@ -34,6 +34,7 @@ describe Ohai::System, "BSD virtualization plugin" do
@plugin.run
expect(@plugin[:virtualization][:system]).to eq("jail")
expect(@plugin[:virtualization][:role]).to eq("guest")
+ expect(@plugin[:virtualization][:systems][:jail]).to eq("guest")
end
it "detects we are hosting jails" do
@@ -43,6 +44,7 @@ describe Ohai::System, "BSD virtualization plugin" do
@plugin.run
expect(@plugin[:virtualization][:system]).to eq("jail")
expect(@plugin[:virtualization][:role]).to eq("host")
+ expect(@plugin[:virtualization][:systems][:jail]).to eq("host")
end
end
@@ -60,6 +62,7 @@ OUT
@plugin.run
expect(@plugin[:virtualization][:system]).to eq("vbox")
expect(@plugin[:virtualization][:role]).to eq("guest")
+ expect(@plugin[:virtualization][:systems][:vbox]).to eq("guest")
end
end
@@ -77,6 +80,7 @@ OUT
@plugin.run
expect(@plugin[:virtualization][:system]).to eq("vbox")
expect(@plugin[:virtualization][:role]).to eq("host")
+ expect(@plugin[:virtualization][:systems][:vbox]).to eq("host")
end
end
@@ -87,9 +91,8 @@ OUT
@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
end
end
-
- # TODO upfactor tests from linux virtualization plugin for dmidecode
end
diff --git a/spec/unit/plugins/linux/virtualization_spec.rb b/spec/unit/plugins/linux/virtualization_spec.rb
index ab7bf274..70046e44 100644
--- a/spec/unit/plugins/linux/virtualization_spec.rb
+++ b/spec/unit/plugins/linux/virtualization_spec.rb
@@ -168,7 +168,7 @@ MSVPC
expect(plugin[:virtualization][:systems][:virtualpc]).to eq("guest")
end
- it "sets vmware guest if dmidecode detects VMware Virtual Platform" do
+ it "sets vmware guest if dmidecode detects VMware" do
vmware_dmidecode=<<-VMWARE
System Information
Manufacturer: VMware, Inc.
@@ -187,7 +187,7 @@ VMWARE
expect(plugin[:virtualization][:systems][:vmware]).to eq("guest")
end
- it "sets vbox guest if dmidecode detects Oracle Corporation" do
+ it "sets vbox guest if dmidecode detects VirtualBox" do
vbox_dmidecode=<<-VBOX
Base Board Information
Manufacturer: Oracle Corporation
@@ -227,8 +227,8 @@ OPENSTACK
expect(plugin[:virtualization][:systems][:openstack]).to eq("guest")
end
- it "sets kvm guest if dmidecode detects KVM" do
- kvm_dmidecode=<<-KVM
+ it "sets kvm guest if dmidecode contains KVM" do
+ kvm_dmidecode=<<-RKVM
System Information
Manufacturer: Red Hat
Product Name: KVM
@@ -238,7 +238,7 @@ System Information
Wake-up Type: Power Switch
SKU Number: Not Specified
Family: Red Hat Enterprise Linux
-KVM
+RKVM
allow(plugin).to receive(:shell_out).with("dmidecode").and_return(mock_shell_out(0, kvm_dmidecode, ""))
plugin.run
expect(plugin[:virtualization][:system]).to eq("kvm")