ceilometer/ceilometer/storage/sqlalchemy/migrate_repo/versions/028_alembic_migrations.py

139 lines
4.9 KiB
Python

#
# Copyright 2014 OpenStack Foundation
# All Rights Reserved.
#
# 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 migrate
import sqlalchemy as sa
def get_alembic_version(meta):
"""Return Alembic version or None if no Alembic table exists."""
try:
a_ver = sa.Table(
'alembic_version',
meta,
autoload=True)
return sa.select([a_ver.c.version_num]).scalar()
except sa.exc.NoSuchTableError:
return None
def delete_alembic(meta):
try:
sa.Table(
'alembic_version',
meta,
autoload=True).drop(checkfirst=True)
except sa.exc.NoSuchTableError:
pass
INDEXES = (
# ([dialects], table_name, index_name, create/delete, uniq/not_uniq)
(['mysql', 'sqlite', 'postgresql'],
'resource',
'resource_user_id_project_id_key',
('user_id', 'project_id'), True, False, True),
(['mysql'], 'source', 'id', ('id',), False, True, False))
def index_cleanup(meta, table_name, uniq_name, columns,
create, unique, limited):
table = sa.Table(table_name, meta, autoload=True)
if create:
if limited and meta.bind.engine.name == 'mysql':
# For some versions of mysql we can get an error
# "Specified key was too long; max key length is 1000 bytes".
# We should create an index by hand in this case with limited
# length of columns.
columns_mysql = ",".join((c + "(100)" for c in columns))
sql = ("create index %s ON %s (%s)" % (uniq_name, table,
columns_mysql))
meta.bind.engine.execute(sql)
else:
cols = [table.c[col] for col in columns]
sa.Index(uniq_name, *cols, unique=unique).create()
else:
if unique:
migrate.UniqueConstraint(*columns, table=table,
name=uniq_name).drop()
else:
cols = [table.c[col] for col in columns]
sa.Index(uniq_name, *cols).drop()
def change_uniq(meta):
uniq_name = 'uniq_sourceassoc0meter_id0user_id'
columns = ('meter_id', 'user_id')
if meta.bind.engine.name == 'sqlite':
return
sourceassoc = sa.Table('sourceassoc', meta, autoload=True)
meter = sa.Table('meter', meta, autoload=True)
user = sa.Table('user', meta, autoload=True)
if meta.bind.engine.name == 'mysql':
# For mysql dialect all dependent FK should be removed
# before renaming of constraint.
params = {'columns': [sourceassoc.c.meter_id],
'refcolumns': [meter.c.id],
'name': 'fk_sourceassoc_meter_id'}
migrate.ForeignKeyConstraint(**params).drop()
params = {'columns': [sourceassoc.c.user_id],
'refcolumns': [user.c.id],
'name': 'fk_sourceassoc_user_id'}
migrate.ForeignKeyConstraint(**params).drop()
migrate.UniqueConstraint(*columns, table=sourceassoc,
name=uniq_name).create()
if meta.bind.engine.name == 'mysql':
params = {'columns': [sourceassoc.c.meter_id],
'refcolumns': [meter.c.id],
'name': 'fk_sourceassoc_meter_id'}
migrate.ForeignKeyConstraint(**params).create()
params = {'columns': [sourceassoc.c.user_id],
'refcolumns': [user.c.id],
'name': 'fk_sourceassoc_user_id'}
migrate.ForeignKeyConstraint(**params).create()
def upgrade(migrate_engine):
meta = sa.MetaData(bind=migrate_engine)
a_ver = get_alembic_version(meta)
if not a_ver:
alarm = sa.Table('alarm', meta, autoload=True)
repeat_act = sa.Column('repeat_actions', sa.Boolean,
server_default=sa.sql.expression.false())
alarm.create_column(repeat_act)
a_ver = '43b1a023dfaa'
if a_ver == '43b1a023dfaa':
meter = sa.Table('meter', meta, autoload=True)
meter.c.resource_metadata.alter(type=sa.Text)
a_ver = '17738166b91'
if a_ver == '17738166b91':
for (engine_names, table_name, uniq_name,
columns, create, uniq, limited) in INDEXES:
if migrate_engine.name in engine_names:
index_cleanup(meta, table_name, uniq_name,
columns, create, uniq, limited)
a_ver = 'b6ae66d05e3'
if a_ver == 'b6ae66d05e3':
change_uniq(meta)
delete_alembic(meta)