Skip to content

Commit 6ba0ef2

Browse files
Find VBRViDatastore/VBRServer by name (#6582)
Co-authored-by: Rafael Weingärtner <rafaelweingartner@gmail.com>
1 parent 9bc3b7b commit 6ba0ef2

File tree

2 files changed

+120
-17
lines changed

2 files changed

+120
-17
lines changed

server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java

Lines changed: 48 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
6767
import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
6868
import org.apache.commons.collections.CollectionUtils;
69+
import org.apache.commons.lang3.BooleanUtils;
6970
import org.apache.commons.lang3.StringUtils;
7071
import org.apache.log4j.Logger;
7172

@@ -634,9 +635,9 @@ public boolean restoreBackupVolumeAndAttachToVM(final String backedUpVolumeUuid,
634635
}
635636
accountManager.checkAccess(CallContext.current().getCallingAccount(), null, true, vmFromBackup);
636637

637-
Pair<String, String> restoreInfo = getRestoreVolumeHostAndDatastore(vm);
638-
String hostIp = restoreInfo.first();
639-
String datastoreUuid = restoreInfo.second();
638+
Pair<HostVO, StoragePoolVO> restoreInfo = getRestoreVolumeHostAndDatastore(vm);
639+
HostVO host = restoreInfo.first();
640+
StoragePoolVO datastore = restoreInfo.second();
640641

641642
LOG.debug("Asking provider to restore volume " + backedUpVolumeUuid + " from backup " + backupId +
642643
" (with external ID " + backup.getExternalId() + ") and attach it to VM: " + vm.getUuid());
@@ -647,17 +648,47 @@ public boolean restoreBackupVolumeAndAttachToVM(final String backedUpVolumeUuid,
647648
}
648649

649650
BackupProvider backupProvider = getBackupProvider(offering.getProvider());
650-
Pair<Boolean, String> result = backupProvider.restoreBackedUpVolume(backup, backedUpVolumeUuid, hostIp, datastoreUuid);
651-
if (!result.first()) {
652-
throw new CloudRuntimeException("Error restoring volume " + backedUpVolumeUuid);
651+
LOG.debug(String.format("Trying to restore volume using host private IP address: [%s].", host.getPrivateIpAddress()));
652+
653+
String[] hostPossibleValues = {host.getPrivateIpAddress(), host.getName()};
654+
String[] datastoresPossibleValues = {datastore.getUuid(), datastore.getName()};
655+
656+
Pair<Boolean, String> result = restoreBackedUpVolume(backedUpVolumeUuid, backup, backupProvider, hostPossibleValues, datastoresPossibleValues);
657+
658+
if (BooleanUtils.isFalse(result.first())) {
659+
throw new CloudRuntimeException(String.format("Error restoring volume [%s] of VM [%s] to host [%s] using backup provider [%s] due to: [%s].",
660+
backedUpVolumeUuid, vm.getUuid(), host.getUuid(), backupProvider.getName(), result.second()));
653661
}
654662
if (!attachVolumeToVM(vm.getDataCenterId(), result.second(), vmFromBackup.getBackupVolumeList(),
655-
backedUpVolumeUuid, vm, datastoreUuid, backup)) {
656-
throw new CloudRuntimeException("Error attaching volume " + backedUpVolumeUuid + " to VM " + vm.getUuid());
663+
backedUpVolumeUuid, vm, datastore.getUuid(), backup)) {
664+
throw new CloudRuntimeException(String.format("Error attaching volume [%s] to VM [%s]." + backedUpVolumeUuid, vm.getUuid()));
657665
}
658666
return true;
659667
}
660668

