Merge "db: Remove explicit autocommit"
This commit is contained in:
commit
88bb1568fc
File diff suppressed because it is too large
Load Diff
|
@ -279,25 +279,24 @@ def delete_cascade(context, name, session):
|
|||
"""Raise if not found, has references or not visible"""
|
||||
|
||||
namespace_rec = _get_by_name(context, name, session)
|
||||
with session.begin():
|
||||
try:
|
||||
metadef_api.tag.delete_namespace_content(
|
||||
context, namespace_rec.id, session)
|
||||
metadef_api.object.delete_namespace_content(
|
||||
context, namespace_rec.id, session)
|
||||
metadef_api.property.delete_namespace_content(
|
||||
context, namespace_rec.id, session)
|
||||
metadef_api.resource_type_association.delete_namespace_content(
|
||||
context, namespace_rec.id, session)
|
||||
session.delete(namespace_rec)
|
||||
session.flush()
|
||||
except db_exc.DBError as e:
|
||||
if isinstance(e.inner_exception, sa_exc.IntegrityError):
|
||||
LOG.debug("Metadata definition namespace=%s not deleted. "
|
||||
"Other records still refer to it.", name)
|
||||
raise exc.MetadefIntegrityError(
|
||||
record_type='namespace', record_name=name)
|
||||
else:
|
||||
raise
|
||||
try:
|
||||
metadef_api.tag.delete_namespace_content(
|
||||
context, namespace_rec.id, session)
|
||||
metadef_api.object.delete_namespace_content(
|
||||
context, namespace_rec.id, session)
|
||||
metadef_api.property.delete_namespace_content(
|
||||
context, namespace_rec.id, session)
|
||||
metadef_api.resource_type_association.delete_namespace_content(
|
||||
context, namespace_rec.id, session)
|
||||
session.delete(namespace_rec)
|
||||
session.flush()
|
||||
except db_exc.DBError as e:
|
||||
if isinstance(e.inner_exception, sa_exc.IntegrityError):
|
||||
LOG.debug("Metadata definition namespace=%s not deleted. "
|
||||
"Other records still refer to it.", name)
|
||||
raise exc.MetadefIntegrityError(
|
||||
record_type='namespace', record_name=name)
|
||||
else:
|
||||
raise
|
||||
|
||||
return namespace_rec.to_dict()
|
||||
|
|
|
@ -118,19 +118,18 @@ def create_tags(context, namespace_name, tag_list, can_append, session):
|
|||
namespace = namespace_api.get(context, namespace_name, session)
|
||||
|
||||
try:
|
||||
with session.begin():
|
||||
if not can_append:
|
||||
query = (session.query(models.MetadefTag).filter_by(
|
||||
namespace_id=namespace['id']))
|
||||
query.delete(synchronize_session='fetch')
|
||||
for value in tag_list:
|
||||
value.update({'namespace_id': namespace['id']})
|
||||
metadef_utils.drop_protected_attrs(
|
||||
models.MetadefTag, value)
|
||||
metadef_tag = models.MetadefTag()
|
||||
metadef_tag.update(value.copy())
|
||||
metadef_tag.save(session=session)
|
||||
metadef_tags_list.append(metadef_tag.to_dict())
|
||||
if not can_append:
|
||||
query = (session.query(models.MetadefTag).filter_by(
|
||||
namespace_id=namespace['id']))
|
||||
query.delete(synchronize_session='fetch')
|
||||
for value in tag_list:
|
||||
value.update({'namespace_id': namespace['id']})
|
||||
metadef_utils.drop_protected_attrs(
|
||||
models.MetadefTag, value)
|
||||
metadef_tag = models.MetadefTag()
|
||||
metadef_tag.update(value.copy())
|
||||
metadef_tag.save(session=session)
|
||||
metadef_tags_list.append(metadef_tag.to_dict())
|
||||
except db_exc.DBDuplicateEntry:
|
||||
LOG.debug("A metadata tag name=%(name)s"
|
||||
" in namespace=%(namespace_name)s already exists.",
|
||||
|
|
|
@ -2160,7 +2160,8 @@ class DBPurgeTests(test_utils.BaseTestCase):
|
|||
|
||||
# Verify that no records from images have been deleted
|
||||
# due to DBReferenceError being raised
|
||||
images_rows = session.query(images).count()
|
||||
with session.begin():
|
||||
images_rows = session.query(images).count()
|
||||
self.assertEqual(4, images_rows)
|
||||
|
||||
def test_purge_task_info_with_refs_to_soft_deleted_tasks(self):
|
||||
|
@ -2172,7 +2173,8 @@ class DBPurgeTests(test_utils.BaseTestCase):
|
|||
self.assertEqual(3, len(tasks))
|
||||
|
||||
task_info = sqlalchemyutils.get_table(engine, 'task_info')
|
||||
task_info_rows = session.query(task_info).count()
|
||||
with session.begin():
|
||||
task_info_rows = session.query(task_info).count()
|
||||
self.assertEqual(3, task_info_rows)
|
||||
|
||||
# purge soft deleted rows older than yesterday
|
||||
|
@ -2183,7 +2185,8 @@ class DBPurgeTests(test_utils.BaseTestCase):
|
|||
self.assertEqual(2, len(tasks))
|
||||
|
||||
# and no task_info was left behind, 1 row purged
|
||||
task_info_rows = session.query(task_info).count()
|
||||
with session.begin():
|
||||
task_info_rows = session.query(task_info).count()
|
||||
self.assertEqual(2, task_info_rows)
|
||||
|
||||
|
||||
|
|
|
@ -58,7 +58,7 @@ class TestSqlAlchemyDriver(base.TestDriver,
|
|||
|
||||
def test_get_image_with_invalid_long_image_id(self):
|
||||
image_id = '343f9ba5-0197-41be-9543-16bbb32e12aa-xxxxxx'
|
||||
self.assertRaises(exception.NotFound, self.db_api._image_get,
|
||||
self.assertRaises(exception.NotFound, self.db_api.image_get,
|
||||
self.context, image_id)
|
||||
|
||||
def test_image_tag_delete_with_invalid_long_image_id(self):
|
||||
|
|
|
@ -956,7 +956,7 @@ class RetryOnDeadlockTestCase(test_utils.BaseTestCase):
|
|||
sess.side_effect = _mock_get_session()
|
||||
|
||||
try:
|
||||
api._image_update(None, {}, 'fake-id')
|
||||
api.image_update(None, 'fake-id', {})
|
||||
except TestException:
|
||||
self.assertEqual(3, sess.call_count)
|
||||
|
||||
|
@ -973,17 +973,19 @@ class RetryOnDeadlockTestCase(test_utils.BaseTestCase):
|
|||
|
||||
class TestImageDeleteRace(test_utils.BaseTestCase):
|
||||
|
||||
@mock.patch.object(api, 'get_session')
|
||||
@mock.patch.object(api, 'LOG')
|
||||
def test_image_property_delete_stale_data(self, mock_LOG):
|
||||
def test_image_property_delete_stale_data(
|
||||
self, mock_LOG, mock_get_session,
|
||||
):
|
||||
mock_context = mock.MagicMock()
|
||||
mock_session = mock.MagicMock()
|
||||
mock_session = mock_get_session.return_value
|
||||
mock_result = (mock_session.query.return_value.
|
||||
filter_by.return_value.
|
||||
one.return_value)
|
||||
mock_result.delete.side_effect = sa_orm.exc.StaleDataError('myerror')
|
||||
# StaleDataError should not be raised
|
||||
r = api.image_property_delete(mock_context, 'myprop', 'myimage',
|
||||
session=mock_session)
|
||||
r = api.image_property_delete(mock_context, 'myprop', 'myimage')
|
||||
# We should not get the property back
|
||||
self.assertIsNone(r)
|
||||
# Make sure we logged it
|
||||
|
@ -993,9 +995,10 @@ class TestImageDeleteRace(test_utils.BaseTestCase):
|
|||
'%(err)s', {'prop': 'myprop', 'image': 'myimage',
|
||||
'err': 'myerror'})
|
||||
|
||||
def test_image_property_delete_exception(self):
|
||||
@mock.patch.object(api, 'get_session')
|
||||
def test_image_property_delete_exception(self, mock_get_session):
|
||||
mock_context = mock.MagicMock()
|
||||
mock_session = mock.MagicMock()
|
||||
mock_session = mock_get_session.return_value
|
||||
mock_result = (mock_session.query.return_value.
|
||||
filter_by.return_value.
|
||||
one.return_value)
|
||||
|
@ -1003,5 +1006,4 @@ class TestImageDeleteRace(test_utils.BaseTestCase):
|
|||
# Any other exception should be raised
|
||||
self.assertRaises(RuntimeError,
|
||||
api.image_property_delete,
|
||||
mock_context, 'myprop', 'myimage',
|
||||
session=mock_session)
|
||||
mock_context, 'myprop', 'myimage')
|
||||
|
|
Loading…
Reference in New Issue