Catch ImageNotFound exception when deleting rbd volume

When deleting a rbd volume it is possible for remove() to
throw a ImageNotFound exception. In this case we should
catch the exception, so the volume delete can continue.

Closes-Bug: 1403172
Change-Id: I32cf9d3774c129cda4449996ceeb4b43b7e42904
(cherry picked from commit ddc8d7a423)
This commit is contained in:
Jordan Tardif 2014-09-15 17:59:06 -04:00
parent ff51359f48
commit 36bb8c285b
2 changed files with 31 additions and 0 deletions

View File

@ -349,6 +349,32 @@ class RBDTestCase(test.TestCase):
self.assertEqual(RAISED_EXCEPTIONS,
[self.mock_rbd.ImageBusy])
@common_mocks
def test_delete_volume_not_found(self):
self.mock_rbd.Image.list_snaps = mock.Mock()
self.mock_rbd.Image.list_snaps.return_value = []
self.mock_rbd.Image.unprotect_snap = mock.Mock()
self.mock_rbd.RBD.remove = mock.Mock()
self.mock_rbd.RBD.remove.side_effect = self.mock_rbd.ImageNotFound
with mock.patch.object(self.driver, '_get_clone_info') as \
mock_get_clone_info:
mock_get_clone_info.return_value = (None, None, None)
with mock.patch.object(self.driver, '_delete_backup_snaps') as \
mock_delete_backup_snaps:
with mock.patch.object(driver, 'RADOSClient') as \
mock_rados_client:
self.assertIsNone(self.driver.delete_volume(self.volume))
mock_get_clone_info.assert_called_once()
self.mock_rbd.Image.list_snaps.assert_called_once()
mock_rados_client.assert_called_once()
mock_delete_backup_snaps.assert_called_once()
self.assertFalse(self.mock_rbd.Image.unprotect_snap.called)
# Make sure the exception was raised
self.assertEqual(RAISED_EXCEPTIONS,
[self.mock_rbd.ImageNotFound])
@common_mocks
def test_create_snapshot(self):
proxy = self.mock_proxy.return_value

View File

@ -659,6 +659,11 @@ class RBDDriver(driver.VolumeDriver):
# Now raise this so that volume stays available so that we
# delete can be retried.
raise exception.VolumeIsBusy(msg, volume_name=volume_name)
except self.rbd.ImageNotFound:
msg = (_("RBD volume %s not found, allowing delete "
"operation to proceed.") % volume_name)
LOG.info(msg)
return
# If it is a clone, walk back up the parent chain deleting
# references.