diff options
| author | Brian Waldon <bcwaldon@gmail.com> | 2012-09-17 13:25:31 -0700 |
|---|---|---|
| committer | Brian Waldon <bcwaldon@gmail.com> | 2012-09-18 10:02:21 -0700 |
| commit | 82d33f51f0fa2258f2a8d4003520af560d8bef11 (patch) | |
| tree | 010c3b911f2630b5aeb30022cd843231cb6072b8 /nova/tests | |
| parent | 5b8d9ada4b44ca7aac523f7e0ec4158bff08232d (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.py | 133 |
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])) |
