ohai 8.6.0.alpha.1 → 8.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -12
  3. data/lib/ohai/config.rb +3 -0
  4. data/lib/ohai/dsl/plugin/versionvii.rb +41 -0
  5. data/lib/ohai/exception.rb +1 -0
  6. data/lib/ohai/mixin/softlayer_metadata.rb +64 -0
  7. data/lib/ohai/plugin_config.rb +46 -0
  8. data/lib/ohai/plugins/aix/cpu.rb +23 -18
  9. data/lib/ohai/plugins/aix/memory.rb +9 -2
  10. data/lib/ohai/plugins/aix/network.rb +1 -1
  11. data/lib/ohai/plugins/cloud.rb +34 -3
  12. data/lib/ohai/plugins/ec2.rb +6 -0
  13. data/lib/ohai/plugins/linux/network.rb +245 -190
  14. data/lib/ohai/plugins/linux/platform.rb +50 -15
  15. data/lib/ohai/plugins/linux/virtualization.rb +3 -1
  16. data/lib/ohai/plugins/softlayer.rb +47 -0
  17. data/lib/ohai/plugins/solaris2/cpu.rb +46 -17
  18. data/lib/ohai/plugins/solaris2/memory.rb +9 -1
  19. data/lib/ohai/plugins/vmware.rb +73 -0
  20. data/lib/ohai/plugins/windows/memory.rb +38 -0
  21. data/lib/ohai/version.rb +1 -1
  22. data/spec/unit/config_spec.rb +28 -0
  23. data/spec/unit/dsl/plugin_spec.rb +73 -0
  24. data/spec/unit/mixin/softlayer_metadata_spec.rb +71 -0
  25. data/spec/unit/plugin_config_spec.rb +118 -0
  26. data/spec/unit/plugins/aix/cpu_spec.rb +31 -12
  27. data/spec/unit/plugins/aix/memory_spec.rb +47 -0
  28. data/spec/unit/plugins/aix/network_spec.rb +1 -1
  29. data/spec/unit/plugins/ec2_spec.rb +35 -13
  30. data/spec/unit/plugins/linux/memory_spec.rb +204 -0
  31. data/spec/unit/plugins/linux/network_spec.rb +40 -0
  32. data/spec/unit/plugins/linux/platform_spec.rb +62 -6
  33. data/spec/unit/plugins/linux/virtualization_spec.rb +21 -0
  34. data/spec/unit/plugins/softlayer_spec.rb +60 -0
  35. data/spec/unit/plugins/solaris2/cpu_spec.rb +2887 -42
  36. data/spec/unit/plugins/solaris2/memory_spec.rb +15 -2
  37. data/spec/unit/plugins/vmware_spec.rb +62 -0
  38. data/spec/unit/plugins/windows/memory_spec.rb +52 -0
  39. metadata +18 -5
@@ -28,18 +28,48 @@ Ohai.plugin(:Platform) do
28
28
  contents[/Rawhide/i] ? contents[/((\d+) \(Rawhide\))/i, 1].downcase : contents[/release ([\d\.]+)/, 1]
29
29
  end
30
30
 
31
- def os_release_file_is_cisco?
32
- return false unless File.exist?('/etc/os-release')
33
- os_release_info = File.read('/etc/os-release').split.inject({}) do |map, key_value_line|
34
- key, _separator, value = key_value_line.partition('=')
35
- map[key] = value
31
+ #
32
+ # Reads an os-release-info file and parse it into a hash
33
+ #
34
+ # @param file [String] the filename to read (e.g. '/etc/os-release')
35
+ #
36
+ # @returns [Hash] the file parsed into a Hash or nil
37
+ #
38
+ def read_os_release_info(file)
39
+ return nil unless File.exist?(file)
40
+ File.read(file).split.inject({}) do |map, line|
41
+ key, value = line.split('=')
42
+ map[key] = value.gsub(/\A"|"\Z/, '') if value
36
43
  map
