Do not return all the limits for POST request.

During Rocky PTG, We decided that the create apis for
registered limit and project limit should not return all
the limits.

They should only return the ones in the request body.

Change-Id: I26c37198861735bf85eb79570f192c71c7dd9941
Partial-Bug: #1754184
This commit is contained in:
wangxiyuan 2018-03-08 15:41:50 +08:00
parent ec338a3374
commit 6ec45b127d
5 changed files with 89 additions and 28 deletions

View File

@ -39,7 +39,7 @@ class UnifiedLimitDriverBase(object):
:param registered_limits: a list of dictionaries representing limits to
create.
:returns: all the registered limits.
:returns: all the newly created registered limits.
:raises keystone.exception.Conflict: If a duplicate registered limit
exists.
@ -106,7 +106,7 @@ class UnifiedLimitDriverBase(object):
:param limits: a list of dictionaries representing limits to create.
:returns: all the limits.
:returns: all the newly created limits.
:raises keystone.exception.Conflict: If a duplicate limit exists.
:raises keystone.exception.NoLimitReference: If no reference registered
limit exists.

View File

@ -135,11 +135,14 @@ class UnifiedLimit(base.UnifiedLimitDriverBase):
@sql.handle_conflicts(conflict_type='registered_limit')
def create_registered_limits(self, registered_limits):
with sql.session_for_write() as session:
new_registered_limits = []
for registered_limit in registered_limits:
if registered_limit.get('region_id') is None:
self._check_unified_limit_without_region(registered_limit)
ref = RegisteredLimitModel.from_dict(registered_limit)
session.add(ref)
new_registered_limits.append(ref.to_dict())
return new_registered_limits
@sql.handle_conflicts(conflict_type='registered_limit')
def update_registered_limits(self, registered_limits):
@ -206,12 +209,15 @@ class UnifiedLimit(base.UnifiedLimitDriverBase):
def create_limits(self, limits):
try:
with sql.session_for_write() as session:
new_limits = []
for limit in limits:
if limit.get('region_id') is None:
self._check_unified_limit_without_region(
limit, is_registered_limit=False)
ref = LimitModel.from_dict(limit)
session.add(ref)
new_limits.append(ref.to_dict())
return new_limits
except db_exception.DBReferenceError:
raise exception.NoLimitReference()

View File

@ -59,8 +59,7 @@ class Manager(manager.Manager):
def create_registered_limits(self, registered_limits):
for registered_limit in registered_limits:
self._assert_resource_exist(registered_limit, 'registered_limit')
self.driver.create_registered_limits(registered_limits)
return self.list_registered_limits()
return self.driver.create_registered_limits(registered_limits)
def update_registered_limits(self, registered_limits):
for registered_limit in registered_limits:
@ -86,8 +85,7 @@ class Manager(manager.Manager):
def create_limits(self, limits):
for limit in limits:
self._assert_resource_exist(limit, 'limit')
self.driver.create_limits(limits)
return self.list_limits()
return self.driver.create_limits(limits)
def update_limits(self, limits):
for limit in limits:

View File

