diff --git a/modules/bmc/base.rb b/modules/bmc/base.rb index c227c6b01..6bf1af389 100644 --- a/modules/bmc/base.rb +++ b/modules/bmc/base.rb @@ -50,6 +50,10 @@ def powerreset raise NotImplementedError.new end + def powerreboot + raise NotImplementedError.new + end + def bootdevice raise NotImplementedError.new end diff --git a/modules/bmc/bmc_api.rb b/modules/bmc/bmc_api.rb index cbcc48d79..eab9b5094 100644 --- a/modules/bmc/bmc_api.rb +++ b/modules/bmc/bmc_api.rb @@ -163,7 +163,7 @@ class Api < ::Sinatra::Base put "/:host/chassis/power/?:action?" do # return hint on valid options if params[:action].nil? - return { :actions => ["on", "off", "cycle", "soft", "reset"] }.to_json + return { :actions => ["on", "off", "cycle", "soft", "reset", "reboot"] }.to_json end bmc_setup begin @@ -178,6 +178,8 @@ class Api < ::Sinatra::Base { :action => params[:action], :result => @bmc.poweroff(true) }.to_json when "reset" { :action => params[:action], :result => @bmc.powerreset }.to_json + when "reboot" + { :action => params[:action], :result => @bmc.powerreboot }.to_json else { :error => "The action: #{params[:action]} is not a valid action" }.to_json end diff --git a/modules/bmc/redfish.rb b/modules/bmc/redfish.rb index 9e4f5d4a1..ff9f43f4e 100644 --- a/modules/bmc/redfish.rb +++ b/modules/bmc/redfish.rb @@ -78,6 +78,10 @@ def powerreset poweraction('ForceRestart') end + def powerreboot + poweraction('GracefulRestart') + end + def poweron poweraction('On') end diff --git a/test/bmc/bmc_api_test.rb b/test/bmc/bmc_api_test.rb index b50db1b88..1528b8721 100644 --- a/test/bmc/bmc_api_test.rb +++ b/test/bmc/bmc_api_test.rb @@ -602,6 +602,13 @@ def test_api_calls_redfish_provider_reset assert expect.once end + def test_api_calls_redfish_provider_reboot + expect = Proxy::BMC::Redfish.any_instance.stubs(:powerreboot) + test_args = { 'bmc_provider' => 'redfish' } + put "/#{@host}/chassis/power/reboot", test_args + assert expect.once + end + def test_api_can_pass_options_in_body Rubyipmi.stubs(:is_provider_installed?).returns(true) args = { 'bmc_provider' => 'freeipmi', :options => {:driver => 'lan20', :privilege => 'USER'} }.to_json diff --git a/test/bmc/bmc_redfish_test.rb b/test/bmc/bmc_redfish_test.rb index eb0965f19..3c0064bbb 100644 --- a/test/bmc/bmc_redfish_test.rb +++ b/test/bmc/bmc_redfish_test.rb @@ -28,4 +28,11 @@ def test_redfish_provider_reset to_return(status: 200, body: JSON.generate({})) assert @bmc.powerreset end + + def test_redfish_provider_reboot + stub_request(:post, "#{@protocol}://#{@host}#{SYSTEM_DATA['Actions']['#ComputerSystem.Reset']['target']}"). + with(body: JSON.generate({ "ResetType" => "GracefulRestart" })). + to_return(status: 200, body: JSON.generate({})) + assert @bmc.powerreboot + end end diff --git a/test/bmc/bmc_test.rb b/test/bmc/bmc_test.rb index 595ba80fc..1fc7d2ed4 100644 --- a/test/bmc/bmc_test.rb +++ b/test/bmc/bmc_test.rb @@ -56,6 +56,12 @@ def test_should_power_reset assert bmc.powerreset end + def test_should_power_reboot + assert_raise(NotImplementedError) do + bmc.powerreboot + end + end + def test_should_bootpxe Rubyipmi::Ipmitool::Chassis.any_instance.expects(:bootpxe).returns(true) bmc.bootpxe