37
44
  end
38
- if os_release_info['CISCO_RELEASE_INFO'] && File.exist?(os_release_info['CISCO_RELEASE_INFO'])
39
- os_release_info
40
- else
41
- false
42
- end
45
+ end
46
+
47
+ #
48
+ # Cached /etc/os-release info Hash. Also has logic for Cisco Nexus
49
+ # switches that pulls the chained CISCO_RELEASE_INFO file into the Hash (other
50
+ # distros can also reuse this method safely).
51
+ #
52
+ # @returns [Hash] the canonical, cached Hash of /etc/os-release info or nil
53
+ #
54
+ def os_release_info
55
+ @os_release_info ||=
56
+ begin
57
+ os_release_info = read_os_release_info('/etc/os-release')
58
+ cisco_release_info = os_release_info['CISCO_RELEASE_INFO'] if os_release_info
59
+ if cisco_release_info && File.exist?(cisco_release_info)
60
+ os_release_info.merge!(read_os_release_info(cisco_release_info))
61
+ end
62
+ os_release_info
63
+ end
64
+ end
65
+
66
+ #
67
+ # If /etc/os-release indicates we are Cisco based
68
+ #
69
+ # @returns [Boolean] if we are Cisco according to /etc/os-release
70
+ #
71
+ def os_release_file_is_cisco?
72
+ File.exist?('/etc/os-release') && os_release_info['CISCO_RELEASE_INFO']
43
73
  end
44
74
 
45
75
  collect_data(:linux) do
@@ -74,10 +104,9 @@ Ohai.plugin(:Platform) do
74
104
  platform get_redhatish_platform(contents)
75
105
  platform_version contents.match(/(\d\.\d\.\d)/)[0]
76
106
  elsif File.exist?("/etc/redhat-release")
77
- if File.exist?('/etc/os-release') && (os_release_info = os_release_file_is_cisco? ) # check if Cisco
78
- platform os_release_info['ID']
79
- platform_family os_release_info['ID_LIKE']
80
- platform_version os_release_info['VERSION'] || ""
107
+ if os_release_file_is_cisco? # Cisco guestshell
108
+ platform 'nexus_centos'
109
+ platform_version os_release_info['VERSION']
81
110
  else
82
111
  contents = File.read("/etc/redhat-release").chomp
83
112
  platform get_redhatish_platform(contents)
@@ -113,6 +142,12 @@ Ohai.plugin(:Platform) do
113
142
  # no way to determine platform_version in a rolling release distribution
114
143
  # kernel release will be used - ex. 3.13
115
144
  platform_version `uname -r`.strip
145
+ elsif os_release_file_is_cisco?
146
+ raise "unknown Cisco /etc/os-release ID field" unless os_release_info['ID'].include?('nexus')
147
+ raise "unknown Cisco /etc/os-release ID-LIKE field" unless os_release_info['ID_LIKE'].include?('wrlinux')
148
+ platform 'nexus'
149
+ platform_family 'wrlinux'
150
+ platform_version os_release_info['VERSION']
116
151
  elsif lsb[:id] =~ /RedHat/i
117
152
  platform "redhat"
118
153
  platform_version lsb[:release]
@@ -135,7 +170,7 @@ Ohai.plugin(:Platform) do
135
170
  platform_family "debian"
136
171
  when /fedora/, /pidora/
137
172
  platform_family "fedora"
138
- when /oracle/, /centos/, /redhat/, /scientific/, /enterpriseenterprise/, /amazon/, /xenserver/, /cloudlinux/, /ibm_powerkvm/, /parallels/ # Note that 'enterpriseenterprise' is oracle's LSB "distributor ID"
173
+ when /oracle/, /centos/, /redhat/, /scientific/, /enterpriseenterprise/, /amazon/, /xenserver/, /cloudlinux/, /ibm_powerkvm/, /parallels/, /nexus_centos/ # Note that 'enterpriseenterprise' is oracle's LSB "distributor ID"
139
174
  platform_family "rhel"
