Skip to content

Commit f903871

Browse files
committed
Fix unit tests, fix metrics (waiting PR #10140 to finish to fix metrics)
1 parent 86f5066 commit f903871

File tree

6 files changed

+136
-155
lines changed

6 files changed

+136
-155
lines changed

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

Lines changed: 117 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
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;
3738
import org.apache.cloudstack.backup.backroll.utils.BackrollApiException;
3839
import org.apache.cloudstack.backup.backroll.utils.BackrollHttpClientProvider;
3940
import org.apache.cloudstack.backup.dao.BackupDao;
@@ -167,16 +168,111 @@ public Map<VirtualMachine, Backup.Metric> getBackupMetrics(Long zoneId, List<Vir
167168
if (vm == null) {
168169
continue;
169170
}
170-
171-
Metric metric;
172171
try {
173-
metric = client.getVirtualMachineMetrics(vm.getUuid());
172+
// get backups from database
173+
List<Backup> backupsInDb = backupDao.listByVmId(zoneId, vm.getId());
174+
175+
// check backing up task
176+
for (Backup backup : backupsInDb) {
177+
if (backup.getStatus().equals(Backup.Status.BackingUp)) {
178+
BackrollTaskStatus response;
179+
try {
180+
response = client.checkBackupTaskStatus(backup.getExternalId());
181+
} catch (ParseException | BackrollApiException | IOException e) {
182+
logger.error(e);
183+
throw new CloudRuntimeException("Failed to sync backups");
184+
}
185+
186+
if (response != null) {
187+
logger.debug("backroll backup id: {}", backup.getExternalId());
188+
logger.debug("backroll backup status: {}", response.getState());
189+
190+
BackupVO backupToUpdate = ((BackupVO) backup);
191+
192+
if (response.getState().equals("PENDING")) {
193+
backupToUpdate.setStatus(Backup.Status.BackingUp);
194+
} else if (response.getState().equals("FAILURE")) {
195+
backupToUpdate.setStatus(Backup.Status.Failed);
196+
} else if (response.getState().equals("SUCCESS")) {
197+
backupToUpdate.setStatus(Backup.Status.BackedUp);
198+
backupToUpdate.setExternalId(response.getInfo());
199+
200+
BackrollBackupMetrics backupMetrics = null;
201+
try {
202+
backupMetrics = client.getBackupMetrics(vm.getUuid() , response.getInfo());
203+
if (backupMetrics != null) {
204+
backupToUpdate.setProtectedSize(backupMetrics.getDeduplicated());
205+
backupToUpdate.setSize(backupMetrics.getSize());
206+
}
207+
} catch (BackrollApiException | IOException e) {
208+
logger.error(e);
209+
throw new CloudRuntimeException("Failed to get backup metrics");
210+
}
211+
} else {
212+
backupToUpdate.setStatus(Backup.Status.BackingUp);
213+
}
214+
215+
if (backupDao.persist(backupToUpdate) != null) {
216+
logger.info("Backroll backup updated");
217+
}
218+
}
219+
} else {
220+
if(backup.getExternalId().contains(",")) {
221+
String backupId = backup.getExternalId().split(",")[1];
222+
BackupVO backupToUpdate = ((BackupVO) backup);
223+
backupToUpdate.setExternalId(backupId);
224+
try {
225+
BackrollBackupMetrics backupMetrics = client.getBackupMetrics(vm.getUuid() , backupId);
226+
if (backupMetrics != null) {
227+
backupToUpdate.setProtectedSize(backupMetrics.getDeduplicated());
228+
backupToUpdate.setSize(backupMetrics.getSize());
229+
}
230+
} catch (BackrollApiException | IOException e) {
231+
logger.error(e);
232+
throw new CloudRuntimeException("Failed to get backup metrics");
233+
}
234+
if (backupDao.persist(backupToUpdate) != null) {
235+
logger.info("Backroll backup updated");
236+
}
237+
}
238+
}
239+
}
240+
241+
// refresh backup in database list
242+
backupsInDb = backupDao.listByVmId(zoneId, vm.getId());
243+
244+
Long usedSize = 0L;
245+
Long dataSize = 0L;
246+
List<RestorePoint> backups = client.listRestorePoints(vm.getUuid());
247+
for (RestorePoint backup : backups) {
248+
249+
BackrollBackupMetrics backupMetrics = client.getBackupMetrics(vm.getUuid() , getBackupName(backup.getId()));
250+
if (backupMetrics != null) {
251+
usedSize += Long.valueOf(backupMetrics.getDeduplicated());
252+
dataSize += Long.valueOf(backupMetrics.getSize());
253+
254+
// update backup metrics
255+
Backup backupToFind = backupsInDb.stream()
256+
.filter(backupInDb -> backupInDb.getExternalId().contains(backup.getId()))
257+
.findAny()
258+
.orElse(null);
259+
260+
if (backupToFind != null) {
261+
BackupVO backupToUpdate = ((BackupVO) backupToFind);
262+
backupToUpdate.setProtectedSize(usedSize);
263+
backupToUpdate.setSize(dataSize);
264+
backupDao.persist(backupToUpdate);
265+
}
266+
267+
}
268+
}
269+
Metric metric = new Metric(dataSize, usedSize);
270+
logger.debug("Metrics for VM [uuid: {}, name: {}] is [backup size: {}, data size: {}].", vm.getUuid(),
271+
vm.getInstanceName(), metric.getBackupSize(), metric.getDataSize());
272+
metrics.put(vm, metric);
174273
} catch (BackrollApiException | IOException e) {
175274
throw new CloudRuntimeException("Failed to retrieve backup metrics");
176275
}
177-
logger.debug("Metrics for VM [uuid: {}, name: {}] is [backup size: {}, data size: {}].", vm.getUuid(),
178-
vm.getInstanceName(), metric.getBackupSize(), metric.getDataSize());
179-
metrics.put(vm, metric);
180276
}
181277
return metrics;
182278
}
@@ -214,7 +310,6 @@ public Pair<Boolean, Backup> takeBackup(VirtualMachine vm) {
214310
backup.setDomainId(vm.getDomainId());
215311
backup.setZoneId(vm.getDataCenterId());
216312
Boolean result = backupDao.persist(backup) != null;
217-
client.triggerTaskStatus(urlToRequest);
218313
return new Pair<Boolean,Backup>(result, backup);
219314
}
220315
} catch (ParseException | BackrollApiException | IOException e) {
@@ -280,7 +375,7 @@ protected BackrollClient getClient(final Long zoneId) {
280375
try {
281376
if (backrollClient == null) {
282377
logger.debug("backroll client null - instantiation of new one ");
283-
BackrollHttpClientProvider provider = BackrollHttpClientProvider.createProvider(BackrollUrlConfigKey.valueIn(zoneId), BackrollAppNameConfigKey.valueIn(zoneId), BackrollPasswordConfigKey.valueIn(zoneId), true, 300, 600);
378+
BackrollHttpClientProvider provider = BackrollHttpClientProvider.createProvider(new BackrollHttpClientProvider(), BackrollUrlConfigKey.valueIn(zoneId), BackrollAppNameConfigKey.valueIn(zoneId), BackrollPasswordConfigKey.valueIn(zoneId), true, 300, 600);
284379
backrollClient = new BackrollClient(provider);
285380
}
286381
return backrollClient;
@@ -294,7 +389,11 @@ protected BackrollClient getClient(final Long zoneId) {
294389
}
295390

296391
private String getBackupName(Backup backup) {
297-
return backup.getExternalId().substring(backup.getExternalId().indexOf(",") + 1);
392+
return getBackupName(backup.getExternalId());
393+
}
394+
395+
private String getBackupName(String externalId) {
396+
return externalId.substring(externalId.indexOf(",") + 1);
298397
}
299398

300399
@Override
@@ -327,21 +426,17 @@ public Backup createNewBackupEntryForRestorePoint(RestorePoint restorePoint, Vir
327426
backupToInsert.setAccountId(vm.getAccountId());
328427
backupToInsert.setDomainId(vm.getDomainId());
329428
backupToInsert.setZoneId(vm.getDataCenterId());
330-
if(metric == null || metric.getBackupSize().equals(0L)){
331-
try {
332-
BackrollBackupMetrics backupMetrics = client.getBackupMetrics(vm.getUuid() , restorePoint.getId());
333-
if (backupMetrics != null) {
334-
backupToInsert.setSize(backupMetrics.getDeduplicated()); // real size
335-
backupToInsert.setProtectedSize(backupMetrics.getSize()); // total size
336-
}
337-
} catch (BackrollApiException | IOException e) {
338-
logger.error(e);
339-
throw new CloudRuntimeException("Failed to get backup metrics");
429+
430+
try {
431+
BackrollBackupMetrics backupMetrics = client.getBackupMetrics(vm.getUuid() , getBackupName(restorePoint.getId()));
432+
if (backupMetrics != null) {
433+
backupToInsert.setProtectedSize(backupMetrics.getDeduplicated());
434+
backupToInsert.setSize(backupMetrics.getSize());
340435
}
341-
}else{
342-
backupToInsert.setSize(metric.getBackupSize());
343-
backupToInsert.setProtectedSize(metric.getDataSize());
436+
} catch (IOException | BackrollApiException e) {
437+
logger.error(e);
344438
}
439+
345440
backupDao.persist(backupToInsert);
346441
return backupToInsert;
347442
}

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

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -168,11 +168,6 @@ public boolean deleteBackup(final String vmId, final String backupName) throws I
168168
return isBackupDeleted;
169169
}
170170

171-
public void triggerTaskStatus(String urlToRequest)
172-
throws IOException, BackrollApiException {
173-
httpProvider.waitGetWithoutParseResponse(urlToRequest);
174-
}
175-
176171
public Metric getVirtualMachineMetrics(final String vmId) throws IOException, BackrollApiException {
177172
logger.info("Trying to retrieve virtual machine metric from Backroll for vm {}", vmId);
178173

@@ -237,7 +232,7 @@ public List<BackrollVmBackup> getAllBackupsfromVirtualMachine(String vmId)
237232
return backups;
238233
}
239234

240-
private List<BackupInfos> getBackupInfosFromVm(String vmId)
235+
public List<BackupInfos> getBackupInfosFromVm(String vmId)
241236
throws BackrollApiException, IOException {
242237
logger.info("Trying to retrieve all backups for vm {}", vmId);
243238
BackrollTaskRequestResponse requestResponse = httpProvider
@@ -260,7 +255,7 @@ public List<Backup.RestorePoint> listRestorePoints(String vmId) throws BackrollA
260255
if (backupInfos != null && backupInfos.size() > 0) {
261256
for (BackupInfos infos : backupInfos) {
262257
var dateStart = new DateTime(infos.start);
263-
backups.add(new Backup.RestorePoint(infos.id + "," + infos.name, dateStart.toDate(), "INCREMENTAL"));
258+
backups.add(new Backup.RestorePoint(infos.name, dateStart.toDate(), "INCREMENTAL"));
264259
}
265260
}
266261
return backups;

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

Lines changed: 4 additions & 8 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(final String url, final String appname, final String password,
72+
public static BackrollHttpClientProvider createProvider(final BackrollHttpClientProvider backrollHttpClientProvider, 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-
BackrollHttpClientProvider backrollHttpClientProvider = new BackrollHttpClientProvider();
75+
//BackrollHttpClientProvider backrollHttpClientProvider = new BackrollHttpClientProvider();
7676
backrollHttpClientProvider.apiURI = new URI(url);
7777
backrollHttpClientProvider.appname = appname;
7878
backrollHttpClientProvider.password = password;
@@ -232,9 +232,6 @@ public class NotOkBodyException extends Exception {
232232
public NotOkBodyException() {
233233
super();
234234
}
235-
public NotOkBodyException(String errorMessage) {
236-
super(errorMessage);
237-
}
238235
}
239236

240237
public String okBody(final CloseableHttpResponse response) throws NotOkBodyException {
@@ -257,14 +254,12 @@ public String okBody(final CloseableHttpResponse response) throws NotOkBodyExcep
257254
}
258255
default:
259256
try {
260-
HttpEntity bodyEntity2 = response.getEntity();
261-
result = EntityUtils.toString(bodyEntity2);
262257
closeConnection(response);
263258
} catch (IOException e) {
264259
e.printStackTrace();
265260
}
266261

267-
throw new NotOkBodyException("Error ok body, code: " + String.valueOf(response.getStatusLine().getStatusCode()) + " / body response: " + result);
262+
throw new NotOkBodyException();
268263
}
269264
}
270265

@@ -276,6 +271,7 @@ public <T> T waitGet(String url, Class<T> classOfT) throws IOException, Backro
276271
String body = getWithoutParseResponse(url);
277272
if(!StringUtils.isEmpty(body)){
278273
if (!body.contains(TaskState.PENDING)) {
274+
logger.debug("METRICS waitGetWithoutParseResponse : result {}", body);
279275
T result = new ObjectMapper().readValue(body, classOfT);
280276
return result;
281277
}

0 commit comments

Comments
 (0)