Return complete response from compute quotas client

Currently compute quota_classes_client and quotas_client returns Response by
removing top key from Response.
For example- return service_client.ResponseBody(resp, body['quota_set'])

As service clients are in direction to move to Tempest-lib, all
service clients should return Response without any truncation.
One good example is Resource pagination links which are lost with current
way of return value. Resource pagination links are present in parallel
(not inside) to top key of Response.

This patch makes compute quota_classes_client and quotas_client to return
complete Response body.

Change-Id: Idd8afb1bcfc1b0165b1e967a991d4705ff182249
Implements: blueprint method-return-value-and-move-service-clients-to-lib
This commit is contained in:
ghanshyam 2015-08-24 16:39:10 +09:00
parent d95efa9be2
commit 5265787b67
9 changed files with 78 additions and 66 deletions

View File

@ -59,7 +59,7 @@ class QuotasAdminTestJSON(base.BaseV2ComputeAdminTest):
# Admin can get the default resource quota set for a tenant
expected_quota_set = self.default_quota_set | set(['id'])
quota_set = self.adm_client.show_default_quota_set(
self.demo_tenant_id)
self.demo_tenant_id)['quota_set']
self.assertEqual(quota_set['id'], self.demo_tenant_id)
for quota in expected_quota_set:
self.assertIn(quota, quota_set.keys())
@ -68,7 +68,7 @@ class QuotasAdminTestJSON(base.BaseV2ComputeAdminTest):
def test_update_all_quota_resources_for_tenant(self):
# Admin can update all the resource quota limits for a tenant
default_quota_set = self.adm_client.show_default_quota_set(
self.demo_tenant_id)
self.demo_tenant_id)['quota_set']
new_quota_set = {'injected_file_content_bytes': 20480,
'metadata_items': 256, 'injected_files': 10,
'ram': 10240, 'floating_ips': 20, 'fixed_ips': 10,
@ -79,7 +79,7 @@ class QuotasAdminTestJSON(base.BaseV2ComputeAdminTest):
quota_set = self.adm_client.update_quota_set(
self.demo_tenant_id,
force=True,
**new_quota_set)
**new_quota_set)['quota_set']
default_quota_set.pop('id')
# NOTE(PhilDay) The following is safe as we're not updating these
@ -107,7 +107,7 @@ class QuotasAdminTestJSON(base.BaseV2ComputeAdminTest):
self.addCleanup(identity_client.delete_tenant, tenant_id)
self.adm_client.update_quota_set(tenant_id, ram='5120')
quota_set = self.adm_client.show_quota_set(tenant_id)
quota_set = self.adm_client.show_quota_set(tenant_id)['quota_set']
self.assertEqual(5120, quota_set['ram'])
# Verify that GET shows the updated quota set of user
@ -126,8 +126,8 @@ class QuotasAdminTestJSON(base.BaseV2ComputeAdminTest):
self.adm_client.update_quota_set(tenant_id,
user_id=user_id,
ram='2048')
quota_set = self.adm_client.show_quota_set(tenant_id,
user_id=user_id)
quota_set = self.adm_client.show_quota_set(
tenant_id, user_id=user_id)['quota_set']
self.assertEqual(2048, quota_set['ram'])
@test.idempotent_id('389d04f0-3a41-405f-9317-e5f86e3c44f0')
@ -140,14 +140,15 @@ class QuotasAdminTestJSON(base.BaseV2ComputeAdminTest):
description=tenant_desc)
tenant_id = tenant['id']
self.addCleanup(identity_client.delete_tenant, tenant_id)
quota_set_default = self.adm_client.show_quota_set(tenant_id)
quota_set_default = (self.adm_client.show_quota_set(tenant_id)
['quota_set'])
ram_default = quota_set_default['ram']
self.adm_client.update_quota_set(tenant_id, ram='5120')
self.adm_client.delete_quota_set(tenant_id)
quota_set_new = self.adm_client.show_quota_set(tenant_id)
quota_set_new = self.adm_client.show_quota_set(tenant_id)['quota_set']
self.assertEqual(ram_default, quota_set_new['ram'])
@ -169,7 +170,7 @@ class QuotaClassesAdminTestJSON(base.BaseV2ComputeAdminTest):
def _restore_default_quotas(self, original_defaults):
LOG.debug("restoring quota class defaults")
self.adm_client.update_quota_class_set(
'default', **original_defaults)
'default', **original_defaults)['quota_class_set']
# NOTE(sdague): this test is problematic as it changes
# global state, and possibly needs to be part of a set of
@ -178,7 +179,8 @@ class QuotaClassesAdminTestJSON(base.BaseV2ComputeAdminTest):
@test.idempotent_id('7932ab0f-5136-4075-b201-c0e2338df51a')
def test_update_default_quotas(self):
LOG.debug("get the current 'default' quota class values")
body = self.adm_client.show_quota_class_set('default')
body = (self.adm_client.show_quota_class_set('default')
['quota_class_set'])
self.assertIn('id', body)
self.assertEqual('default', body.pop('id'))
# restore the defaults when the test is done
@ -190,8 +192,8 @@ class QuotaClassesAdminTestJSON(base.BaseV2ComputeAdminTest):
# to a very small number which causes issues.
body[quota] = default + 100
LOG.debug("update limits for the default quota class set")
update_body = self.adm_client.update_quota_class_set('default',
**body)
update_body = self.adm_client.update_quota_class_set(
'default', **body)['quota_class_set']
LOG.debug("assert that the response has all of the changed values")
self.assertThat(update_body.items(),
matchers.ContainsAll(body.items()))

