Merge "Fix the backup restore issue for NetApp driver for REST client" into stable/2024.1
This commit is contained in:
commit
41b207454e
@ -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()
|
||||||
|
|
||||||
|
@ -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",
|
||||||
|
@ -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,
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
@ -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.
|
Loading…
x
Reference in New Issue
Block a user