140
175
  when /suse/
141
176
  platform_family "suse"
@@ -190,7 +190,9 @@ Ohai.plugin(:Virtualization) do
190
190
  # Full notes, https://tickets.opscode.com/browse/OHAI-551
191
191
  # Kernel docs, https://www.kernel.org/doc/Documentation/cgroups
192
192
  if File.exists?("/proc/self/cgroup")
193
- if File.read("/proc/self/cgroup") =~ %r{^\d+:[^:]+:/(lxc|docker)/.+$}
193
+ cgroup_content = File.read("/proc/self/cgroup")
194
+ if cgroup_content =~ %r{^\d+:[^:]+:/(lxc|docker)/.+$} ||
195
+ cgroup_content =~ %r{^\d+:[^:]+:/[^/]+/(lxc|docker)-.+$}
194
196
  virtualization[:system] = $1
195
197
  virtualization[:role] = "guest"
196
198
  virtualization[:systems][$1.to_sym] = "guest"
@@ -0,0 +1,47 @@
1
+ #
2
+ # Author:: Alexey Karpik <alexey.karpik@rightscale.com>
3
+ # Author:: Peter Schroeter <peter.schroeter@rightscale.com>
4
+ # Author:: Stas Turlo <stanislav.turlo@rightscale.com>
5
+ # Copyright:: Copyright (c) 2010-2014 RightScale Inc
6
+ # License:: Apache License, Version 2.0
7
+ #
8
+ # Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
17
+ # implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+
21
+ require 'ohai/mixin/softlayer_metadata'
22
+
23
+ Ohai.plugin(:Softlayer) do
24
+ include ::Ohai::Mixin::SoftlayerMetadata
25
+
26
+ provides 'softlayer'
27
+
28
+ # Identifies the softlayer cloud
29
+ #
30
+ # === Return
31
+ # true:: If the softlayer cloud can be identified
32
+ # false:: Otherwise
33
+ def looks_like_softlayer?
34
+ hint?('softlayer')
35
+ end
36
+
37
+ collect_data do
38
+ # Adds softlayer Mash
39
+ if looks_like_softlayer?
40
+ ::Ohai::Log.debug("looks_like_softlayer? == true")
41
+ metadata = fetch_metadata
42
+ softlayer Mash.new
43
+ metadata.each { |k,v| softlayer[k] = v } if metadata
44
+ end
45
+
46
+ end
47
+ end
@@ -16,26 +16,55 @@
16
16
 
17
17
  Ohai.plugin(:CPU) do
18
18
  provides "cpu"
19
-
19
+
20
20
  collect_data(:solaris2) do
21
21
  cpu Mash.new
22
- cpu[:total] = shell_out("psrinfo | wc -l").stdout.to_i
23
- cpu[:real] = shell_out("psrinfo -p").stdout.to_i
24
-
25
- processor_info = shell_out("psrinfo -v -p | grep Hz").stdout
26
- processors = processor_info.split(/^ [^\s]/)
27
- processors.each_with_index do |processor, i|
28
- cpu_info, model_name = processor.split("\n ")
29
- cpu_info = cpu_info.tr("()","").split
22
+ # This does assume that /usr/bin/kstat is in the path
23
+ processor_info = shell_out("kstat -p cpu_info").stdout.lines
24
+ cpu["total"] = 0
25
+ cpu["sockets"] = 0
26
+ cpu["cores"] = 0
27
+ cpu["corethreads"] = 0
28
+ cpu["cpustates"] = Mash.new
30
29
 
