Merge "Implement Models and Repositories for Resource Quotas"

This commit is contained in:
Jenkins
2015-08-24 12:53:01 +00:00
committed by Gerrit Code Review
15 changed files with 1195 additions and 146 deletions

View File

@@ -28,10 +28,10 @@ class QuotaBehaviors(base_behaviors.BaseBehaviors):
:param user_name: The user name used for REST command
:return: a request Response object
"""
resp = self.client.get('quotas',
response_model_type=quota_models.QuotaModel,
extra_headers=extra_headers,
use_auth=use_auth, user_name=user_name)
resp = self.client.get(
'quotas', response_model_type=quota_models.QuotasResponseModel,
extra_headers=extra_headers,
use_auth=use_auth, user_name=user_name)
return resp
def get_project_quotas_list(self, limit=10, offset=0, extra_headers=None,
@@ -44,21 +44,25 @@ class QuotaBehaviors(base_behaviors.BaseBehaviors):
:param extra_headers: extra HTTP headers for the REST request
:param use_auth: Boolean for whether to send authentication headers
:param user_name: The user name used for REST command
:return: a request Response object
:return: the response, a list of project quotas and the next/prev refs
"""
params = {'limit': limit, 'offset': offset}
resp = self.client.get(
'project-quotas',
response_model_type=quota_models.ProjectQuotaModel,
response_model_type=quota_models.ProjectQuotaListModel,
params=params,
extra_headers=extra_headers,
use_auth=use_auth, user_name=user_name)
response = self.get_json(resp)
project_quotas, next_ref, prev_ref = self.client.get_list_of_models(
response, quota_models.ProjectQuotaModel)
# handle expected JSON parsing errors for unauthenticated requests
if resp.status_code == 401 and not use_auth:
return resp, None, None, None
return resp, project_quotas
project_quotas_list = self.get_json(resp)
project_quotas, next_ref, prev_ref = self.client.get_list_of_models(
project_quotas_list, quota_models.ProjectQuotaListItemModel)
return resp, project_quotas, next_ref, prev_ref
def get_project_quotas(self, project_id, extra_headers=None,
use_auth=True, user_name=None):
@@ -71,9 +75,14 @@ class QuotaBehaviors(base_behaviors.BaseBehaviors):
"""
resp = self.client.get(
'project-quotas/' + project_id,
response_model_type=quota_models.ProjectQuotaModel,
response_model_type=quota_models.ProjectQuotaOneModel,
extra_headers=extra_headers,
use_auth=use_auth, user_name=user_name)
# handle expected JSON parsing errors for unauthenticated requests
if resp.status_code == 401 and not use_auth:
return resp, None, None, None
return resp
def set_project_quotas(self, project_id, request_model, extra_headers=None,
@@ -86,15 +95,18 @@ class QuotaBehaviors(base_behaviors.BaseBehaviors):
:param user_name: The user name used for REST command
:return: a request Response object
"""
resp = self.client.post(
resp = self.client.put(
'project-quotas/' + project_id,
request_model=request_model,
response_model_type=quota_models.ProjectQuotaModel,
extra_headers=extra_headers,
use_auth=use_auth, user_name=user_name)
self.created_entities.append((project_id, user_name))
return resp
def delete_project_quotas(self, project_id, extra_headers=None,
expected_fail=False,
use_auth=True, user_name=None):
"""Handles deleting project quotas
@@ -107,4 +119,16 @@ class QuotaBehaviors(base_behaviors.BaseBehaviors):
resp = self.client.delete('project-quotas/' + project_id,
extra_headers=extra_headers,
use_auth=use_auth, user_name=user_name)
if not expected_fail:
for item in self.created_entities:
if item[0] == project_id:
self.created_entities.remove(item)
return resp
def delete_all_created_quotas(self):
"""Delete all of the project_quotas that we have created."""
entities = list(self.created_entities)
for (acl_ref, user_name) in entities:
self.delete_project_quotas(acl_ref, user_name=user_name)

View File

@@ -40,60 +40,135 @@ class QuotasTestCase(base.TestCase):
def tearDown(self):
super(QuotasTestCase, self).tearDown()
self.behaviors.delete_all_created_quotas()
def test_get_quotas(self):
"""Get quota information"""
def test_get_quotas_with_defaults(self):
"""Get effective quota information for own project"""
resp = self.behaviors.get_quotas()
self.assertEqual(200, resp.status_code)
self.assertEqual(500, resp.model.quotas['secrets'])
self.assertEqual(100, resp.model.quotas['transport_keys'])
self.assertEqual(100, resp.model.quotas['orders'])
self.assertEqual(-1, resp.model.quotas['containers'])
self.assertEqual(100, resp.model.quotas['consumers'])
self.assertEqual(-1, resp.model.quotas.secrets)
self.assertEqual(-1, resp.model.quotas.transport_keys)
self.assertEqual(-1, resp.model.quotas.orders)
self.assertEqual(-1, resp.model.quotas.containers)
self.assertEqual(-1, resp.model.quotas.consumers)
def test_get_project_quota_list(self):
"""Get list of all project quotas"""
resp, project_quotas_list = self.behaviors.get_project_quotas_list(
user_name=service_admin)
self.assertEqual(200, resp.status_code)
for project_quotas in project_quotas_list:
self.assertEqual(500, project_quotas.project_quotas['secrets'])
self.assertEqual(100,
project_quotas.project_quotas['transport_keys'])
self.assertEqual(100, project_quotas.project_quotas['orders'])
self.assertEqual(-1, project_quotas.project_quotas['containers'])
self.assertEqual(100, project_quotas.project_quotas['consumers'])
def test_get_one_project_quotas(self):
def test_get_project_quotas_by_project_id(self):
"""Get project quota information for specific project"""
resp = self.behaviors.get_project_quotas(self.project_id,
user_name=service_admin)
self.assertEqual(200, resp.status_code)
self.assertEqual(500, resp.model.project_quotas['secrets'])
self.assertEqual(100, resp.model.project_quotas['transport_keys'])
self.assertEqual(100, resp.model.project_quotas['orders'])
self.assertEqual(-1, resp.model.project_quotas['containers'])
self.assertEqual(100, resp.model.project_quotas['consumers'])
def test_set_project_quotas(self):
"""Set project quota information"""
request_model = quota_models.ProjectQuotaRequestModel(
**get_set_project_quotas_request())
resp = self.behaviors.set_project_quotas(self.project_id,
resp = self.behaviors.set_project_quotas('44444',
request_model,
user_name=service_admin)
self.assertEqual(204, resp.status_code)
resp = self.behaviors.get_project_quotas('44444',
user_name=service_admin)
self.assertEqual(200, resp.status_code)
self.assertEqual(50, resp.model.project_quotas.secrets)
self.assertIsNone(resp.model.project_quotas.transport_keys)
self.assertEqual(10, resp.model.project_quotas.orders)
self.assertEqual(20, resp.model.project_quotas.containers)
self.assertIsNone(resp.model.project_quotas.consumers)
def test_get_project_quotas_by_project_id_not_found(self):
"""Get project quota information for specific project"""
resp = self.behaviors.get_project_quotas('dummy',
user_name=service_admin)
self.assertEqual(404, resp.status_code)
def test_delete_project_quotas(self):
"""Delete project quota information"""
request_model = quota_models.ProjectQuotaRequestModel(
**get_set_project_quotas_request())
resp = self.behaviors.set_project_quotas('55555',
request_model,
user_name=service_admin)
self.assertEqual(204, resp.status_code)
resp = self.behaviors.delete_project_quotas(self.project_id,
resp = self.behaviors.delete_project_quotas('55555',
user_name=service_admin)
self.assertEqual(204, resp.status_code)
def test_delete_project_quotas_not_found(self):
"""Get project quota information"""
resp = self.behaviors.delete_project_quotas('dummy',
user_name=service_admin)
self.assertEqual(404, resp.status_code)
class ProjectQuotasPagingTestCase(base.PagingTestCase):
def setUp(self):
super(ProjectQuotasPagingTestCase, self).setUp()
self.behaviors = quota_behaviors.QuotaBehaviors(self.client)
def tearDown(self):
self.behaviors.delete_all_created_quotas()
super(ProjectQuotasPagingTestCase, self).tearDown()
def create_model(self):
request_model = quota_models.ProjectQuotaRequestModel(
**get_set_project_quotas_request())
return request_model
def create_resources(self, count=0, model=None):
for x in range(0, count):
self.behaviors.set_project_quotas(str(x), model,
user_name=service_admin)
def get_resources(self, limit=10, offset=0, filter=None):
return self.behaviors.get_project_quotas_list(
limit=limit, offset=offset, user_name=service_admin)
def set_filter_field(self, unique_str, model):
"""ProjectQuotas API does not support filter """
pass
def test_get_project_quota_list_none(self):
"""Get list of all project quotas, when there are none"""
resp, project_quotas_list, _, _ =\
self.behaviors.get_project_quotas_list(user_name=service_admin)
self.assertEqual(200, resp.status_code)
self.assertEqual([], project_quotas_list)
def test_get_project_quota_list_one(self):
"""Get list of all project quotas, when there is one"""
request_model = quota_models.ProjectQuotaRequestModel(
**get_set_project_quotas_request())
resp = self.behaviors.set_project_quotas('11111',
request_model,
user_name=service_admin)
self.assertEqual(204, resp.status_code)
resp, project_quotas_list, _, _ =\
self.behaviors.get_project_quotas_list(user_name=service_admin)
self.assertEqual(200, resp.status_code)
self.assertEqual(1, len(project_quotas_list))
def test_get_project_quota_list_two(self):
"""Get list of all project quotas, when there is one"""
request_model = quota_models.ProjectQuotaRequestModel(
**get_set_project_quotas_request())
resp = self.behaviors.set_project_quotas('22222',
request_model,
user_name=service_admin)
self.assertEqual(204, resp.status_code)
resp = self.behaviors.set_project_quotas('33333',
request_model,
user_name=service_admin)
self.assertEqual(204, resp.status_code)
resp, project_quotas_list, _, _ =\
self.behaviors.get_project_quotas_list(user_name=service_admin)
self.assertEqual(200, resp.status_code)
self.assertEqual(2, len(project_quotas_list))

View File

@@ -56,7 +56,7 @@ test_data_rbac_get_project_quotas = {
test_data_rbac_set_project_quotas = {
'with_service_admin': {'user': service_admin, 'admin': service_admin,
'expected_return': 200},
'expected_return': 204},
'with_admin_a': {'user': admin_a, 'admin': admin_a,
'expected_return': 403},
'with_creator_a': {'user': creator_a, 'admin': admin_a,
@@ -125,7 +125,7 @@ class RBACQuotasTestCase(base.TestCase):
:param admin: the admin of the group owning quotas
:param expected_return: the expected http return code
"""
resp, _ = self.behaviors.get_project_quotas_list(user_name=user)
resp, _, _, _ = self.behaviors.get_project_quotas_list(user_name=user)
self.assertEqual(expected_return, resp.status_code)
@utils.parameterized_dataset(test_data_rbac_set_project_quotas)

View File

@@ -17,19 +17,28 @@ limitations under the License.
from functionaltests.api.v1.models.base_models import BaseModel
class QuotaModel(BaseModel):
class QuotasModel(BaseModel):
def __init__(self, secrets=None, orders=None, containers=None,
transport_keys=None, consumers=None):
super(QuotasModel, self).__init__()
self.secrets = secrets
self.orders = orders
self.containers = containers
self.transport_keys = transport_keys
self.consumers = consumers
class QuotasResponseModel(BaseModel):
def __init__(self, quotas=None):
super(QuotaModel, self).__init__()
super(QuotasResponseModel, self).__init__()
self.quotas = quotas
class ProjectQuotaModel(BaseModel):
def __init__(self, project_quotas=None, project_id=None):
super(ProjectQuotaModel, self).__init__()
self.project_quotas = project_quotas
self.project_id = project_id
@classmethod
def dict_to_obj(cls, input_dict):
quotas = QuotasModel(**input_dict.get('quotas'))
return cls(quotas=quotas)
class ProjectQuotaRequestModel(BaseModel):
@@ -37,3 +46,37 @@ class ProjectQuotaRequestModel(BaseModel):
def __init__(self, project_quotas=None):
super(ProjectQuotaRequestModel, self).__init__()
self.project_quotas = project_quotas
@classmethod
def dict_to_obj(cls, input_dict):
project_quotas = QuotasModel(**input_dict.get('project_quotas'))
return cls(project_quotas=project_quotas)
class ProjectQuotaOneModel(BaseModel):
def __init__(self, project_quotas=None):
super(ProjectQuotaOneModel, self).__init__()
self.project_quotas = QuotasModel(**project_quotas)
class ProjectQuotaListItemModel(BaseModel):
def __init__(self, project_id=None, project_quotas=None):
super(ProjectQuotaListItemModel, self).__init__()
self.project_id = project_id
self.project_quotas = QuotasModel(**project_quotas)
class ProjectQuotaListModel(BaseModel):
def __init__(self, project_quotas=None):
super(ProjectQuotaListModel, self).__init__()
self.project_quotas = project_quotas
@classmethod
def dict_to_obj(cls, input_dict):
project_quotas = [ProjectQuotaListItemModel(**project_quotas_item)
for project_quotas_item in
input_dict.get('project_quotas', [])]
return cls(project_quotas=project_quotas)

View File

@@ -35,8 +35,9 @@ retval=$?
testr slowest
# run the tests in parallel
SKIP=^\(\?\!\.\*ProjectQuotasPagingTestCase\)
testr init
testr run --parallel --subunit | subunit-trace --no-failure-debug -f
testr run $SKIP --parallel --subunit | subunit-trace --no-failure-debug -f
retval=$?
testr slowest