View File

@ -55,13 +55,14 @@ class QuotasAdminNegativeTestJSON(base.BaseV2ComputeAdminTest):
@test.idempotent_id('91058876-9947-4807-9f22-f6eb17140d9b')
def test_create_server_when_cpu_quota_is_full(self):
# Disallow server creation when tenant's vcpu quota is full
quota_set = self.adm_client.show_quota_set(self.demo_tenant_id)
quota_set = (self.adm_client.show_quota_set(self.demo_tenant_id)
['quota_set'])
default_vcpu_quota = quota_set['cores']
vcpu_quota = 0 # Set the quota to zero to conserve resources
quota_set = self.adm_client.update_quota_set(self.demo_tenant_id,
force=True,
cores=vcpu_quota)
self.adm_client.update_quota_set(self.demo_tenant_id,
force=True,
cores=vcpu_quota)
self.addCleanup(self.adm_client.update_quota_set, self.demo_tenant_id,
cores=default_vcpu_quota)
@ -72,7 +73,8 @@ class QuotasAdminNegativeTestJSON(base.BaseV2ComputeAdminTest):
@test.idempotent_id('6fdd7012-584d-4327-a61c-49122e0d5864')
def test_create_server_when_memory_quota_is_full(self):
# Disallow server creation when tenant's memory quota is full
quota_set = self.adm_client.show_quota_set(self.demo_tenant_id)
quota_set = (self.adm_client.show_quota_set(self.demo_tenant_id)
['quota_set'])
default_mem_quota = quota_set['ram']
mem_quota = 0 # Set the quota to zero to conserve resources
@ -89,7 +91,8 @@ class QuotasAdminNegativeTestJSON(base.BaseV2ComputeAdminTest):
@test.idempotent_id('7c6be468-0274-449a-81c3-ac1c32ee0161')
def test_create_server_when_instances_quota_is_full(self):
# Once instances quota limit is reached, disallow server creation
quota_set = self.adm_client.show_quota_set(self.demo_tenant_id)
quota_set = (self.adm_client.show_quota_set(self.demo_tenant_id)
['quota_set'])
default_instances_quota = quota_set['instances']
instances_quota = 0 # Set quota to zero to disallow server creation
@ -108,17 +111,17 @@ class QuotasAdminNegativeTestJSON(base.BaseV2ComputeAdminTest):
def test_security_groups_exceed_limit(self):
# Negative test: Creation Security Groups over limit should FAIL
quota_set = self.adm_client.show_quota_set(self.demo_tenant_id)
quota_set = (self.adm_client.show_quota_set(self.demo_tenant_id)
['quota_set'])
default_sg_quota = quota_set['security_groups']
# Set the quota to number of used security groups
sg_quota = self.limits_client.show_limits()['absolute'][
'totalSecurityGroupsUsed']
quota_set =\
self.adm_client.update_quota_set(self.demo_tenant_id,
force=True,
security_groups=sg_quota)
self.adm_client.update_quota_set(self.demo_tenant_id,
force=True,
security_groups=sg_quota)
self.addCleanup(self.adm_client.update_quota_set,
self.demo_tenant_id,
@ -140,15 +143,14 @@ class QuotasAdminNegativeTestJSON(base.BaseV2ComputeAdminTest):
# Negative test: Creation of Security Group Rules should FAIL
# when we reach limit maxSecurityGroupRules
quota_set = self.adm_client.show_quota_set(self.demo_tenant_id)
quota_set = (self.adm_client.show_quota_set(self.demo_tenant_id)
['quota_set'])
default_sg_rules_quota = quota_set['security_group_rules']
sg_rules_quota = 0 # Set the quota to zero to conserve resources
quota_set =\
self.adm_client.update_quota_set(
self.demo_tenant_id,
force=True,
security_group_rules=sg_rules_quota)
self.adm_client.update_quota_set(self.demo_tenant_id,
force=True,
security_group_rules=sg_rules_quota)
self.addCleanup(self.adm_client.update_quota_set,
self.demo_tenant_id,

View File

@ -69,7 +69,8 @@ class ServersAdminNegativeTestJSON(base.BaseV2ComputeAdminTest):
self.useFixture(fixtures.LockFixture('compute_quotas'))
flavor_name = data_utils.rand_name("flavor")
flavor_id = self._get_unused_flavor_id()
quota_set = self.quotas_client.show_default_quota_set(self.tenant_id)
quota_set = (self.quotas_client.show_default_quota_set(self.tenant_id)
['quota_set'])
ram = int(quota_set['ram']) + 1
vcpus = 8
disk = 10
@ -93,7 +94,8 @@ class ServersAdminNegativeTestJSON(base.BaseV2ComputeAdminTest):
flavor_name = data_utils.rand_name("flavor")
flavor_id = self._get_unused_flavor_id()
ram = 512
quota_set = self.quotas_client.show_default_quota_set(self.tenant_id)
quota_set = (self.quotas_client.show_default_quota_set(self.tenant_id)
['quota_set'])
vcpus = int(quota_set['cores']) + 1
disk = 10
flavor_ref = self.flavors_client.create_flavor(name=flavor_name,

View File

@ -137,7 +137,7 @@ class ServerMetadataNegativeTestJSON(base.BaseV2ComputeTest):
# A 403 Forbidden or 413 Overlimit (old behaviour) exception
# will be raised while exceeding metadata items limit for
# tenant.
quota_set = self.quotas.show_quota_set(self.tenant_id)
quota_set = self.quotas.show_quota_set(self.tenant_id)['quota_set']
quota_metadata = quota_set['metadata_items']
if quota_metadata == -1:
raise self.skipException("No limit for metadata_items")

View File

@ -54,14 +54,14 @@ class QuotasTestJSON(base.BaseV2ComputeTest):
def test_get_quotas(self):
# User can get the quota set for it's tenant
expected_quota_set = self.default_quota_set | set(['id'])
quota_set = self.client.show_quota_set(self.tenant_id)
quota_set = self.client.show_quota_set(self.tenant_id)['quota_set']
self.assertEqual(quota_set['id'], self.tenant_id)
for quota in expected_quota_set:
self.assertIn(quota, quota_set.keys())
# get the quota set using user id
quota_set = self.client.show_quota_set(self.tenant_id,
self.user_id)
self.user_id)['quota_set']
self.assertEqual(quota_set['id'], self.tenant_id)
for quota in expected_quota_set:
self.assertIn(quota, quota_set.keys())
@ -70,7 +70,8 @@ class QuotasTestJSON(base.BaseV2ComputeTest):
def test_get_default_quotas(self):
# User can get the default quota set for it's tenant
expected_quota_set = self.default_quota_set | set(['id'])
quota_set = self.client.show_default_quota_set(self.tenant_id)
quota_set = (self.client.show_default_quota_set(self.tenant_id)
['quota_set'])
self.assertEqual(quota_set['id'], self.tenant_id)
for quota in expected_quota_set:
self.assertIn(quota, quota_set.keys())
@ -79,6 +80,7 @@ class QuotasTestJSON(base.BaseV2ComputeTest):
def test_compare_tenant_quotas_with_default_quotas(self):
# Tenants are created with the default quota values
defualt_quota_set = \
self.client.show_default_quota_set(self.tenant_id)
tenant_quota_set = self.client.show_quota_set(self.tenant_id)
self.client.show_default_quota_set(self.tenant_id)['quota_set']
tenant_quota_set = (self.client.show_quota_set(self.tenant_id)
['quota_set'])
self.assertEqual(defualt_quota_set, tenant_quota_set)

View File

@ -29,7 +29,7 @@ class QuotaClassesClient(service_client.ServiceClient):
resp, body = self.get(url)
body = json.loads(body)
self.validate_response(classes_schema.get_quota_class_set, resp, body)
return service_client.ResponseBody(resp, body['quota_class_set'])
return service_client.ResponseBody(resp, body)
def update_quota_class_set(self, quota_class_id, **kwargs):
"""
@ -43,4 +43,4 @@ class QuotaClassesClient(service_client.ServiceClient):
body = json.loads(body)
self.validate_response(classes_schema.update_quota_class_set,
resp, body)
return service_client.ResponseBody(resp, body['quota_class_set'])
return service_client.ResponseBody(resp, body)

View File

@ -30,7 +30,7 @@ class QuotasClient(service_client.ServiceClient):
resp, body = self.get(url)
body = json.loads(body)
self.validate_response(schema.get_quota_set, resp, body)
return service_client.ResponseBody(resp, body['quota_set'])
return service_client.ResponseBody(resp, body)
def show_default_quota_set(self, tenant_id):
"""List the default quota set for a tenant."""
@ -39,7 +39,7 @@ class QuotasClient(service_client.ServiceClient):
resp, body = self.get(url)
body = json.loads(body)
self.validate_response(schema.get_quota_set, resp, body)
return service_client.ResponseBody(resp, body['quota_set'])
return service_client.ResponseBody(resp, body)
def update_quota_set(self, tenant_id, user_id=None, **kwargs):
"""
@ -56,7 +56,7 @@ class QuotasClient(service_client.ServiceClient):
body = json.loads(body)
self.validate_response(schema.update_quota_set, resp, body)
return service_client.ResponseBody(resp, body['quota_set'])
return service_client.ResponseBody(resp, body)
def delete_quota_set(self, tenant_id):
"""Delete the tenant's quota set."""

View File

@ -50,8 +50,8 @@ class TestQuotaClassesClient(base.TestCase):
fake_auth, 'compute', 'regionOne')
def _test_show_quota_class_set(self, bytes_body=False):
serialized_body = json.dumps({
"quota_class_set": self.FAKE_QUOTA_CLASS_SET})
expected = {'quota_class_set': self.FAKE_QUOTA_CLASS_SET}
serialized_body = json.dumps(expected)
if bytes_body:
serialized_body = serialized_body.encode('utf-8')
@ -60,7 +60,7 @@ class TestQuotaClassesClient(base.TestCase):
'tempest.common.service_client.ServiceClient.get',
return_value=mocked_resp))
resp = self.client.show_quota_class_set("test")
self.assertEqual(self.FAKE_QUOTA_CLASS_SET, resp)
self.assertEqual(expected, resp)
def test_show_quota_class_set_with_str_body(self):
self._test_show_quota_class_set()
@ -71,11 +71,12 @@ class TestQuotaClassesClient(base.TestCase):
def test_update_quota_class_set(self):
fake_quota_class_set = copy.deepcopy(self.FAKE_QUOTA_CLASS_SET)
fake_quota_class_set.pop("id")
serialized_body = json.dumps({"quota_class_set": fake_quota_class_set})
expected = {'quota_class_set': fake_quota_class_set}
serialized_body = json.dumps(expected)
mocked_resp = (httplib2.Response({'status': 200}), serialized_body)
self.useFixture(mockpatch.Patch(
'tempest.common.service_client.ServiceClient.put',
return_value=mocked_resp))
resp = self.client.update_quota_class_set("test")
self.assertEqual(fake_quota_class_set, resp)
self.assertEqual(expected, resp)

