Merge "Fix the backup restore issue for NetApp driver for REST client" into stable/2024.1

This commit is contained in:
Zuul 2024-06-17 20:11:03 +00:00 committed by Gerrit Code Review
commit 41b207454e
6 changed files with 38 additions and 17 deletions

View File

@ -6258,7 +6258,7 @@ class NetAppCmodeClient(client_base.NetAppBaseClient):
def snapmirror_restore_vol(self, source_path=None, dest_path=None, def snapmirror_restore_vol(self, source_path=None, dest_path=None,
source_vserver=None, dest_vserver=None, source_vserver=None, dest_vserver=None,
source_volume=None, dest_volume=None, source_volume=None, dest_volume=None,
source_snapshot=None): des_cluster=None, source_snapshot=None):
"""Restore snapshot copy from destination volume to source volume""" """Restore snapshot copy from destination volume to source volume"""
self._ensure_snapmirror_v2() self._ensure_snapmirror_v2()

View File

@ -5402,15 +5402,9 @@ class NetAppRestClient(object):
def snapmirror_restore_vol(self, source_path=None, dest_path=None, def snapmirror_restore_vol(self, source_path=None, dest_path=None,
source_vserver=None, dest_vserver=None, source_vserver=None, dest_vserver=None,
source_volume=None, dest_volume=None, source_volume=None, dest_volume=None,
source_snapshot=None): des_cluster=None, source_snapshot=None):
"""Restore snapshot copy from destination volume to source volume""" """Restore snapshot copy from destination volume to source volume"""
snapmirror_info = self.get_snapmirror_destinations(dest_path, snapmirror_info = self.get_snapmirrors(dest_path, source_path)
source_path,
dest_vserver,
source_vserver,
dest_volume,
source_volume,
)
if not snapmirror_info: if not snapmirror_info:
msg = _("There is no relationship between source " msg = _("There is no relationship between source "
"'%(source_path)s' and destination cluster" "'%(source_path)s' and destination cluster"
@ -5420,7 +5414,8 @@ class NetAppRestClient(object):
} }
raise exception.NetAppException(msg % msg_args) raise exception.NetAppException(msg % msg_args)
uuid = snapmirror_info[0].get('uuid') uuid = snapmirror_info[0].get('uuid')
body = {"destination": {"path": dest_path}, body = {"destination": {"path": dest_path,
"cluster": {"name": des_cluster}},
"source_snapshot": source_snapshot} "source_snapshot": source_snapshot}
try: try:
self.send_request(f"/snapmirror/relationships/{uuid}/restore", self.send_request(f"/snapmirror/relationships/{uuid}/restore",

View File

@ -4636,13 +4636,25 @@ class NetAppCmodeFileStorageLibrary(object):
raise exception.NetAppException("Not able to find vserver " raise exception.NetAppException("Not able to find vserver "
" and volume from SnpMirror" " and volume from SnpMirror"
" relationship.") " relationship.")
backend_name = self._get_backend(backup)
des_vserver_client = self._get_api_client_for_backend(
backend_name,
vserver=des_vserver,
)
vserver_client = src_vserver_client
backend_config = data_motion.get_backend_configuration(
backend_name)
if not backend_config.netapp_use_legacy_client:
vserver_client = des_vserver_client
snap_name = self._get_backup_snapshot_name(backup, snap_name = self._get_backup_snapshot_name(backup,
share_instance['id']) share_instance['id'])
source_path = src_vserver + ":" + src_vol_name source_path = src_vserver + ":" + src_vol_name
des_path = des_vserver + ":" + des_vol des_path = des_vserver + ":" + des_vol
src_vserver_client.snapmirror_restore_vol(source_path=des_path, source_cluster = src_vserver_client.get_cluster_name()
dest_path=source_path, vserver_client.snapmirror_restore_vol(source_path=des_path,
source_snapshot=snap_name) dest_path=source_path,
source_snapshot=snap_name,
des_cluster=source_cluster)
@na_utils.trace @na_utils.trace
def restore_backup_continue(self, context, backup, def restore_backup_continue(self, context, backup,

View File

@ -6901,7 +6901,8 @@ class NetAppRestCmodeClientTestCase(test.TestCase):
def test_snapmirror_restore_vol(self): def test_snapmirror_restore_vol(self):
uuid = fake.VOLUME_ITEM_SIMPLE_RESPONSE_REST["uuid"] uuid = fake.VOLUME_ITEM_SIMPLE_RESPONSE_REST["uuid"]
body = { body = {
"destination": {"path": fake.SM_DEST_PATH}, "destination": {"path": fake.SM_DEST_PATH,
"cluster": {"name": fake.CLUSTER_NAME}},
"source_snapshot": fake.SNAPSHOT_NAME "source_snapshot": fake.SNAPSHOT_NAME
} }
snapmirror_info = [{'destination-vserver': "fake_des_vserver", snapmirror_info = [{'destination-vserver': "fake_des_vserver",
@ -6909,12 +6910,13 @@ class NetAppRestCmodeClientTestCase(test.TestCase):
'relationship-status': "idle", 'relationship-status': "idle",
'uuid': uuid}] 'uuid': uuid}]
self.mock_object(self.client, 'get_snapmirror_destinations', self.mock_object(self.client, 'get_snapmirrors',
mock.Mock(return_value=snapmirror_info)) mock.Mock(return_value=snapmirror_info))
self.mock_object(self.client, 'send_request') self.mock_object(self.client, 'send_request')
self.client.snapmirror_restore_vol(source_path=fake.SM_SOURCE_PATH, self.client.snapmirror_restore_vol(source_path=fake.SM_SOURCE_PATH,
dest_path=fake.SM_DEST_PATH, dest_path=fake.SM_DEST_PATH,
source_snapshot=fake.SNAPSHOT_NAME) source_snapshot=fake.SNAPSHOT_NAME,
des_cluster=fake.CLUSTER_NAME)
self.client.send_request.assert_called_once_with( self.client.send_request.assert_called_once_with(
f'/snapmirror/relationships/{uuid}/restore', 'post', body=body) f'/snapmirror/relationships/{uuid}/restore', 'post', body=body)

View File

@ -7902,7 +7902,9 @@ class NetAppFileStorageLibraryTestCase(test.TestCase):
vserver_client.snapmirror_restore_vol.assert_called_once_with( vserver_client.snapmirror_restore_vol.assert_called_once_with(
source_path=mock.ANY, source_path=mock.ANY,
dest_path=mock.ANY, dest_path=mock.ANY,
source_snapshot=mock.ANY) source_snapshot=mock.ANY,
des_cluster=mock.ANY,
)
def test_restore_backup_continue(self): def test_restore_backup_continue(self):
vserver_client = mock.Mock() vserver_client = mock.Mock()

View File

@ -0,0 +1,10 @@
---
fixes:
- |
NetApp driver `bug #2059399
<https://bugs.launchpad.net/manila/+bug/2059399>`_:
Fix the backup restore issue for NetApp driver for REST client.
Backup restore is failing across the ONTAP cluster for REST client.
Added the logic to use to destination vserver client for REST client
to restore the backup and modify the restore lib for cmode REST
client accordingly.