Skip to content

Commit 86f5066

Browse files
committed
Delete syncBackups in backroll provider, fix delete backup and fix restore
1 parent 5741318 commit 86f5066

File tree

4 files changed

+33
-170
lines changed

4 files changed

+33
-170
lines changed

plugins/backup/backroll/src/main/java/org/apache/cloudstack/backup/BackrollBackupProvider.java

Lines changed: 8 additions & 149 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@
3434
import org.apache.cloudstack.backup.Backup.RestorePoint;
3535
import org.apache.cloudstack.backup.backroll.BackrollClient;
3636
import org.apache.cloudstack.backup.backroll.model.BackrollBackupMetrics;
37-
import org.apache.cloudstack.backup.backroll.model.BackrollTaskStatus;
38-
import org.apache.cloudstack.backup.backroll.model.BackrollVmBackup;
3937
import org.apache.cloudstack.backup.backroll.utils.BackrollApiException;
4038
import org.apache.cloudstack.backup.backroll.utils.BackrollHttpClientProvider;
4139
import org.apache.cloudstack.backup.dao.BackupDao;
@@ -155,9 +153,6 @@ public boolean restoreVMFromBackup(VirtualMachine vm, Backup backup) {
155153

156154
@Override
157155
public Map<VirtualMachine, Backup.Metric> getBackupMetrics(Long zoneId, List<VirtualMachine> vms) {
158-
Long vmBackupSize=0L;
159-
Long vmBackupProtectedSize=0L;
160-
161156
final Map<VirtualMachine, Backup.Metric> metrics = new HashMap<>();
162157
if (CollectionUtils.isEmpty(vms)) {
163158
logger.warn("Unable to get VM Backup Metrics because the list of VMs is empty.");
@@ -175,13 +170,7 @@ public Map<VirtualMachine, Backup.Metric> getBackupMetrics(Long zoneId, List<Vir
175170

176171
Metric metric;
177172
try {
178-
final List<BackrollVmBackup> backups = client.getAllBackupsfromVirtualMachine(vm.getUuid());
179-
for (BackrollVmBackup backup : backups ) {
180-
BackrollBackupMetrics backupMetric = client.getBackupMetrics(vm.getUuid(), backup.getId());
181-
vmBackupProtectedSize += backupMetric.getDeduplicated();
182-
vmBackupSize += backupMetric.getSize();
183-
}
184-
metric = new Metric(vmBackupSize, vmBackupProtectedSize);
173+
metric = client.getVirtualMachineMetrics(vm.getUuid());
185174
} catch (BackrollApiException | IOException e) {
186175
throw new CloudRuntimeException("Failed to retrieve backup metrics");
187176
}
@@ -235,136 +224,6 @@ public Pair<Boolean, Backup> takeBackup(VirtualMachine vm) {
235224
return new Pair<Boolean,Backup>(false, null);
236225
}
237226

238-
239-
public void syncBackups(VirtualMachine vm, Backup.Metric metric) {
240-
logger.info("Starting sync backup for VM ID " + vm.getUuid() + " on backroll provider");
241-
242-
final BackrollClient client = getClient(vm.getDataCenterId());
243-
List<Backup> backupsInDb = backupDao.listByVmId(vm.getDataCenterId(), vm.getId());
244-
245-
for (Backup backup : backupsInDb) {
246-
if (backup.getStatus().equals(Backup.Status.BackingUp)) {
247-
BackrollTaskStatus response;
248-
try {
249-
response = client.checkBackupTaskStatus(backup.getExternalId());
250-
} catch (ParseException | BackrollApiException | IOException e) {
251-
logger.error(e);
252-
throw new CloudRuntimeException("Failed to sync backups");
253-
}
254-
255-
if (response != null) {
256-
logger.debug("backroll backup id: {}", backup.getExternalId());
257-
logger.debug("backroll backup status: {}", response.getState());
258-
259-
BackupVO backupToUpdate = ((BackupVO) backup);
260-
261-
if (response.getState().equals("PENDING")) {
262-
backupToUpdate.setStatus(Backup.Status.BackingUp);
263-
} else if (response.getState().equals("FAILURE")) {
264-
backupToUpdate.setStatus(Backup.Status.Failed);
265-
} else if (response.getState().equals("SUCCESS")) {
266-
backupToUpdate.setStatus(Backup.Status.BackedUp);
267-
backupToUpdate.setExternalId(backup.getExternalId() + "," + response.getInfo());
268-
269-
BackrollBackupMetrics backupMetrics = null;
270-
try {
271-
backupMetrics = client.getBackupMetrics(vm.getUuid() , response.getInfo());
272-
if (backupMetrics != null) {
273-
backupToUpdate.setSize(backupMetrics.getDeduplicated()); // real size
274-
backupToUpdate.setProtectedSize(backupMetrics.getSize()); // total size
275-
}
276-
} catch (BackrollApiException | IOException e) {
277-
logger.error(e);
278-
throw new CloudRuntimeException("Failed to get backup metrics");
279-
}
280-
} else {
281-
backupToUpdate.setStatus(Backup.Status.BackingUp);
282-
}
283-
284-
if (backupDao.persist(backupToUpdate) != null) {
285-
logger.info("Backroll mise à jour enregistrée");
286-
}
287-
}
288-
} else if (backup.getStatus().equals(Backup.Status.BackedUp) && backup.getSize().equals(0L)) {
289-
String backupId = backup.getExternalId().contains(",") ? backup.getExternalId().split(",")[1] : backup.getExternalId();
290-
BackrollBackupMetrics backupMetrics;
291-
try {
292-
backupMetrics = client.getBackupMetrics(vm.getUuid() , backupId);
293-
} catch (BackrollApiException | IOException e) {
294-
logger.error(e);
295-
throw new CloudRuntimeException("Failed to get backup metrics");
296-
}
297-
298-
if (backupMetrics != null) {
299-
BackupVO backupToUpdate = ((BackupVO) backup);
300-
backupToUpdate.setSize(backupMetrics.getDeduplicated()); // real size
301-
backupToUpdate.setProtectedSize(backupMetrics.getSize()); // total size
302-
backupDao.persist(backupToUpdate);
303-
}
304-
}
305-
}
306-
307-
// Backups synchronisation between Backroll ad CS Db
308-
List<BackrollVmBackup> backupsFromBackroll;
309-
try {
310-
backupsFromBackroll = client.getAllBackupsfromVirtualMachine(vm.getUuid());
311-
312-
backupsInDb = backupDao.listByVmId(null, vm.getId());
313-
314-
// insert new backroll backup in CS
315-
for (BackrollVmBackup backupInBackroll : backupsFromBackroll) {
316-
Backup backupToFind = backupsInDb.stream()
317-
.filter(backupInDb -> backupInDb.getExternalId().contains(backupInBackroll.getName()))
318-
.findAny()
319-
.orElse(null);
320-
321-
if (backupToFind == null) {
322-
BackupVO backupToInsert = new BackupVO();
323-
backupToInsert.setVmId(vm.getId());
324-
backupToInsert.setExternalId(backupInBackroll.getId() + "," + backupInBackroll.getName());
325-
backupToInsert.setType("INCREMENTAL");
326-
backupToInsert.setDate(backupInBackroll.getDate());
327-
backupToInsert.setSize(0L);
328-
backupToInsert.setProtectedSize(0L);
329-
backupToInsert.setStatus(Backup.Status.BackedUp);
330-
backupToInsert.setBackupOfferingId(vm.getBackupOfferingId());
331-
backupToInsert.setAccountId(vm.getAccountId());
332-
backupToInsert.setDomainId(vm.getDomainId());
333-
backupToInsert.setZoneId(vm.getDataCenterId());
334-
backupDao.persist(backupToInsert);
335-
}
336-
if (backupToFind != null && backupToFind.getStatus() == Backup.Status.Removed) {
337-
BackupVO backupToUpdate = ((BackupVO) backupToFind);
338-
backupToUpdate.setStatus(Backup.Status.BackedUp);
339-
if (backupDao.persist(backupToUpdate) != null) {
340-
logger.info("Backroll update saved");
341-
backupDao.remove(backupToFind.getId());
342-
}
343-
}
344-
}
345-
346-
// delete deleted backroll backup in CS
347-
backupsInDb = backupDao.listByVmId(null, vm.getId());
348-
for (Backup backup : backupsInDb) {
349-
String backupName = backup.getExternalId().contains(",") ? backup.getExternalId().split(",")[1] : backup.getExternalId();
350-
BackrollVmBackup backupToFind = backupsFromBackroll.stream()
351-
.filter(backupInBackroll -> backupInBackroll.getName().contains(backupName))
352-
.findAny()
353-
.orElse(null);
354-
355-
if (backupToFind == null) {
356-
BackupVO backupToUpdate = ((BackupVO) backup);
357-
backupToUpdate.setStatus(Backup.Status.Removed);
358-
if (backupDao.persist(backupToUpdate) != null) {
359-
logger.debug("Backroll delete saved (sync)");
360-
}
361-
}
362-
}
363-
} catch (BackrollApiException | IOException e) {
364-
logger.error(e);
365-
}
366-
}
367-
368227
@Override
369228
public String getConfigComponentName() {
370229
return BackupService.class.getSimpleName();
@@ -381,24 +240,24 @@ public ConfigKey<?>[] getConfigKeys() {
381240

382241
@Override
383242
public boolean deleteBackup(Backup backup, boolean forced) {
384-
logger.info("backroll delete backup id: {}", backup.getExternalId());
243+
logger.info("BACKROLL: delete backup id: {}", backup.getExternalId());
385244
if (backup.getStatus().equals(Backup.Status.BackingUp)) {
386245
throw new CloudRuntimeException("You can't delete a backup while it still BackingUp");
387246
} else {
388-
logger.debug("backroll - try delete backup");
247+
logger.debug("BACKROLL: try delete backup");
389248

390249
if (backup.getStatus().equals(Backup.Status.Removed) || backup.getStatus().equals(Backup.Status.Failed)){
391250
return deleteBackupInDb(backup);
392251
} else {
393252
VMInstanceVO vm = vmInstanceDao.findByIdIncludingRemoved(backup.getVmId());
394253
try {
395254
if (getClient(backup.getZoneId()).deleteBackup(vm.getUuid(), getBackupName(backup))) {
396-
logger.debug("Backup deletion for backup {} complete on backroll side.", backup.getUuid());
255+
logger.debug("BACKROLL: Backup deletion for backup {} complete on backroll side.", backup.getUuid());
397256
return deleteBackupInDb(backup);
398257
}
399258
} catch (BackrollApiException | IOException e) {
400259
logger.error(e);
401-
throw new CloudRuntimeException("Failed to delete backup");
260+
throw new CloudRuntimeException("BACKROLL: Failed to delete backup");
402261
}
403262
}
404263
}
@@ -409,7 +268,7 @@ private boolean deleteBackupInDb(Backup backup) {
409268
BackupVO backupToUpdate = ((BackupVO) backup);
410269
backupToUpdate.setStatus(Backup.Status.Removed);
411270
if (backupDao.persist(backupToUpdate) != null) {
412-
logger.debug("Backroll backup {} deleted in database.", backup.getUuid());
271+
logger.debug("BACKROLL: Backroll backup {} deleted in database.", backup.getUuid());
413272
VMInstanceVO vm = vmInstanceDao.findByIdIncludingRemoved(backup.getVmId());
414273
return true;
415274
}
@@ -421,7 +280,7 @@ protected BackrollClient getClient(final Long zoneId) {
421280
try {
422281
if (backrollClient == null) {
423282
logger.debug("backroll client null - instantiation of new one ");
424-
BackrollHttpClientProvider provider = BackrollHttpClientProvider.createProvider(new BackrollHttpClientProvider(), BackrollUrlConfigKey.valueIn(zoneId), BackrollAppNameConfigKey.valueIn(zoneId), BackrollPasswordConfigKey.valueIn(zoneId), true, 300, 600);
283+
BackrollHttpClientProvider provider = BackrollHttpClientProvider.createProvider(BackrollUrlConfigKey.valueIn(zoneId), BackrollAppNameConfigKey.valueIn(zoneId), BackrollPasswordConfigKey.valueIn(zoneId), true, 300, 600);
425284
backrollClient = new BackrollClient(provider);
426285
}
427286
return backrollClient;
@@ -451,7 +310,7 @@ public List<RestorePoint> listRestorePoints(VirtualMachine vm) {
451310
return client.listRestorePoints(vm.getUuid());
452311
} catch (BackrollApiException | IOException e) {
453312
logger.error(e);
454-
throw new CloudRuntimeException("Failed to delete backup");
313+
throw new CloudRuntimeException("Error while listing restore points");
455314
}
456315
}
457316

plugins/backup/backroll/src/main/java/org/apache/cloudstack/backup/backroll/BackrollClient.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ public BackrollTaskStatus checkBackupTaskStatus(String taskId) throws IOExceptio
153153
}
154154

155155
public boolean deleteBackup(final String vmId, final String backupName) throws IOException, BackrollApiException {
156-
logger.info("Trying to delete backup {} for vm {} using Backroll", vmId, backupName);
156+
logger.info("BACKROLL: Trying to delete backup {} for vm {} using Backroll", vmId, backupName);
157157
boolean isBackupDeleted = false;
158158

159159
BackrollTaskRequestResponse requestResponse = httpProvider.delete(
@@ -260,7 +260,7 @@ public List<Backup.RestorePoint> listRestorePoints(String vmId) throws BackrollA
260260
if (backupInfos != null && backupInfos.size() > 0) {
261261
for (BackupInfos infos : backupInfos) {
262262
var dateStart = new DateTime(infos.start);
263-
backups.add(new Backup.RestorePoint(infos.id, dateStart.toDate(), "INCREMENTAL"));
263+
backups.add(new Backup.RestorePoint(infos.id + "," + infos.name, dateStart.toDate(), "INCREMENTAL"));
264264
}
265265
}
266266
return backups;

plugins/backup/backroll/src/main/java/org/apache/cloudstack/backup/backroll/utils/BackrollHttpClientProvider.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,10 @@ public class BackrollHttpClientProvider {
6969

7070
private Logger logger = LogManager.getLogger(BackrollClient.class);
7171

72-
public static BackrollHttpClientProvider createProvider(BackrollHttpClientProvider backrollHttpClientProvider, final String url, final String appname, final String password,
72+
public static BackrollHttpClientProvider createProvider(final String url, final String appname, final String password,
7373
final boolean validateCertificate, final int timeout,
7474
final int restoreTimeout) throws URISyntaxException, NoSuchAlgorithmException, KeyManagementException {
75-
75+
BackrollHttpClientProvider backrollHttpClientProvider = new BackrollHttpClientProvider();
7676
backrollHttpClientProvider.apiURI = new URI(url);
7777
backrollHttpClientProvider.appname = appname;
7878
backrollHttpClientProvider.password = password;
@@ -229,6 +229,12 @@ public <T> T delete(String path, Class<T> classOfT) throws IOException, Backroll
229229
}
230230

231231
public class NotOkBodyException extends Exception {
232+
public NotOkBodyException() {
233+
super();
234+
}
235+
public NotOkBodyException(String errorMessage) {
236+
super(errorMessage);
237+
}
232238
}
233239

234240
public String okBody(final CloseableHttpResponse response) throws NotOkBodyException {
@@ -251,11 +257,14 @@ public String okBody(final CloseableHttpResponse response) throws NotOkBodyExcep
251257
}
252258
default:
253259
try {
260+
HttpEntity bodyEntity2 = response.getEntity();
261+
result = EntityUtils.toString(bodyEntity2);
254262
closeConnection(response);
255263
} catch (IOException e) {
256264
e.printStackTrace();
257265
}
258-
throw new NotOkBodyException();
266+
267+
throw new NotOkBodyException("Error ok body, code: " + String.valueOf(response.getStatusLine().getStatusCode()) + " / body response: " + result);
259268
}
260269
}
261270

@@ -339,11 +348,11 @@ private void closeConnection(CloseableHttpResponse closeableHttpResponse) throws
339348

340349
public void loginIfAuthenticationFailed() throws BackrollApiException, IOException {
341350
if (!isAuthenticated()) {
342-
login(appname, password);
351+
login();
343352
}
344353
}
345354

346-
protected void login(final String appname, final String appsecret) throws BackrollApiException, IOException {
355+
protected void login() throws BackrollApiException, IOException {
347356
logger.debug("Backroll client - start login");
348357

349358
CloseableHttpClient httpClient = createHttpClient();
@@ -357,7 +366,7 @@ protected void login(final String appname, final String appsecret) throws Backro
357366

358367
try {
359368
jsonBody.put("app_id", appname);
360-
jsonBody.put("app_secret", appsecret);
369+
jsonBody.put("app_secret", password);
361370
params = new StringEntity(jsonBody.toString());
362371
request.setEntity(params);
363372

@@ -368,7 +377,7 @@ protected void login(final String appname, final String appsecret) throws Backro
368377
logger.info("BACKROLL: " + response);
369378
LoginApiResponse loginResponse = objectMapper.readValue(response, LoginApiResponse.class);
370379
logger.info("ok");
371-
this.backrollToken = loginResponse.accessToken;
380+
backrollToken = loginResponse.accessToken;
372381
logger.debug("Backroll client - Token : {}", backrollToken);
373382

374383
if (StringUtils.isEmpty(loginResponse.accessToken)) {

plugins/backup/backroll/src/test/java/org/apache/cloudstack/backup/BackrollBackupProviderTest.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.apache.cloudstack.backup.backroll.model.BackrollBackupMetrics;
3737
import org.apache.cloudstack.backup.backroll.model.BackrollOffering;
3838
import org.apache.cloudstack.backup.backroll.model.response.TaskState;
39+
import org.apache.cloudstack.backup.Backup.Metric;
3940
import org.apache.cloudstack.backup.Backup.RestorePoint;
4041
import org.apache.cloudstack.backup.dao.BackupDao;
4142
import org.apache.logging.log4j.Logger;
@@ -145,7 +146,7 @@ public void getBackupMetricsEmpty_Test() {
145146
}
146147

147148
@Test
148-
public void getBackupMetrics_Test() throws BackrollApiException, IOException {
149+
public void getBackupMetrics_Test() throws BackrollApiException, IOException{
149150
VMInstanceVO vmInstanceVO = new VMInstanceVO();
150151
vmInstanceVO.setInstanceName("test");
151152
vmInstanceVO.setDataCenterId(1l);
@@ -156,24 +157,18 @@ public void getBackupMetrics_Test() throws BackrollApiException, IOException {
156157
vmInstanceVO2.setDataCenterId(2l);
157158
vmInstanceVO2.setBackupOfferingId(2l);
158159

160+
159161
VMInstanceVO vmInstanceVO3 = new VMInstanceVO();
160162
vmInstanceVO3.setInstanceName("test3");
161163
vmInstanceVO3.setDataCenterId(3l);
162164
vmInstanceVO3.setBackupOfferingId(3l);
163165

164-
List<BackrollVmBackup> backupsFromBackroll = Arrays.asList(
165-
new BackrollVmBackup("OK", "OK", new Date()));
166+
Metric metric = new Metric(2L, 3L);
166167

167-
BackrollBackupMetrics metrics = new BackrollBackupMetrics(2L, 3L);
168-
169-
Mockito.doReturn(metrics).when(clientMock).getBackupMetrics(Mockito.anyString(), Mockito.anyString());
170-
Mockito.doReturn(backupsFromBackroll).when(clientMock).getAllBackupsfromVirtualMachine(Mockito.anyString());
171-
assertEquals(
172-
backupProvider.getBackupMetrics(2L, Arrays.asList(vmInstanceVO, vmInstanceVO2, vmInstanceVO3)).size(),
173-
1);
168+
Mockito.doReturn(metric).when(clientMock).getVirtualMachineMetrics(Mockito.anyString());
169+
assertEquals(backupProvider.getBackupMetrics(2L, Arrays.asList(vmInstanceVO, vmInstanceVO2, vmInstanceVO3)).size(), 1);
174170

175-
Mockito.verify(clientMock, times(3)).getAllBackupsfromVirtualMachine(Mockito.anyString());
176-
Mockito.verify(clientMock, times(3)).getBackupMetrics(Mockito.anyString(), Mockito.anyString());
171+
Mockito.verify(clientMock, times(3)).getVirtualMachineMetrics(Mockito.anyString());
177172
}
178173

179174
@Test

0 commit comments

Comments
 (0)