diff options
author | Tim Smith <tsmith84@gmail.com> | 2015-11-27 13:27:48 -0800 |
---|---|---|
committer | Tim Smith <tsmith84@gmail.com> | 2015-11-27 18:03:40 -0800 |
commit | dbc5c406df19f0d2bbcca364d1f3d36957d04c81 (patch) | |
tree | 7879a69c63c3bbddf80ecb07a8be8f946c5125c0 | |
parent | ebeb43911a65a39ab0b5ffb49e2f9eae7dfe61f4 (diff) | |
download | ohai-dbc5c406df19f0d2bbcca364d1f3d36957d04c81.tar.gz |
Move dmidecode parsing into a mixin to dedupe code
-rw-r--r-- | lib/ohai/mixin/dmi_decode.rb | 45 | ||||
-rw-r--r-- | lib/ohai/plugins/bsd/virtualization.rb | 72 | ||||
-rw-r--r-- | lib/ohai/plugins/linux/virtualization.rb | 45 | ||||
-rw-r--r-- | spec/unit/plugins/bsd/virtualization_spec.rb | 7 | ||||
-rw-r--r-- | spec/unit/plugins/linux/virtualization_spec.rb | 10 |
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") |