diff --git a/manila/db/migrations/alembic/versions/38e632621e5a_change_volume_type_to_share_type.py b/manila/db/migrations/alembic/versions/38e632621e5a_change_volume_type_to_share_type.py index 280247c83f..58e019ed9b 100644 --- a/manila/db/migrations/alembic/versions/38e632621e5a_change_volume_type_to_share_type.py +++ b/manila/db/migrations/alembic/versions/38e632621e5a_change_volume_type_to_share_type.py @@ -115,7 +115,7 @@ def _copy_records(destination_table, up_migration=True): sa.Column('created_at', sa.DateTime), sa.Column('updated_at', sa.DateTime), sa.Column('deleted_at', sa.DateTime), - sa.Column('deleted', sa.Integer if up_migration else sa.Boolean), + sa.Column('deleted', sa.Boolean if up_migration else sa.Integer), sa.Column('id', sa.Integer, primary_key=True, nullable=False), sa.Column(data_from[0] + '_type_id', sa.String(length=36)), sa.Column(data_from[1] + 'key', sa.String(length=255)), @@ -126,13 +126,12 @@ def _copy_records(destination_table, up_migration=True): if up_migration: deleted = strutils.int_from_bool_as_string(es.deleted) else: - deleted = strutils.bool_from_string(es.deleted) + deleted = strutils.bool_from_string(es.deleted, default=True) extra_specs.append({ 'created_at': es.created_at, 'updated_at': es.updated_at, 'deleted_at': es.deleted_at, 'deleted': deleted, - 'id': es.id, data_to[0] + '_type_id': getattr(es, data_from[0] + '_type_id'), data_to[1] + 'key': getattr(es, data_from[1] + 'key'), data_to[1] + 'value': getattr(es, data_from[1] + 'value'), diff --git a/manila/tests/db/migrations/alembic/migrations_data_checks.py b/manila/tests/db/migrations/alembic/migrations_data_checks.py index 2e6d9b0957..5a0d9bfcd2 100644 --- a/manila/tests/db/migrations/alembic/migrations_data_checks.py +++ b/manila/tests/db/migrations/alembic/migrations_data_checks.py @@ -121,6 +121,97 @@ class BaseMigrationChecks(object): """ +@map_to_migration('38e632621e5a') +class ShareTypeMigrationChecks(BaseMigrationChecks): + def _get_fake_data(self): + extra_specs = [] + self.share_type_ids = [] + volume_types = [ + { + 'id': uuidutils.generate_uuid(), + 'deleted': 'False', + 'name': 'vol-type-A', + }, + { + 'id': uuidutils.generate_uuid(), + 'deleted': 'False', + 'name': 'vol-type-B', + }, + ] + for idx, volume_type in enumerate(volume_types): + extra_specs.append({ + 'volume_type_id': volume_type['id'], + 'key': 'foo', + 'value': 'bar%s' % idx, + 'deleted': False, + }) + extra_specs.append({ + 'volume_type_id': volume_type['id'], + 'key': 'xyzzy', + 'value': 'spoon_%s' % idx, + 'deleted': False, + }) + self.share_type_ids.append(volume_type['id']) + return volume_types, extra_specs + + def setup_upgrade_data(self, engine): + (self.volume_types, self.extra_specs) = self._get_fake_data() + + volume_types_table = utils.load_table('volume_types', engine) + engine.execute(volume_types_table.insert(self.volume_types)) + extra_specs_table = utils.load_table('volume_type_extra_specs', + engine) + engine.execute(extra_specs_table.insert(self.extra_specs)) + + def check_upgrade(self, engine, data): + # Verify table transformations + share_types_table = utils.load_table('share_types', engine) + share_types_specs_table = utils.load_table( + 'share_type_extra_specs', engine) + self.test_case.assertRaises(sa_exc.NoSuchTableError, utils.load_table, + 'volume_types', engine) + self.test_case.assertRaises(sa_exc.NoSuchTableError, utils.load_table, + 'volume_type_extra_specs', engine) + + # Verify presence of data + share_type_ids = [ + st['id'] for st in engine.execute(share_types_table.select()) + if st['id'] in self.share_type_ids + ] + self.test_case.assertEqual(sorted(self.share_type_ids), + sorted(share_type_ids)) + extra_specs = [ + {'type': es['share_type_id'], 'key': es['spec_key']} + for es in engine.execute(share_types_specs_table.select()) + if es['share_type_id'] in self.share_type_ids + ] + self.test_case.assertEqual(4, len(extra_specs)) + + def check_downgrade(self, engine): + # Verify table transformations + volume_types_table = utils.load_table('volume_types', engine) + volume_types_specs_table = utils.load_table( + 'volume_type_extra_specs', engine) + self.test_case.assertRaises(sa_exc.NoSuchTableError, utils.load_table, + 'share_types', engine) + self.test_case.assertRaises(sa_exc.NoSuchTableError, utils.load_table, + 'share_type_extra_specs', engine) + + # Verify presence of data + volume_type_ids = [ + vt['id'] for vt in engine.execute(volume_types_table.select()) + if vt['id'] in self.share_type_ids + ] + self.test_case.assertEqual(sorted(self.share_type_ids), + sorted(volume_type_ids)) + extra_specs = [ + {'type': es['volume_type_id'], 'key': es['key']} + for es in engine.execute(volume_types_specs_table.select()) + if es['volume_type_id'] in self.share_type_ids + ] + self.test_case.assertEqual(4, len(extra_specs)) + + @map_to_migration('1f0bd302c1a6') class AvailabilityZoneMigrationChecks(BaseMigrationChecks):