3434import org .apache .cloudstack .backup .Backup .RestorePoint ;
3535import org .apache .cloudstack .backup .backroll .BackrollClient ;
3636import org .apache .cloudstack .backup .backroll .model .BackrollBackupMetrics ;
37+ import org .apache .cloudstack .backup .backroll .model .BackrollTaskStatus ;
3738import org .apache .cloudstack .backup .backroll .utils .BackrollApiException ;
3839import org .apache .cloudstack .backup .backroll .utils .BackrollHttpClientProvider ;
3940import 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 }
0 commit comments