Allow registered limit's region_id to be None

Region_id in registered limit is optional, so we should allow
updating its region_id to None as well.

Closes-bug: #1798716
Change-Id: Ia59950376e958aaa19973d3bc97180727f5e5326
This commit is contained in:
wangxiyuan 2018-10-16 14:39:45 +08:00
parent c1e57e57cc
commit 8e9de8a515
3 changed files with 50 additions and 2 deletions

View File

@ -212,7 +212,7 @@ class UnifiedLimit(base.UnifiedLimitDriverBase):
old_dict = ref.to_dict()
old_dict.update(registered_limit)
if (registered_limit.get('service_id') or
registered_limit.get('region_id') or
'region_id' in registered_limit or
registered_limit.get('resource_name')):
self._check_unified_limit_unique(old_dict)
new_registered_limit = RegisteredLimitModel.from_dict(

View File

@ -18,7 +18,7 @@ from keystone.common.validation import parameter_types
_registered_limit_properties = {
'service_id': parameter_types.id_string,
'region_id': {
'type': 'string'
'type': ['null', 'string']
},
'resource_name': {
'type': 'string'

View File

@ -280,6 +280,54 @@ class RegisteredLimitsTestCase(test_v3.RestfulTestCase):
new_registered_limits = r.result['registered_limit']
self.assertEqual(new_registered_limits['description'], '')
def test_update_registered_limit_region_id_to_none(self):
ref = unit.new_registered_limit_ref(service_id=self.service_id,
region_id=self.region_id,
resource_name='volume',
default_limit=10)
r = self.post(
'/registered_limits',
body={'registered_limits': [ref]},
expected_status=http_client.CREATED)
update_ref = {
'region_id': None
}
registered_limit_id = r.result['registered_limits'][0]['id']
r = self.patch(
'/registered_limits/%s' % registered_limit_id,
body={'registered_limit': update_ref},
expected_status=http_client.OK)
self.assertIsNone(r.result['registered_limit']['region_id'])
def test_update_registered_limit_region_id_to_none_conflict(self):
ref1 = unit.new_registered_limit_ref(service_id=self.service_id,
resource_name='volume',
default_limit=10)
ref2 = unit.new_registered_limit_ref(service_id=self.service_id,
region_id=self.region_id,
resource_name='volume',
default_limit=10)
self.post(
'/registered_limits',
body={'registered_limits': [ref1]},
expected_status=http_client.CREATED)
r = self.post(
'/registered_limits',
body={'registered_limits': [ref2]},
expected_status=http_client.CREATED)
update_ref = {
'region_id': None
}
registered_limit_id = r.result['registered_limits'][0]['id']
# There is a registered limit with "service_id=self.service_id,
# region_id=None" already. So update ref2's region_id to None will
# raise 409 Conflict Error.
self.patch(
'/registered_limits/%s' % registered_limit_id,
body={'registered_limit': update_ref},
expected_status=http_client.CONFLICT)
def test_update_registered_limit_not_found(self):
update_ref = {
'service_id': self.service_id,