apidb: Compact Stein database migrations
Specific changes include: - Add 'user_id' column to 'instance_mappings' table (062) - Add index covering 'user_id' and 'project_id' columns to 'instance_mappings' table (062) Note that we forgot to add placeholder migrations in Rocky, meaning there is significantly less to clean up here. Change-Id: I38a6f4d1c3d2a9797ba543694401b7b821a79805 Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
This commit is contained in:
parent
6665bd8cb9
commit
dae3c89874
|
@ -1,32 +0,0 @@
|
||||||
# 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.
|
|
||||||
|
|
||||||
from sqlalchemy import Column
|
|
||||||
from sqlalchemy import Index
|
|
||||||
from sqlalchemy import MetaData
|
|
||||||
from sqlalchemy import String
|
|
||||||
from sqlalchemy import Table
|
|
||||||
|
|
||||||
|
|
||||||
def upgrade(migrate_engine):
|
|
||||||
meta = MetaData()
|
|
||||||
meta.bind = migrate_engine
|
|
||||||
|
|
||||||
instance_mappings = Table('instance_mappings', meta, autoload=True)
|
|
||||||
|
|
||||||
if not hasattr(instance_mappings.c, 'user_id'):
|
|
||||||
instance_mappings.create_column(Column('user_id', String(length=255),
|
|
||||||
nullable=True))
|
|
||||||
index = Index('instance_mappings_user_id_project_id_idx',
|
|
||||||
instance_mappings.c.user_id,
|
|
||||||
instance_mappings.c.project_id)
|
|
||||||
index.create()
|
|
|
@ -86,10 +86,14 @@ def upgrade(migrate_engine):
|
||||||
Column(
|
Column(
|
||||||
'queued_for_delete', Boolean(create_constraint=False),
|
'queued_for_delete', Boolean(create_constraint=False),
|
||||||
default=False),
|
default=False),
|
||||||
|
Column('user_id', String(length=255), nullable=True),
|
||||||
UniqueConstraint(
|
UniqueConstraint(
|
||||||
'instance_uuid', name='uniq_instance_mappings0instance_uuid'),
|
'instance_uuid', name='uniq_instance_mappings0instance_uuid'),
|
||||||
Index('instance_uuid_idx', 'instance_uuid'),
|
Index('instance_uuid_idx', 'instance_uuid'),
|
||||||
Index('project_id_idx', 'project_id'),
|
Index('project_id_idx', 'project_id'),
|
||||||
|
Index(
|
||||||
|
'instance_mappings_user_id_project_id_idx', 'user_id',
|
||||||
|
'project_id'),
|
||||||
ForeignKeyConstraint(
|
ForeignKeyConstraint(
|
||||||
columns=['cell_id'], refcolumns=[cell_mappings.c.id]),
|
columns=['cell_id'], refcolumns=[cell_mappings.c.id]),
|
||||||
mysql_engine='InnoDB',
|
mysql_engine='InnoDB',
|
|
@ -30,7 +30,7 @@ from nova.i18n import _
|
||||||
|
|
||||||
INIT_VERSION = {}
|
INIT_VERSION = {}
|
||||||
INIT_VERSION['main'] = 401
|
INIT_VERSION['main'] = 401
|
||||||
INIT_VERSION['api'] = 60
|
INIT_VERSION['api'] = 61
|
||||||
_REPOSITORY = {}
|
_REPOSITORY = {}
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
|
@ -35,9 +35,6 @@ import mock
|
||||||
from oslo_db.sqlalchemy import enginefacade
|
from oslo_db.sqlalchemy import enginefacade
|
||||||
from oslo_db.sqlalchemy import test_fixtures
|
from oslo_db.sqlalchemy import test_fixtures
|
||||||
from oslo_db.sqlalchemy import test_migrations
|
from oslo_db.sqlalchemy import test_migrations
|
||||||
from oslo_db.sqlalchemy import utils as db_utils
|
|
||||||
import sqlalchemy
|
|
||||||
from sqlalchemy.engine import reflection
|
|
||||||
import testtools
|
import testtools
|
||||||
|
|
||||||
from nova.db import migration
|
from nova.db import migration
|
||||||
|
@ -170,7 +167,6 @@ class NovaAPIMigrationsWalk(test_migrations.WalkVersionsMixin):
|
||||||
return self.engine
|
return self.engine
|
||||||
|
|
||||||
def _skippable_migrations(self):
|
def _skippable_migrations(self):
|
||||||
# We forgot to add the rocky placeholders
|
|
||||||
stein_placeholders = list(range(63, 68))
|
stein_placeholders = list(range(63, 68))
|
||||||
train_placeholders = list(range(68, 73))
|
train_placeholders = list(range(68, 73))
|
||||||
ussuri_placeholders = list(range(73, 78))
|
ussuri_placeholders = list(range(73, 78))
|
||||||
|
@ -196,30 +192,6 @@ class NovaAPIMigrationsWalk(test_migrations.WalkVersionsMixin):
|
||||||
def test_walk_versions(self):
|
def test_walk_versions(self):
|
||||||
self.walk_versions(snake_walk=False, downgrade=False)
|
self.walk_versions(snake_walk=False, downgrade=False)
|
||||||
|
|
||||||
def assertColumnExists(self, engine, table_name, column):
|
|
||||||
self.assertTrue(db_utils.column_exists(engine, table_name, column),
|
|
||||||
'Column %s.%s does not exist' % (table_name, column))
|
|
||||||
|
|
||||||
def assertIndexExists(self, engine, table_name, index):
|
|
||||||
self.assertTrue(db_utils.index_exists(engine, table_name, index),
|
|
||||||
'Index %s on table %s does not exist' %
|
|
||||||
(index, table_name))
|
|
||||||
|
|
||||||
def assertUniqueConstraintExists(self, engine, table_name, columns):
|
|
||||||
inspector = reflection.Inspector.from_engine(engine)
|
|
||||||
constrs = inspector.get_unique_constraints(table_name)
|
|
||||||
constr_columns = [constr['column_names'] for constr in constrs]
|
|
||||||
self.assertIn(columns, constr_columns)
|
|
||||||
|
|
||||||
def assertTableNotExists(self, engine, table_name):
|
|
||||||
self.assertRaises(sqlalchemy.exc.NoSuchTableError,
|
|
||||||
db_utils.get_table, engine, table_name)
|
|
||||||
|
|
||||||
def _check_062(self, engine, data):
|
|
||||||
self.assertColumnExists(engine, 'instance_mappings', 'user_id')
|
|
||||||
self.assertIndexExists(engine, 'instance_mappings',
|
|
||||||
'instance_mappings_user_id_project_id_idx')
|
|
||||||
|
|
||||||
|
|
||||||
class TestNovaAPIMigrationsWalkSQLite(NovaAPIMigrationsWalk,
|
class TestNovaAPIMigrationsWalkSQLite(NovaAPIMigrationsWalk,
|
||||||
test_fixtures.OpportunisticDBTestMixin,
|
test_fixtures.OpportunisticDBTestMixin,
|
||||||
|
|
Loading…
Reference in New Issue