From d5a16f96a4160f55e43d93fa9f225ddef395d1d1 Mon Sep 17 00:00:00 2001 From: danielarthurt Date: Fri, 14 Feb 2020 13:28:19 +0000 Subject: [PATCH] [NetApp] Fix share shrink error status This patch fixes the error raised by NetApp driver when the user try to shrink a share to a size smaller than the current used space. Now the driver raises "shrinking_possible_data_loss" instead of "shrinking_error". Change-Id: I01a549a0e299ae0d0d9b603a9d0797f16f4b68b3 Closes-Bug: #1858328 (cherry picked from commit c169902d41ef2b70ce1c1181408bc0916a7ea319) (cherry picked from commit 97a913209825f975ccfc2d76c91f4215d02622ad) (cherry picked from commit d7853ae6ed258077eab90fb29055a055e085a5fd) (cherry picked from commit 421cd52014a860815dd4df06cc0100a59a6d2f81) --- .../drivers/netapp/dataontap/client/api.py | 1 + .../netapp/dataontap/cluster_mode/lib_base.py | 18 ++++++++++--- .../dataontap/cluster_mode/test_lib_base.py | 27 +++++++++++++++++++ ...-fix-shrinking-error-48bcfffe694f5e81.yaml | 7 +++++ 4 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 releasenotes/notes/bug-1858328-netapp-fix-shrinking-error-48bcfffe694f5e81.yaml diff --git a/manila/share/drivers/netapp/dataontap/client/api.py b/manila/share/drivers/netapp/dataontap/client/api.py index 6c09973b0b..833a501416 100644 --- a/manila/share/drivers/netapp/dataontap/client/api.py +++ b/manila/share/drivers/netapp/dataontap/client/api.py @@ -33,6 +33,7 @@ from manila.share.drivers.netapp import utils LOG = log.getLogger(__name__) EONTAPI_EINVAL = '22' +EVOLOPNOTSUPP = '160' EAPIERROR = '13001' EAPINOTFOUND = '13005' ESNAPSHOTNOTALLOWED = '13023' diff --git a/manila/share/drivers/netapp/dataontap/cluster_mode/lib_base.py b/manila/share/drivers/netapp/dataontap/cluster_mode/lib_base.py index 3b4531e917..05a546af95 100644 --- a/manila/share/drivers/netapp/dataontap/cluster_mode/lib_base.py +++ b/manila/share/drivers/netapp/dataontap/cluster_mode/lib_base.py @@ -1342,9 +1342,21 @@ class NetAppCmodeFileStorageLibrary(object): filesys_size_fixed=False) LOG.debug('Shrinking share %(name)s to %(size)s GB.', {'name': share_name, 'size': new_size}) - vserver_client.set_volume_size(share_name, new_size) - self._adjust_qos_policy_with_volume_resize(share, new_size, - vserver_client) + + try: + vserver_client.set_volume_size(share_name, new_size) + except netapp_api.NaApiError as e: + if e.code == netapp_api.EVOLOPNOTSUPP: + msg = _('Failed to shrink share %(share_id)s. ' + 'The current used space is larger than the the size' + ' requested.') + msg_args = {'share_id': share['id']} + LOG.error(msg, msg_args) + raise exception.ShareShrinkingPossibleDataLoss( + share_id=share['id']) + + self._adjust_qos_policy_with_volume_resize( + share, new_size, vserver_client) @na_utils.trace def update_access(self, context, share, access_rules, add_rules, diff --git a/manila/tests/share/drivers/netapp/dataontap/cluster_mode/test_lib_base.py b/manila/tests/share/drivers/netapp/dataontap/cluster_mode/test_lib_base.py index 93a50838ba..edb11e30de 100644 --- a/manila/tests/share/drivers/netapp/dataontap/cluster_mode/test_lib_base.py +++ b/manila/tests/share/drivers/netapp/dataontap/cluster_mode/test_lib_base.py @@ -97,6 +97,10 @@ class NetAppFileStorageLibraryTestCase(test.TestCase): mock.Mock(return_value=self.mock_dm_session)) self.mock_object(data_motion, 'get_client_for_backend') + def _mock_api_error(self, code='fake', message='fake'): + return mock.Mock(side_effect=netapp_api.NaApiError(code=code, + message=message)) + def test_init(self): self.assertEqual(fake.DRIVER_NAME, self.library.driver_name) self.assertEqual(1, na_utils.validate_driver_instantiation.call_count) @@ -2233,6 +2237,29 @@ class NetAppFileStorageLibraryTestCase(test.TestCase): mock_adjust_qos_policy.assert_called_once_with( fake.SHARE, new_size, vserver_client) + def test_shrinking_possible_data_loss(self): + + naapi_error = self._mock_api_error(code=netapp_api.EVOLOPNOTSUPP, + message='Possible data loss') + + vserver_client = mock.Mock() + self.mock_object(self.library, + '_get_vserver', + mock.Mock(return_value=(fake.VSERVER1, + vserver_client))) + + mock_set_volume_size = self.mock_object( + vserver_client, 'set_volume_size', naapi_error) + + new_size = fake.SHARE['size'] - 1 + + self.assertRaises(exception.ShareShrinkingPossibleDataLoss, + self.library.shrink_share, + fake.SHARE, new_size) + + self.library._get_vserver.assert_called_once_with(share_server=None) + mock_set_volume_size.assert_called_once_with(fake.SHARE_NAME, new_size) + def test_update_access(self): vserver_client = mock.Mock() diff --git a/releasenotes/notes/bug-1858328-netapp-fix-shrinking-error-48bcfffe694f5e81.yaml b/releasenotes/notes/bug-1858328-netapp-fix-shrinking-error-48bcfffe694f5e81.yaml new file mode 100644 index 0000000000..9bc7dbb00c --- /dev/null +++ b/releasenotes/notes/bug-1858328-netapp-fix-shrinking-error-48bcfffe694f5e81.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + Fixed an issue in NetApp driver when shrinking shares to a size + smaller than the current used space. Now it will return a more + appropriate error status called + ``shrinking_possible_data_loss_error``.