persistence: Handle switch to alembic

Change-Id: I02e3fdd7cb16ee420f47eb08ecce983f50d32697
Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
This commit is contained in:
Stephen Finucane 2023-09-28 14:28:14 +01:00
parent 98fc4b6c68
commit f1af46dc6a
3 changed files with 15 additions and 14 deletions

View File

@ -15,13 +15,14 @@
import logging
import alembic.script.revision
import alembic.util.exc
from cinder.db import api as db_api
from cinder.db import migration
from cinder.db.sqlalchemy import api as sqla_api
from cinder.db.sqlalchemy import models
from cinder import exception as cinder_exception
from cinder import objects as cinder_objs
import migrate
from oslo_config import cfg
from oslo_db import exception
from oslo_db.sqlalchemy import models as oslo_db_models
@ -79,9 +80,9 @@ class DBPersistence(persistence_base.PersistenceDriverBase):
sqlite_synchronous,
'database')
# Suppress logging for migration
migrate_logger = logging.getLogger('migrate')
migrate_logger.setLevel(logging.WARNING)
# Suppress logging for alembic
alembic_logger = logging.getLogger('alembic.runtime.migration')
alembic_logger.setLevel(logging.WARNING)
self._clear_facade()
self.db_instance = db_api.oslo_db_api.DBAPI.from_config(
@ -99,13 +100,15 @@ class DBPersistence(persistence_base.PersistenceDriverBase):
try:
migration.db_sync()
except exception.DBMigrationError as exc:
except alembic.util.exc.CommandError as exc:
# We can be running 2 Cinder versions at the same time on the same
# DB while we upgrade, so we must ignore the fact that the DB is
# now on a newer version.
if not isinstance(getattr(exc, 'inner_exception', None),
migrate.exceptions.VersionNotFoundError):
if not isinstance(
exc.__cause__, alembic.script.revision.ResolutionError,
):
raise
self._create_key_value_table()
# NOTE : At this point, the persistence isn't ready so we need to use

View File

@ -16,6 +16,8 @@
import tempfile
from unittest import mock
import alembic.script.revision
import alembic.util.exc
from cinder.db.sqlalchemy import api as sqla_api
from cinder.db.sqlalchemy import models as sqla_models
from cinder import objects as cinder_ovos
@ -152,10 +154,10 @@ class TestDBPersistenceNewerSchema(base.helper.TestHelper):
pass
def _raise_exc(self):
inner_exc = dbms.migrate.exceptions.VersionNotFoundError()
exc = dbms.exception.DBMigrationError(inner_exc)
inner_exc = alembic.script.revision.ResolutionError('foo', 'rev')
outer_exc = alembic.util.exc.CommandError('bar')
self.original_db_sync()
raise(exc)
raise outer_exc from inner_exc
def test_newer_db_schema(self):
self.original_db_sync = dbms.migration.db_sync

View File

@ -5,7 +5,3 @@ os-brick>=6.3.0 # Apache-2.0
importlib_metadata>=1.7.0 # Apache-2.0
importlib_resources>=3.2.1;python_version<'3.10' # Apache-2.0
# TODO: cinder removed this as a dependency in 2023.2 (Bobcat)
# but we need to include it here until cinderlib catches up
sqlalchemy-migrate>=0.13.0 # Apache-2.0