-
Notifications
You must be signed in to change notification settings - Fork 896
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add physical server REST api #14028
Merged
blomquisg
merged 21 commits into
ManageIQ:master
from
lenovo:add_ops_to_physical_server
Apr 24, 2017
Merged
Add physical server REST api #14028
Changes from all commits
Commits
Show all changes
21 commits
Select commit
Hold shift + click to select a range
b345df4
Adds host to physical server relationship
99f258a
Enables the physical server refresher
7dcdb72
Adds operations to the physical server model
0db33fc
Update the REST API to add physical server operations
53aa87d
Updates firmware REST API definitions
868957f
Removes $lenovo_log references, replace with _log.info
4bd0611
Rebasing PR from upstream manageiq/master
95855a0
Address outstanding rubcop messages
d19771f
Moves firmware api enhancements to PR 14034
a69cbea
Resolve rubocop warning in controller
c919b41
Fix rubocop style warnings
walteraa 310138d
Sync ems_refresh and save_inventory functions with upstream branch
d828e25
Update api definition and error handling
f9536e4
Add spec tests for physical_servers_controller
a1ec6f1
Refactor physical_servers_controller tests
8b37742
Adds collection, bulk api spec tests. Changes action name show->read
5de51b1
Refactors collections_spec and physical_servers_spec
a190fdf
Adjusts log statement in the ps controller
039a724
Remove extraneous comments
0b7f900
Changes uuid references to ems_ref
2f20e3a
Removes introduced trailing whitespace (rubocop)
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
module Api | ||
class PhysicalServersController < BaseController | ||
def blink_loc_led_resource(type, id, _data) | ||
change_resource_state(:blink_loc_led, type, id) | ||
end | ||
|
||
def turn_on_loc_led_resource(type, id, _data) | ||
change_resource_state(:turn_on_loc_led, type, id) | ||
end | ||
|
||
def turn_off_loc_led_resource(type, id, _data) | ||
change_resource_state(:turn_off_loc_led, type, id) | ||
end | ||
|
||
def power_on_resource(type, id, _data) | ||
change_resource_state(:power_on, type, id) | ||
end | ||
|
||
def power_off_resource(type, id, _data) | ||
change_resource_state(:power_off, type, id) | ||
end | ||
|
||
def restart_resource(type, id, _data) | ||
change_resource_state(:restart, type, id) | ||
end | ||
|
||
private | ||
|
||
def change_resource_state(state, type, id) | ||
raise BadRequestError, "Must specify an id for changing a #{type} resource" unless id | ||
|
||
api_action(type, id) do |klass| | ||
begin | ||
server = resource_search(id, type, klass) | ||
desc = "Requested server state #{state} for #{server_ident(server)}" | ||
api_log_info(desc) | ||
task_id = queue_object_action(server, desc, :method_name => state, :role => :ems_operations) | ||
action_result(true, desc, :task_id => task_id) | ||
rescue => err | ||
action_result(false, err.to_s) | ||
end | ||
end | ||
end | ||
|
||
def server_ident(server) | ||
"Server instance: #{server.id} name:'#{server.name}'" | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
module PhysicalServer::Operations | ||
extend ActiveSupport::Concern | ||
|
||
include_concern 'Power' | ||
include_concern 'Led' | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
module PhysicalServer::Operations::Led | ||
def blink_loc_led | ||
change_state(:blink_loc_led) | ||
end | ||
|
||
def turn_on_loc_led | ||
change_state(:turn_on_loc_led) | ||
end | ||
|
||
def turn_off_loc_led | ||
change_state(:turn_off_loc_led) | ||
end | ||
|
||
private | ||
|
||
def change_state(verb) | ||
unless ext_management_system | ||
raise _("A Server #{self} <%{name}> with Id: <%{id}> is not associated \ | ||
with a provider.") % {:name => name, :id => id} | ||
end | ||
|
||
options = {:uuid => ems_ref} | ||
_log.info("Begin #{verb} server: #{name} with UUID: #{ems_ref}") | ||
ext_management_system.send(verb, self, options) | ||
_log.info("Complete #{verb} #{self}") | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
module PhysicalServer::Operations::Power | ||
def power_on | ||
change_state(:power_on) | ||
end | ||
|
||
def power_off | ||
change_state(:power_off) | ||
end | ||
|
||
def restart | ||
change_state(:restart) | ||
end | ||
|
||
private | ||
|
||
def change_state(verb) | ||
unless ext_management_system | ||
raise _(" A Server #{self} <%{name}> with Id: <%{id}> | ||
is not associated with a provider.") % {:name => name, :id => id} | ||
end | ||
options = {:uuid => ems_ref} | ||
_log.info("Begin #{verb} server: #{name} with UUID: #{ems_ref}") | ||
ext_management_system.send(verb, self, options) | ||
_log.info("Complete #{verb} #{self}") | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
FactoryGirl.define do | ||
factory :physical_server do | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,134 @@ | ||
RSpec.describe "physical_servers API" do | ||
describe "display a physical server's details" do | ||
context "with valid properties" do | ||
it "shows all of its properties" do | ||
ps = FactoryGirl.create(:physical_server, :ems_ref => "A59D5B36821111E1A9F5E41F13ED4F6A") | ||
|
||
api_basic_authorize action_identifier(:physical_servers, :read, :resource_actions, :get) | ||
run_get physical_servers_url(ps.id) | ||
|
||
expect_single_resource_query("ems_ref" => "A59D5B36821111E1A9F5E41F13ED4F6A") | ||
end | ||
end | ||
end | ||
|
||
describe "power on/off a physical server" do | ||
context "with valid action names" do | ||
it "powers on a server successfully" do | ||
ps = FactoryGirl.create(:physical_server) | ||
|
||
api_basic_authorize action_identifier(:physical_servers, :power_on, :resource_actions, :post) | ||
run_post(physical_servers_url(ps.id), gen_request(:power_on)) | ||
|
||
expect(response).to have_http_status(:success) | ||
end | ||
|
||
it "powers off a server successfully" do | ||
ps = FactoryGirl.create(:physical_server) | ||
|
||
api_basic_authorize action_identifier(:physical_servers, :power_off, :resource_actions, :post) | ||
run_post(physical_servers_url(ps.id), gen_request(:power_off)) | ||
|
||
expect(response).to have_http_status(:success) | ||
end | ||
|
||
it "restarts a server successfully" do | ||
ps = FactoryGirl.create(:physical_server) | ||
|
||
api_basic_authorize action_identifier(:physical_servers, :restart, :resource_actions, :post) | ||
run_post(physical_servers_url(ps.id), gen_request(:restart)) | ||
|
||
expect(response).to have_http_status(:success) | ||
end | ||
end | ||
|
||
context "without an appropriate role" do | ||
it "fails to power on a server" do | ||
ps = FactoryGirl.create(:physical_server) | ||
|
||
api_basic_authorize | ||
run_post(physical_servers_url(ps.id), gen_request(:power_on)) | ||
|
||
expect(response).to have_http_status(:forbidden) | ||
end | ||
|
||
it "fails to power off a server" do | ||
ps = FactoryGirl.create(:physical_server) | ||
|
||
api_basic_authorize | ||
run_post(physical_servers_url(ps.id), gen_request(:power_off)) | ||
|
||
expect(response).to have_http_status(:forbidden) | ||
end | ||
|
||
it "fails to restart a server" do | ||
ps = FactoryGirl.create(:physical_server) | ||
|
||
api_basic_authorize | ||
run_post(physical_servers_url(ps.id), gen_request(:restart)) | ||
|
||
expect(response).to have_http_status(:forbidden) | ||
end | ||
end | ||
end | ||
|
||
describe "turn on/off a physical server's location LED" do | ||
context "with valid action names" do | ||
it "turns on a location LED successfully" do | ||
ps = FactoryGirl.create(:physical_server) | ||
|
||
api_basic_authorize action_identifier(:physical_servers, :turn_on_loc_led, :resource_actions, :post) | ||
run_post(physical_servers_url(ps.id), gen_request(:turn_on_loc_led)) | ||
|
||
expect(response).to have_http_status(:success) | ||
end | ||
|
||
it "turns off a location LED successfully" do | ||
ps = FactoryGirl.create(:physical_server) | ||
|
||
api_basic_authorize action_identifier(:physical_servers, :turn_off_loc_led, :resource_actions, :post) | ||
run_post(physical_servers_url(ps.id), gen_request(:turn_off_loc_led)) | ||
|
||
expect(response).to have_http_status(:success) | ||
end | ||
|
||
it "blinks a location LED successfully" do | ||
ps = FactoryGirl.create(:physical_server) | ||
|
||
api_basic_authorize action_identifier(:physical_servers, :blink_loc_led, :resource_actions, :post) | ||
run_post(physical_servers_url(ps.id), gen_request(:blink_loc_led)) | ||
|
||
expect(response).to have_http_status(:success) | ||
end | ||
end | ||
|
||
context "without an appropriate role" do | ||
it "fails to turn on a location LED" do | ||
ps = FactoryGirl.create(:physical_server) | ||
|
||
api_basic_authorize | ||
run_post(physical_servers_url(ps.id), gen_request(:turn_on_loc_led)) | ||
|
||
expect(response).to have_http_status(:forbidden) | ||
end | ||
|
||
it "fails to turn off a location LED" do | ||
ps = FactoryGirl.create(:physical_server) | ||
|
||
api_basic_authorize | ||
run_post(physical_servers_url(ps.id), gen_request(:turn_off_loc_led)) | ||
|
||
expect(response).to have_http_status(:forbidden) | ||
end | ||
|
||
it "fails to blink a location LED" do | ||
ps = FactoryGirl.create(:physical_server) | ||
|
||
api_basic_authorize | ||
run_post(physical_servers_url(ps.id), gen_request(:blink_loc_led)) | ||
|
||
expect(response).to have_http_status(:forbidden) | ||
end | ||
end | ||
end | ||
end |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
missing :get: section in collection and resource section with appropriate identifiers for listing (show_list) and fetching (show) a physical server.
also, should implement the query post action for bulk queries.