summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Smith <tsmith@chef.io>2016-09-13 21:58:28 -0700
committerGitHub <noreply@github.com>2016-09-13 21:58:28 -0700
commitbe251f7b9d1d835fc3b0158f2cd8595d17451811 (patch)
treeafb32042a2ce7d46e6ccebcd4e2dcb5824565c47
parent13485c17da688654890047d1952d9f71e735d162 (diff)
parent2dc33369cab377e176535a10e80f1b869f3a1a31 (diff)
downloadohai-be251f7b9d1d835fc3b0158f2cd8595d17451811.tar.gz
Merge pull request #876 from MsysTechnologiesllc/ali/ohai_uptime_hang_fix
Ohai uptime plugin hangs in Windows.
-rw-r--r--lib/ohai/plugins/uptime.rb8
-rw-r--r--spec/functional/plugins/windows/uptime_spec.rb81
-rw-r--r--spec/unit/plugins/windows/uptime_spec.rb88
3 files changed, 176 insertions, 1 deletions
diff --git a/lib/ohai/plugins/uptime.rb b/lib/ohai/plugins/uptime.rb
index c1cc5be5..e5866fa3 100644
--- a/lib/ohai/plugins/uptime.rb
+++ b/lib/ohai/plugins/uptime.rb
@@ -29,6 +29,7 @@ require "ohai/mixin/seconds_to_human"
Ohai.plugin(:Uptime) do
provides "uptime", "uptime_seconds"
provides "idletime", "idletime_seconds" # linux only
+ depends "platform_version"
def collect_uptime(path)
# kern.boottime: { sec = 1232765114, usec = 823118 } Fri Jan 23 18:45:14 2009
@@ -96,7 +97,12 @@ Ohai.plugin(:Uptime) do
collect_data(:windows) do
require "wmi-lite/wmi"
wmi = WmiLite::Wmi.new
- uptime_seconds wmi.first_of("Win32_PerfFormattedData_PerfOS_System")["systemuptime"].to_i
+ if platform_version.to_f >= 6.0 ## for newer version of Windows starting from Windows Server 2008 ##
+ last_boot_up_time = wmi.first_of("Win32_OperatingSystem")["lastbootuptime"]
+ uptime_seconds Time.new.to_i - Time.parse(last_boot_up_time).to_i
+ else ## for older version of Windows starting from Windows Server 2003 ##
+ uptime_seconds wmi.first_of("Win32_PerfFormattedData_PerfOS_System")["systemuptime"].to_i
+ end
uptime seconds_to_human(uptime_seconds)
end
diff --git a/spec/functional/plugins/windows/uptime_spec.rb b/spec/functional/plugins/windows/uptime_spec.rb
new file mode 100644
index 00000000..d1abd681
--- /dev/null
+++ b/spec/functional/plugins/windows/uptime_spec.rb
@@ -0,0 +1,81 @@
+#
+# Author:: Aliasgar Batterywala (<aliasgar.batterywala@msystechnologies.com>)
+# Copyright:: Copyright (c) 2016 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.
+#
+
+require File.expand_path(File.dirname(__FILE__) + "/../../../spec_helper.rb")
+
+describe Ohai::System, "Windows plugin uptime" do
+
+ context "for newer version of Windows" do
+ let(:uptime_plugin) do
+ get_plugin("uptime").tap do |plugin|
+ plugin[:platform_version] = "6.3.9600"
+ end
+ end
+
+ let(:wmi) do
+ double("wmi", { :first_of =>
+ { "lastbootuptime" => "20160912103128.597219+0000" },
+ })
+ end
+
+ before(:each) do
+ allow(uptime_plugin).to receive(:collect_os).and_return(:windows)
+ allow(WmiLite::Wmi).to receive(:new).and_return(wmi)
+ allow(Time).to receive_message_chain(:new, :to_i).and_return(1473756619)
+ end
+
+ it "should set uptime_seconds to uptime" do
+ uptime_plugin.run
+ expect(uptime_plugin[:uptime_seconds]).to be == 80331
+ end
+
+ it "should set uptime to a human readable value" do
+ uptime_plugin.run
+ expect(uptime_plugin[:uptime]).to eq("22 hours 18 minutes 51 seconds")
+ end
+ end
+
+ context "for older version of Windows" do
+ let(:uptime_plugin) do
+ get_plugin("uptime").tap do |plugin|
+ plugin[:platform_version] = "5.0.2195"
+ end
+ end
+
+ let(:wmi) do
+ double("wmi", { :first_of =>
+ { "systemuptime" => "785345" },
+ })
+ end
+
+ before(:each) do
+ allow(uptime_plugin).to receive(:collect_os).and_return(:windows)
+ allow(WmiLite::Wmi).to receive(:new).and_return(wmi)
+ end
+
+ it "should set uptime_seconds to uptime" do
+ uptime_plugin.run
+ expect(uptime_plugin[:uptime_seconds]).to be == 785345
+ end
+
+ it "should set uptime to a human readable value" do
+ uptime_plugin.run
+ expect(uptime_plugin[:uptime]).to eq("9 days 02 hours 09 minutes 05 seconds")
+ end
+ end
+end
diff --git a/spec/unit/plugins/windows/uptime_spec.rb b/spec/unit/plugins/windows/uptime_spec.rb
new file mode 100644
index 00000000..05d2fd2f
--- /dev/null
+++ b/spec/unit/plugins/windows/uptime_spec.rb
@@ -0,0 +1,88 @@
+#
+# Author:: Aliasgar Batterywala (<aliasgar.batterywala@msystechnologies.com>)
+# Copyright:: Copyright (c) 2016 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.
+#
+
+require File.expand_path(File.dirname(__FILE__) + "/../../../spec_helper.rb")
+
+describe Ohai::System, "Windows plugin uptime" do
+
+ let(:wmi) { double("wmi", { :first_of => "" }) }
+
+ before(:each) do
+ allow(WmiLite::Wmi).to receive(:new).and_return(wmi)
+ end
+
+ ## Windows newer versions category here includes server OS starting from Windows Server 2008 ##
+ shared_context "WMI class for newer versions of Windows platform" do
+ before do
+ allow(uptime_plugin).to receive(:collect_os).and_return(:windows)
+ end
+
+ it "uses Win32_OperatingSystem WMI class to fetch the system's uptime" do
+ expect(wmi).to receive(:first_of).with("Win32_OperatingSystem")
+ expect(Time).to receive(:new)
+ expect(Time).to receive(:parse)
+ expect(uptime_plugin).to receive(:seconds_to_human)
+ uptime_plugin.run
+ end
+ end
+
+ ## Windows older versions category here includes server OS starting from Windows Server 2003 ##
+ shared_context "WMI class for older versions of Windows platform" do
+ before do
+ allow(uptime_plugin).to receive(:collect_os).and_return(:windows)
+ end
+
+ it "uses Win32_PerfFormattedData_PerfOS_System WMI class to fetch the system's uptime" do
+ expect(wmi).to receive(:first_of).with("Win32_PerfFormattedData_PerfOS_System")
+ expect(Time).to_not receive(:new)
+ expect(Time).to_not receive(:parse)
+ expect(uptime_plugin).to receive(:seconds_to_human)
+ uptime_plugin.run
+ end
+ end
+
+ context "platform is Windows Server 2008 R2" do
+ let(:uptime_plugin) do
+ get_plugin("uptime").tap do |plugin|
+ plugin[:platform_version] = "6.1.7601"
+ end
+ end
+
+ include_context "WMI class for newer versions of Windows platform"
+ end
+
+ context "platform is Windows Server 2003 R2" do
+ let(:uptime_plugin) do
+ get_plugin("uptime").tap do |plugin|
+ plugin[:platform_version] = "5.2.3790"
+ end
+ end
+
+ include_context "WMI class for older versions of Windows platform"
+ end
+
+ context "platform is Windows Server 2012" do
+ let(:uptime_plugin) do
+ get_plugin("uptime").tap do |plugin|
+ plugin[:platform_version] = "6.2.9200"
+ end
+ end
+
+ include_context "WMI class for newer versions of Windows platform"
+ end
+end