Smaller Quota changes ignore change history

Update the quota logic to ignore change history
if the current change in quota is downward.

Change-Id: Iacbab882c3031db3d126a15dfb42c3cc8baa713e
Fixes-Bug: 1746137
This commit is contained in:
Adrian Turjak 2018-02-12 17:18:58 +13:00
parent 2cf6791eba
commit 7ccc5b28fa
3 changed files with 77 additions and 9 deletions

View File

@ -288,6 +288,7 @@ class UpdateProjectQuotasAction(BaseAction, QuotaMixin):
cancelled__exact=False,
project_id__exact=self.project_id)
changed_in_period = False
# Check to see if there have been any updates in the relavent regions
# recently
for task in task_list:
@ -295,10 +296,7 @@ class UpdateProjectQuotasAction(BaseAction, QuotaMixin):
intersect = set(action.action_data[
'regions']).intersection(self.regions)
if intersect:
self.add_note(
"Quota has already been updated within the auto "
"approve time limit.")
return False
changed_in_period = True
region_sizes = []
@ -315,17 +313,33 @@ class UpdateProjectQuotasAction(BaseAction, QuotaMixin):
# Check for preapproved_quotas
preapproved_quotas = []
smaller_quotas = []
# If all region sizes are the same
if region_sizes.count(region_sizes[0]) == len(region_sizes):
preapproved_quotas = quota_manager.get_quota_change_options(
region_sizes[0])
smaller_quotas = quota_manager.get_smaller_quota_options(
region_sizes[0])
if self.size in smaller_quotas:
self.add_note(
"Quota size '%s' is in list of smaller quotas: %s" %
(self.size, smaller_quotas))
return True
if changed_in_period:
self.add_note(
"Quota has already been updated within the auto "
"approve time limit.")
return False
if self.size not in preapproved_quotas:
self.add_note(
"Quota size '%s' not in preapproved list: %s" %
(self.size, preapproved_quotas))
return False
self.add_note(
"Quota size '%s' in preapproved list: %s" %
(self.size, preapproved_quotas))

View File

@ -533,7 +533,7 @@ class QuotaAPITests(APITestCase):
# Then check to see the quotas have changed
self.check_quota_cache('RegionOne', project.id, 'medium')
data = {'size': 'small',
data = {'size': 'large',
'regions': ['RegionOne']}
response = self.client.post(url, data,
headers=admin_headers, format='json')
@ -564,7 +564,51 @@ class QuotaAPITests(APITestCase):
{'notes': ['Task completed successfully.']}
)
# Quotas should have changed to small
# Quotas should have changed to large
self.check_quota_cache('RegionOne', project.id, 'large')
def test_update_quota_history_smaller(self):
"""
Update quota to a smaller quota right after a change to a larger
quota. Should auto approve to smaller quotas regardless of history.
"""
project = fake_clients.FakeProject(
name="test_project", id='test_project_id')
user = fake_clients.FakeUser(
name="test@example.com", password="123", email="test@example.com")
setup_identity_cache(projects=[project], users=[user])
admin_headers = {
'project_name': "test_project",
'project_id': project.id,
'roles': "project_admin,_member_,project_mod",
'username': "test@example.com",
'user_id': "user_id",
'authenticated': True
}
url = "/v1/openstack/quotas/"
data = {'size': 'medium',
'regions': ['RegionOne']}
response = self.client.post(url, data,
headers=admin_headers, format='json')
# First check we can actually access the page correctly
self.assertEqual(response.status_code, status.HTTP_200_OK)
# Then check to see the quotas have changed
self.check_quota_cache('RegionOne', project.id, 'medium')
data = {'size': 'small',
'regions': ['RegionOne']}
response = self.client.post(url, data,
headers=admin_headers, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
# Then check to see the quotas have changed
self.check_quota_cache('RegionOne', project.id, 'small')
def test_update_quota_old_history(self):
@ -953,7 +997,7 @@ class QuotaAPITests(APITestCase):
self.check_quota_cache('RegionTwo', project.id, 'medium')
data = {'size': 'small'}
data = {'size': 'large'}
response = self.client.post(url, data, headers=headers, format='json')
self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED)
@ -983,9 +1027,9 @@ class QuotaAPITests(APITestCase):
{'notes': ['Task completed successfully.']}
)
self.check_quota_cache('RegionOne', project.id, 'small')
self.check_quota_cache('RegionOne', project.id, 'large')
self.check_quota_cache('RegionTwo', project.id, 'small')
self.check_quota_cache('RegionTwo', project.id, 'large')
def test_set_multi_quota_single_history(self):
"""

View File

@ -214,6 +214,16 @@ class QuotaManager(object):
return quota_change_list
def get_smaller_quota_options(self, quota_size):
""" Get the quota sizes smaller than the current size."""
quota_list = settings.QUOTA_SIZES_ASC
try:
list_position = quota_list.index(quota_size)
except ValueError:
return []
return quota_list[:list_position]
def get_region_quota_data(self, region_id):
current_quota = self.get_current_region_quota(region_id)
current_quota_size = self.get_quota_size(current_quota)