31
- index = i.to_s
32
- cpu[index] = Mash.new
33
- cpu[index]['vendor_id'] = cpu_info[1]
34
- cpu[index]['family'] = cpu_info[4]
35
- cpu[index]['model'] = cpu_info[6]
36
- cpu[index]['stepping'] = cpu_info[8]
37
- cpu[index]['model_name'] = model_name.strip
38
- cpu[index]['mhz'] = cpu_info[10]
30
+ currentcpu = 0
31
+ cpucores = Array.new
32
+ cpusockets = Array.new
33
+ processor_info.each_with_index do |processor, i|
34
+ desc,instance,record,keyvalue = processor.split(":")
35
+ cpu[instance] ||= Mash.new
36
+ if (currentcpu != instance)
37
+ cpu["total"] += 1
38
+ currentcpu = instance
39
+ end
40
+ kv = keyvalue.split(/\s+/)
41
+ key = kv.shift
42
+ value = kv.join(" ").chomp
43
+ case key
44
+ when /chip_id/
45
+ cpu[instance]["socket"] = value
46
+ cpusockets.push(value) if cpusockets.index(value).nil?
47
+ when /cpu_type/
48
+ cpu[instance]["arch"] = value
49
+ when /clock_MHz/
50
+ cpu[instance]["mhz"] = value
51
+ when /brand/
52
+ cpu[instance]["model_name"] = value.sub(/\s+/," ")
53
+ when /^state$/
54
+ cpu[instance]["state"] = value
55
+ cpu["cpustates"][value] ||= 0
56
+ cpu["cpustates"][value] += 1
57
+ when /core_id/
58
+ cpu[instance]["core_id"] = value
59
+ # Detect hyperthreading/multithreading
60
+ cpucores.push(value) if cpucores.index(value).nil?
61
+ when /family|fpu_type|model|stepping|vendor_id/
62
+ cpu[instance][key] = value
63
+ end
39
64
  end
65
+ cpu["cores"] = cpucores.size
66
+ cpu["corethreads"] = (cpu["total"] / cpucores.size)
67
+ cpu["sockets"] = cpusockets.size
68
+ cpu["real"] = cpusockets.size
40
69
  end
41
70
  end
@@ -19,6 +19,14 @@ Ohai.plugin(:Memory) do
19
19
 
20
20
  collect_data(:solaris2) do
21
21
  memory Mash.new
22
- memory[:total] = shell_out("prtconf -m").stdout.to_i
22
+ memory[:swap] = Mash.new
23
+ meminfo = shell_out("prtconf | grep Memory").stdout
24
+ memory[:total] = "#{meminfo.split[2].to_i * 1024}kB"
25
+
26
+ tokens = shell_out("swap -s").stdout.strip.split
27
+ used_swap = tokens[8][0..-1].to_i #strip k from end
28
+ free_swap = tokens[10][0..-1].to_i #strip k from end
29
+ memory[:swap][:total] = "#{used_swap + free_swap}kB"
30
+ memory[:swap][:free] = "#{free_swap}kB"
23
31
  end
24
32
  end
