diff --git a/cinder/tests/unit/volume/drivers/solidfire/test_solidfire.py b/cinder/tests/unit/volume/drivers/solidfire/test_solidfire.py index dace4cd4b56..3af142f3fb7 100644 --- a/cinder/tests/unit/volume/drivers/solidfire/test_solidfire.py +++ b/cinder/tests/unit/volume/drivers/solidfire/test_solidfire.py @@ -682,6 +682,49 @@ class SolidFireVolumeTestCase(test.TestCase): self.assertEqual(get_vol_result['volumeID'], sfvol['volumeID']) def test_delete_volume(self): + vol_id = 'a720b3c0-d1f0-11e1-9b23-0800200c9a66' + testvol = test_utils.create_volume( + self.ctxt, + id=vol_id, + display_name='test_volume', + provider_id='1 5 None', + multiattach=False) + + fake_sfaccounts = [{'accountID': 5, + 'name': 'testprjid', + 'targetSecret': 'shhhh', + 'username': 'john-wayne'}] + + get_vol_result = {'volumeID': 5, + 'name': 'test_volume', + 'accountID': 25, + 'sliceCount': 1, + 'totalSize': 1 * units.Gi, + 'enable512e': True, + 'access': "readWrite", + 'status': "active", + 'attributes': {}, + 'qos': None, + 'iqn': 'super_fake_iqn'} + + mod_conf = self.configuration + mod_conf.sf_enable_vag = True + sfv = solidfire.SolidFireDriver(configuration=mod_conf) + with mock.patch.object(sfv, + '_get_sfaccounts_for_tenant', + return_value=fake_sfaccounts), \ + mock.patch.object(sfv, + '_get_sfvol_by_cinder_vref', + return_value=get_vol_result), \ + mock.patch.object(sfv, + '_issue_api_request'), \ + mock.patch.object(sfv, + '_remove_volume_from_vags') as rem_vol: + + sfv.delete_volume(testvol) + rem_vol.not_called(get_vol_result['volumeID']) + + def test_delete_multiattach_volume(self): vol_id = 'a720b3c0-d1f0-11e1-9b23-0800200c9a66' testvol = test_utils.create_volume( self.ctxt, diff --git a/cinder/volume/drivers/solidfire.py b/cinder/volume/drivers/solidfire.py index d8b9f73f033..f422b6a7cde 100644 --- a/cinder/volume/drivers/solidfire.py +++ b/cinder/volume/drivers/solidfire.py @@ -1535,12 +1535,15 @@ class SolidFireDriver(san.SanISCSIDriver): self._issue_api_request('PurgeDeletedVolume', params, endpoint=cluster['endpoint']) + # The multiattach volumes are only removed from the VAG on + # deletion. + if volume.get('multiattach'): + self._remove_volume_from_vags(sf_vol['volumeID']) + if sf_vol['status'] == 'active': params = {'volumeID': sf_vol['volumeID']} self._issue_api_request('DeleteVolume', params) self._issue_api_request('PurgeDeletedVolume', params) - if volume.get('multiattach'): - self._remove_volume_from_vags(sf_vol['volumeID']) else: LOG.error("Volume ID %s was not found on " "the SolidFire Cluster while attempting " diff --git a/releasenotes/notes/fix-multiattach-deletion-b3990acf1f5fd378.yaml b/releasenotes/notes/fix-multiattach-deletion-b3990acf1f5fd378.yaml new file mode 100644 index 00000000000..7108e647339 --- /dev/null +++ b/releasenotes/notes/fix-multiattach-deletion-b3990acf1f5fd378.yaml @@ -0,0 +1,4 @@ +--- +fixes: + - | + Fixed NetApp SolidFire bug that avoided multiatached volumes to be deleted.