Merge "Fixed rise of Duplicate exception for DB"

This commit is contained in:
Jenkins 2014-04-29 06:12:33 +00:00 committed by Gerrit Code Review
commit 9dfc2d22a6
4 changed files with 22 additions and 11 deletions

View File

@ -54,14 +54,20 @@ class ManilaBase(object):
"""Save this object."""
if not session:
session = get_session()
session.add(self)
try:
session.flush()
except IntegrityError, e:
if str(e).endswith('is not unique'):
raise exception.Duplicate(str(e))
else:
raise
# NOTE(boris-42): This part of code should be look like:
# sesssion.add(self)
# session.flush()
# But there is a bug in sqlalchemy and eventlet that
# raises NoneType exception if there is no running
# transaction and rollback is called. As long as
# sqlalchemy has this bug we have to create transaction
# explicity.
with session.begin(subtransactions=True):
try:
session.add(self)
session.flush()
except IntegrityError as e:
raise exception.Duplicate(message=str(e))
def delete(self, session=None):
"""Delete this object."""

View File

@ -25,6 +25,7 @@ SHOULD include dedicated exception logging.
"""
from oslo.config import cfg
from sqlalchemy import exc as sqa_exc
import webob.exc
@ -86,6 +87,10 @@ def wrap_db_error(f):
return f(*args, **kwargs)
except UnicodeEncodeError:
raise InvalidUnicodeParameter()
except sqa_exc.IntegrityError as e:
raise Duplicate(message=str(e))
except Duplicate:
raise
except Exception, e:
LOG.exception(_('DB exception wrapped.'))
raise DBError(e)
@ -328,7 +333,7 @@ class NotAllowed(ManilaException):
#TODO(bcwaldon): EOL this exception!
class Duplicate(ManilaException):
pass
message = _("Duplicate entry: %(message)s")
class KeyPairExists(Duplicate):

View File

@ -56,7 +56,7 @@ class SecurityServiceDBTest(test.TestCase):
db_api.security_service_create(self.fake_context,
security_service_dict)
self.assertRaises(exception.DBError,
self.assertRaises(exception.Duplicate,
db_api.security_service_create,
self.fake_context,
security_service_dict)

View File

@ -86,7 +86,7 @@ class ShareNetworkDBTest(test.TestCase):
def test_create_with_duplicated_id(self):
db_api.share_network_create(self.fake_context, self.share_nw_dict)
self.assertRaises(exception.DBError,
self.assertRaises(exception.Duplicate,
db_api.share_network_create,
self.fake_context,
self.share_nw_dict)