Merge "Disallow updating baymodel when it is referenced"

This commit is contained in:
Jenkins 2016-01-14 02:41:20 +00:00 committed by Gerrit Code Review
commit cfae69474a
2 changed files with 24 additions and 8 deletions

View File

@ -319,14 +319,13 @@ class Connection(api.Connection):
except NoResultFound:
raise exception.BayModelNotFound(baymodel=baymodel_name)
def destroy_baymodel(self, baymodel_id):
def is_baymodel_referenced(session, baymodel_uuid):
"""Checks whether the baymodel is referenced by bay(s)."""
query = model_query(models.Bay, session=session)
query = self._add_bays_filters(query,
{'baymodel_id': baymodel_uuid})
return query.count() != 0
def is_baymodel_referenced(self, session, baymodel_uuid):
"""Checks whether the baymodel is referenced by bay(s)."""
query = model_query(models.Bay, session=session)
query = self._add_bays_filters(query, {'baymodel_id': baymodel_uuid})
return query.count() != 0
def destroy_baymodel(self, baymodel_id):
session = get_session()
with session.begin():
query = model_query(models.BayModel, session=session)
@ -337,7 +336,7 @@ class Connection(api.Connection):
except NoResultFound:
raise exception.BayModelNotFound(baymodel=baymodel_id)
if is_baymodel_referenced(session, baymodel_ref['uuid']):
if self.is_baymodel_referenced(session, baymodel_ref['uuid']):
raise exception.BayModelReferenced(baymodel=baymodel_id)
query.delete()
@ -360,6 +359,9 @@ class Connection(api.Connection):
except NoResultFound:
raise exception.BayModelNotFound(baymodel=baymodel_id)
if self.is_baymodel_referenced(session, ref['uuid']):
raise exception.BayModelReferenced(baymodel=baymodel_id)
ref.update(values)
return ref

View File

@ -261,6 +261,20 @@ class TestPatch(api_base.FunctionalTest):
self.assertEqual('application/json', response.content_type)
self.assertTrue(response.json['error_message'])
def test_update_baymodel_with_bay(self):
baymodel = obj_utils.create_test_baymodel(self.context)
obj_utils.create_test_bay(self.context, baymodel_id=baymodel.uuid)
response = self.patch_json('/baymodels/%s' % baymodel.uuid,
[{'path': '/name',
'value': 'bay_model_example_B',
'op': 'replace'}],
expect_errors=True)
self.assertEqual(400, response.status_int)
self.assertEqual('application/json', response.content_type)
self.assertTrue(response.json['error_message'])
self.assertIn(baymodel.uuid, response.json['error_message'])
@mock.patch.object(magnum_policy, 'enforce')
def test_update_public_baymodel_success(self, mock_policy):
mock_policy.return_value = True