Merge "Implement Models and Repositories for Resource Quotas"
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user