From 7e549075dcbb9276bc93aff6c9b7d29568589a54 Mon Sep 17 00:00:00 2001 From: Alexander Demichev Date: Wed, 6 Sep 2017 16:13:36 +0200 Subject: [PATCH] add flavors create, delete to api --- app/controllers/api/flavors_controller.rb | 20 +++ config/api.yml | 9 +- spec/requests/flavors_spec.rb | 163 ++++++++++++++++++++++ 3 files changed, 191 insertions(+), 1 deletion(-) create mode 100644 spec/requests/flavors_spec.rb diff --git a/app/controllers/api/flavors_controller.rb b/app/controllers/api/flavors_controller.rb index 8f0cc35aa0..9945f57d14 100644 --- a/app/controllers/api/flavors_controller.rb +++ b/app/controllers/api/flavors_controller.rb @@ -1,4 +1,24 @@ module Api class FlavorsController < BaseController + def create_resource(_type, _id, data) + task_id = Flavor.create_flavor_queue(User.current_user.id, EmsCloud.find(data['ems']['id']), data) + action_result(true, 'Creating Flavor', :task_id => task_id) + rescue => err + action_result(false, err.to_s) + end + + def delete_resource(type, id, _data = {}) + flavor = resource_search(id, type, collection_class(:flavors)) + task_id = flavor.delete_flavor_queue(User.current_user.id) + action_result(true, "Deleting #{flavor_ident(flavor)}", :task_id => task_id) + rescue => err + action_result(false, err.to_s) + end + + private + + def flavor_ident(flavor) + "Flavor id:#{flavor.id} name: '#{flavor.name}'" + end end end diff --git a/config/api.yml b/config/api.yml index 2950faf4ab..21cb6ae01e 100644 --- a/config/api.yml +++ b/config/api.yml @@ -794,19 +794,26 @@ :identifier: flavor :options: - :collection - :verbs: *gp + :verbs: *gpd :klass: Flavor :collection_actions: :get: - :name: read :identifier: flavor_show_list :post: + - :name: delete + :identifier: flavor_delete - :name: query :identifier: flavor_show_list + - :name: create + :identifier: flavor_create :resource_actions: :get: - :name: read :identifier: flavor_show + :delete: + - :name: delete + :identifier: flavor_delete :floating_ips: :description: Floating IPs :identifier: floating_ip diff --git a/spec/requests/flavors_spec.rb b/spec/requests/flavors_spec.rb new file mode 100644 index 0000000000..aaf36f0579 --- /dev/null +++ b/spec/requests/flavors_spec.rb @@ -0,0 +1,163 @@ +RSpec.describe 'Flavors API' do + let(:ems) { FactoryGirl.create(:ems_cloud) } + let(:flavor) { FactoryGirl.create(:flavor_openstack, :ext_management_system => ems) } + let(:flavor_2) { FactoryGirl.create(:flavor_openstack, :ext_management_system => ems) } + + describe 'GET/api/flavors' do + it 'lists all the flavor bases with an appropriate role' do + flavor = FactoryGirl.create(:flavor_openstack) + + api_basic_authorize collection_action_identifier(:flavors, :read, :get) + + run_get(api_flavors_url) + + expected = { + 'count' => 1, + 'subcount' => 1, + 'name' => 'flavors', + 'resources' => [hash_including('href' => a_string_matching(api_flavors_url(nil, flavor.compressed_id)))] + } + expect(response.parsed_body).to include(expected) + expect(response).to have_http_status(:ok) + end + + it 'forbids access to flavor bases without an appropriate role' do + api_basic_authorize + + run_get(api_flavors_url) + + expect(response).to have_http_status(:forbidden) + end + end + + describe 'GET /api/flavors/:id' do + it 'will show a flavor base' do + api_basic_authorize action_identifier(:flavors, :read, :resource_actions, :get) + + run_get(api_flavor_url(nil, flavor)) + + expected = { + 'href' => a_string_matching(api_flavors_url(nil, flavor.compressed_id)) + } + expect(response.parsed_body).to include(expected) + expect(response).to have_http_status(:ok) + end + + it 'forbids access to a flavor base' do + api_basic_authorize + + run_get(api_flavors_url) + + expect(response).to have_http_status(:forbidden) + end + end + + describe 'DELETE /api/flavors/:id' do + it 'will delete a flavor' do + api_basic_authorize action_identifier(:flavors, :delete, :resource_actions, :delete) + + run_delete api_flavor_url(nil, flavor) + + expect(response).to have_http_status(:no_content) + end + + it 'will not delete a flavor without an appropriate role' do + api_basic_authorize + + run_delete api_flavor_url(nil, flavor) + + expect(response).to have_http_status(:forbidden) + end + end + + describe 'POST /api/flavors' do + let(:create_params) do + { + :action => 'create', + :description => "Description", + :name => "A Flavor", + :related => {}, + :ems => { :id => ems.id }, + :type => 'ManageIQ::Providers::Openstack::CloudManager::Flavor', + } + end + + it 'will delete multiple flavors' do + api_basic_authorize collection_action_identifier(:flavors, :delete, :post) + + expected = { + 'results' => [ + a_hash_including( + 'success' => true, + 'message' => a_string_including('Deleting Flavor'), + 'task_id' => a_kind_of(String) + ), + a_hash_including( + 'success' => true, + 'message' => a_string_including('Deleting Flavor'), + 'task_id' => a_kind_of(String) + ) + ] + } + + run_post(api_flavors_url, :action => 'delete', :resources => [{ 'id' => flavor.id}, { 'id' => flavor_2.id }]) + + expect(response.parsed_body).to include(expected) + expect(response).to have_http_status(:ok) + end + + it 'will forbid deletion to an flavor without appropriate role' do + api_basic_authorize + + run_post(api_flavors_url, :action => 'delete', :resources => [{ 'id' => flavor.id }]) + expect(response).to have_http_status(:forbidden) + end + + it 'can create an flavor' do + api_basic_authorize collection_action_identifier(:flavors, :create, :post) + + expected = { + 'results' => [a_hash_including( + 'success' => true, + 'message' => 'Creating Flavor', + 'task_id' => a_kind_of(String) + )] + } + run_post(api_flavors_url, create_params) + + expect(response).to have_http_status(:ok) + expect(response.parsed_body).to include(expected) + end + + it 'can create flavors in bulk' do + api_basic_authorize collection_action_identifier(:flavors, :create, :post) + + expected = { + 'results' => [ + a_hash_including( + 'success' => true, + 'message' => 'Creating Flavor', + 'task_id' => a_kind_of(String) + ), + a_hash_including( + 'success' => true, + 'message' => 'Creating Flavor', + 'task_id' => a_kind_of(String) + ) + ] + } + run_post(api_flavors_url, :resources => [create_params, create_params]) + + expect(response).to have_http_status(:ok) + expect(response.parsed_body).to include(expected) + end + + it 'will forbid creation of an flavor without appropriate role' do + api_basic_authorize + + run_post(api_flavors_url, :action => 'create') + + expect(response).to have_http_status(:forbidden) + end + end +end