summaryrefslogtreecommitdiffstats
path: root/nova/tests
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-05-24 19:39:07 +0000
committerGerrit Code Review <review@openstack.org>2013-05-24 19:39:07 +0000
commitf56d3e13eba566f6c262a96e1a967b596d54b0e4 (patch)
tree0809f5659b77e3689507b3d37e5eb6d5192acc49 /nova/tests
parentba894e71820a2abc9bd6a590afea0f5691796ad0 (diff)
parentbf4142bc7083120563638d3eaf0e2463ecbfc40b (diff)
Merge "Change db `deleted` column type utils"
Diffstat (limited to 'nova/tests')
-rw-r--r--nova/tests/test_migration_utils.py133
1 files changed, 131 insertions, 2 deletions
diff --git a/nova/tests/test_migration_utils.py b/nova/tests/test_migration_utils.py
index 5155dba8f..a15ac251b 100644
--- a/nova/tests/test_migration_utils.py
+++ b/nova/tests/test_migration_utils.py
@@ -16,12 +16,14 @@
# under the License.
from migrate.changeset import UniqueConstraint
-from sqlalchemy import Integer, DateTime, String
+from sqlalchemy.dialects import mysql
+from sqlalchemy import Boolean, Index, Integer, DateTime, String
from sqlalchemy import MetaData, Table, Column
+from sqlalchemy.engine import reflection
from sqlalchemy.exc import NoSuchTableError
from sqlalchemy.exc import SAWarning
from sqlalchemy.sql import select
-from sqlalchemy.types import UserDefinedType
+from sqlalchemy.types import UserDefinedType, NullType
from nova.db.sqlalchemy import api as db
from nova.db.sqlalchemy import utils
@@ -385,3 +387,130 @@ class TestMigrationUtils(test_migrations.BaseMigrationTestCase):
self.assertRaises(exception.ShadowTableExists,
utils.create_shadow_table,
engine, table_name=table_name)
+
+ def test_change_deleted_column_type_doesnt_drop_index(self):
+ table_name = 'abc'
+ for key, engine in self.engines.items():
+ meta = MetaData(bind=engine)
+
+ indexes = {
+ 'idx_a_deleted': ['a', 'deleted'],
+ 'idx_b_deleted': ['b', 'deleted'],
+ 'idx_a': ['a']
+ }
+
+ index_instances = [Index(name, *columns)
+ for name, columns in indexes.iteritems()]
+
+ table = Table(table_name, meta,
+ Column('id', Integer, primary_key=True),
+ Column('a', String(255)),
+ Column('b', String(255)),
+ Column('deleted', Boolean),
+ *index_instances)
+ table.create()
+ utils.change_deleted_column_type_to_id_type(engine, table_name)
+ utils.change_deleted_column_type_to_boolean(engine, table_name)
+
+ insp = reflection.Inspector.from_engine(engine)
+ real_indexes = insp.get_indexes(table_name)
+ self.assertEqual(len(real_indexes), 3)
+ for index in real_indexes:
+ name = index['name']
+ self.assertIn(name, indexes)
+ self.assertEqual(set(index['column_names']),
+ set(indexes[name]))
+
+ def test_change_deleted_column_type_to_id_type_integer(self):
+ table_name = 'abc'
+ for key, engine in self.engines.items():
+ meta = MetaData()
+ meta.bind = engine
+ table = Table(table_name, meta,
+ Column('id', Integer, primary_key=True),
+ Column('deleted', Boolean))
+ table.create()
+ utils.change_deleted_column_type_to_id_type(engine, table_name)
+
+ table = utils.get_table(engine, table_name)
+ self.assertTrue(isinstance(table.c.deleted.type, Integer))
+
+ def test_change_deleted_column_type_to_id_type_string(self):
+ table_name = 'abc'
+ for key, engine in self.engines.items():
+ meta = MetaData()
+ meta.bind = engine
+ table = Table(table_name, meta,
+ Column('id', String(255), primary_key=True),
+ Column('deleted', Boolean))
+ table.create()
+ utils.change_deleted_column_type_to_id_type(engine, table_name)
+
+ table = utils.get_table(engine, table_name)
+ self.assertTrue(isinstance(table.c.deleted.type, String))
+
+ def test_change_deleted_column_type_to_id_type_custom(self):
+ table_name = 'abc'
+ engine = self.engines['sqlite']
+ meta = MetaData()
+ meta.bind = engine
+ table = Table(table_name, meta,
+ Column('id', Integer, primary_key=True),
+ Column('foo', CustomType),
+ Column('deleted', Boolean))
+ table.create()
+
+ self.assertRaises(exception.NovaException,
+ utils.change_deleted_column_type_to_id_type,
+ engine, table_name)
+
+ fooColumn = Column('foo', CustomType())
+ utils.change_deleted_column_type_to_id_type(engine, table_name,
+ foo=fooColumn)
+
+ table = utils.get_table(engine, table_name)
+ # NOTE(boris-42): There is no way to check has foo type CustomType.
+ # but sqlalchemy will set it to NullType.
+ self.assertTrue(isinstance(table.c.foo.type, NullType))
+ self.assertTrue(isinstance(table.c.deleted.type, Integer))
+
+ def test_change_deleted_column_type_to_boolean(self):
+ table_name = 'abc'
+ for key, engine in self.engines.items():
+ meta = MetaData()
+ meta.bind = engine
+ table = Table(table_name, meta,
+ Column('id', Integer, primary_key=True),
+ Column('deleted', Integer))
+ table.create()
+
+ utils.change_deleted_column_type_to_boolean(engine, table_name)
+
+ table = utils.get_table(engine, table_name)
+ expected_type = Boolean if key != "mysql" else mysql.TINYINT
+ self.assertTrue(isinstance(table.c.deleted.type, expected_type))
+
+ def test_change_deleted_column_type_to_boolean_type_custom(self):
+ table_name = 'abc'
+ engine = self.engines['sqlite']
+ meta = MetaData()
+ meta.bind = engine
+ table = Table(table_name, meta,
+ Column('id', Integer, primary_key=True),
+ Column('foo', CustomType),
+ Column('deleted', Integer))
+ table.create()
+
+ self.assertRaises(exception.NovaException,
+ utils.change_deleted_column_type_to_boolean,
+ engine, table_name)
+
+ fooColumn = Column('foo', CustomType())
+ utils.change_deleted_column_type_to_boolean(engine, table_name,
+ foo=fooColumn)
+
+ table = utils.get_table(engine, table_name)
+ # NOTE(boris-42): There is no way to check has foo type CustomType.
+ # but sqlalchemy will set it to NullType.
+ self.assertTrue(isinstance(table.c.foo.type, NullType))
+ self.assertTrue(isinstance(table.c.deleted.type, Boolean))