From 42d2cb94ec4b0da9c4d723b6bc712928ae05ce70 Mon Sep 17 00:00:00 2001 From: Nelvin Driz Date: Sun, 26 Feb 2012 16:09:22 +0800 Subject: [PATCH] [openstack|identity] Update Tenants (Complete CRUD) --- lib/fog/openstack.rb | 2 +- lib/fog/openstack/identity.rb | 5 ++- lib/fog/openstack/models/identity/tenant.rb | 24 +++++++++++++ lib/fog/openstack/models/identity/tenants.rb | 11 ++++++ .../requests/identity/create_tenant.rb | 34 ++++++++++++++++++ .../requests/identity/delete_tenant.rb | 31 ++++++++++++++++ .../requests/identity/list_tenants.rb | 19 ++++------ .../requests/identity/update_tenant.rb | 30 ++++++++++++++++ tests/helpers/succeeds_helper.rb | 5 ++- .../openstack/models/identity/tenant_tests.rb | 21 +++++++++-- .../models/identity/tenants_tests.rb | 26 ++++++++++++++ .../requests/identity/tenant_tests.rb | 35 +++++++++++++++---- 12 files changed, 215 insertions(+), 28 deletions(-) create mode 100644 lib/fog/openstack/requests/identity/create_tenant.rb create mode 100644 lib/fog/openstack/requests/identity/delete_tenant.rb create mode 100644 lib/fog/openstack/requests/identity/update_tenant.rb create mode 100644 tests/openstack/models/identity/tenants_tests.rb diff --git a/lib/fog/openstack.rb b/lib/fog/openstack.rb index 0ad800e67..dba8dc66b 100644 --- a/lib/fog/openstack.rb +++ b/lib/fog/openstack.rb @@ -74,7 +74,7 @@ module Fog connection = Fog::Connection.new(uri.to_s, false, connection_options) @openstack_api_key = options[:openstack_api_key] @openstack_username = options[:openstack_username] - @openstack_tenant = options[:openstack_tenant] + @openstack_tenant = options[:openstack_tenant] || 'admin' @compute_service_name = options[:openstack_compute_service_name] @endpoint_type = options[:openstack_endpoint_type] || 'publicURL' diff --git a/lib/fog/openstack/identity.rb b/lib/fog/openstack/identity.rb index d77fc3c47..d3035ca9e 100644 --- a/lib/fog/openstack/identity.rb +++ b/lib/fog/openstack/identity.rb @@ -23,9 +23,12 @@ module Fog request :validate_token request :list_tenants + request :create_tenant request :get_tenant request :get_tenants_by_id request :get_tenants_by_name + request :update_tenant + request :delete_tenant request :list_users request :get_user_by_id @@ -112,7 +115,7 @@ module Fog rescue Excon::Errors::HTTPStatusError => error raise case error when Excon::Errors::NotFound - Fog::Compute::OpenStack::NotFound.slurp(error) + Fog::Identity::OpenStack::NotFound.slurp(error) else error end diff --git a/lib/fog/openstack/models/identity/tenant.rb b/lib/fog/openstack/models/identity/tenant.rb index b5d6cef5d..c71c3f962 100644 --- a/lib/fog/openstack/models/identity/tenant.rb +++ b/lib/fog/openstack/models/identity/tenant.rb @@ -19,6 +19,30 @@ module Fog :tenant => self, :user => user) end + + def destroy + requires :id + connection.delete_tenant(self.id) + true + end + + def update(attr = nil) + requires :id + merge_attributes( + connection.update_tenant(self.id, attr || attributes).body['tenant']) + self + end + + def save + requires :name + identity ? update : create + end + + def create + merge_attributes( + connection.create_tenant(attributes).body['tenant']) + self + end end # class Tenant end # class OpenStack end # module Identity diff --git a/lib/fog/openstack/models/identity/tenants.rb b/lib/fog/openstack/models/identity/tenants.rb index 8b5ab4029..634b9858f 100644 --- a/lib/fog/openstack/models/identity/tenants.rb +++ b/lib/fog/openstack/models/identity/tenants.rb @@ -10,6 +10,17 @@ module Fog def all load(connection.list_tenants.body['tenants']) end + + def find_by_id(id) + self.find {|tenant| tenant.id == id} || + Fog::Identity::OpenStack::Tenant.new( + connection.get_tenant(id).body['tenant']) + end + + def destroy(id) + tenant = self.find_by_id(id) + tenant.destroy + end end # class Tenants end # class OpenStack end # module Compute diff --git a/lib/fog/openstack/requests/identity/create_tenant.rb b/lib/fog/openstack/requests/identity/create_tenant.rb new file mode 100644 index 000000000..ca81b4680 --- /dev/null +++ b/lib/fog/openstack/requests/identity/create_tenant.rb @@ -0,0 +1,34 @@ +module Fog + module Identity + class OpenStack + class Real + def create_tenant(attributes) + request( + :expects => [200], + :method => 'POST', + :path => "tenants", + :body => { + 'tenant' => attributes + }.to_json + ) + end # def create_tenant + end # class Real + + class Mock + def create_tenant(attributes) + response = Excon::Response.new + response.status = [200, 204][rand(1)] + response.body = { + 'tenant' => { + 'id' => '1', + 'description' => 'Has access to everything', + 'enabled' => true, + 'name' => 'admin' + } + } + response + end # def create_tenant + end # class Mock + end # class OpenStack + end # module Identity +end # module Fog diff --git a/lib/fog/openstack/requests/identity/delete_tenant.rb b/lib/fog/openstack/requests/identity/delete_tenant.rb new file mode 100644 index 000000000..d93356826 --- /dev/null +++ b/lib/fog/openstack/requests/identity/delete_tenant.rb @@ -0,0 +1,31 @@ +module Fog + module Identity + class OpenStack + class Real + def delete_tenant(id) + request( + :expects => [200], + :method => 'DELETE', + :path => "tenants/#{id}" + ) + end # def create_tenant + end # class Real + + class Mock + def delete_tenant(attributes) + response = Excon::Response.new + response.status = [200, 204][rand(1)] + response.body = { + 'tenant' => { + 'id' => '1', + 'description' => 'Has access to everything', + 'enabled' => true, + 'name' => 'admin' + } + } + response + end # def create_tenant + end # class Mock + end # class OpenStack + end # module Identity +end # module Fog diff --git a/lib/fog/openstack/requests/identity/list_tenants.rb b/lib/fog/openstack/requests/identity/list_tenants.rb index ee4ec7d6d..757c650b5 100644 --- a/lib/fog/openstack/requests/identity/list_tenants.rb +++ b/lib/fog/openstack/requests/identity/list_tenants.rb @@ -2,23 +2,16 @@ module Fog module Identity class OpenStack class Real - def list_tenants(options = {}) - path = 'tenants' - - params = options.map do |key, value| - next unless [ - 'limit', 'marker', 'name', 'id' - ].include?(key.to_s) - - "#{key}=#{value}" - end.compact.join('&') - - path.concat("?#{params}") unless params.empty? + def list_tenants(limit = nil, marker = nil) + params = Hash.new + params['limit'] = limit if limit + params['marker'] = marker if marker request( :expects => [200, 204], :method => 'GET', - :path => path + :path => "tenants", + :query => params ) end end # class Real diff --git a/lib/fog/openstack/requests/identity/update_tenant.rb b/lib/fog/openstack/requests/identity/update_tenant.rb new file mode 100644 index 000000000..aacad5df8 --- /dev/null +++ b/lib/fog/openstack/requests/identity/update_tenant.rb @@ -0,0 +1,30 @@ +module Fog + module Identity + class OpenStack + class Real + def update_tenant(id, attributes) + request( + :expects => [200], + :method => 'PUT', + :path => "tenants/#{id}", + :body => { + 'tenant' => attributes + }.to_json + ) + end # def create_tenant + end # class Real + + class Mock + def update_tenant(id, attributes) + response = Excon::Response.new + response.status = [200, 204][rand(1)] + attributes = {'enabled' => true, 'id' => '1'}.merge(attributes) + response.body = { + 'tenant' => attributes + } + response + end # def create_tenant + end # class Mock + end # class OpenStack + end # module Identity +end # module Fog diff --git a/tests/helpers/succeeds_helper.rb b/tests/helpers/succeeds_helper.rb index 527a06735..fe6fb1b43 100644 --- a/tests/helpers/succeeds_helper.rb +++ b/tests/helpers/succeeds_helper.rb @@ -3,10 +3,9 @@ module Shindo def succeeds test('succeeds') do - instance_eval(&Proc.new) - true + !!instance_eval(&Proc.new) end end end -end \ No newline at end of file +end diff --git a/tests/openstack/models/identity/tenant_tests.rb b/tests/openstack/models/identity/tenant_tests.rb index c6e520013..4af768789 100644 --- a/tests/openstack/models/identity/tenant_tests.rb +++ b/tests/openstack/models/identity/tenant_tests.rb @@ -1,9 +1,24 @@ Shindo.tests("Fog::Compute[:openstack] | tenant", ['openstack']) do - @instance = Fog::Identity[:openstack].tenants.first - tests('success') do tests('#roles_for(0)').succeeds do - @instance.roles_for(0) + instance = Fog::Identity[:openstack].tenants.first + instance.roles_for(0) + end + end + + tests('CRUD') do + tests('#create').succeeds do + @instance = Fog::Identity[:openstack].tenants.create(:name => 'test') + !@instance.id.nil? + end + + tests('#update').succeeds do + @instance.update(:name => 'test2') + @instance.name == 'test2' + end + + tests('#destroy').succeeds do + @instance.destroy == true end end end diff --git a/tests/openstack/models/identity/tenants_tests.rb b/tests/openstack/models/identity/tenants_tests.rb new file mode 100644 index 000000000..b8a4b526b --- /dev/null +++ b/tests/openstack/models/identity/tenants_tests.rb @@ -0,0 +1,26 @@ +Shindo.tests("Fog::Compute[:openstack] | tenants", ['openstack']) do + @instance = Fog::Identity[:openstack].tenants.create(:name => 'test') + + tests('success') do + tests('#find_by_id').succeeds do + tenant = Fog::Identity[:openstack].tenants.find_by_id(@instance.id) + tenant.id == @instance.id + end + + tests('#destroy').succeeds do + Fog::Identity[:openstack].tenants.destroy(@instance.id) + end + end + + tests('fails') do + pending if Fog.mocking? + + tests('#find_by_id').raises(Fog::Identity::OpenStack::NotFound) do + Fog::Identity[:openstack].tenants.find_by_id('fake') + end + + tests('#destroy').raises(Fog::Identity::OpenStack::NotFound) do + Fog::Identity[:openstack].tenants.destroy('fake') + end + end +end diff --git a/tests/openstack/requests/identity/tenant_tests.rb b/tests/openstack/requests/identity/tenant_tests.rb index 9c700428a..6660e2092 100644 --- a/tests/openstack/requests/identity/tenant_tests.rb +++ b/tests/openstack/requests/identity/tenant_tests.rb @@ -3,8 +3,9 @@ Shindo.tests('Fog::Identity[:openstack] | tenant requests', ['openstack']) do @tenant_format = { 'id' => String, 'name' => String, - 'enabled' => Fog::Boolean, - 'description' => String + 'enabled' => Fog::Nullable::Boolean, + 'description' => Fog::Nullable::String, + 'extra' => Fog::Nullable::Hash } @role_format = { @@ -13,20 +14,40 @@ Shindo.tests('Fog::Identity[:openstack] | tenant requests', ['openstack']) do } tests('success') do - tests('#list_tenants').formats({'tenants' => [@tenant_format]}) do + tests('#list_tenants').formats({'tenants' => [@tenant_format], 'tenants_links' => []}) do Fog::Identity[:openstack].list_tenants.body end tests('#list_roles_for_user_on_tenant(0,1)'). formats({'roles' => [@role_format]}) do - pending unless Fog.mocking? - Fog::Identity[:openstack].list_roles_for_user_on_tenant(0,1).body + openstack = Fog::Identity[:openstack] + openstack.list_roles_for_user_on_tenant( + openstack.tenants.first, openstack.users.first).body + end + + tests('#create_tenant').formats({'tenant' => @tenant_format}) do + @instance = Fog::Identity[:openstack].create_tenant('name' => 'test').body end tests('#get_tenant').formats({'tenant' => @tenant_format}) do - pending unless Fog.mocking? - Fog::Identity[:openstack].get_tenant(0).body + Fog::Identity[:openstack].get_tenant(@instance['tenant']['id']).body end + + tests('#update_tenant check format').formats({'tenant' => @tenant_format}) do + @instance = Fog::Identity[:openstack].update_tenant( + @instance['tenant']['id'], 'name' => 'test2').body + end + + tests('#update_tenant update name').succeeds do + @instance = Fog::Identity[:openstack].update_tenant( + @instance['tenant']['id'], 'name' => 'test3').body + @instance['tenant']['name'] == 'test3' + end + + tests('#delete_tenant').succeeds do + Fog::Identity[:openstack].delete_tenant(@instance['tenant']['id']) + end + end end