Esempio n. 1
0
 def __init__(self):
     super(RevisionPlugin, self).__init__()
     # background on these event hooks:
     # https://docs.sqlalchemy.org/en/latest/orm/session_events.html
     db_api.sqla_listen(se.Session, 'before_flush', self.bump_revisions)
     db_api.sqla_listen(se.Session, "after_flush_postexec",
                        self._emit_related_revision_bumps)
     db_api.sqla_listen(se.Session, 'after_commit',
                        self._clear_rev_bumped_flags)
     db_api.sqla_listen(se.Session, 'after_rollback',
                        self._clear_rev_bumped_flags)
Esempio n. 2
0
 def __init__(self):
     super(RevisionPlugin, self).__init__()
     # background on these event hooks:
     # https://docs.sqlalchemy.org/en/latest/orm/session_events.html
     db_api.sqla_listen(se.Session, 'before_flush', self.bump_revisions)
     db_api.sqla_listen(
         se.Session, "after_flush_postexec",
         self._emit_related_revision_bumps)
     db_api.sqla_listen(se.Session, 'after_commit',
                        self._clear_rev_bumped_flags)
     db_api.sqla_listen(se.Session, 'after_rollback',
                        self._clear_rev_bumped_flags)
Esempio n. 3
0
    def test_constrained_port_update_handles_db_retries(self):
        # here we ensure all of the constraint handling logic persists
        # on retriable failures to commit caused by races with another
        # update
        with self.port() as port:
            rev = port['port']['revision_number']
            new = {'port': {'name': 'nigiri'}}

            def concurrent_increment(s):
                db_api.sqla_remove(se.Session, 'before_commit',
                                   concurrent_increment)
                # slip in a concurrent update that will bump the revision
                plugin = directory.get_plugin()
                plugin.update_port(nctx.get_admin_context(),
                                   port['port']['id'], new)
                raise db_exc.DBDeadlock()
            db_api.sqla_listen(se.Session, 'before_commit',
                               concurrent_increment)
            self._update('ports', port['port']['id'], new,
                         headers={'If-Match': 'revision_number=%s' % rev},
                         expected_code=exc.HTTPPreconditionFailed.code)
Esempio n. 4
0
    def test_constrained_port_update_handles_db_retries(self):
        # here we ensure all of the constraint handling logic persists
        # on retriable failures to commit caused by races with another
        # update
        with self.port() as port:
            rev = port['port']['revision_number']
            new = {'port': {'name': 'nigiri'}}

            def concurrent_increment(s):
                db_api.sqla_remove(se.Session, 'before_commit',
                                   concurrent_increment)
                # slip in a concurrent update that will bump the revision
                plugin = directory.get_plugin()
                plugin.update_port(nctx.get_admin_context(),
                                   port['port']['id'], new)
                raise db_exc.DBDeadlock()
            db_api.sqla_listen(se.Session, 'before_commit',
                               concurrent_increment)
            self._update('ports', port['port']['id'], new,
                         headers={'If-Match': 'revision_number=%s' % rev},
                         expected_code=exc.HTTPPreconditionFailed.code)
Esempio n. 5
0
 def __init__(self):
     super(RevisionPlugin, self).__init__()
     db_api.sqla_listen(se.Session, 'before_flush', self.bump_revisions)
     db_api.sqla_listen(se.Session, 'after_commit',
                        self._clear_rev_bumped_flags)
     db_api.sqla_listen(se.Session, 'after_rollback',
                        self._clear_rev_bumped_flags)
Esempio n. 6
0
 def __init__(self):
     super(RevisionPlugin, self).__init__()
     db_api.sqla_listen(se.Session, 'before_flush', self.bump_revisions)
     db_api.sqla_listen(se.Session, 'after_commit',
                        self._clear_rev_bumped_flags)
     db_api.sqla_listen(se.Session, 'after_rollback',
                        self._clear_rev_bumped_flags)
Esempio n. 7
0
 def __init__(self):
     super(LokiPlugin, self).__init__()
     db_api.sqla_listen(se.Session, 'before_flush', self.random_deadlock)
     db_api.sqla_listen(se.Session, 'loaded_as_persistent',
                        self.random_delay)
Esempio n. 8
0
# compliance to SQLAlchemy 2.0.
def do_orm_execute(orm_execute_state):
    if not orm_execute_state.session.in_transaction():
        trace_string = '\n'.join(traceback.format_stack(sys._getframe(1)))
        LOG.warning(
            'ORM session: SQL execution without transaction in '
            'progress, traceback:\n%s', trace_string)


try:
    _debug = cfg.CONF.debug
except cfg.NoSuchOptError:
    _debug = False

if _debug:
    db_api.sqla_listen(orm.Session, 'do_orm_execute', do_orm_execute)


def get_object_class_by_model(model):
    for obj_class in NeutronObjectRegistry.obj_classes().values():
        obj_class = obj_class[0]
        if getattr(obj_class, 'db_model', _NO_DB_MODEL) is model:
            return obj_class
    raise o_exc.NeutronDbObjectNotFoundByModel(model=model.__name__)


def register_filter_hook_on_model(model, filter_name):
    obj_class = get_object_class_by_model(model)
    obj_class.add_extra_filter_name(filter_name)