[OHAI-458] Include Joyent SmartOS specific attributes in Ohai #133

Merged
merged 15 commits into from Jun 18, 2014
View
@@ -0,0 +1,82 @@
+#
+# Author: sawanoboriyu@higanworks.com
+# Copyright (C) 2014 HiganWorks LLC
+# 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.
+#
+#
+
+# Reference from: sm-summary command
+
+Ohai.plugin(:Joyent) do
+ provides 'joyent'
+ provides 'virtualization/guest_id'
+ depends 'os', 'platform', 'virtualization'
+
+ def collect_product_file
+ lines = []
+ if ::File.exists?("/etc/product")
+ ::File.open("/etc/product") do |file|
+ while line = file.gets
+ lines << line
+ end
+ end
+ end
+ lines
+ end
+
+ def collect_pkgsrc
+ if File.exist?('/opt/local/etc/pkg_install.conf')
+ sm_pkgsrc = ::File.read("/opt/local/etc/pkg_install.conf").split("=")
+ sm_pkgsrc[1].chomp
+ else
+ nil
+ end
+ end
+
+ def is_smartos?
+ platform == 'smartos'
+ end
+
+ collect_data do
+ if is_smartos?
@mcquin

mcquin May 30, 2014

Contributor

I'm not personally familiar with SmartOS, but if ::RbConfig::CONFIG['host_os'] matches SmartOS you can add a line that determines that here (https://github.com/opscode/ohai/blob/master/lib%2Fohai%2Fmixin%2Fos.rb#L26) and then write collect_data(:smartos) do instead of wrapping the code in an if-statement.

@sawanoboly

sawanoboly Jun 2, 2014

Contributor

Thanks for tell me usage for collect_data!

But ::RbConfig::CONFIG['host_os'] returns solaris2.11 on smartos.

> ::RbConfig::CONFIG['host_os']
=> "solaris2.11"
+ joyent Mash.new
+
+ # copy uuid
+ joyent[:sm_uuid] = virtualization[:guest_uuid]
+
+ # get zone id unless globalzone
+ unless joyent[:sm_uuid] == "global"
+ joyent[:sm_id] = virtualization[:guest_id]
+ end
+
+ # retrieve image name and pkgsrc
+ collect_product_file.each do |line|
+ case line
+ when /^Image/
+ sm_image = line.split(" ")
+ joyent[:sm_image_id] = sm_image[1]
+ joyent[:sm_image_ver] = sm_image[2]
+ when /^Base Image/
+ sm_baseimage = line.split(" ")
+ joyent[:sm_baseimage_id] = sm_baseimage[2]
+ joyent[:sm_baseimage_ver] = sm_baseimage[3]
+ end
+ end
+
+ ## retrieve pkgsrc
+ joyent[:sm_pkgsrc] = collect_pkgsrc if collect_pkgsrc
+ end
+ end
+end
@@ -21,6 +21,12 @@
Ohai.plugin(:Virtualization) do
provides "virtualization"
+ def collect_solaris_guestid
+ command = '/usr/sbin/zoneadm list -p'
+ so = shell_out(command)
+ so.stdout.split(':').first
+ end
+
collect_data(:solaris2) do
virtualization Mash.new
@@ -75,6 +81,7 @@
virtualization[:system] = 'zone'
virtualization[:role] = 'guest'
virtualization[:guest_uuid] = zones[first_zone]['uuid']
+ virtualization[:guest_id] = collect_solaris_guestid
end
elsif (zones.length > 1)
virtualization[:system] = 'zone'
@@ -0,0 +1,74 @@
+require 'spec_helper'
+
+
+describe Ohai::System, "plugin joyent" do
+ before(:each) do
+ @plugin = get_plugin('joyent')
+ end
+
+ describe "without joyent" do
+ before(:each) do
+ @plugin.stub(:is_smartos?).and_return(false)
+ end
+
+ it "should NOT create joyent" do
+ @plugin.run
+ @plugin[:joyent].should be_nil
+ end
+ end
+
+ describe "with joyent" do
+ before(:each) do
+ @plugin.stub(:is_smartos?).and_return(true)
+ @plugin[:virtualization] = Mash.new
+ @plugin[:virtualization][:guest_uuid] = "global"
+ end
+
+ it "should create joyent" do
+ @plugin.run
+ @plugin[:joyent].should_not be_nil
+ end
+
+ describe "under global zone" do
+ before(:each) do
+ @plugin.run
+ end
+
+ it "should ditect global zone" do
+ @plugin[:joyent][:sm_uuid].should eql 'global'
+ end
+
+ it "should NOT create sm_id" do
+ @plugin[:joyent][:sm_id].should be_nil
+ end
+ end
+
+ describe "under smartmachine" do
+ before(:each) do
+ @plugin[:virtualization][:guest_uuid] = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx'
+ @plugin[:virtualization][:guest_id] = '30'
+ @plugin.stub(:collect_product_file).and_return(["Name: Joyent Instance", "Image: base64 13.4.2", "Documentation: http://wiki.joyent.com/jpc2/SmartMachine+Base"])
+ @plugin.stub(:collect_pkgsrc).and_return('http://pkgsrc.joyent.com/packages/SmartOS/2013Q4/x86_64/All')
+ @plugin.run
+ end
+
+ it "should retrive zone uuid" do
+ @plugin[:joyent][:sm_uuid].should eql 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx'
+ end
+
+ it "should collect sm_id" do
+ @plugin[:joyent][:sm_id].should eql '30'
+ end
+
+ it "should collect images" do
+ @plugin[:joyent][:sm_image_id].should_not be_nil
+ @plugin[:joyent][:sm_image_ver].should_not be_nil
+ end
+
+ it "should collect pkgsrc" do
+ @plugin[:joyent][:sm_pkgsrc].should eql 'http://pkgsrc.joyent.com/packages/SmartOS/2013Q4/x86_64/All'
+ end
+ end
+ end
+end
+