71 lines
2.2 KiB
Python
71 lines
2.2 KiB
Python
# Copyright 2016 Rackspace
|
|
# Copyright 2016 Intel Corporation
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import importlib
|
|
import os.path
|
|
import pkgutil
|
|
|
|
from glance.common import exception
|
|
from glance.db import migration as db_migrations
|
|
from glance.db.sqlalchemy import api as db_api
|
|
|
|
|
|
def _find_migration_modules(release):
|
|
migrations = list()
|
|
for _, module_name, _ in pkgutil.iter_modules([os.path.dirname(__file__)]):
|
|
if module_name.startswith(release):
|
|
migrations.append(module_name)
|
|
|
|
migration_modules = list()
|
|
for migration in sorted(migrations):
|
|
module = importlib.import_module('.'.join([__package__, migration]))
|
|
has_migrations_function = getattr(module, 'has_migrations', None)
|
|
migrate_function = getattr(module, 'migrate', None)
|
|
|
|
if has_migrations_function is None or migrate_function is None:
|
|
raise exception.InvalidDataMigrationScript(script=module.__name__)
|
|
|
|
migration_modules.append(module)
|
|
|
|
return migration_modules
|
|
|
|
|
|
def _run_migrations(engine, migrations):
|
|
rows_migrated = 0
|
|
for migration in migrations:
|
|
if migration.has_migrations(engine):
|
|
rows_migrated += migration.migrate(engine)
|
|
|
|
return rows_migrated
|
|
|
|
|
|
def has_pending_migrations(engine=None):
|
|
if not engine:
|
|
engine = db_api.get_engine()
|
|
|
|
migrations = _find_migration_modules(db_migrations.CURRENT_RELEASE)
|
|
if not migrations:
|
|
return False
|
|
return any([x.has_migrations(engine) for x in migrations])
|
|
|
|
|
|
def migrate(engine=None):
|
|
if not engine:
|
|
engine = db_api.get_engine()
|
|
|
|
migrations = _find_migration_modules(db_migrations.CURRENT_RELEASE)
|
|
rows_migrated = _run_migrations(engine, migrations)
|
|
return rows_migrated
|