Add user quota client API support

Implements blueprint user-quota-related-client-api

    This patch adds user arguments to the following subcommands:
        * quota-show
        * quota-update
        * quota-delete

Change-Id: I6556de366a758f7550e9b26357f231666caae419
This commit is contained in:
liyingjun 2013-07-30 10:18:59 +08:00
parent 5fe9408d2e
commit 8b5dcee15e
4 changed files with 87 additions and 13 deletions

View File

@ -26,6 +26,13 @@ class QuotaSetsTest(utils.TestCase):
cs.quotas.get(tenant_id)
cs.assert_called('GET', '/os-quota-sets/%s' % tenant_id)
def test_user_quotas_get(self):
tenant_id = 'test'
user_id = 'fake_user'
cs.quotas.get(tenant_id, user_id=user_id)
url = '/os-quota-sets/%s?user_id=%s' % (tenant_id, user_id)
cs.assert_called('GET', url)
def test_tenant_quotas_defaults(self):
tenant_id = '97f4c221bff44578b0300df4ef119353'
cs.quotas.defaults(tenant_id)
@ -37,6 +44,14 @@ class QuotaSetsTest(utils.TestCase):
cs.assert_called('PUT',
'/os-quota-sets/97f4c221bff44578b0300df4ef119353')
def test_update_user_quota(self):
tenant_id = '97f4c221bff44578b0300df4ef119353'
user_id = 'fake_user'
q = cs.quotas.get(tenant_id)
q.update(volumes=2, user_id=user_id)
url = '/os-quota-sets/%s?user_id=%s' % (tenant_id, user_id)
cs.assert_called('PUT', url)
def test_force_update_quota(self):
q = cs.quotas.get('97f4c221bff44578b0300df4ef119353')
q.update(cores=2, force=True)
@ -59,3 +74,10 @@ class QuotaSetsTest(utils.TestCase):
tenant_id = 'test'
cs.quotas.delete(tenant_id)
cs.assert_called('DELETE', '/os-quota-sets/%s' % tenant_id)
def test_user_quotas_delete(self):
tenant_id = 'test'
user_id = 'fake_user'
cs.quotas.delete(tenant_id, user_id=user_id)
url = '/os-quota-sets/%s?user_id=%s' % (tenant_id, user_id)
cs.assert_called('DELETE', url)

View File

