Merge "Fixed rise of Duplicate exception for DB"
This commit is contained in:
commit
9dfc2d22a6
@ -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."""
|
||||
|
@ -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):
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user