barbican/functionaltests/api/v1/behaviors/quota_behaviors.py
Dave McCowan 023ccbbefc Implement Models and Repositories for Resource Quotas
In the interest of smaller CRs, this CR partially implements the
quota support blueprint.  It includes code model and repository
used to store project quota information.  Unit and functional tests
are also provided to verify the implementation.

This CR also cover some small design changes, such as: the new
defaults is for unlimited quotas for all resources.

Implements: blueprint quota-support-on-barbican-resources

Change-Id: Ief79dd36fd35528c9d8586d77e01d1f9ad723f4d
2015-08-20 15:50:31 -04:00

135 lines
5.5 KiB
Python

"""
Copyright 2015 Cisco Systems
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
"""
from functionaltests.api.v1.behaviors import base_behaviors
from functionaltests.api.v1.models import quota_models
class QuotaBehaviors(base_behaviors.BaseBehaviors):
def get_quotas(self, extra_headers=None,
use_auth=True, user_name=None):
"""Handles getting quotas
: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
"""
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,
use_auth=True, user_name=None):
"""Handles getting project quotas
:param limit: limits number of returned orders (default 10)
:param offset: represents how many records to skip before retrieving
the list (default 0)
: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: 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.ProjectQuotaListModel,
params=params,
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
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):
"""Handles getting project quotas
: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
"""
resp = self.client.get(
'project-quotas/' + project_id,
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,
use_auth=True, user_name=None):
"""Handles setting project quotas
:param project_id: id of project whose quotas are to be set
: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
"""
resp = self.client.put(
'project-quotas/' + project_id,
request_model=request_model,
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
:param project_id: id of project whose quotas are to be deleted
: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
"""
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)