@@ -0,0 +1,73 @@
1
+ #
2
+ # Author:: "Dan Robinson" <drobinson@getchef.com>
3
+ # Author:: "Christopher M. Luciano" <cmlucian@us.ibm.com>
4
+ # Copyright:: Copyright (c) 2014 Chef Software, Inc.
5
+ # Copyright (C) 2015 IBM Corp.
6
+ # License:: Apache License, Version 2.0
7
+ #
8
+ # Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ # See the License for the specific language governing permissions and
18
+ # limitations under the License.
19
+ #
20
+
21
+ #
22
+ # Provides a set of attributes for a VMware ESX virtual machine with results
23
+ # obtained from vmware-toolbox-cmd. VMware Tools must be installed
24
+ # on the virtual machine.
25
+ #
26
+ # Modify the path to vmware-toolbox-cmd in the call to get_vm_attributes for
27
+ # your particular operating system and configuration
28
+ #
29
+ # Example:
30
+ #
31
+ # get_vm_attributes("/usr/bin/vmware-toolbox-cmd")
32
+ #
33
+
34
+ Ohai.plugin(:VMware) do
35
+ provides "vmware"
36
+
37
+ def from_cmd(cmd)
38
+ so = shell_out(cmd)
39
+ so.stdout.split($/)[0]
40
+ end
41
+
42
+ def get_vm_attributes(vmtools_path)
43
+ if !File.exist?(vmtools_path)
44
+ Ohai::Log.debug("#{vmtools_path} not found")
45
+ else
46
+ vmware Mash.new
47
+ begin
48
+ # vmware-toolbox-cmd stat <param> commands
49
+ # Iterate through each parameter supported by the "vwware-toolbox-cmd stat" command, assign value
50
+ # to attribute "vmware[:<parameter>]"
51
+ [ "hosttime", "speed", "sessionid", "balloon", "swap", "memlimit", "memres", "cpures", "cpulimit" ].each do |param|
52
+ vmware[param] = from_cmd("#{vmtools_path} stat #{param}")
53
+ if vmware[param] =~ /UpdateInfo failed/
54
+ vmware[param] = nil
55
+ end
56
+ end
57
+ # vmware-toolbox-cmd <param> status commands
58
+ # Iterate through each parameter supported by the "vwware-toolbox-cmd status" command, assign value
59
+ # to attribute "vmware[:<parameter>]"
60
+ [ "upgrade", "timesync" ].each do |param|
61
+ vmware[param] = from_cmd("#{vmtools_path} #{param} status")
62
+ end
63
+ rescue
64
+ Ohai::Log.debug("Error while collecting VMware guest attributes")
65
+ end
66
+ end
67
+ end
68
+
69
+ collect_data(:linux) do
70
+ get_vm_attributes("/usr/bin/vmware-toolbox-cmd")
71
+ end
72
+
73
+ end
@@ -0,0 +1,38 @@
1
+ #
2
+ # License:: Apache License, Version 2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ Ohai.plugin(:Memory) do
17
+ provides "memory"
18
+
19
+ collect_data(:windows) do
20
+ require "wmi-lite/wmi"
21
+
22
+ memory Mash.new
23
+ memory[:swap] = Mash.new
24
+
25
+ wmi = WmiLite::Wmi.new
26
+
27
+ os = wmi.first_of("Win32_OperatingSystem")
28
+
29
+ # MemTotal
30
+ memory[:total] = os["TotalVisibleMemorySize"] + "kB"
31
+ # MemFree
32
+ memory[:free] = os["FreePhysicalMemory"] + "kB"
33
+ # SwapTotal
34
+ memory[:swap][:total] = os["SizeStoredInPagingFiles"] + "kB"
35
+ # SwapFree
36
+ memory[:swap][:free] = os["FreeSpaceInPagingFiles"] + "kB"
37
+ end
38
+ end
@@ -18,5 +18,5 @@
18
18
 
19
19
  module Ohai
20
20
  OHAI_ROOT = File.expand_path(File.dirname(__FILE__))
21
- VERSION = '8.6.0.alpha.1'
21
+ VERSION = '8.6.0'
22
22
  end
@@ -90,6 +90,34 @@ RSpec.describe Ohai::Config do
90
90
  end
91
91
  end
92
92
 
93
+ describe "config_context :ohai" do
94
+ describe "option :plugin" do
95
+ it "gets configured with a value" do
96
+ Ohai::Config.ohai[:plugin][:foo] = true
97
+ expect(Ohai::Config.ohai[:plugin]).to have_key(:foo)
98
+ expect(Ohai::Config.ohai[:plugin][:foo]).to be true
99
+ end
100
+
101
+ it "gets configured with a Hash" do
102
+ value = { :bar => true, :baz => true }
103
+ Ohai::Config.ohai[:plugin][:foo] = value
104
+ expect(Ohai::Config.ohai[:plugin]).to have_key(:foo)
105
+ expect(Ohai::Config.ohai[:plugin][:foo]).to eq(value)
106
+ end
107
+
108
+ it "raises an error if the plugin name is not a symbol" do
109
+ expect { Ohai::Config.ohai[:plugin]["foo"] = false }.
110
+ to raise_error(Ohai::Exceptions::PluginConfigError, /Expected Symbol/)
111
+ end
112
+
113
+ it "raises an error if the value Hash has non-Symbol key" do
114
+ value = { :bar => true, "baz" => true }
115
+ expect { Ohai::Config.ohai[:plugin][:foo] = value }.
116
+ to raise_error(Ohai::Exceptions::PluginConfigError, /Expected Symbol/)
117
+ end
118
+ end
119
+ end
120
+
93
121
  describe "::merge_deprecated_config" do