@ -1213,6 +1213,12 @@ class ShellTest(utils.TestCase):
self.assert_called('GET',
'/os-quota-sets/97f4c221bff44578b0300df4ef119353')
def test_user_quota_show(self):
self.run_command('quota-show --tenant '
'97f4c221bff44578b0300df4ef119353 --user u1')
self.assert_called('GET',
'/os-quota-sets/97f4c221bff44578b0300df4ef119353?user_id=u1')
def test_quota_show_no_tenant(self):
self.run_command('quota-show')
self.assert_called('GET', '/os-quota-sets/tenant_id')
@ -1237,6 +1243,17 @@ class ShellTest(utils.TestCase):
{'quota_set': {'instances': 5,
'tenant_id': '97f4c221bff44578b0300df4ef119353'}})
def test_user_quota_update(self):
self.run_command(
'quota-update 97f4c221bff44578b0300df4ef119353'
' --user=u1'
' --instances=5')
self.assert_called(
'PUT',
'/os-quota-sets/97f4c221bff44578b0300df4ef119353?user_id=u1',
{'quota_set': {'instances': 5,
'tenant_id': '97f4c221bff44578b0300df4ef119353'}})
def test_quota_force_update(self):
self.run_command(
'quota-update 97f4c221bff44578b0300df4ef119353'
@ -1262,6 +1279,13 @@ class ShellTest(utils.TestCase):
self.assert_called('DELETE',
'/os-quota-sets/97f4c221bff44578b0300df4ef119353')
def test_user_quota_delete(self):
self.run_command('quota-delete --tenant '
'97f4c221bff44578b0300df4ef119353 '
'--user u1')
self.assert_called('DELETE',
'/os-quota-sets/97f4c221bff44578b0300df4ef119353?user_id=u1')
def test_quota_class_show(self):
self.run_command('quota-class-show test')
self.assert_called('GET', '/os-quota-class-sets/test')

View File

@ -31,17 +31,22 @@ class QuotaSet(base.Resource):
class QuotaSetManager(base.Manager):
resource_class = QuotaSet
def get(self, tenant_id):
def get(self, tenant_id, user_id=None):
if hasattr(tenant_id, 'tenant_id'):
tenant_id = tenant_id.tenant_id
return self._get("/os-quota-sets/%s" % (tenant_id), "quota_set")
if user_id:
url = '/os-quota-sets/%s?user_id=%s' % (tenant_id, user_id)
else:
url = '/os-quota-sets/%s' % tenant_id
return self._get(url, "quota_set")
def update(self, tenant_id, metadata_items=None,
injected_file_content_bytes=None, injected_file_path_bytes=None,
volumes=None, gigabytes=None,
ram=None, floating_ips=None, fixed_ips=None, instances=None,
injected_files=None, cores=None, key_pairs=None,
security_groups=None, security_group_rules=None, force=None):
security_groups=None, security_group_rules=None, force=None,
user_id=None):
body = {'quota_set': {
'tenant_id': tenant_id,
@ -65,11 +70,19 @@ class QuotaSetManager(base.Manager):
if body['quota_set'][key] is None:
body['quota_set'].pop(key)
return self._update('/os-quota-sets/%s' % tenant_id, body, 'quota_set')
if user_id:
url = '/os-quota-sets/%s?user_id=%s' % (tenant_id, user_id)
else:
url = '/os-quota-sets/%s' % tenant_id
return self._update(url, body, 'quota_set')
def defaults(self, tenant_id):
return self._get('/os-quota-sets/%s/defaults' % tenant_id,
'quota_set')
def delete(self, tenant_id):
self._delete("/os-quota-sets/%s" % tenant_id)
def delete(self, tenant_id, user_id=None):
if user_id:
url = '/os-quota-sets/%s?user_id=%s' % (tenant_id, user_id)
else:
url = '/os-quota-sets/%s' % tenant_id
self._delete(url)

View File

@ -2895,8 +2895,10 @@ def _quota_update(manager, identifier, args):
# default value of force is None to make sure this client
# will be compatibile with old nova server
force_update = getattr(args, 'force', None)
user_id = getattr(args, 'user', None)
if isinstance(manager, quotas.QuotaSetManager):
manager.update(identifier, force=force_update, **updates)
manager.update(identifier, force=force_update, user_id=user_id,
**updates)
else:
manager.update(identifier, **updates)
@ -2905,13 +2907,17 @@ def _quota_update(manager, identifier, args):
metavar='<tenant-id>',
default=None,
help='ID of tenant to list the quotas for.')
@utils.arg('--user',
metavar='<user-id>',
default=None,
help='ID of user to list the quotas for.')
def do_quota_show(cs, args):
"""List the quotas for a tenant."""
"""List the quotas for a tenant/user."""
if not args.tenant:
_quota_show(cs.quotas.get(cs.client.tenant_id))
_quota_show(cs.quotas.get(cs.client.tenant_id, user_id=args.user))
else:
_quota_show(cs.quotas.get(args.tenant))
_quota_show(cs.quotas.get(args.tenant, user_id=args.user))
@utils.arg('--tenant',
@ -2930,6 +2936,10 @@ def do_quota_defaults(cs, args):
@utils.arg('tenant',
metavar='<tenant-id>',
help='ID of tenant to set the quotas for.')
@utils.arg('--user',
metavar='<user-id>',
default=None,
help='ID of user to set the quotas for.')
@utils.arg('--instances',
metavar='<instances>',
type=int, default=None,
@ -3014,7 +3024,7 @@ def do_quota_defaults(cs, args):
help='Whether force update the quota even if the already used'
' and reserved exceeds the new quota')
def do_quota_update(cs, args):
"""Update the quotas for a tenant."""
"""Update the quotas for a tenant/user."""
_quota_update(cs.quotas, args.tenant, args)
@ -3022,10 +3032,15 @@ def do_quota_update(cs, args):
@utils.arg('--tenant',
metavar='<tenant-id>',
help='ID of tenant to delete quota for.')
@utils.arg('--user',
metavar='<user-id>',
help='ID of user to delete quota for.')
def do_quota_delete(cs, args):
"""Delete quota for a tenant so their quota will revert back to default."""
"""Delete quota for a tenant/user so their quota will Revert
back to default.
"""
cs.quotas.delete(args.tenant)
cs.quotas.delete(args.tenant, user_id=args.user)
@utils.arg('class_name',