From 3147f9b36ba797ec5d2fe7b666b146249ffe85a8 Mon Sep 17 00:00:00 2001 From: "Philip Mark M. Deazeta" Date: Fri, 12 Apr 2013 18:10:01 +0800 Subject: [PATCH] [openstack|volume] Added quota requests for Cinder --- .../openstack/requests/volume/get_quota.rb | 31 +++++++++++ .../requests/volume/get_quota_defaults.rb | 31 +++++++++++ .../openstack/requests/volume/update_quota.rb | 32 ++++++++++++ lib/fog/openstack/volume.rb | 11 +++- .../openstack/requests/volume/quota_tests.rb | 51 +++++++++++++++++++ 5 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 lib/fog/openstack/requests/volume/get_quota.rb create mode 100644 lib/fog/openstack/requests/volume/get_quota_defaults.rb create mode 100644 lib/fog/openstack/requests/volume/update_quota.rb create mode 100644 tests/openstack/requests/volume/quota_tests.rb diff --git a/lib/fog/openstack/requests/volume/get_quota.rb b/lib/fog/openstack/requests/volume/get_quota.rb new file mode 100644 index 000000000..f505c64cd --- /dev/null +++ b/lib/fog/openstack/requests/volume/get_quota.rb @@ -0,0 +1,31 @@ +module Fog + module Volume + class OpenStack + class Real + + def get_quota(tenant_id) + request( + :expects => 200, + :method => 'GET', + :path => "/os-quota-sets/#{tenant_id}" + ) + end + + end + + class Mock + + def get_quota(tenant_id) + response = Excon::Response.new + response.status = 200 + response.body = { + 'quota_set' => (self.data[:quota_updated] or self.data[:quota]).merge({'id' => tenant_id}) + } + response + end + + end + + end + end +end diff --git a/lib/fog/openstack/requests/volume/get_quota_defaults.rb b/lib/fog/openstack/requests/volume/get_quota_defaults.rb new file mode 100644 index 000000000..6474a75c3 --- /dev/null +++ b/lib/fog/openstack/requests/volume/get_quota_defaults.rb @@ -0,0 +1,31 @@ +module Fog + module Volume + class OpenStack + class Real + + def get_quota_defaults(tenant_id) + request( + :expects => 200, + :method => 'GET', + :path => "/os-quota-sets/#{tenant_id}/defaults" + ) + end + + end + + class Mock + + def get_quota_defaults(tenant_id) + response = Excon::Response.new + response.status = 200 + response.body = { + 'quota_set' => self.data[:quota].merge({'id' => tenant_id}) + } + response + end + + end + + end + end +end diff --git a/lib/fog/openstack/requests/volume/update_quota.rb b/lib/fog/openstack/requests/volume/update_quota.rb new file mode 100644 index 000000000..c0a628e99 --- /dev/null +++ b/lib/fog/openstack/requests/volume/update_quota.rb @@ -0,0 +1,32 @@ +module Fog + module Volume + class OpenStack + class Real + + def update_quota(tenant_id, options = {}) + options['tenant_id'] = tenant_id + request( + :body => Fog::JSON.encode({ 'quota_set' => options }), + :expects => 200, + :method => 'PUT', + :path => "/os-quota-sets/#{tenant_id}" + ) + end + + end + + class Mock + + def update_quota(tenant_id, options = {}) + self.data[:quota_updated] = self.data[:quota].merge options + + response = Excon::Response.new + response.status = 200 + response.body = { 'quota_set' => self.data[:quota_updated] } + response + end + + end + end + end +end diff --git a/lib/fog/openstack/volume.rb b/lib/fog/openstack/volume.rb index a5cec9f24..d5fc6d5e8 100644 --- a/lib/fog/openstack/volume.rb +++ b/lib/fog/openstack/volume.rb @@ -29,6 +29,10 @@ module Fog request :list_snapshots request :get_snapshot_details request :delete_snapshot + + request :update_quota + request :get_quota + request :get_quota_defaults request :set_tenant @@ -37,7 +41,12 @@ module Fog @data ||= Hash.new do |hash, key| hash[key] = { :users => {}, - :tenants => {} + :tenants => {}, + :quota => { + 'gigabytes' => 1000, + 'volumes' => 10, + 'snapshots' => 10 + } } end end diff --git a/tests/openstack/requests/volume/quota_tests.rb b/tests/openstack/requests/volume/quota_tests.rb new file mode 100644 index 000000000..5e5290ad0 --- /dev/null +++ b/tests/openstack/requests/volume/quota_tests.rb @@ -0,0 +1,51 @@ +Shindo.tests('Fog::Volume[:openstack] | quota requests', ['openstack']) do + + @tenant_id = Fog::Compute[:openstack].list_tenants.body['tenants'].first['id'] + @quota_set_format = { + 'volumes' => Fog::Nullable::Integer, + 'gigabytes' => Fog::Nullable::Integer, + 'snapshots' => Fog::Nullable::Integer, + 'id' => String + } + + tests('success') do + + tests('#get_quota_defaults').formats({ 'quota_set' => @quota_set_format }) do + Fog::Volume[:openstack].get_quota_defaults(@tenant_id).body + end + + tests('#get_quota').formats(@quota_set_format) do + @quota = Fog::Volume[:openstack].get_quota(@tenant_id).body['quota_set'] + @quota + end + + tests('#update_quota') do + + new_values = @quota.merge({ + 'volumes' => @quota['volumes']/2, + 'snapshots' => @quota['snapshots']/2 + }) + + succeeds do + Fog::Volume[:openstack].update_quota(@tenant_id, new_values.clone) + end + + returns(new_values, 'returns new values') do + Fog::Volume[:openstack].get_quota(@tenant_id).body['quota_set'] + end + + # set quota back to old values + succeeds do + Fog::Volume[:openstack].update_quota(@tenant_id, @quota.clone) + end + + # ensure old values are restored + returns(@quota, 'old values restored') do + Fog::Volume[:openstack].get_quota(@tenant_id).body['quota_set'] + end + + end + + end +end +