From 8ae267e4f144e88dda9b513f104b3244c544caea Mon Sep 17 00:00:00 2001 From: Naresh Kumar Gunjalli Date: Thu, 14 Feb 2019 13:21:30 +0000 Subject: [PATCH] [NetApp] Allow extension/shrinking of NetApp replicated share The NetApp ONTAP driver is now fixed to allow extension and shrinking of share replicas after they get promoted. Change-Id: Iea92feaf5894c10674d2ec4c1a4d7b0191e6d5b4 Closes-Bug: #1700871 (cherry picked from commit 75f108b0aee630b54a44d0c27467a85fd8a6af3a) (cherry picked from commit e38c8b508ff0cd1f5ea81a0f566fd83fb0b069ce) (cherry picked from commit 5255ca20fb2aff3b2548475d4b7914dc02eb8bbf) --- .../netapp/dataontap/client/client_cmode.py | 32 +++++++++++++++++++ .../netapp/dataontap/cluster_mode/lib_base.py | 9 ++++++ .../dataontap/client/test_client_cmode.py | 31 ++++++++++++++++++ ...-of-replicated-share-2c9709180d954308.yaml | 4 +++ 4 files changed, 76 insertions(+) create mode 100644 releasenotes/notes/bug-1700871-ontap-allow-extend-of-replicated-share-2c9709180d954308.yaml diff --git a/manila/share/drivers/netapp/dataontap/client/client_cmode.py b/manila/share/drivers/netapp/dataontap/client/client_cmode.py index e338d73411..f32273333d 100644 --- a/manila/share/drivers/netapp/dataontap/client/client_cmode.py +++ b/manila/share/drivers/netapp/dataontap/client/client_cmode.py @@ -1662,6 +1662,38 @@ class NetAppCmodeClient(client_base.NetAppBaseClient): errors[0].get_child_content('error-code'), errors[0].get_child_content('error-message')) + @na_utils.trace + def set_volume_filesys_size_fixed(self, + volume_name, filesys_size_fixed=False): + """Set volume file system size fixed to true/false.""" + api_args = { + 'query': { + 'volume-attributes': { + 'volume-id-attributes': { + 'name': volume_name, + }, + }, + }, + 'attributes': { + 'volume-attributes': { + 'volume-space-attributes': { + 'is-filesys-size-fixed': six.text_type( + filesys_size_fixed).lower(), + }, + }, + }, + } + result = self.send_request('volume-modify-iter', api_args) + failures = result.get_child_content('num-failed') + if failures and int(failures) > 0: + failure_list = result.get_child_by_name( + 'failure-list') or netapp_api.NaElement('none') + errors = failure_list.get_children() + if errors: + raise netapp_api.NaApiError( + errors[0].get_child_content('error-code'), + errors[0].get_child_content('error-message')) + @na_utils.trace def set_volume_security_style(self, volume_name, security_style='unix'): """Set volume security style""" 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 84a7615332..c363a9c17e 100644 --- a/manila/share/drivers/netapp/dataontap/cluster_mode/lib_base.py +++ b/manila/share/drivers/netapp/dataontap/cluster_mode/lib_base.py @@ -1354,6 +1354,8 @@ class NetAppCmodeFileStorageLibrary(object): """Extends size of existing share.""" vserver, vserver_client = self._get_vserver(share_server=share_server) share_name = self._get_backend_share_name(share['id']) + vserver_client.set_volume_filesys_size_fixed(share_name, + filesys_size_fixed=False) LOG.debug('Extending share %(name)s to %(size)s GB.', {'name': share_name, 'size': new_size}) vserver_client.set_volume_size(share_name, new_size) @@ -1365,6 +1367,8 @@ class NetAppCmodeFileStorageLibrary(object): """Shrinks size of existing share.""" vserver, vserver_client = self._get_vserver(share_server=share_server) share_name = self._get_backend_share_name(share['id']) + vserver_client.set_volume_filesys_size_fixed(share_name, + 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) @@ -1773,6 +1777,11 @@ class NetAppCmodeFileStorageLibrary(object): new_active_replica['export_locations'] = self._create_export( new_active_replica, share_server, vserver, vserver_client) new_active_replica['replica_state'] = constants.REPLICA_STATE_ACTIVE + + # 4. Set File system size fixed to false + vserver_client.set_volume_filesys_size_fixed(share_name, + filesys_size_fixed=False) + return new_active_replica def _safe_change_replica_source(self, dm_session, replica, diff --git a/manila/tests/share/drivers/netapp/dataontap/client/test_client_cmode.py b/manila/tests/share/drivers/netapp/dataontap/client/test_client_cmode.py index 10e494266a..5ab5906bc9 100644 --- a/manila/tests/share/drivers/netapp/dataontap/client/test_client_cmode.py +++ b/manila/tests/share/drivers/netapp/dataontap/client/test_client_cmode.py @@ -3182,6 +3182,37 @@ class NetAppClientCmodeTestCase(test.TestCase): fake.SHARE_NAME, 10) + @ddt.data(True, False) + def test_set_volume_filesys_size_fixed(self, filesys_size_fixed): + api_response = netapp_api.NaElement( + fake.VOLUME_MODIFY_ITER_RESPONSE) + self.mock_object(self.client, + 'send_request', + mock.Mock(return_value=api_response)) + + self.client.set_volume_filesys_size_fixed(fake.SHARE_NAME, + filesys_size_fixed) + + api_args = { + 'query': { + 'volume-attributes': { + 'volume-id-attributes': { + 'name': fake.SHARE_NAME + } + } + }, + 'attributes': { + 'volume-attributes': { + 'volume-space-attributes': { + 'is-filesys-size-fixed': six.text_type( + filesys_size_fixed).lower(), + }, + }, + }, + } + self.client.send_request.assert_called_once_with( + 'volume-modify-iter', api_args) + def test_set_volume_size_api_error(self): api_response = netapp_api.NaElement( diff --git a/releasenotes/notes/bug-1700871-ontap-allow-extend-of-replicated-share-2c9709180d954308.yaml b/releasenotes/notes/bug-1700871-ontap-allow-extend-of-replicated-share-2c9709180d954308.yaml new file mode 100644 index 0000000000..f29fbe380d --- /dev/null +++ b/releasenotes/notes/bug-1700871-ontap-allow-extend-of-replicated-share-2c9709180d954308.yaml @@ -0,0 +1,4 @@ +--- +fixes: + - The NetApp ONTAP driver is now fixed to allow extension and shrinking + of share replicas after they get promoted.