1616// under the License.
1717package org .apache .cloudstack .backup ;
1818
19- import java .io .IOException ;
20- import java .net .URISyntaxException ;
21- import java .security .KeyManagementException ;
22- import java .security .NoSuchAlgorithmException ;
23- import java .util .ArrayList ;
24- import java .util .HashMap ;
25- import java .util .List ;
26- import java .util .Map ;
27- import java .util .Objects ;
28- import java .util .stream .Collectors ;
29-
30- import javax .inject .Inject ;
31-
32-
19+ import com .cloud .utils .Pair ;
20+ import com .cloud .utils .component .AdapterBase ;
21+ import com .cloud .utils .exception .CloudRuntimeException ;
22+ import com .cloud .vm .VMInstanceVO ;
23+ import com .cloud .vm .VirtualMachine ;
24+ import com .cloud .vm .dao .VMInstanceDao ;
3325import org .apache .cloudstack .backup .Backup .Metric ;
3426import org .apache .cloudstack .backup .Backup .RestorePoint ;
3527import org .apache .cloudstack .backup .backroll .BackrollClient ;
4032import org .apache .cloudstack .backup .dao .BackupDao ;
4133import org .apache .cloudstack .framework .config .ConfigKey ;
4234import org .apache .cloudstack .framework .config .Configurable ;
43-
4435import org .apache .commons .collections .CollectionUtils ;
4536import org .apache .commons .lang3 .StringUtils ;
4637import org .apache .http .ParseException ;
4738import org .apache .logging .log4j .Logger ;
4839import org .joda .time .DateTime ;
4940
50- import com .cloud .utils .Pair ;
51- import com .cloud .utils .component .AdapterBase ;
52- import com .cloud .utils .exception .CloudRuntimeException ;
53- import com .cloud .vm .VMInstanceVO ;
54- import com .cloud .vm .VirtualMachine ;
55- import com .cloud .vm .dao .VMInstanceDao ;
41+ import javax .inject .Inject ;
42+ import java .io .IOException ;
43+ import java .net .URISyntaxException ;
44+ import java .security .KeyManagementException ;
45+ import java .security .NoSuchAlgorithmException ;
46+ import java .util .HashMap ;
47+ import java .util .List ;
48+ import java .util .Map ;
49+ import java .util .Objects ;
50+ import java .util .stream .Collectors ;
5651
5752public class BackrollBackupProvider extends AdapterBase implements BackupProvider , Configurable {
5853
@@ -88,6 +83,8 @@ public BackrollBackupProvider(BackupDao backupDao, VMInstanceDao vmInstanceDao,
8883 }
8984
9085 public BackrollBackupProvider (){}
86+
87+ private Map <VirtualMachine , Backup .Metric > backupFilesMetricsMap = new HashMap <>();
9188
9289 @ Override
9390 public String getName () {
@@ -104,24 +101,14 @@ public List<BackupOffering> listBackupOfferings(Long zoneId) {
104101 logger .debug ("Listing backup policies on backroll B&R Plugin" );
105102 BackrollClient client = getClient (zoneId );
106103 try {
107- String urlToRequest = client .getBackupOfferingUrl ();
108- logger .info ("BackrollProvider: urlToRequest: " + urlToRequest );
109- if (!StringUtils .isEmpty (urlToRequest )){
110- List <BackupOffering > results = new ArrayList <BackupOffering >();
111- // return client.getBackupOfferings(urlToRequest);
112- results = client .getBackupOfferings (urlToRequest );
113- if (results .size ()>0 ) {
114- logger .info ("BackrollProvider: results > 0" );
115- } else {
116- logger .info ("BackrollProvider: results <= 0" );
117- }
118- return results ;
119- }
104+ var results = client .getBackupOfferings ();
105+
106+ logger .info ("BackrollProvider: results " + (results .size () > 0 ? "> 0" : "<= 0" ));
107+ return results ;
120108 } catch (ParseException | BackrollApiException | IOException e ) {
121109 logger .info ("BackrollProvider: catch erreur: {}" , e );
122110 throw new CloudRuntimeException ("Failed to load backup offerings" );
123111 }
124- return new ArrayList <BackupOffering >();
125112 }
126113
127114 @ Override
@@ -134,7 +121,8 @@ public boolean isValidProviderOffering(Long zoneId, String uuid) {
134121 public boolean assignVMToBackupOffering (VirtualMachine vm , BackupOffering backupOffering ) {
135122 logger .info ("Creating VM backup for VM {} from backup offering {}" , vm .getInstanceName (), backupOffering .getName ());
136123 if (vm instanceof VMInstanceVO ) {
137- ((VMInstanceVO ) vm ).setBackupExternalId (backupOffering .getUuid ());
124+ ((VMInstanceVO ) vm ).setBackupExternalId (backupOffering .getUuid ());
125+
138126 return true ;
139127 }
140128 return false ;
@@ -143,17 +131,15 @@ public boolean assignVMToBackupOffering(VirtualMachine vm, BackupOffering backup
143131 @ Override
144132 public boolean restoreVMFromBackup (VirtualMachine vm , Backup backup ) {
145133 logger .debug ("Restoring vm {} from backup {} on the backroll Backup Provider" , vm .getUuid (), backup .getUuid ());
146- boolean isSuccess ;
134+
147135 try {
148- isSuccess = getClient (vm .getDataCenterId ()).restoreVMFromBackup (vm .getUuid (), getBackupName (backup ));
136+ return getClient (vm .getDataCenterId ()).restoreVMFromBackup (vm .getUuid (), getBackupName (backup ));
149137 } catch (ParseException | BackrollApiException | IOException e ) {
150138 throw new CloudRuntimeException ("Failed to restore VM from Backup" );
151139 }
152- return isSuccess ;
153140 }
154141
155- @ Override
156- public Map <VirtualMachine , Backup .Metric > getBackupMetrics (Long zoneId , List <VirtualMachine > vms ) {
142+ private Map <VirtualMachine , Backup .Metric > getBackupMetrics (Long zoneId , List <VirtualMachine > vms ) {
157143 final Map <VirtualMachine , Backup .Metric > metrics = new HashMap <>();
158144 if (CollectionUtils .isEmpty (vms )) {
159145 logger .warn ("Unable to get VM Backup Metrics because the list of VMs is empty." );
@@ -288,35 +274,38 @@ public boolean willDeleteBackupsOnOfferingRemoval() {
288274 }
289275
290276 @ Override
291- public Pair <Boolean , Backup > takeBackup (VirtualMachine vm ) {
277+ public Pair <Boolean , Backup > takeBackup (VirtualMachine vm , Boolean quiesceVM ) {
292278 logger .info ("Starting backup for VM ID {} on backroll provider" , vm .getUuid ());
293279 final BackrollClient client = getClient (vm .getDataCenterId ());
294280
295281 try {
296- String urlToRequest = client .startBackupJob (vm .getUuid ());
297- logger .info ("BackrollProvider: urlToRequest: " + urlToRequest );
298- String backupJob = urlToRequest .replace ("/status/" , "" );
299- if (!StringUtils .isEmpty (backupJob )) {
300- BackupVO backup = new BackupVO ();
301- backup .setVmId (vm .getId ());
302- backup .setExternalId (backupJob );
303- backup .setType ("INCREMENTAL" );
304- backup .setDate (new DateTime ().toDate ());
305- backup .setSize (0L );
306- backup .setProtectedSize (0L );
307- backup .setStatus (Backup .Status .BackingUp );
308- backup .setBackupOfferingId (vm .getBackupOfferingId ());
309- backup .setAccountId (vm .getAccountId ());
310- backup .setDomainId (vm .getDomainId ());
311- backup .setZoneId (vm .getDataCenterId ());
312- Boolean result = backupDao .persist (backup ) != null ;
313- return new Pair <Boolean ,Backup >(result , backup );
282+ String backupExternalId = client .startBackupJob (vm .getUuid ());
283+
284+ if (StringUtils .isEmpty (backupExternalId )) {
285+ return new Pair <>(false , null );
314286 }
287+
288+ var backup = new BackupVO ();
289+ backup .setVmId (vm .getId ());
290+ backup .setExternalId (backupExternalId );
291+ backup .setType ("INCREMENTAL" );
292+ backup .setDate (new DateTime ().toDate ());
293+ backup .setSize (0L );
294+ backup .setProtectedSize (0L );
295+ backup .setStatus (Backup .Status .BackingUp );
296+ backup .setBackupOfferingId (vm .getBackupOfferingId ());
297+ backup .setAccountId (vm .getAccountId ());
298+ backup .setDomainId (vm .getDomainId ());
299+ backup .setZoneId (vm .getDataCenterId ());
300+
301+ Boolean result = backupDao .persist (backup ) != null ;
302+
303+ return new Pair <Boolean ,Backup >(result , backup );
304+
315305 } catch (ParseException | BackrollApiException | IOException e ) {
316306 logger .debug (e .getMessage ());
317307 throw new CloudRuntimeException ("Failed to take backup" );
318308 }
319- return new Pair <Boolean ,Backup >(false , null );
320309 }
321310
322311 @ Override
@@ -364,13 +353,12 @@ private boolean deleteBackupInDb(Backup backup) {
364353 backupToUpdate .setStatus (Backup .Status .Removed );
365354 if (backupDao .persist (backupToUpdate ) != null ) {
366355 logger .debug ("BACKROLL: Backroll backup {} deleted in database." , backup .getUuid ());
367- VMInstanceVO vm = vmInstanceDao .findByIdIncludingRemoved (backup .getVmId ());
368356 return true ;
369357 }
370358 return false ;
371359 }
372360
373- protected BackrollClient getClient (final Long zoneId ) {
361+ private BackrollClient getClient (final Long zoneId ) {
374362 logger .debug ("Backroll Provider GetClient with zone id {}" , zoneId );
375363 try {
376364 if (backrollClient == null ) {
@@ -397,8 +385,8 @@ private String getBackupName(String externalId) {
397385 }
398386
399387 @ Override
400- public Pair <Boolean , String > restoreBackedUpVolume (Backup backup , String volumeUuid , String hostIp , String dataStoreUuid , Pair <String , VirtualMachine .State > vmNameAndState ) {
401- logger .debug ("Restoring volume {} from backup {} on the Backroll Backup Provider" , volumeUuid , backup .getUuid ());
388+ public Pair <Boolean , String > restoreBackedUpVolume (Backup backup , Backup . VolumeInfo backupVolumeInfo , String hostIp , String dataStoreUuid , Pair <String , VirtualMachine .State > vmNameAndState ) {
389+ logger .debug ("Restoring volume {} from backup {} on the Backroll Backup Provider" , backupVolumeInfo . getUuid () , backup .getUuid ());
402390 throw new CloudRuntimeException ("Backroll plugin does not support this feature" );
403391 }
404392
@@ -414,7 +402,7 @@ public List<RestorePoint> listRestorePoints(VirtualMachine vm) {
414402 }
415403
416404 @ Override
417- public Backup createNewBackupEntryForRestorePoint (RestorePoint restorePoint , VirtualMachine vm , Metric metric ) {
405+ public Backup createNewBackupEntryForRestorePoint (RestorePoint restorePoint , VirtualMachine vm ) {
418406 final BackrollClient client = getClient (vm .getDataCenterId ());
419407 BackupVO backupToInsert = new BackupVO ();
420408 backupToInsert .setVmId (vm .getId ());
@@ -440,4 +428,37 @@ public Backup createNewBackupEntryForRestorePoint(RestorePoint restorePoint, Vir
440428 backupDao .persist (backupToInsert );
441429 return backupToInsert ;
442430 }
431+
432+ @ Override
433+ public Boolean crossZoneInstanceCreationEnabled (BackupOffering backupOffering ) {
434+ return false ;
435+ }
436+
437+ @ Override
438+ public Pair <Boolean , String > restoreBackupToVM (VirtualMachine vm , Backup backup , String hostIp , String dataStoreUuid ) {
439+ throw new UnsupportedOperationException ("Not supported yet." ); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
440+ }
441+
442+ @ Override
443+ public void syncBackupMetrics (Long zoneId ) {
444+ final List <VMInstanceVO > vms = vmInstanceDao .listByZoneId (zoneId );
445+
446+ final var castedVMList = vms .stream ().map ((v ) -> (VirtualMachine )v ).collect (Collectors .toList ());
447+
448+ backupFilesMetricsMap = getBackupMetrics (zoneId , castedVMList );
449+ }
450+
451+ @ Override
452+ public boolean supportsInstanceFromBackup () {
453+ return true ;
454+ }
455+
456+ @ Override
457+ public Pair <Long , Long > getBackupStorageStats (Long zoneId ) {
458+ return new Pair <>(0L , 0L );
459+ }
460+
461+ @ Override
462+ public void syncBackupStorageStats (Long zoneId ) {
463+ }
443464}
0 commit comments