summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ceilometer/storage/sqlalchemy/alembic/versions/2c3ccda5a3ad_fix_uniq_name.py22
-rw-r--r--ceilometer/storage/sqlalchemy/alembic/versions/b6ae66d05e3_remove_extra_indexes.py49
-rw-r--r--nova_tests/test_notifier.py3
3 files changed, 42 insertions, 32 deletions
diff --git a/ceilometer/storage/sqlalchemy/alembic/versions/2c3ccda5a3ad_fix_uniq_name.py b/ceilometer/storage/sqlalchemy/alembic/versions/2c3ccda5a3ad_fix_uniq_name.py
index a99f0194..d00d368b 100644
--- a/ceilometer/storage/sqlalchemy/alembic/versions/2c3ccda5a3ad_fix_uniq_name.py
+++ b/ceilometer/storage/sqlalchemy/alembic/versions/2c3ccda5a3ad_fix_uniq_name.py
@@ -32,13 +32,13 @@ from alembic import op
TABLE_NAME = 'sourceassoc'
-OLD_NAME = 'uniq_sourceassoc0meter_id'
-NEW_NAME = 'uniq_sourceassoc0meter_id0user_id'
+UNIQ_NAME = 'uniq_sourceassoc0meter_id0user_id'
COLUMNS = ('meter_id', 'user_id')
-def change_uniq(table_name, old_name, new_name, columns):
- engine = op.get_bind().engine
+def change_uniq(table_name, uniq_name, columns, downgrade=False):
+ bind = op.get_bind()
+ engine = bind.engine
if engine.name == 'sqlite':
return
if engine.name == 'mysql':
@@ -50,12 +50,10 @@ def change_uniq(table_name, old_name, new_name, columns):
op.drop_constraint('fk_sourceassoc_user_id',
table_name,
type_='foreignkey')
- try:
- # For some versions of dialects constraint can be skipped.
- op.drop_constraint(old_name, table_name=table_name, type_='unique')
- except Exception:
- pass
- op.create_unique_constraint(new_name, table_name, columns)
+ if downgrade:
+ op.drop_constraint(uniq_name, table_name=table_name, type_='unique')
+ else:
+ op.create_unique_constraint(uniq_name, table_name, columns)
if engine.name == 'mysql':
op.create_foreign_key('fk_sourceassoc_meter_id', table_name, 'meter',
['meter_id'], ['id'])
@@ -64,8 +62,8 @@ def change_uniq(table_name, old_name, new_name, columns):
def upgrade():
- change_uniq(TABLE_NAME, OLD_NAME, NEW_NAME, COLUMNS)
+ change_uniq(TABLE_NAME, UNIQ_NAME, COLUMNS)
def downgrade():
- change_uniq(TABLE_NAME, NEW_NAME, OLD_NAME, COLUMNS)
+ change_uniq(TABLE_NAME, UNIQ_NAME, COLUMNS, downgrade=True)
diff --git a/ceilometer/storage/sqlalchemy/alembic/versions/b6ae66d05e3_remove_extra_indexes.py b/ceilometer/storage/sqlalchemy/alembic/versions/b6ae66d05e3_remove_extra_indexes.py
index ec260e53..8f89a9ae 100644
--- a/ceilometer/storage/sqlalchemy/alembic/versions/b6ae66d05e3_remove_extra_indexes.py
+++ b/ceilometer/storage/sqlalchemy/alembic/versions/b6ae66d05e3_remove_extra_indexes.py
@@ -29,53 +29,66 @@ revision = 'b6ae66d05e3'
down_revision = '17738166b91'
from alembic import op
+import sqlalchemy as sa
INDEXES = (
- # ([dialects], table_name, index_name, create/delete, uniq/not uniq)
+ # ([dialects], table_name, index_name, create/delete, uniq/not_uniq,
+ # length_limited)
(['mysql', 'sqlite', 'postgresql'],
'resource',
'resource_user_id_project_id_key',
- ('user_id', 'project_id'), True, False),
- (['mysql'], 'source', 'id', ('id',), False, True))
+ ('user_id', 'project_id'), True, False, True),
+ (['mysql'], 'source', 'id', ('id',), False, True, False))
-def index_cleanup(engine_names, table_name, uniq_name, columns, create=True,
- unique=False):
- engine = op.get_bind().engine
+def index_cleanup(engine_names, table_name, uniq_name, columns, create,
+ unique, limited):
+ bind = op.get_bind()
+ engine = bind.engine
if engine.name not in engine_names:
return
if create:
- # We have unique constraint in postgres for `resource` table.
- # But it should be a simple index. So, we should delete unique key
- # before index creation.
- if engine.name == 'postgresql':
- op.drop_constraint(uniq_name, table_name, type_='unique')
- op.create_index(uniq_name, table_name, columns, unique=unique)
+ if limited and 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.
+ meta = sa.MetaData()
+ meta.bind = engine
+ table = sa.Table(table_name, meta, autoload=True)
+ columns_mysql = ",".join((c + "(100)" for c in columns))
+ sql = ("create index %s ON %s (%s)" % (uniq_name, table,
+ columns_mysql))
+ engine.execute(sql)
+ else:
+ op.create_index(uniq_name, table_name, columns, unique=unique)
else:
if unique:
op.drop_constraint(uniq_name, table_name, type_='unique')
else:
op.drop_index(uniq_name, table_name=table_name)
- if engine.name == 'postgresql':
- op.create_unique_constraint(uniq_name, table_name, columns)
def upgrade():
- for engine_names, table_name, uniq_name, columns, create, uniq in INDEXES:
+ for (engine_names, table_name, uniq_name, columns, create, uniq,
+ limited) in INDEXES:
index_cleanup(engine_names,
table_name,
uniq_name,
columns,
create,
- uniq)
+ uniq,
+ limited)
def downgrade():
- for engine_names, table_name, uniq_name, columns, create, uniq in INDEXES:
+ for (engine_names, table_name, uniq_name, columns, create, uniq,
+ limited) in INDEXES:
index_cleanup(engine_names,
table_name,
uniq_name,
columns,
not create,
- uniq)
+ uniq,
+ limited)
diff --git a/nova_tests/test_notifier.py b/nova_tests/test_notifier.py
index 2ab67b92..bebfa8c5 100644
--- a/nova_tests/test_notifier.py
+++ b/nova_tests/test_notifier.py
@@ -178,8 +178,7 @@ class TestNovaNotifier(base.TestCase):
self.stubs.Set(db, 'block_device_mapping_get_all_by_instance',
lambda context, instance: {})
self.stubs.Set(db, 'instance_update_and_get_original',
- lambda context, uuid, kwargs, update_cells: (self.instance,
- self.instance))
+ lambda *args, **kwargs: (self.instance, self.instance))
self.stubs.Set(flavors, 'extract_flavor',
lambda ref: {})