ceilometer/ceilometer/storage/sqlalchemy/migrate_repo/versions/030_rename_meter_table.py

111 lines
4.1 KiB
Python

#
# 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 _handle_meter_indices(meta):
if meta.bind.engine.name == 'sqlite':
return
resource = sa.Table('resource', meta, autoload=True)
project = sa.Table('project', meta, autoload=True)
user = sa.Table('user', meta, autoload=True)
meter = sa.Table('meter', meta, autoload=True)
indices = [(sa.Index('ix_meter_timestamp', meter.c.timestamp),
sa.Index('ix_sample_timestamp', meter.c.timestamp)),
(sa.Index('ix_meter_user_id', meter.c.user_id),
sa.Index('ix_sample_user_id', meter.c.user_id)),
(sa.Index('ix_meter_project_id', meter.c.project_id),
sa.Index('ix_sample_project_id', meter.c.project_id)),
(sa.Index('idx_meter_rid_cname', meter.c.resource_id,
meter.c.counter_name),
sa.Index('idx_sample_rid_cname', meter.c.resource_id,
meter.c.counter_name))]
fk_params = [({'columns': [meter.c.resource_id],
'refcolumns': [resource.c.id]},
'fk_meter_resource_id',
'fk_sample_resource_id'),
({'columns': [meter.c.project_id],
'refcolumns': [project.c.id]},
'fk_meter_project_id',
'fk_sample_project_id'),
({'columns': [meter.c.user_id],
'refcolumns': [user.c.id]},
'fk_meter_user_id',
'fk_sample_user_id')]
for fk in fk_params:
params = fk[0]
if meta.bind.engine.name == 'mysql':
params['name'] = fk[1]
migrate.ForeignKeyConstraint(**params).drop()
for meter_ix, sample_ix in indices:
meter_ix.drop()
sample_ix.create()
for fk in fk_params:
params = fk[0]
if meta.bind.engine.name == 'mysql':
params['name'] = fk[2]
migrate.ForeignKeyConstraint(**params).create()
def _alter_sourceassoc(meta, t_name, ix_name, post_action=False):
if meta.bind.engine.name == 'sqlite':
return
sourceassoc = sa.Table('sourceassoc', meta, autoload=True)
table = sa.Table(t_name, meta, autoload=True)
user = sa.Table('user', meta, autoload=True)
c_name = '%s_id' % t_name
col = getattr(sourceassoc.c, c_name)
uniq_name = 'uniq_sourceassoc0%s0user_id' % c_name
uniq_cols = (c_name, 'user_id')
param = {'columns': [col],
'refcolumns': [table.c.id]}
user_param = {'columns': [sourceassoc.c.user_id],
'refcolumns': [user.c.id]}
if meta.bind.engine.name == 'mysql':
param['name'] = 'fk_sourceassoc_%s' % c_name
user_param['name'] = 'fk_sourceassoc_user_id'
actions = [migrate.ForeignKeyConstraint(**user_param),
migrate.ForeignKeyConstraint(**param),
sa.Index(ix_name, sourceassoc.c.source_id, col),
migrate.UniqueConstraint(*uniq_cols, table=sourceassoc,
name=uniq_name)]
for action in actions:
action.create() if post_action else action.drop()
def upgrade(migrate_engine):
meta = sa.MetaData(bind=migrate_engine)
_handle_meter_indices(meta)
meter = sa.Table('meter', meta, autoload=True)
meter.rename('sample')
_alter_sourceassoc(meta, 'meter', 'idx_sm')
sourceassoc = sa.Table('sourceassoc', meta, autoload=True)
sourceassoc.c.meter_id.alter(name='sample_id')
# re-bind metadata to pick up alter name change
meta = sa.MetaData(bind=migrate_engine)
_alter_sourceassoc(meta, 'sample', 'idx_ss', True)