oslo.db/oslo_db
Victor Stinner 2e79681670 Fix sqlalchemy.ModelBase.__contains__() behaviour
Currently, sqlalchemy.ModelBase.__contains__() catches any exception,
and by doing that, it hides real bugs. For example, a Nova unit test
raises the following error, but __contains__() simply returns False:

    sqlalchemy.orm.exc.DetachedInstanceError: Parent instance
    <InstanceExtra at 0x7fea635bc5f8> is not bound to a Session;
    deferred load operation of attribute 'pci_requests' cannot proceed

On Python 3, hasattr() calls getattr(): it returns True if getattr()
succeeds, False if getattr() raises an AttributeError, or passes
through the exception, if getattr() failed for a different reason.

On Python 2, hasattr() also calls getattr(), but it catches *any*
exception.

This change replaces hasattr() with getattr(), and it only catches
AttributeError as Python 3, so passes through sqlalchemy exceptions.

Add an unit test to test the new behaviour.

Closes-Bug: #1469225

Change-Id: If9c3ccc03f1dc9746936b0b83ea132508491e577
2015-06-26 19:02:53 +03:00
..
sqlalchemy Fix sqlalchemy.ModelBase.__contains__() behaviour 2015-06-26 19:02:53 +03:00
tests Fix sqlalchemy.ModelBase.__contains__() behaviour 2015-06-26 19:02:53 +03:00
__init__.py Move files out of the namespace package 2014-12-24 13:28:48 +02:00
_i18n.py Switch to non-namespaced module import - oslo_i18n 2015-03-12 06:44:10 -04:00
api.py Allow additional exceptions in wrap_db_retry 2015-06-25 11:36:35 -07:00
concurrency.py Update Oslo imports to remove namespace package 2015-01-21 18:23:56 -05:00
exception.py Implement new oslo.db.sqlalchemy.enginefacade module 2015-06-04 11:43:39 -04:00
options.py Merge "Retry query if db deadlock error is received" 2015-01-27 15:33:15 +00:00