669+
protected Pair<Boolean, String> restoreBackedUpVolume(final String backedUpVolumeUuid, final BackupVO backup, BackupProvider backupProvider, String[] hostPossibleValues,
670+
String[] datastoresPossibleValues) {
671+
Pair<Boolean, String> result = new Pair<>(false, "");
672+
for (String hostData : hostPossibleValues) {
673+
for (String datastoreData : datastoresPossibleValues) {
674+
LOG.debug(String.format("Trying to restore volume [UUID: %s], using host [%s] and datastore [%s].",
675+
backedUpVolumeUuid, hostData, datastoreData));
676+
677+
try {
678+
result = backupProvider.restoreBackedUpVolume(backup, backedUpVolumeUuid, hostData, datastoreData);
679+
680+
if (BooleanUtils.isTrue(result.first())) {
681+
return result;
682+
}
683+
} catch (Exception e) {
684+
LOG.debug(String.format("Failed to restore volume [UUID: %s], using host [%s] and datastore [%s] due to: [%s].",
685+
backedUpVolumeUuid, hostData, datastoreData, e.getMessage()), e);
686+
}
687+
}
688+
}
689+
return result;
690+
}
691+
661692
@Override
662693
@ActionEvent(eventType = EventTypes.EVENT_VM_BACKUP_DELETE, eventDescription = "deleting VM backup", async = true)
663694
public boolean deleteBackup(final Long backupId) {
@@ -694,31 +725,31 @@ public boolean deleteBackup(final Long backupId) {
694725
/**
695726
* Get the pair: hostIp, datastoreUuid in which to restore the volume, based on the VM to be attached information
696727
*/
697-
private Pair<String, String> getRestoreVolumeHostAndDatastore(VMInstanceVO vm) {
728+
private Pair<HostVO, StoragePoolVO> getRestoreVolumeHostAndDatastore(VMInstanceVO vm) {
698729
List<VolumeVO> rootVmVolume = volumeDao.findIncludingRemovedByInstanceAndType(vm.getId(), Volume.Type.ROOT);
699730
Long poolId = rootVmVolume.get(0).getPoolId();
700731
StoragePoolVO storagePoolVO = primaryDataStoreDao.findById(poolId);
701-
String datastoreUuid = storagePoolVO.getUuid();
702-
String hostIp = vm.getHostId() == null ?
703-
getHostIp(storagePoolVO) :
704-
hostDao.findById(vm.getHostId()).getPrivateIpAddress();
705-
return new Pair<>(hostIp, datastoreUuid);
732+
HostVO hostVO = vm.getHostId() == null ?
733+
getFirstHostFromStoragePool(storagePoolVO) :
734+
hostDao.findById(vm.getHostId());
735+
return new Pair<>(hostVO, storagePoolVO);
706736
}
707737

708738
/**
709-
* Find a host IP from storage pool access
739+
* Find a host from storage pool access
710740
*/
711-
private String getHostIp(StoragePoolVO storagePoolVO) {
741+
private HostVO getFirstHostFromStoragePool(StoragePoolVO storagePoolVO) {
712742
List<HostVO> hosts = null;
713743
if (storagePoolVO.getScope().equals(ScopeType.CLUSTER)) {
714744
hosts = hostDao.findByClusterId(storagePoolVO.getClusterId());
715745

716746
} else if (storagePoolVO.getScope().equals(ScopeType.ZONE)) {
717747
hosts = hostDao.findByDataCenterId(storagePoolVO.getDataCenterId());
718748
}
719-
return hosts.get(0).getPrivateIpAddress();
749+
return hosts.get(0);
720750
}
721751

752+
722753
/**
723754
* Attach volume to VM
724755
*/

server/src/test/java/org/apache/cloudstack/backup/BackupManagerTest.java

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
// under the License.
1717
package org.apache.cloudstack.backup;
1818
import static org.junit.Assert.assertEquals;
19+
import static org.mockito.Mockito.times;
1920
import static org.mockito.Mockito.when;
2021

2122
import org.apache.cloudstack.api.ServerApiException;
@@ -30,6 +31,7 @@
3031
import org.mockito.Spy;
3132

3233
import com.cloud.exception.InvalidParameterValueException;
34+
import com.cloud.utils.Pair;
3335

3436
public class BackupManagerTest {
3537
@Spy
@@ -39,6 +41,12 @@ public class BackupManagerTest {
3941
@Mock
4042
BackupOfferingDao backupOfferingDao;
4143

44+
@Mock
45+
BackupProvider backupProvider;
46+
47+
private String[] hostPossibleValues = {"127.0.0.1", "hostname"};
48+
private String[] datastoresPossibleValues = {"e9804933-8609-4de3-bccc-6278072a496c", "datastore-name"};
49+
4250
@Before
4351
public void setup() throws Exception {
4452
MockitoAnnotations.initMocks(this);
@@ -117,4 +125,68 @@ public void testUpdateBackupOfferingSuccess() {
117125
assertEquals("New description", updated.getDescription());
118126
assertEquals(true, updated.isUserDrivenBackupAllowed());
119127
}
128+
129+
@Test
130+
public void restoreBackedUpVolumeTestHostIpAndDatastoreUuid() {
131+
BackupVO backupVO = new BackupVO();
132+
String volumeUuid = "5f4ed903-ac23-4f8a-b595-69c73c40593f";
133+
134+
Mockito.when(backupProvider.restoreBackedUpVolume(Mockito.any(), Mockito.eq(volumeUuid),
135+
Mockito.eq("127.0.0.1"), Mockito.eq("e9804933-8609-4de3-bccc-6278072a496c"))).thenReturn(new Pair<Boolean, String>(Boolean.TRUE, "Success"));
136+
Pair<Boolean,String> restoreBackedUpVolume = backupManager.restoreBackedUpVolume(volumeUuid, backupVO, backupProvider, hostPossibleValues, datastoresPossibleValues);
137+
138+
assertEquals(Boolean.TRUE, restoreBackedUpVolume.first());
139+
assertEquals("Success", restoreBackedUpVolume.second());
140+
141+
Mockito.verify(backupProvider, times(1)).restoreBackedUpVolume(Mockito.any(), Mockito.anyString(),
142+
Mockito.anyString(), Mockito.anyString());
143+
}
144+
145+
@Test
146+
public void restoreBackedUpVolumeTestHostIpAndDatastoreName() {
147+
BackupVO backupVO = new BackupVO();
148+
String volumeUuid = "5f4ed903-ac23-4f8a-b595-69c73c40593f";
149+
150+
Mockito.when(backupProvider.restoreBackedUpVolume(Mockito.any(), Mockito.eq(volumeUuid),
151+
Mockito.eq("127.0.0.1"), Mockito.eq("datastore-name"))).thenReturn(new Pair<Boolean, String>(Boolean.TRUE, "Success2"));
152+
Pair<Boolean,String> restoreBackedUpVolume = backupManager.restoreBackedUpVolume(volumeUuid, backupVO, backupProvider, hostPossibleValues, datastoresPossibleValues);
153+
154+
assertEquals(Boolean.TRUE, restoreBackedUpVolume.first());
155+
assertEquals("Success2", restoreBackedUpVolume.second());
156+
157+
Mockito.verify(backupProvider, times(2)).restoreBackedUpVolume(Mockito.any(), Mockito.anyString(),
158+
Mockito.anyString(), Mockito.anyString());
159+
}
160+
161+
@Test
162+
public void restoreBackedUpVolumeTestHostNameAndDatastoreUuid() {
163+
BackupVO backupVO = new BackupVO();
164+
String volumeUuid = "5f4ed903-ac23-4f8a-b595-69c73c40593f";
165+
166+
Mockito.when(backupProvider.restoreBackedUpVolume(Mockito.any(), Mockito.eq(volumeUuid),
167+
Mockito.eq("hostname"), Mockito.eq("e9804933-8609-4de3-bccc-6278072a496c"))).thenReturn(new Pair<Boolean, String>(Boolean.TRUE, "Success3"));
168+
Pair<Boolean,String> restoreBackedUpVolume = backupManager.restoreBackedUpVolume(volumeUuid, backupVO, backupProvider, hostPossibleValues, datastoresPossibleValues);
169+
170+
assertEquals(Boolean.TRUE, restoreBackedUpVolume.first());
171+
assertEquals("Success3", restoreBackedUpVolume.second());
172+
173+
Mockito.verify(backupProvider, times(3)).restoreBackedUpVolume(Mockito.any(), Mockito.anyString(),
174+
Mockito.anyString(), Mockito.anyString());
175+
}
176+
177+
@Test
178+
public void restoreBackedUpVolumeTestHostAndDatastoreName() {
179+
BackupVO backupVO = new BackupVO();
180+
String volumeUuid = "5f4ed903-ac23-4f8a-b595-69c73c40593f";
181+
182+
Mockito.when(backupProvider.restoreBackedUpVolume(Mockito.any(), Mockito.eq(volumeUuid),
183+
Mockito.eq("hostname"), Mockito.eq("datastore-name"))).thenReturn(new Pair<Boolean, String>(Boolean.TRUE, "Success4"));
184+
Pair<Boolean,String> restoreBackedUpVolume = backupManager.restoreBackedUpVolume(volumeUuid, backupVO, backupProvider, hostPossibleValues, datastoresPossibleValues);
185+
186+
assertEquals(Boolean.TRUE, restoreBackedUpVolume.first());
187+
assertEquals("Success4", restoreBackedUpVolume.second());
188+
189+
Mockito.verify(backupProvider, times(4)).restoreBackedUpVolume(Mockito.any(), Mockito.anyString(),
190+
Mockito.anyString(), Mockito.anyString());
191+
}
120192
}

0 commit comments

Comments
 (0)