From 0ea2ce5b522216c0bc587ac89d18fc9a0cbdaae3 Mon Sep 17 00:00:00 2001
From: Pierre Charton
Date: Fri, 20 Dec 2024 11:03:33 +0100
Subject: [PATCH] UT + correction bug
---
build_backroll_plugin.sh | 5 +-
.../backup/BackrollBackupProvider.java | 4 +-
.../backup/backroll/BackrollClient.java | 4 +-
.../utils/BackrollHttpClientProvider.java | 13 +-
.../backup/BackrollBackupProviderTest.java | 116 ++++++++++++++++--
5 files changed, 116 insertions(+), 26 deletions(-)
diff --git a/build_backroll_plugin.sh b/build_backroll_plugin.sh
index bc314fbf7e5..7fdc1c46951 100755
--- a/build_backroll_plugin.sh
+++ b/build_backroll_plugin.sh
@@ -1,4 +1 @@
-mvn install -f "/opt/cloudstack/plugins/backup/backroll/pom.xml" -DskipTests
-mvn install -f "/opt/cloudstack/plugins/pom.xml" -DskipTests
-mvn install -f "/opt/cloudstack/client/pom.xml" -DskipTests
-mvn -pl :cloud-client-ui jetty:run
\ No newline at end of file
+mvn install -f "/opt/cloudstack/plugins/backup/backroll/pom.xml" -DskipTests && mvn install -f "/opt/cloudstack/plugins/pom.xml" -DskipTests && mvn install -f "/opt/cloudstack/client/pom.xml" -DskipTests && mvn -pl :cloud-client-ui jetty:run
\ No newline at end of file
diff --git a/plugins/backup/backroll/src/main/java/org/apache/cloudstack/backup/BackrollBackupProvider.java b/plugins/backup/backroll/src/main/java/org/apache/cloudstack/backup/BackrollBackupProvider.java
index 4aba761bbb0..0386bd437c7 100644
--- a/plugins/backup/backroll/src/main/java/org/apache/cloudstack/backup/BackrollBackupProvider.java
+++ b/plugins/backup/backroll/src/main/java/org/apache/cloudstack/backup/BackrollBackupProvider.java
@@ -146,7 +146,7 @@ public class BackrollBackupProvider extends AdapterBase implements BackupProvide
try {
isSuccess = getClient(vm.getDataCenterId()).restoreVMFromBackup(vm.getUuid(), getBackupName(backup));
} catch (ParseException | BackrollApiException | IOException e) {
- throw new CloudRuntimeException("Failed to restore VM from Backrup");
+ throw new CloudRuntimeException("Failed to restore VM from Backup");
}
return isSuccess;
}
@@ -198,7 +198,7 @@ public class BackrollBackupProvider extends AdapterBase implements BackupProvide
try {
String urlToRequest = client.startBackupJob(vm.getUuid());
-
+ logger.info("BackrollProvider: urlToRequest: " + urlToRequest);
String backupJob = urlToRequest.replace("/status/", "");
if (!StringUtils.isEmpty(backupJob)) {
BackupVO backup = new BackupVO();
diff --git a/plugins/backup/backroll/src/main/java/org/apache/cloudstack/backup/backroll/BackrollClient.java b/plugins/backup/backroll/src/main/java/org/apache/cloudstack/backup/backroll/BackrollClient.java
index f945d7a1718..55da37cbd2c 100644
--- a/plugins/backup/backroll/src/main/java/org/apache/cloudstack/backup/backroll/BackrollClient.java
+++ b/plugins/backup/backroll/src/main/java/org/apache/cloudstack/backup/backroll/BackrollClient.java
@@ -69,10 +69,10 @@ public class BackrollClient {
}
public String startBackupJob(final String jobId) throws IOException, BackrollApiException {
- logger.info("Trying to start backup for Backroll job: {}", jobId);
+ logger.info("startBackupJob : Trying to start backup for Backroll job: {}", jobId);
String backupJob = "";
BackrollTaskRequestResponse requestResponse = httpProvider.post(String.format("/tasks/singlebackup/%s", jobId), null, BackrollTaskRequestResponse.class);
- logger.info("BackupJob status link: {}", requestResponse.location);
+ logger.info("startBackupJob : BackupJob status link: {}", requestResponse.location);
backupJob = requestResponse.location.replace("/api/v1", "");
return StringUtils.isEmpty(backupJob) ? null : backupJob;
}
diff --git a/plugins/backup/backroll/src/main/java/org/apache/cloudstack/backup/backroll/utils/BackrollHttpClientProvider.java b/plugins/backup/backroll/src/main/java/org/apache/cloudstack/backup/backroll/utils/BackrollHttpClientProvider.java
index 823e7ffb972..401d0454f02 100644
--- a/plugins/backup/backroll/src/main/java/org/apache/cloudstack/backup/backroll/utils/BackrollHttpClientProvider.java
+++ b/plugins/backup/backroll/src/main/java/org/apache/cloudstack/backup/backroll/utils/BackrollHttpClientProvider.java
@@ -136,8 +136,9 @@ public class BackrollHttpClientProvider {
logger.debug("Response received in POST request with body {} is: {} for URL {}.", xml, response.toString(), url);
String result = okBody(response);
+
T requestResponse = new ObjectMapper().readValue(result, classOfT);
- response.close();
+ //response.close();
return requestResponse;
} catch (ParseException | NotOkBodyException e) {
@@ -164,7 +165,7 @@ public class BackrollHttpClientProvider {
String result = okBody(response);
T requestResponse = new ObjectMapper().readValue(result, classOfT);
- response.close();
+ //response.close();
return requestResponse;
} catch (NotOkBodyException e) {
@@ -190,7 +191,7 @@ public class BackrollHttpClientProvider {
logger.debug("Response received in GET request is: {} for URL: {}.", response.toString(), url);
String result = okBody(response);
- response.close();
+ //response.close();
return result;
} catch (NotOkBodyException e) {
@@ -215,7 +216,7 @@ public class BackrollHttpClientProvider {
String result = okBody(response);
T requestResponse = new ObjectMapper().readValue(result, classOfT);
- response.close();
+ //response.close();
return requestResponse;
} catch (NotOkBodyException e) {
@@ -235,7 +236,9 @@ public class BackrollHttpClientProvider {
case HttpStatus.SC_ACCEPTED:
HttpEntity bodyEntity = response.getEntity();
try {
+ logger.debug("bodyentity : {}", bodyEntity);
result = EntityUtils.toString(bodyEntity);
+ logger.debug("bodyentity : result {}", result);
EntityUtils.consumeQuietly(bodyEntity);
return result;
} catch (ParseException | IOException e) {
@@ -290,6 +293,7 @@ public class BackrollHttpClientProvider {
String body = getWithoutParseResponse(url);
if (!body.contains(TaskState.PENDING)) {
+ logger.debug("waitGetWithoutParseResponse : result {}", body);
return body;
}
@@ -301,7 +305,6 @@ public class BackrollHttpClientProvider {
throw new BackrollApiException();
}
}
-
return null;
}
diff --git a/plugins/backup/backroll/src/test/java/org/apache/cloudstack/backup/BackrollBackupProviderTest.java b/plugins/backup/backroll/src/test/java/org/apache/cloudstack/backup/BackrollBackupProviderTest.java
index 33c22fb2e96..54c40ee4646 100644
--- a/plugins/backup/backroll/src/test/java/org/apache/cloudstack/backup/BackrollBackupProviderTest.java
+++ b/plugins/backup/backroll/src/test/java/org/apache/cloudstack/backup/BackrollBackupProviderTest.java
@@ -17,14 +17,13 @@
package org.apache.cloudstack.backup;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import java.io.IOException;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
-import java.util.Map;
import java.util.UUID;
import org.apache.cloudstack.backup.backroll.BackrollClient;
@@ -32,10 +31,9 @@ import org.apache.cloudstack.backup.backroll.utils.BackrollApiException;
import org.apache.cloudstack.backup.backroll.model.BackrollTaskStatus;
import org.apache.cloudstack.backup.backroll.model.BackrollVmBackup;
import org.apache.cloudstack.backup.backroll.model.BackrollBackupMetrics;
+import org.apache.cloudstack.backup.backroll.model.BackrollOffering;
import org.apache.cloudstack.backup.backroll.model.response.TaskState;
import org.apache.cloudstack.backup.dao.BackupDao;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.http.ParseException;
import org.apache.logging.log4j.Logger;
import org.junit.Before;
import org.junit.Test;
@@ -46,14 +44,8 @@ import org.mockito.Spy;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.VMInstanceVO;
-
-import net.bytebuddy.agent.VirtualMachine;
import com.cloud.vm.dao.VMInstanceDao;
-import net.bytebuddy.agent.VirtualMachine;
-
-import net.bytebuddy.agent.VirtualMachine;
-
public class BackrollBackupProviderTest {
@Mock
BackrollClient clientMock;
@@ -81,21 +73,119 @@ public class BackrollBackupProviderTest {
}
@Test
- public void listBackupOfferings_Test() {
-
+ public void listBackupOfferings_Test() throws BackrollApiException, IOException{
+ Mockito.doReturn("dummyUrlToRequest").when(clientMock).getBackupOfferingUrl();
+ Mockito.doReturn(Arrays.asList(new BackrollOffering("dummyName", "dummyId"))).when(clientMock).getBackupOfferings(Mockito.anyString());
+ List results = backupProvider.listBackupOfferings(2L);
+ assertTrue(results.size() == 1);
}
@Test
public void takeBackup_Test() {
+ // logger.info("Starting backup for VM ID {} on backroll provider", vm.getUuid());
+ // final BackrollClient client = getClient(vm.getDataCenterId());
+
+ // try {
+ // String urlToRequest = client.startBackupJob(vm.getUuid());
+
+ // String backupJob = urlToRequest.replace("/status/", "");
+ // if (!StringUtils.isEmpty(backupJob)) {
+ // BackupVO backup = new BackupVO();
+ // backup.setVmId(vm.getId());
+ // backup.setExternalId(backupJob);
+ // backup.setType("INCREMENTAL");
+ // backup.setDate(new DateTime().toDate());
+ // backup.setSize(0L);
+ // backup.setProtectedSize(0L);
+ // backup.setStatus(Backup.Status.BackingUp);
+ // backup.setBackupOfferingId(vm.getBackupOfferingId());
+ // backup.setAccountId(vm.getAccountId());
+ // backup.setDomainId(vm.getDomainId());
+ // backup.setZoneId(vm.getDataCenterId());
+ // Boolean result = backupDao.persist(backup) != null;
+ // client.triggerTaskStatus(urlToRequest);
+ // syncBackups(vm, null);
+ // return result;
+ // }
+ // } catch (ParseException | BackrollApiException | IOException e) {
+ // logger.debug(e.getMessage());
+ // throw new CloudRuntimeException("Failed to take backup");
+ // }
+ // return false;
}
@Test
public void getBackupMetrics_Test() {
+ // final Map metrics = new HashMap<>();
+ // if (CollectionUtils.isEmpty(vms)) {
+ // logger.warn("Unable to get VM Backup Metrics because the list of VMs is empty.");
+ // return metrics;
+ // }
+
+ // List vmUuids = vms.stream().filter(Objects::nonNull).map(VirtualMachine::getUuid).collect(Collectors.toList());
+ // logger.debug("Get Backup Metrics for VMs: {}.", String.join(", ", vmUuids));
+
+ // BackrollClient client = getClient(zoneId);
+ // for (final VirtualMachine vm : vms) {
+ // if (vm == null) {
+ // continue;
+ // }
+
+ // Metric metric;
+ // try {
+ // metric = client.getVirtualMachineMetrics(vm.getUuid());
+ // } catch (BackrollApiException | IOException e) {
+ // throw new CloudRuntimeException("Failed to retrieve backup metrics");
+ // }
+ // logger.debug("Metrics for VM [uuid: {}, name: {}] is [backup size: {}, data size: {}].", vm.getUuid(),
+ // vm.getInstanceName(), metric.getBackupSize(), metric.getDataSize());
+ // metrics.put(vm, metric);
+ // }
+ // return metrics;
}
@Test
- public void restoreVMFromBackup_Test() {
+ public void restoreVMFromBackupTrue_Test() throws BackrollApiException, IOException {
+ VMInstanceVO vmInstanceVO = new VMInstanceVO();
+ vmInstanceVO.setDataCenterId(2l);
+ BackupVO backupVo = new BackupVO();
+ backupVo.setExternalId("abc,defgh");
+
+ Mockito.doReturn(true).when(clientMock).restoreVMFromBackup(Mockito.anyString(), Mockito.anyString());
+
+ Boolean result = backupProvider.restoreVMFromBackup(vmInstanceVO, backupVo);
+
+ assertTrue(result);
+ }
+
+ @Test
+ public void restoreVMFromBackupFalse_Test() throws BackrollApiException, IOException {
+ VMInstanceVO vmInstanceVO = new VMInstanceVO();
+ vmInstanceVO.setDataCenterId(2l);
+
+ BackupVO backupVo = new BackupVO();
+ backupVo.setExternalId("abc,defgh");
+
+ Mockito.doReturn(false).when(clientMock).restoreVMFromBackup(Mockito.anyString(), Mockito.anyString());
+
+ try {
+ backupProvider.restoreVMFromBackup(vmInstanceVO, backupVo);
+ } catch (Exception e) {
+ assertEquals(CloudRuntimeException.class, e.getClass());
+ String expected = String.format("Failed to restore VM from Backup");
+ assertEquals(expected , e.getMessage());
+ }
+ }
+
+ @Test
+ public void removeVMFromBackupOffering_Test(){
+ assertTrue(backupProvider.removeVMFromBackupOffering(new VMInstanceVO()));
+ }
+
+ @Test
+ public void willDeleteBackupsOnOfferingRemoval_Test(){
+ assertTrue(backupProvider.willDeleteBackupsOnOfferingRemoval());
}