QNAP: driver should not manage snapshot which does not exist

The snapshot which does not exist in NAS shuold not be managed.

Change-Id: I06475ccc507ee62f3da8f8795694f6da14064036
Closes-Bug: #1810374
This commit is contained in:
Chris Yang 2019-01-03 15:14:33 +08:00
parent d144bf7593
commit cb7b8e292a
3 changed files with 47 additions and 1 deletions

View File

@ -75,9 +75,11 @@ class QnapShareDriver(driver.ShareDriver):
of managed share should not be changed.
1.0.6 - Add support for QES fw 2.1.0.
1.0.7 - Add support for QES fw on TDS series NAS model.
1.0.8 - Fix bug, driver should not manage snapshot which does not
exist in NAS.
"""
DRIVER_VERSION = '1.0.7'
DRIVER_VERSION = '1.0.8'
def __init__(self, *args, **kwargs):
"""Initialize QnapShareDriver."""
@ -900,6 +902,7 @@ class QnapShareDriver(driver.ShareDriver):
if len(snapshot_id_info) == 2:
share_name = snapshot_id_info[0]
snapshot_name = snapshot_id_info[1]
else:
msg = _("Incorrect provider_location format. It should have the "
"following format: share_name@snapshot_name.")
@ -914,6 +917,15 @@ class QnapShareDriver(driver.ShareDriver):
LOG.error(msg)
raise exception.ShareNotFound(reason=msg)
check_snapshot = self.api_executor.get_snapshot_info(
volID=volID, snapshot_name=snapshot_name)
if check_snapshot is None:
msg = (_("The snapshot %(snapshot_name)s was not "
"found on backend.") %
{'snapshot_name': snapshot_name})
LOG.error(msg)
raise exception.InvalidParameterValue(err=msg)
_metadata = {
'snapshot_id': snapshot_id,
}

View File

@ -1147,6 +1147,35 @@ class QnapShareDriverTestCase(QnapShareDriverBaseTestCase):
mock_private_storage.update.assert_called_once_with(
'fakeSnapshotId', fake_metadata)
@mock.patch.object(qnap.QnapShareDriver, '_get_location_path')
def test_manage_existing_snapshot_not_exist(
self,
mock_get_location_path):
"""Test manage existing snapshot with snapshot which does not exist."""
fake_snapshot = fakes.SnapshotClass(
10, 'fakeShareName@fakeSnapshotName')
mock_api_executor = qnap.QnapShareDriver._create_api_executor
mock_api_executor.return_value.get_share_info.return_value = (
self.get_share_info_return_value())
mock_api_executor.return_value.get_snapshot_info.return_value = None
mock_private_storage = mock.Mock()
mock_private_storage.get.side_effect = [
'fakeVolId', 'fakeVolName']
self._do_setup('http://1.2.3.4:8080', '1.2.3.4', 'admin',
'qnapadmin', 'Storage Pool 1',
private_storage=mock_private_storage)
mock_api_return = mock_api_executor.return_value
self.assertRaises(
exception.InvalidParameterValue,
self.driver.manage_existing_snapshot,
snapshot=fake_snapshot,
driver_options='driver_options')
mock_api_return.get_share_info.assert_called_once_with(
'Storage Pool 1', vol_no='fakeVolId')
def test_unmanage_snapshot(self):
"""Test unmanage snapshot."""
fake_snapshot = fakes.SnapshotClass(

View File

@ -0,0 +1,5 @@
---
fixes:
- |
Fixed the QNAP driver so that the snapshot which does not exist in NAS
will not be managed.