summaryrefslogtreecommitdiffstats
path: root/nova/tests
diff options
context:
space:
mode:
authorBrian Waldon <bcwaldon@gmail.com>2012-09-17 13:25:31 -0700
committerBrian Waldon <bcwaldon@gmail.com>2012-09-18 10:02:21 -0700
commit82d33f51f0fa2258f2a8d4003520af560d8bef11 (patch)
tree010c3b911f2630b5aeb30022cd843231cb6072b8 /nova/tests
parent5b8d9ada4b44ca7aac523f7e0ec4158bff08232d (diff)
Correct db migration 91
* Snapshot.id gets the new snapshot uuid rather than snapshot.volume_id * Foreign keys are dropped before and recreated after updating id fields * Snapshot id <-> uuid queries use snapshot_id_mappings.c.id rather than volume_id_mappings.id * Snapshot id <-> uuid queries are executed before passing the new id values into subsequent UPDATE queries * Thoroughly inspect the expected modifications in a new functional test * Fixes bug 1052244 * Fixes bug 1052220 Change-Id: I22c820e5747562251c6447ac678c80dd9e0e2e20
Diffstat (limited to 'nova/tests')
-rw-r--r--nova/tests/test_migrations.py133
1 files changed, 133 insertions, 0 deletions
diff --git a/nova/tests/test_migrations.py b/nova/tests/test_migrations.py
index 9487443a2..73b50c280 100644
--- a/nova/tests/test_migrations.py
+++ b/nova/tests/test_migrations.py
@@ -323,3 +323,136 @@ class TestMigrations(test.TestCase):
migration_api.upgrade(engine, TestMigrations.REPOSITORY, 98)
migration_api.downgrade(engine, TestMigrations.REPOSITORY, 97)
+
+ def test_migration_91(self):
+ """Test that migration 91 works correctly.
+
+ This test prevents regression of bugs 1052244 and 1052220.
+ """
+ for key, engine in self.engines.items():
+ migration_api.version_control(engine, TestMigrations.REPOSITORY,
+ migration.INIT_VERSION)
+ migration_api.upgrade(engine, TestMigrations.REPOSITORY, 90)
+
+ vol1_id = '10'
+ vol1_uuid = '9db3c2e5-8cac-4e94-9e6c-b5f750736727'
+
+ vol2_id = '11'
+ vol2_uuid = 'fb17fb5a-ca3d-4bba-8903-fc776ea81d78'
+
+ snap_id = '7'
+ snap_uuid = 'a87e5108-8a2b-4c89-be96-0e8760db2c6a'
+
+ inst_id = '0ec45d38-aefd-4c42-a209-361e848240b7'
+
+ metadata = sqlalchemy.schema.MetaData()
+ metadata.bind = engine
+
+ instances = sqlalchemy.Table('instances', metadata, autoload=True)
+ volumes = sqlalchemy.Table('volumes', metadata, autoload=True)
+ sm_flavors = sqlalchemy.Table(
+ 'sm_flavors', metadata, autoload=True)
+ sm_backend_config = sqlalchemy.Table(
+ 'sm_backend_config', metadata, autoload=True)
+ sm_volume = sqlalchemy.Table(
+ 'sm_volume', metadata, autoload=True)
+ volume_mappings = sqlalchemy.Table(
+ 'volume_id_mappings', metadata, autoload=True)
+ iscsi_targets = sqlalchemy.Table(
+ 'iscsi_targets', metadata, autoload=True)
+ volume_metadata = sqlalchemy.Table(
+ 'volume_metadata', metadata, autoload=True)
+ snapshots = sqlalchemy.Table('snapshots', metadata, autoload=True)
+ snapshot_mappings = sqlalchemy.Table(
+ 'snapshot_id_mappings', metadata, autoload=True)
+ block_device_mapping = sqlalchemy.Table(
+ 'block_device_mapping', metadata, autoload=True)
+
+ volumes.insert().values(id=vol1_id).execute()
+ volume_mappings.insert() \
+ .values(id=vol1_id, uuid=vol1_uuid).execute()
+ snapshots.insert().values(id=snap_id, volume_id=vol1_id).execute()
+ snapshot_mappings.insert() \
+ .values(id=snap_id, uuid=snap_uuid).execute()
+ volumes.insert().values(id=vol2_id, snapshot_id=snap_id).execute()
+ volume_mappings.insert() \
+ .values(id=vol2_id, uuid=vol2_uuid).execute()
+ sm_flavors.insert().values(id=7).execute()
+ sm_backend_config.insert().values(id=7, flavor_id=7).execute()
+ sm_volume.insert().values(id=vol1_id, backend_id=7).execute()
+ volume_metadata.insert().values(id=7, volume_id=vol1_id).execute()
+ iscsi_targets.insert().values(id=7, volume_id=vol1_id).execute()
+ instances.insert().values(id=7, uuid=inst_id).execute()
+ block_device_mapping.insert()\
+ .values(id=7, volume_id=vol1_id, instance_uuid=inst_id) \
+ .execute()
+
+ vols = volumes.select().execute().fetchall()
+ self.assertEqual(set([vol.id for vol in vols]),
+ set([vol1_id, vol2_id]))
+ self.assertEqual(snap_id, vols[1].snapshot_id)
+
+ query = volume_metadata.select(volume_metadata.c.id == 7)
+ self.assertEqual(vol1_id, query.execute().fetchone().volume_id)
+
+ query = iscsi_targets.select(iscsi_targets.c.id == 7)
+ self.assertEqual(vol1_id, query.execute().fetchone().volume_id)
+
+ query = block_device_mapping.select(block_device_mapping.c.id == 7)
+ self.assertEqual(vol1_id, query.execute().fetchone().volume_id)
+
+ snaps = sqlalchemy.select([snapshots.c.id]).execute().fetchall()
+ self.assertEqual(set([snap.id for snap in snaps]),
+ set([snap_id]))
+
+ sm_vols = sqlalchemy.select([sm_volume.c.id]).execute().fetchall()
+ self.assertEqual(set([sm_vol.id for sm_vol in sm_vols]),
+ set([vol1_id]))
+
+ migration_api.upgrade(engine, TestMigrations.REPOSITORY, 91)
+
+ vols = volumes.select().execute().fetchall()
+ self.assertEqual(set([vol.id for vol in vols]),
+ set([vol1_uuid, vol2_uuid]))
+ self.assertEqual(snap_uuid, vols[1].snapshot_id)
+
+ query = volume_metadata.select(volume_metadata.c.id == 7)
+ self.assertEqual(vol1_uuid, query.execute().fetchone().volume_id)
+
+ query = iscsi_targets.select(iscsi_targets.c.id == 7)
+ self.assertEqual(vol1_uuid, query.execute().fetchone().volume_id)
+
+ query = block_device_mapping.select(block_device_mapping.c.id == 7)
+ self.assertEqual(vol1_uuid, query.execute().fetchone().volume_id)
+
+ snaps = sqlalchemy.select([snapshots.c.id]).execute().fetchall()
+ self.assertEqual(set([snap.id for snap in snaps]),
+ set([snap_uuid]))
+
+ sm_vols = sqlalchemy.select([sm_volume.c.id]).execute().fetchall()
+ self.assertEqual(set([sm_vol.id for sm_vol in sm_vols]),
+ set([vol1_uuid]))
+
+ migration_api.downgrade(engine, TestMigrations.REPOSITORY, 90)
+
+ vols = volumes.select().execute().fetchall()
+ self.assertEqual(set([vol.id for vol in vols]),
+ set([vol1_id, vol2_id]))
+ self.assertEqual(snap_id, vols[1].snapshot_id)
+
+ query = volume_metadata.select(volume_metadata.c.id == 7)
+ self.assertEqual(vol1_id, query.execute().fetchone().volume_id)
+
+ query = iscsi_targets.select(iscsi_targets.c.id == 7)
+ self.assertEqual(vol1_id, query.execute().fetchone().volume_id)
+
+ query = block_device_mapping.select(block_device_mapping.c.id == 7)
+ self.assertEqual(vol1_id, query.execute().fetchone().volume_id)
+
+ snaps = sqlalchemy.select([snapshots.c.id]).execute().fetchall()
+ self.assertEqual(set([snap.id for snap in snaps]),
+ set([snap_id]))
+
+ sm_vols = sqlalchemy.select([sm_volume.c.id]).execute().fetchall()
+ self.assertEqual(set([sm_vol.id for sm_vol in sm_vols]),
+ set([vol1_id]))