diff --git a/cinderlib/persistence/dbms.py b/cinderlib/persistence/dbms.py index cc6a9b5..3f443f4 100644 --- a/cinderlib/persistence/dbms.py +++ b/cinderlib/persistence/dbms.py @@ -315,6 +315,10 @@ class DBPersistence(persistence_base.PersistenceDriverBase): volume.volume_type.qos_specs_id) else: LOG.debug('hard deleting volume %s', volume.id) + for model in (models.VolumeMetadata, models.VolumeAdminMetadata): + query = sqla_api.model_query(objects.CONTEXT, model) + query.filter_by(volume_id=volume.id).delete() + query = sqla_api.model_query(objects.CONTEXT, models.Volume) query.filter_by(id=volume.id).delete() if delete_type: diff --git a/cinderlib/tests/unit/persistence/test_dbms.py b/cinderlib/tests/unit/persistence/test_dbms.py index 1ddfb47..a42314c 100644 --- a/cinderlib/tests/unit/persistence/test_dbms.py +++ b/cinderlib/tests/unit/persistence/test_dbms.py @@ -120,6 +120,21 @@ class TestDBPersistence(base.BasePersistenceTest): cinder_ovos.VolumeType) self.assertEqual('__DEFAULT__', self.persistence.DEFAULT_TYPE.name) + def test_delete_volume_with_metadata(self): + vols = self.create_volumes([{'size': i, 'name': 'disk%s' % i, + 'metadata': {'k': 'v', 'k2': 'v2'}, + 'admin_metadata': {'k': '1'}} + for i in range(1, 3)]) + self.persistence.delete_volume(vols[0]) + res = self.persistence.get_volumes() + self.assertListEqualObj([vols[1]], res) + + for model in (dbms.models.VolumeMetadata, + dbms.models.VolumeAdminMetadata): + query = dbms.sqla_api.model_query(self.context, model) + res = query.filter_by(volume_id=vols[0].id).all() + self.assertEqual([], res) + class TestMemoryDBPersistence(TestDBPersistence): PERSISTENCE_CFG = {'storage': 'memory_db'} diff --git a/releasenotes/notes/fix-mysql-vol-delete-f675778ea150cb9a.yaml b/releasenotes/notes/fix-mysql-vol-delete-f675778ea150cb9a.yaml new file mode 100644 index 0000000..e0760b6 --- /dev/null +++ b/releasenotes/notes/fix-mysql-vol-delete-f675778ea150cb9a.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + Bug #1868148: Volume deletion no longer fails due to DB constraints when + using the DBMS metadata persistence plugin with a MySQL backend.