Allow removing NFS snapshots in error status

The NFS driver doesn't allow to delete snapshots in error state when
snapshot support is disable.

I'm facing some scenarios where snapshots are enabled then a snapshot
is created and after that then snapshots are disabled. This results
in error state snapshots that can't be deleted.  Another scenario is
- with nfs snapshot support disable from the beginning- the API layer
allows the snapshot to be created but the NFS driver sets the status
to "error" leaving the snapshot in the DB with error state.
Because of that, I have snapshots in error state that I'm not able
to delete.

The purpose of this fix allow deleting snapshots in error state.
It makes sense to block creating snapshots when snapshot support is
False. However, when deleting snapshot we don't want to block
attempts to delete a broken snapshot DB entry, which is necessary to
clean up a failed snapshot create.

Closes-Bug: #1842088
Change-Id: Ieb19d5e3f58ae2343b6b145772fec33cb7517ab5
(cherry picked from commit 5714bdb844)
(cherry picked from commit 5a4f3ac53a)
(cherry picked from commit fb0efc4214)
(cherry picked from commit e9ef536958)
This commit is contained in:
Sofia Enriquez 2019-08-28 17:38:50 -03:00
parent 9c770d9749
commit 51a06f3fcc
2 changed files with 3 additions and 1 deletions

View File

@ -1378,6 +1378,8 @@ class NfsDriverTestCase(test.TestCase):
mock.patch.object(drv, '_read_info_file', return_value={}), \
mock.patch.object(drv, '_do_create_snapshot') \
as mock_do_create_snapshot, \
mock.patch.object(drv, '_check_snapshot_support') \
as mock_check_support, \
mock.patch.object(drv, '_write_info_file') \
as mock_write_info_file, \
mock.patch.object(drv, 'get_active_image_from_info',
@ -1386,6 +1388,7 @@ class NfsDriverTestCase(test.TestCase):
return_value=snap_path):
self._driver.create_snapshot(fake_snap)
mock_check_support.assert_called_once()
mock_do_create_snapshot.assert_called_with(fake_snap, volume['name'],
snap_path)
mock_write_info_file.assert_called_with(

View File

@ -574,7 +574,6 @@ class NfsDriver(remotefs.RemoteFSSnapDriverDistributed):
def delete_snapshot(self, snapshot):
"""Apply locking to the delete snapshot operation."""
self._check_snapshot_support()
return self._delete_snapshot(snapshot)
def _copy_volume_from_snapshot(self, snapshot, volume, volume_size):