@ -24,28 +24,32 @@ PROVIDERS = provider_api.ProviderAPIs
class RegisteredLimitTests(object):
def test_create_registered_limit_crud(self):
# create one, return all registered_limits
# create one, return it.
registered_limit_1 = unit.new_registered_limit_ref(
service_id=self.service_one['id'],
region_id=self.region_one['id'],
resource_name='volume', default_limit=10, id=uuid.uuid4().hex)
res1 = PROVIDERS.unified_limit_api.create_registered_limits(
reg_limits = PROVIDERS.unified_limit_api.create_registered_limits(
[registered_limit_1])
self.assertDictEqual(registered_limit_1, res1[0])
self.assertDictEqual(registered_limit_1, reg_limits[0])
# create another, return all registered_limits
# create another two, return them.
registered_limit_2 = unit.new_registered_limit_ref(
service_id=self.service_one['id'],
region_id=self.region_one['id'],
resource_name='snapshot', default_limit=5, id=uuid.uuid4().hex)
res2 = PROVIDERS.unified_limit_api.create_registered_limits(
[registered_limit_2])
self.assertEqual(2, len(res2))
for re in res2:
if re['id'] == registered_limit_1['id']:
self.assertDictEqual(registered_limit_1, re)
if re['id'] == registered_limit_2['id']:
self.assertDictEqual(registered_limit_2, re)
registered_limit_3 = unit.new_registered_limit_ref(
service_id=self.service_one['id'],
region_id=self.region_one['id'],
resource_name='backup', default_limit=5, id=uuid.uuid4().hex)
reg_limits = PROVIDERS.unified_limit_api.create_registered_limits(
[registered_limit_2, registered_limit_3])
self.assertEqual(2, len(reg_limits))
for reg_limit in reg_limits:
if reg_limit['id'] == registered_limit_2['id']:
self.assertDictEqual(registered_limit_2, reg_limit)
if reg_limit['id'] == registered_limit_3['id']:
self.assertDictEqual(registered_limit_3, reg_limit)
def test_create_registered_limit_duplicate(self):
registered_limit_1 = unit.new_registered_limit_ref(
@ -371,27 +375,33 @@ class RegisteredLimitTests(object):
class LimitTests(object):
def test_create_limit(self):
# create one, return all limits
# create one, return it.
limit_1 = unit.new_limit_ref(
project_id=self.tenant_bar['id'],
service_id=self.service_one['id'],
region_id=self.region_one['id'],
resource_name='volume', resource_limit=10, id=uuid.uuid4().hex)
res1 = PROVIDERS.unified_limit_api.create_limits([limit_1])
self.assertDictEqual(limit_1, res1[0])
limits = PROVIDERS.unified_limit_api.create_limits([limit_1])
self.assertDictEqual(limit_1, limits[0])
# create another, return all limits
# create another two, return them.
limit_2 = unit.new_limit_ref(
project_id=self.tenant_bar['id'],
service_id=self.service_one['id'],
region_id=self.region_two['id'],
resource_name='snapshot', resource_limit=5, id=uuid.uuid4().hex)
res2 = PROVIDERS.unified_limit_api.create_limits([limit_2])
for re in res2:
if re['id'] == limit_1['id']:
self.assertDictEqual(limit_1, re)
if re['id'] == limit_2['id']:
self.assertDictEqual(limit_2, re)
limit_3 = unit.new_limit_ref(
project_id=self.tenant_bar['id'],
service_id=self.service_one['id'],
region_id=self.region_two['id'],
resource_name='backup', resource_limit=5, id=uuid.uuid4().hex)
limits = PROVIDERS.unified_limit_api.create_limits([limit_2, limit_3])
for limit in limits:
if limit['id'] == limit_2['id']:
self.assertDictEqual(limit_2, limit)
if limit['id'] == limit_3['id']:
self.assertDictEqual(limit_3, limit)
def test_create_limit_duplicate(self):
limit_1 = unit.new_limit_ref(

View File

@ -84,6 +84,26 @@ class RegisteredLimitsTestCase(test_v3.RestfulTestCase):
self.assertEqual(registered_limits[0]['region_id'], ref1['region_id'])
self.assertIsNone(registered_limits[1].get('region_id'))
def test_create_registered_limit_return_count(self):
ref1 = unit.new_registered_limit_ref(service_id=self.service_id,
region_id=self.region_id)
r = self.post(
'/registered_limits',
body={'registered_limits': [ref1]},
expected_status=http_client.CREATED)
registered_limits = r.result['registered_limits']
self.assertEqual(1, len(registered_limits))
ref2 = unit.new_registered_limit_ref(service_id=self.service_id2,
region_id=self.region_id2)
ref3 = unit.new_registered_limit_ref(service_id=self.service_id2)
r = self.post(
'/registered_limits',
body={'registered_limits': [ref2, ref3]},
expected_status=http_client.CREATED)
registered_limits = r.result['registered_limits']
self.assertEqual(2, len(registered_limits))
def test_create_registered_limit_with_invalid_input(self):
ref1 = unit.new_registered_limit_ref()
ref2 = unit.new_registered_limit_ref(default_limit='not_int')
@ -438,6 +458,33 @@ class LimitsTestCase(test_v3.RestfulTestCase):
self.assertEqual(limits[0]['region_id'], ref1['region_id'])
self.assertIsNone(limits[1].get('region_id'))
def test_create_limit_return_count(self):
ref1 = unit.new_limit_ref(project_id=self.project_id,
service_id=self.service_id,
region_id=self.region_id,
resource_name='volume')
r = self.post(
'/limits',
body={'limits': [ref1]},
expected_status=http_client.CREATED)
limits = r.result['limits']
self.assertEqual(1, len(limits))
ref2 = unit.new_limit_ref(project_id=self.project_id,
service_id=self.service_id,
region_id=self.region_id,
resource_name='snapshot')
ref3 = unit.new_limit_ref(project_id=self.project_id,
service_id=self.service_id,
region_id=self.region_id,
resource_name='backup')
r = self.post(
'/limits',
body={'limits': [ref2, ref3]},
expected_status=http_client.CREATED)
limits = r.result['limits']
self.assertEqual(2, len(limits))
def test_create_limit_with_invalid_input(self):
ref1 = unit.new_limit_ref(project_id=self.project_id,
resource_limit='not_int')