View File

@ -25,21 +25,24 @@ from tempest.tests import fake_auth_provider
class TestQuotasClient(base.TestCase):
FAKE_QUOTA_SET = {"injected_file_content_bytes": 10240,
"metadata_items": 128,
"server_group_members": 10,
"server_groups": 10,
"ram": 51200,
"floating_ips": 10,
"key_pairs": 100,
"id": "8421f7be61064f50b680465c07f334af",
"instances": 10,
"security_group_rules": 20,
"injected_files": 5,
"cores": 20,
"fixed_ips": -1,
"injected_file_path_bytes": 255,
"security_groups": 10}
FAKE_QUOTA_SET = {
"quota_set": {
"injected_file_content_bytes": 10240,
"metadata_items": 128,
"server_group_members": 10,
"server_groups": 10,
"ram": 51200,
"floating_ips": 10,
"key_pairs": 100,
"id": "8421f7be61064f50b680465c07f334af",
"instances": 10,
"security_group_rules": 20,
"injected_files": 5,
"cores": 20,
"fixed_ips": -1,
"injected_file_path_bytes": 255,
"security_groups": 10}
}
project_id = "8421f7be61064f50b680465c07f334af"
@ -50,7 +53,7 @@ class TestQuotasClient(base.TestCase):
fake_auth, 'compute', 'regionOne')
def _test_show_quota_set(self, bytes_body=False):
serialized_body = json.dumps({"quota_set": self.FAKE_QUOTA_SET})
serialized_body = json.dumps(self.FAKE_QUOTA_SET)
if bytes_body:
serialized_body = serialized_body.encode('utf-8')
@ -68,7 +71,7 @@ class TestQuotasClient(base.TestCase):
self._test_show_quota_set(bytes_body=True)
def _test_show_default_quota_set(self, bytes_body=False):
serialized_body = json.dumps({"quota_set": self.FAKE_QUOTA_SET})
serialized_body = json.dumps(self.FAKE_QUOTA_SET)
if bytes_body:
serialized_body = serialized_body.encode('utf-8')
@ -87,8 +90,8 @@ class TestQuotasClient(base.TestCase):
def test_update_quota_set(self):
fake_quota_set = copy.deepcopy(self.FAKE_QUOTA_SET)
fake_quota_set.pop("id")
serialized_body = json.dumps({"quota_set": fake_quota_set})
fake_quota_set['quota_set'].pop("id")
serialized_body = json.dumps(fake_quota_set)
mocked_resp = (httplib2.Response({'status': 200}), serialized_body)
self.useFixture(mockpatch.Patch(
'tempest.common.service_client.ServiceClient.put',