This is an automated email from the ASF dual-hosted git repository.

dahn pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/main by this push:
     new 6ba0ef2f50 Find VBRViDatastore/VBRServer by name (#6582)
6ba0ef2f50 is described below

commit 6ba0ef2f500381975a79f6e9bafc6a3e0ebe10b6
Author: SadiJr <[email protected]>
AuthorDate: Tue Aug 2 04:07:03 2022 -0300

    Find VBRViDatastore/VBRServer by name (#6582)
    
    Co-authored-by: Rafael Weingärtner <[email protected]>
---
 .../cloudstack/backup/BackupManagerImpl.java       | 65 ++++++++++++++-----
 .../cloudstack/backup/BackupManagerTest.java       | 72 ++++++++++++++++++++++
 2 files changed, 120 insertions(+), 17 deletions(-)

diff --git 
a/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java 
b/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java
index 387bd8a4e2..3956fe40fb 100644
--- a/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java
+++ b/server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java
@@ -66,6 +66,7 @@ import 
org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import 
org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.log4j.Logger;
 
@@ -634,9 +635,9 @@ public class BackupManagerImpl extends ManagerBase 
implements BackupManager {
         }
         accountManager.checkAccess(CallContext.current().getCallingAccount(), 
null, true, vmFromBackup);
 
-        Pair<String, String> restoreInfo = 
getRestoreVolumeHostAndDatastore(vm);
-        String hostIp = restoreInfo.first();
-        String datastoreUuid = restoreInfo.second();
+        Pair<HostVO, StoragePoolVO> restoreInfo = 
getRestoreVolumeHostAndDatastore(vm);
+        HostVO host = restoreInfo.first();
+        StoragePoolVO datastore = restoreInfo.second();
 
         LOG.debug("Asking provider to restore volume " + backedUpVolumeUuid + 
" from backup " + backupId +
                 " (with external ID " + backup.getExternalId() + ") and attach 
it to VM: " + vm.getUuid());
@@ -647,17 +648,47 @@ public class BackupManagerImpl extends ManagerBase 
implements BackupManager {
         }
 
         BackupProvider backupProvider = 
getBackupProvider(offering.getProvider());
-        Pair<Boolean, String> result = 
backupProvider.restoreBackedUpVolume(backup, backedUpVolumeUuid, hostIp, 
datastoreUuid);
-        if (!result.first()) {
-            throw new CloudRuntimeException("Error restoring volume " + 
backedUpVolumeUuid);
+        LOG.debug(String.format("Trying to restore volume using host private 
IP address: [%s].", host.getPrivateIpAddress()));
+
+        String[] hostPossibleValues = {host.getPrivateIpAddress(), 
host.getName()};
+        String[] datastoresPossibleValues = {datastore.getUuid(), 
datastore.getName()};
+
+        Pair<Boolean, String> result = 
restoreBackedUpVolume(backedUpVolumeUuid, backup, backupProvider, 
hostPossibleValues, datastoresPossibleValues);
+
+        if (BooleanUtils.isFalse(result.first())) {
+            throw new CloudRuntimeException(String.format("Error restoring 
volume [%s] of VM [%s] to host [%s] using backup provider [%s] due to: [%s].",
+                    backedUpVolumeUuid, vm.getUuid(), host.getUuid(), 
backupProvider.getName(), result.second()));
         }
         if (!attachVolumeToVM(vm.getDataCenterId(), result.second(), 
vmFromBackup.getBackupVolumeList(),
-                            backedUpVolumeUuid, vm, datastoreUuid, backup)) {
-            throw new CloudRuntimeException("Error attaching volume " + 
backedUpVolumeUuid + " to VM " + vm.getUuid());
+                            backedUpVolumeUuid, vm, datastore.getUuid(), 
backup)) {
+            throw new CloudRuntimeException(String.format("Error attaching 
volume [%s] to VM [%s]." + backedUpVolumeUuid, vm.getUuid()));
         }
         return true;
     }
 
+    protected Pair<Boolean, String> restoreBackedUpVolume(final String 
backedUpVolumeUuid, final BackupVO backup, BackupProvider backupProvider, 
String[] hostPossibleValues,
+            String[] datastoresPossibleValues) {
+        Pair<Boolean, String> result = new  Pair<>(false, "");
+        for (String hostData : hostPossibleValues) {
+            for (String datastoreData : datastoresPossibleValues) {
+                LOG.debug(String.format("Trying to restore volume [UUID: %s], 
using host [%s] and datastore [%s].",
+                        backedUpVolumeUuid, hostData, datastoreData));
+
+                try {
+                    result = backupProvider.restoreBackedUpVolume(backup, 
backedUpVolumeUuid, hostData, datastoreData);
+
+                    if (BooleanUtils.isTrue(result.first())) {
+                        return result;
+                    }
+                } catch (Exception e) {
+                    LOG.debug(String.format("Failed to restore volume [UUID: 
%s], using host [%s] and datastore [%s] due to: [%s].",
+                            backedUpVolumeUuid, hostData, datastoreData, 
e.getMessage()), e);
+                }
+            }
+        }
+        return result;
+    }
+
     @Override
     @ActionEvent(eventType = EventTypes.EVENT_VM_BACKUP_DELETE, 
eventDescription = "deleting VM backup", async = true)
     public boolean deleteBackup(final Long backupId) {
@@ -694,21 +725,20 @@ public class BackupManagerImpl extends ManagerBase 
implements BackupManager {
     /**
      * Get the pair: hostIp, datastoreUuid in which to restore the volume, 
based on the VM to be attached information
      */
-    private Pair<String, String> getRestoreVolumeHostAndDatastore(VMInstanceVO 
vm) {
+    private Pair<HostVO, StoragePoolVO> 
getRestoreVolumeHostAndDatastore(VMInstanceVO vm) {
         List<VolumeVO> rootVmVolume = 
volumeDao.findIncludingRemovedByInstanceAndType(vm.getId(), Volume.Type.ROOT);
         Long poolId = rootVmVolume.get(0).getPoolId();
         StoragePoolVO storagePoolVO = primaryDataStoreDao.findById(poolId);
-        String datastoreUuid = storagePoolVO.getUuid();
-        String hostIp = vm.getHostId() == null ?
-                            getHostIp(storagePoolVO) :
-                            
hostDao.findById(vm.getHostId()).getPrivateIpAddress();
-        return new Pair<>(hostIp, datastoreUuid);
+        HostVO hostVO = vm.getHostId() == null ?
+                            getFirstHostFromStoragePool(storagePoolVO) :
+                            hostDao.findById(vm.getHostId());
+        return new Pair<>(hostVO, storagePoolVO);
     }
 
     /**
-     * Find a host IP from storage pool access
+     * Find a host from storage pool access
      */
-    private String getHostIp(StoragePoolVO storagePoolVO) {
+    private HostVO getFirstHostFromStoragePool(StoragePoolVO storagePoolVO) {
         List<HostVO> hosts = null;
         if (storagePoolVO.getScope().equals(ScopeType.CLUSTER)) {
             hosts = hostDao.findByClusterId(storagePoolVO.getClusterId());
@@ -716,9 +746,10 @@ public class BackupManagerImpl extends ManagerBase 
implements BackupManager {
         } else if (storagePoolVO.getScope().equals(ScopeType.ZONE)) {
             hosts = 
hostDao.findByDataCenterId(storagePoolVO.getDataCenterId());
         }
-        return hosts.get(0).getPrivateIpAddress();
+        return hosts.get(0);
     }
 
+
     /**
      * Attach volume to VM
      */
diff --git 
a/server/src/test/java/org/apache/cloudstack/backup/BackupManagerTest.java 
b/server/src/test/java/org/apache/cloudstack/backup/BackupManagerTest.java
index 42efe14a64..304e6ddce9 100644
--- a/server/src/test/java/org/apache/cloudstack/backup/BackupManagerTest.java
+++ b/server/src/test/java/org/apache/cloudstack/backup/BackupManagerTest.java
@@ -16,6 +16,7 @@
 // under the License.
 package org.apache.cloudstack.backup;
 import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.when;
 
 import org.apache.cloudstack.api.ServerApiException;
@@ -30,6 +31,7 @@ import org.mockito.MockitoAnnotations;
 import org.mockito.Spy;
 
 import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.utils.Pair;
 
 public class BackupManagerTest {
     @Spy
@@ -39,6 +41,12 @@ public class BackupManagerTest {
     @Mock
     BackupOfferingDao backupOfferingDao;
 
+    @Mock
+    BackupProvider backupProvider;
+
+    private String[] hostPossibleValues = {"127.0.0.1", "hostname"};
+    private String[] datastoresPossibleValues = 
{"e9804933-8609-4de3-bccc-6278072a496c", "datastore-name"};
+
     @Before
     public void setup() throws Exception {
         MockitoAnnotations.initMocks(this);
@@ -117,4 +125,68 @@ public class BackupManagerTest {
         assertEquals("New description", updated.getDescription());
         assertEquals(true, updated.isUserDrivenBackupAllowed());
     }
+
+    @Test
+    public void restoreBackedUpVolumeTestHostIpAndDatastoreUuid() {
+        BackupVO backupVO = new BackupVO();
+        String volumeUuid = "5f4ed903-ac23-4f8a-b595-69c73c40593f";
+
+        Mockito.when(backupProvider.restoreBackedUpVolume(Mockito.any(), 
Mockito.eq(volumeUuid),
+                Mockito.eq("127.0.0.1"), 
Mockito.eq("e9804933-8609-4de3-bccc-6278072a496c"))).thenReturn(new 
Pair<Boolean, String>(Boolean.TRUE, "Success"));
+        Pair<Boolean,String> restoreBackedUpVolume = 
backupManager.restoreBackedUpVolume(volumeUuid, backupVO, backupProvider, 
hostPossibleValues, datastoresPossibleValues);
+
+        assertEquals(Boolean.TRUE, restoreBackedUpVolume.first());
+        assertEquals("Success", restoreBackedUpVolume.second());
+
+        Mockito.verify(backupProvider, 
times(1)).restoreBackedUpVolume(Mockito.any(), Mockito.anyString(),
+                Mockito.anyString(), Mockito.anyString());
+    }
+
+    @Test
+    public void restoreBackedUpVolumeTestHostIpAndDatastoreName() {
+        BackupVO backupVO = new BackupVO();
+        String volumeUuid = "5f4ed903-ac23-4f8a-b595-69c73c40593f";
+
+        Mockito.when(backupProvider.restoreBackedUpVolume(Mockito.any(), 
Mockito.eq(volumeUuid),
+                Mockito.eq("127.0.0.1"), 
Mockito.eq("datastore-name"))).thenReturn(new Pair<Boolean, 
String>(Boolean.TRUE, "Success2"));
+        Pair<Boolean,String> restoreBackedUpVolume = 
backupManager.restoreBackedUpVolume(volumeUuid, backupVO, backupProvider, 
hostPossibleValues, datastoresPossibleValues);
+
+        assertEquals(Boolean.TRUE, restoreBackedUpVolume.first());
+        assertEquals("Success2", restoreBackedUpVolume.second());
+
+        Mockito.verify(backupProvider, 
times(2)).restoreBackedUpVolume(Mockito.any(), Mockito.anyString(),
+                Mockito.anyString(), Mockito.anyString());
+    }
+
+    @Test
+    public void restoreBackedUpVolumeTestHostNameAndDatastoreUuid() {
+        BackupVO backupVO = new BackupVO();
+        String volumeUuid = "5f4ed903-ac23-4f8a-b595-69c73c40593f";
+
+        Mockito.when(backupProvider.restoreBackedUpVolume(Mockito.any(), 
Mockito.eq(volumeUuid),
+                Mockito.eq("hostname"), 
Mockito.eq("e9804933-8609-4de3-bccc-6278072a496c"))).thenReturn(new 
Pair<Boolean, String>(Boolean.TRUE, "Success3"));
+        Pair<Boolean,String> restoreBackedUpVolume = 
backupManager.restoreBackedUpVolume(volumeUuid, backupVO, backupProvider, 
hostPossibleValues, datastoresPossibleValues);
+
+        assertEquals(Boolean.TRUE, restoreBackedUpVolume.first());
+        assertEquals("Success3", restoreBackedUpVolume.second());
+
+        Mockito.verify(backupProvider, 
times(3)).restoreBackedUpVolume(Mockito.any(), Mockito.anyString(),
+                Mockito.anyString(), Mockito.anyString());
+    }
+
+    @Test
+    public void restoreBackedUpVolumeTestHostAndDatastoreName() {
+        BackupVO backupVO = new BackupVO();
+        String volumeUuid = "5f4ed903-ac23-4f8a-b595-69c73c40593f";
+
+        Mockito.when(backupProvider.restoreBackedUpVolume(Mockito.any(), 
Mockito.eq(volumeUuid),
+                Mockito.eq("hostname"), 
Mockito.eq("datastore-name"))).thenReturn(new Pair<Boolean, 
String>(Boolean.TRUE, "Success4"));
+        Pair<Boolean,String> restoreBackedUpVolume = 
backupManager.restoreBackedUpVolume(volumeUuid, backupVO, backupProvider, 
hostPossibleValues, datastoresPossibleValues);
+
+        assertEquals(Boolean.TRUE, restoreBackedUpVolume.first());
+        assertEquals("Success4", restoreBackedUpVolume.second());
+
+        Mockito.verify(backupProvider, 
times(4)).restoreBackedUpVolume(Mockito.any(), Mockito.anyString(),
+                Mockito.anyString(), Mockito.anyString());
+    }
 }
\ No newline at end of file

Reply via email to