INFINIDAT: support deleting datasets with snapshots

Deleting a share or a snapshot from the INFINDIAT InfiniBox should
support a case where the share or snapshot has snapshots that were
created externally (i.e. through the InfiniBox interface).

Change-Id: Ic9d03493283c573506330a620fa21516bbd09c26
Closes-Bug: #1746439
This commit is contained in:
Amit Oren 2018-01-28 16:25:16 +02:00
parent a80c6fca57
commit 09da8f8d9d
3 changed files with 17 additions and 17 deletions

View File

@ -331,20 +331,12 @@ class InfiniboxShareDriver(driver.ShareDriver):
"delete") "delete")
LOG.warning(message, {"share": share}) LOG.warning(message, {"share": share})
return # filesystem not found return # filesystem not found
if infinidat_filesystem.has_children():
# can't delete a filesystem that has a live snapshot
if is_snapshot:
raise exception.ShareSnapshotIsBusy(snapshot_name=dataset_name)
else:
reason = _("share has snapshots and cannot be deleted")
raise exception.ShareBusyException(reason=reason)
try: try:
infinidat_export = self._get_export(infinidat_filesystem) infinidat_export = self._get_export(infinidat_filesystem)
except exception.ShareBackendException:
# it's possible that the export has been deleted
pass
else:
infinidat_export.safe_delete() infinidat_export.safe_delete()
except exception.ShareBackendException:
# it is possible that the export has been deleted
pass
infinidat_filesystem.safe_delete() infinidat_filesystem.safe_delete()
@infinisdk_to_manila_exceptions @infinisdk_to_manila_exceptions

View File

@ -378,10 +378,12 @@ class InfiniboxDriverTestCase(InfiniboxDriverTestCaseBase):
# should not raise an exception # should not raise an exception
self.driver.delete_share(None, test_share) self.driver.delete_share(None, test_share)
def test_delete_share_with_children(self): def test_delete_share_with_snapshots(self):
# deleting a share with snapshots should succeed:
self._mock_filesystem.has_children.return_value = True self._mock_filesystem.has_children.return_value = True
self.assertRaises(exception.ShareBusyException, self.driver.delete_share(None, test_share)
self.driver.delete_share, None, test_share) self._mock_filesystem.safe_delete.assert_called_once()
self._mock_export.safe_delete.assert_called_once()
def test_delete_share_wrong_share_protocol(self): def test_delete_share_wrong_share_protocol(self):
# set test_share protocol for non-NFS (CIFS, for that matter) and see # set test_share protocol for non-NFS (CIFS, for that matter) and see
@ -468,10 +470,12 @@ class InfiniboxDriverTestCase(InfiniboxDriverTestCaseBase):
self._mock_filesystem.safe_delete.assert_called_once() self._mock_filesystem.safe_delete.assert_called_once()
self._mock_export.safe_delete.assert_called_once() self._mock_export.safe_delete.assert_called_once()
def test_delete_snapshot_with_children(self): def test_delete_snapshot_with_snapshots(self):
# deleting a snapshot with snapshots should succeed:
self._mock_filesystem.has_children.return_value = True self._mock_filesystem.has_children.return_value = True
self.assertRaises(exception.ShareSnapshotIsBusy, self.driver.delete_snapshot(None, test_snapshot)
self.driver.delete_snapshot, None, test_snapshot) self._mock_filesystem.safe_delete.assert_called_once()
self._mock_export.safe_delete.assert_called_once()
def test_delete_snapshot_doesnt_exist(self): def test_delete_snapshot_doesnt_exist(self):
self._system.filesystems.safe_get.return_value = None self._system.filesystems.safe_get.return_value = None

View File

@ -0,0 +1,4 @@
---
fixes:
- Fixed a failure in the INFINIDAT share driver which occurs while deleting
shares with externally created snapshots.