Skip to content

Commit

Permalink
Merge pull request #876 from MsysTechnologiesllc/ali/ohai_uptime_hang…
Browse files Browse the repository at this point in the history
…_fix

Ohai uptime plugin hangs in Windows.
  • Loading branch information
tas50 authored Sep 14, 2016
2 parents 13485c1 + 2dc3336 commit be251f7
Show file tree
Hide file tree
Showing 3 changed files with 176 additions and 1 deletion.
8 changes: 7 additions & 1 deletion lib/ohai/plugins/uptime.rb
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
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
Expand Down Expand Up @@ -96,7 +97,12 @@ def collect_uptime(path)
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

Expand Down
81 changes: 81 additions & 0 deletions spec/functional/plugins/windows/uptime_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
#
# Author:: Aliasgar Batterywala (<[email protected]>)
# 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
88 changes: 88 additions & 0 deletions spec/unit/plugins/windows/uptime_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
#
# Author:: Aliasgar Batterywala (<[email protected]>)
# 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

0 comments on commit be251f7

Please sign in to comment.