diff --git a/manila/share/drivers/qnap/qnap.py b/manila/share/drivers/qnap/qnap.py index 98a4b1b907..3d56c31406 100644 --- a/manila/share/drivers/qnap/qnap.py +++ b/manila/share/drivers/qnap/qnap.py @@ -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, } diff --git a/manila/tests/share/drivers/qnap/test_qnap.py b/manila/tests/share/drivers/qnap/test_qnap.py index 0f252e35f5..6c397deeeb 100644 --- a/manila/tests/share/drivers/qnap/test_qnap.py +++ b/manila/tests/share/drivers/qnap/test_qnap.py @@ -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( diff --git a/releasenotes/notes/qnap-fix-manage-snapshot-not-exist-4b111982ddc5fdae.yaml b/releasenotes/notes/qnap-fix-manage-snapshot-not-exist-4b111982ddc5fdae.yaml new file mode 100644 index 0000000000..488ed2a161 --- /dev/null +++ b/releasenotes/notes/qnap-fix-manage-snapshot-not-exist-4b111982ddc5fdae.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + Fixed the QNAP driver so that the snapshot which does not exist in NAS + will not be managed.