94
122
  before(:each) do
95
123
  allow(Ohai::Log).to receive(:warn)
@@ -293,6 +293,79 @@ describe Ohai::DSL::Plugin::VersionVII do
293
293
  end
294
294
  end
295
295
 
296
+ describe "#configuration" do
297
+ let(:plugin) do
298
+ klass = Ohai.plugin(camel_name) { }
299
+ klass.new({})
300
+ end
301
+
302
+ shared_examples_for "plugin config lookup" do
303
+ it "returns the configuration option value" do
304
+ Ohai.config[:plugin][snake_name][:foo] = true
305
+ expect(plugin.configuration(:foo)).to eq(true)
306
+ end
307
+ end
308
+
309
+ describe "a plugin named Abc" do
310
+ let(:camel_name) { :Abc }
311
+ let(:snake_name) { :abc }
312
+
313
+ it "returns nil when the plugin is not configured" do
314
+ expect(plugin.configuration(:foo)).to eq(nil)
315
+ end
316
+
317
+ it "does not auto-vivify an un-configured plugin" do
318
+ plugin.configuration(:foo)
319
+ expect(Ohai.config[:plugin]).to_not have_key(:test)
320
+ end
321
+
322
+ it "returns nil when the option is not configured" do
323
+ Ohai.config[:plugin][snake_name][:foo] = true
324
+ expect(plugin.configuration(:bar)).to eq(nil)
325
+ end
326
+
327
+ it "returns nil when the suboption is not configured" do
328
+ Ohai.config[:plugin][snake_name][:foo] = { }
329
+ expect(plugin.configuration(:foo, :bar)).to eq(nil)
330
+ end
331
+
332
+ include_examples "plugin config lookup"
333
+
334
+ it "returns the configuration sub-option value" do
335
+ Ohai.config[:plugin][snake_name][:foo] = { :bar => true }
336
+ expect(plugin.configuration(:foo, :bar)).to eq(true)
337
+ end
338
+ end
339
+
340
+ describe "a plugin named ABC" do
341
+ let(:camel_name) { :ABC }
342
+ let(:snake_name) { :abc }
343
+
344
+ include_examples "plugin config lookup"
345
+ end
346
+
347
+ describe "a plugin named Abc2" do
348
+ let(:camel_name) { :Abc2 }
349
+ let(:snake_name) { :abc_2 }
350
+
351
+ include_examples "plugin config lookup"
352
+ end
353
+
354
+ describe "a plugin named AbcAbc" do
355
+ let(:camel_name) { :AbcXyz }
356
+ let(:snake_name) { :abc_xyz }
357
+
358
+ include_examples "plugin config lookup"
359
+ end
360
+
361
+ describe "a plugin named ABCLmnoXyz" do
362
+ let(:camel_name) { :ABCLmnoXyz }
363
+ let(:snake_name) { :abc_lmno_xyz }
364
+
365
+ include_examples "plugin config lookup"
366
+ end
367
+ end
368
+
296
369
  it_behaves_like "Ohai::DSL::Plugin" do
297
370
  let(:ohai) { Ohai::System.new }
298
371
  let(:plugin) { Ohai::DSL::Plugin::VersionVII.new(ohai.data) }