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()); }