Skip to content
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

Creating an endpoint for a PhysicalRack to execute toolbar actions #349

Merged
merged 1 commit into from
Jun 26, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions app/controllers/api/physical_racks_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
module Api
class PhysicalRacksController < BaseController
def refresh_resource(type, id, _data = nil)
raise BadRequestError, "Must specify an id for refreshing a #{type} resource" unless id

ensure_resource_exists(type, id) if single_resource?

api_action(type, id) do |klass|
physical_rack = resource_search(id, type, klass)
api_log_info("Refreshing #{physical_rack_ident(physical_rack)}")
refresh_physical_rack(physical_rack)
end
end

private

def ensure_resource_exists(type, id)
raise NotFoundError, "#{type} with id:#{id} not found" unless collection_class(type).exists?(id)
end

def refresh_physical_rack(physical_rack)
desc = "#{physical_rack_ident(physical_rack)} refreshing"
task_id = queue_object_action(physical_rack, desc, :method_name => "refresh_ems", :role => "ems_operations")
action_result(true, desc, :task_id => task_id)
rescue => err
action_result(false, err.to_s)
end

def physical_rack_ident(physical_rack)
"Physical Rack id:#{physical_rack.id} name:'#{physical_rack.name}'"
end
end
end
24 changes: 24 additions & 0 deletions config/api.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1762,6 +1762,30 @@
:post:
- :name: refresh
:identifier: physical_chassis_refresh
:physical_racks:
:description: Physical Racks
:identifier: physical_rack
:options:
- :collection
:verbs: *gp
:klass: PhysicalRack
:subcollections:
:collection_actions:
:get:
- :name: read
:identifier: physical_rack_show_list
:post:
- :name: query
:identifier: physical_rack_show_list
- :name: refresh
:identifier: physical_rack_refresh
:resource_actions:
:get:
- :name: read
:identifier: physical_rack_show
:post:
- :name: refresh
:identifier: physical_rack_refresh
:physical_servers:
:description: Physical Servers
:identifier: physical_server
Expand Down
100 changes: 100 additions & 0 deletions spec/requests/physical_racks_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
describe "Physical Racks API" do
context "GET /api/physical_racks" do
it "returns all Physical Racks" do
physical_rack = FactoryGirl.create(:physical_rack)
api_basic_authorize('physical_rack_show_list')

get(api_physical_racks_url)

expected = {
"name" => "physical_racks",
"resources" => [{"href" => api_physical_rack_url(nil, physical_rack)}]
}
expect(response).to have_http_status(:ok)
expect(response.parsed_body).to include(expected)
end
end

context "GET /api/physical_racks/:id" do
it "returns a single Physical Rack" do
physical_rack = FactoryGirl.create(:physical_rack)
api_basic_authorize('physical_rack_show')

get(api_physical_rack_url(nil, physical_rack))

expected = {
"name" => physical_rack.name,
"href" => api_physical_rack_url(nil, physical_rack)
}
expect(response).to have_http_status(:ok)
expect(response.parsed_body).to include(expected)
end
end

describe "Physical Racks refresh action" do
context "with an invalid id" do
it "it responds with 404 Not Found" do
api_basic_authorize(action_identifier(:physical_racks, :refresh, :resource_actions, :post))

post(api_physical_rack_url(nil, 999_999), :params => gen_request(:refresh))

expect(response).to have_http_status(:not_found)
end
end

context "without an appropriate role" do
it "it responds with 403 Forbidden" do
physical_rack = FactoryGirl.create(:physical_rack)
api_basic_authorize

post(api_physical_rack_url(nil, physical_rack), :params => gen_request(:refresh))

expect(response).to have_http_status(:forbidden)
end
end

context "with an appropriate role" do
it "rejects refresh for an unspecified Physical Rack" do
api_basic_authorize(action_identifier(:physical_racks, :refresh, :resource_actions, :post))

post(api_physical_racks_url, :params => gen_request(:refresh, [{"href" => api_physical_racks_url}, {"href" => api_physical_racks_url}]))

expect_bad_request(/Must specify an id/i)
end

it "refresh of a single Physical Rack" do
physical_rack = FactoryGirl.create(:physical_rack)
api_basic_authorize('physical_rack_refresh')

post(api_physical_rack_url(nil, physical_rack), :params => gen_request(:refresh))

expect_single_action_result(:success => true, :message => /#{physical_rack.id}.* refreshing/i, :href => api_physical_rack_url(nil, physical_rack))
end

it "refresh of multiple Physical Racks" do
first_physical_rack = FactoryGirl.create(:physical_rack)
second_physical_rack = FactoryGirl.create(:physical_rack)
api_basic_authorize('physical_rack_refresh')

post(api_physical_racks_url, :params => gen_request(:refresh, [{"href" => api_physical_rack_url(nil, first_physical_rack)}, {"href" => api_physical_rack_url(nil, second_physical_rack)}]))

expected = {
"results" => a_collection_containing_exactly(
a_hash_including(
"message" => a_string_matching(/#{first_physical_rack.id}.* refreshing/i),
"success" => true,
"href" => api_physical_rack_url(nil, first_physical_rack)
),
a_hash_including(
"message" => a_string_matching(/#{second_physical_rack.id}.* refreshing/i),
"success" => true,
"href" => api_physical_rack_url(nil, second_physical_rack)
)
)
}
expect(response.parsed_body).to include(expected)
expect(response).to have_http_status(:ok)
end
end
end
end