1616// under the License.
1717package org .apache .cloudstack .backup ;
1818
19- import java .io .IOException ;
2019import java .net .URISyntaxException ;
2120import java .security .KeyManagementException ;
2221import java .security .NoSuchAlgorithmException ;
4039
4140import org .apache .commons .collections .CollectionUtils ;
4241import org .apache .commons .lang3 .StringUtils ;
43- import org . apache . http . client . ClientProtocolException ;
42+
4443import org .joda .time .DateTime ;
4544
4645import com .cloud .utils .Pair ;
@@ -55,19 +54,19 @@ public class BackrollBackupProvider extends AdapterBase implements BackupProvide
5554 public static final String BACKUP_IDENTIFIER = "-CSBKP-" ;
5655
5756 public ConfigKey <String > BackrollUrlConfigKey = new ConfigKey <>("Advanced" , String .class ,
58- "backup.plugin.backroll.config.url" ,
59- "http://api.backup.demo.ccc:5050/api/v1" ,
60- "Url for backroll plugin." , true , ConfigKey .Scope .Zone );
57+ "backup.plugin.backroll.config.url" ,
58+ "http://api.backup.demo.ccc:5050/api/v1" ,
59+ "Url for backroll plugin." , true , ConfigKey .Scope .Zone );
6160
6261 public ConfigKey <String > BackrollAppNameConfigKey = new ConfigKey <>("Advanced" , String .class ,
63- "backup.plugin.backroll.config.appname" ,
64- "backroll_api" ,
65- "App Name for backroll plugin." , true , ConfigKey .Scope .Zone );
62+ "backup.plugin.backroll.config.appname" ,
63+ "backroll_api" ,
64+ "App Name for backroll plugin." , true , ConfigKey .Scope .Zone );
6665
6766 public ConfigKey <String > BackrollPasswordConfigKey = new ConfigKey <>("Advanced" , String .class ,
68- "backup.plugin.backroll.config.password" ,
69- "VviX8dALauSyYJMqVYJqf3UyZOpO3joS" ,
70- "Password for backroll plugin." , true , ConfigKey .Scope .Zone );
67+ "backup.plugin.backroll.config.password" ,
68+ "VviX8dALauSyYJMqVYJqf3UyZOpO3joS" ,
69+ "Password for backroll plugin." , true , ConfigKey .Scope .Zone );
7170
7271 private BackrollClient backrollClient ;
7372
@@ -89,12 +88,12 @@ public String getDescription() {
8988 @ Override
9089 public List <BackupOffering > listBackupOfferings (Long zoneId ) {
9190 logger .debug ("Listing backup policies on backroll B&R Plugin" );
92- try {
93- BackrollClient client = getClient (zoneId );
94- return client .getBackupOfferings (client .getBackupOfferingUrl ()); // TODO Embed URL in method ?
95- } catch (Exception e ) {
96- throw new CloudRuntimeException (String .format ("Failed to list backup offerings for zone %s." , zoneId ), e );
91+ BackrollClient client = getClient (zoneId );
92+ String urlToRequest = client .getBackupOfferingUrl ();
93+ if (!StringUtils .isEmpty (urlToRequest )){
94+ return client .getBackupOfferings (urlToRequest );
9795 }
96+ return new ArrayList <BackupOffering >();
9897 }
9998
10099 @ Override
@@ -105,22 +104,16 @@ public boolean isValidProviderOffering(Long zoneId, String uuid) {
105104
106105 @ Override
107106 public boolean assignVMToBackupOffering (VirtualMachine vm , BackupOffering backupOffering ) {
108- logger .info ("Creating VM backup for VM {} from backup offering {}" , vm .getInstanceName (),
109- backupOffering .getName ());
107+ logger .info ("Creating VM backup for VM {} from backup offering {}" , vm .getInstanceName (), backupOffering .getName ());
110108 ((VMInstanceVO ) vm ).setBackupExternalId (backupOffering .getUuid ());
111109 return true ;
112110 }
113111
114112 @ Override
115113 public boolean restoreVMFromBackup (VirtualMachine vm , Backup backup ) {
116114 logger .debug ("Restoring vm {} from backup {} on the backroll Backup Provider" , vm .getUuid (), backup .getUuid ());
117- try {
118- getClient (vm .getDataCenterId ()).restoreVMFromBackup (vm .getUuid (), getBackupName (backup ));
119- } catch (Exception e ) {
120- throw new CloudRuntimeException (
121- String .format ("Failed to restore backup %s to VM %s." , backup .getName (), vm .getName ()), e );
122- }
123- return true ;
115+ boolean isSuccess = getClient (vm .getDataCenterId ()).restoreVMFromBackup (vm .getUuid (), getBackupName (backup ));
116+ return isSuccess ;
124117 }
125118
126119 @ Override
@@ -131,23 +124,18 @@ public Map<VirtualMachine, Backup.Metric> getBackupMetrics(Long zoneId, List<Vir
131124 return metrics ;
132125 }
133126
134- List <String > vmUuids = vms .stream ().filter (Objects ::nonNull ).map (VirtualMachine ::getUuid )
135- .collect (Collectors .toList ());
127+ List <String > vmUuids = vms .stream ().filter (Objects ::nonNull ).map (VirtualMachine ::getUuid ).collect (Collectors .toList ());
136128 logger .debug ("Get Backup Metrics for VMs: {}." , String .join (", " , vmUuids ));
137129
138130 for (final VirtualMachine vm : vms ) {
139131 if (vm == null ) {
140132 continue ;
141133 }
142134
143- try {
144- Metric metric = getClient (zoneId ).getVirtualMachineMetrics (vm .getUuid ());
145- logger .debug ("Metrics for VM [uuid: {}, name: {}] is [backup size: {}, data size: {}]." , vm .getUuid (),
146- vm .getInstanceName (), metric .getBackupSize (), metric .getDataSize ());
147- metrics .put (vm , metric );
148- } catch (Exception e ) {
149- logger .error ("Failed to get backup metrics for VM {} due to {}." , vm .getName (), e );
150- }
135+ Metric metric = getClient (zoneId ).getVirtualMachineMetrics (vm .getUuid ());
136+ logger .debug ("Metrics for VM [uuid: {}, name: {}] is [backup size: {}, data size: {}]." , vm .getUuid (),
137+ vm .getInstanceName (), metric .getBackupSize (), metric .getDataSize ());
138+ metrics .put (vm , metric );
151139 }
152140 return metrics ;
153141 }
@@ -156,30 +144,28 @@ public Map<VirtualMachine, Backup.Metric> getBackupMetrics(Long zoneId, List<Vir
156144 public boolean removeVMFromBackupOffering (VirtualMachine vm ) {
157145 logger .info ("Removing VM ID {} from Backrool backup offering " , vm .getUuid ());
158146
159- boolean everythingIsOk = true ;
147+ boolean isAnyProblemWhileRemovingBackups = false ;
160148
161149 List <Backup > backupsInCs = backupDao .listByVmId (null , vm .getId ());
162150
163151 for (Backup backup : backupsInCs ) {
164152 logger .debug ("Trying to remove backup with id {}" , backup .getId ());
165153
166- try {
167- getClient (backup .getZoneId ()).deleteBackup (vm .getUuid (), getBackupName (backup ));
154+ if (getClient (backup .getZoneId ()).deleteBackup (vm .getUuid (), getBackupName (backup ))) {
168155 logger .info ("Backup {} deleted in Backroll for virtual machine {}" , backup .getId (), vm .getName ());
169- if (!backupDao .remove (backup .getId ())) {
170- everythingIsOk = false ;
156+ if (!backupDao .remove (backup .getId ())){
157+ isAnyProblemWhileRemovingBackups = true ;
171158 }
172159 logger .info ("Backup {} deleted in CS for virtual machine {}" , backup .getId (), vm .getName ());
173- } catch (Exception e ) {
174- logger .error ("Failed to remove backup {} for VM {}." , backup .getName (), vm .getName ());
175- everythingIsOk = false ;
160+ } else {
161+ isAnyProblemWhileRemovingBackups = false ;
176162 }
177163 }
178164
179- if (! everythingIsOk ) {
165+ if (isAnyProblemWhileRemovingBackups ) {
180166 logger .info ("Problems occured while removing some backups for virtual machine {}" , vm .getName ());
181167 }
182- return everythingIsOk ;
168+ return isAnyProblemWhileRemovingBackups ;
183169 }
184170
185171 @ Override
@@ -190,9 +176,10 @@ public boolean willDeleteBackupsOnOfferingRemoval() {
190176 @ Override
191177 public boolean takeBackup (VirtualMachine vm ) {
192178 logger .info ("Starting backup for VM ID {} on backroll provider" , vm .getUuid ());
193- try {
194- final BackrollClient client = getClient (vm .getDataCenterId ());
195- String idBackupTask = client .startBackupJob (vm .getUuid ());
179+ final BackrollClient client = getClient (vm .getDataCenterId ());
180+
181+ String idBackupTask = client .startBackupJob (vm .getUuid ());
182+ if (!StringUtils .isEmpty (idBackupTask )) {
196183 BackupVO backup = new BackupVO ();
197184 backup .setVmId (vm .getId ());
198185 backup .setExternalId (idBackupTask );
@@ -205,32 +192,22 @@ public boolean takeBackup(VirtualMachine vm) {
205192 backup .setAccountId (vm .getAccountId ());
206193 backup .setDomainId (vm .getDomainId ());
207194 backup .setZoneId (vm .getDataCenterId ());
208- assert backupDao .persist (backup ) != null ;
209- } catch (Exception e ) {
210- throw new CloudRuntimeException (String .format ("Failed to take a backup of VM %s." , vm .getName ()), e );
195+ return backupDao .persist (backup ) != null ;
211196 }
212- return true ;
197+ return false ;
213198 }
214199
215200 @ Override
216201 public void syncBackups (VirtualMachine vm , Backup .Metric metric ) {
217202 logger .info ("Starting sync backup for VM ID " + vm .getUuid () + " on backroll provider" );
218203
219- final BackrollClient client ;
220- try {
221- client = getClient (vm .getDataCenterId ());
222- } catch (Exception e ) {
223- throw new CloudRuntimeException (
224- String .format ("Failed to get Backroll client while syncing backups for VM %s." , vm .getName ()));
225- }
226-
204+ final BackrollClient client = getClient (vm .getDataCenterId ());
227205 List <Backup > backupsInDb = backupDao .listByVmId (null , vm .getId ());
228206
229207 for (Backup backup : backupsInDb ) {
230- try {
231- if (backup .getStatus ().equals (Backup .Status .BackingUp )) {
232- BackrollTaskStatus response = client .checkBackupTaskStatus (backup .getExternalId ());
233-
208+ if (backup .getStatus ().equals (Backup .Status .BackingUp )) {
209+ BackrollTaskStatus response = client .checkBackupTaskStatus (backup .getExternalId ());
210+ if (response != null ) {
234211 logger .debug ("backroll backup id: {}" , backup .getExternalId ());
235212 logger .debug ("backroll backup status: {}" , response .getState ());
236213
@@ -254,8 +231,7 @@ public void syncBackups(VirtualMachine vm, Backup.Metric metric) {
254231 backupToUpdate .setStatus (Backup .Status .BackedUp );
255232 backupToUpdate .setExternalId (backup .getExternalId () + "," + response .getInfo ());
256233
257- BackrollBackupMetrics backupMetrics = client .getBackupMetrics (vm .getUuid (),
258- response .getInfo ());
234+ BackrollBackupMetrics backupMetrics = client .getBackupMetrics (vm .getUuid () , response .getInfo ());
259235 if (backupMetrics != null ) {
260236 backupToUpdate .setSize (backupMetrics .getDeduplicated ()); // real size
261237 backupToUpdate .setProtectedSize (backupMetrics .getSize ()); // total size
@@ -268,19 +244,16 @@ public void syncBackups(VirtualMachine vm, Backup.Metric metric) {
268244 logger .info ("Backroll mise à jour enregistrée" );
269245 backupDao .remove (backup .getId ());
270246 }
271-
272- } else if (backup .getStatus ().equals (Backup .Status .BackedUp ) && backup .getSize ().equals (0L )) {
273- String backupId = backup .getExternalId ().contains ("," ) ? backup .getExternalId ().split ("," )[1 ]
274- : backup .getExternalId ();
275-
276- BackrollBackupMetrics backupMetrics = client .getBackupMetrics (vm .getUuid (), backupId );
247+ }
248+ } else if (backup .getStatus ().equals (Backup .Status .BackedUp ) && backup .getSize ().equals (0L )) {
249+ String backupId = backup .getExternalId ().contains ("," ) ? backup .getExternalId ().split ("," )[1 ] : backup .getExternalId ();
250+ BackrollBackupMetrics backupMetrics = client .getBackupMetrics (vm .getUuid () , backupId );
251+ if (backupMetrics != null ) {
277252 BackupVO backupToUpdate = ((BackupVO ) backup );
278253 backupToUpdate .setSize (backupMetrics .getDeduplicated ()); // real size
279254 backupToUpdate .setProtectedSize (backupMetrics .getSize ()); // total size
280255 backupDao .persist (backupToUpdate );
281256 }
282- } catch (Exception e ) {
283- logger .error ("Failed to sync backup {}." , backup .getName ());
284257 }
285258 }
286259
@@ -291,9 +264,9 @@ public void syncBackups(VirtualMachine vm, Backup.Metric metric) {
291264 // insert new backroll backup in CS
292265 for (BackrollVmBackup backupInBackroll : backupsFromBackroll ) {
293266 Backup backupToFind = backupsInDb .stream ()
294- .filter (backupInDb -> backupInDb .getExternalId ().contains (backupInBackroll .getName ()))
295- .findAny ()
296- .orElse (null );
267+ .filter (backupInDb -> backupInDb .getExternalId ().contains (backupInBackroll .getName ()))
268+ .findAny ()
269+ .orElse (null );
297270
298271 if (backupToFind == null ) {
299272 BackupVO backupToInsert = new BackupVO ();
@@ -323,12 +296,11 @@ public void syncBackups(VirtualMachine vm, Backup.Metric metric) {
323296 // delete deleted backroll backup in CS
324297 backupsInDb = backupDao .listByVmId (null , vm .getId ());
325298 for (Backup backup : backupsInDb ) {
326- String backupName = backup .getExternalId ().contains ("," ) ? backup .getExternalId ().split ("," )[1 ]
327- : backup .getExternalId ();
299+ String backupName = backup .getExternalId ().contains ("," ) ? backup .getExternalId ().split ("," )[1 ] : backup .getExternalId ();
328300 BackrollVmBackup backupToFind = backupsFromBackroll .stream ()
329- .filter (backupInBackroll -> backupInBackroll .getName ().contains (backupName ))
330- .findAny ()
331- .orElse (null );
301+ .filter (backupInBackroll -> backupInBackroll .getName ().contains (backupName ))
302+ .findAny ()
303+ .orElse (null );
332304
333305 if (backupToFind == null ) {
334306 BackupVO backupToUpdate = ((BackupVO ) backup );
@@ -347,35 +319,32 @@ public String getConfigComponentName() {
347319
348320 @ Override
349321 public ConfigKey <?>[] getConfigKeys () {
350- return new ConfigKey [] {
351- BackrollUrlConfigKey ,
352- BackrollAppNameConfigKey ,
353- BackrollPasswordConfigKey
322+ return new ConfigKey []{
323+ BackrollUrlConfigKey ,
324+ BackrollAppNameConfigKey ,
325+ BackrollPasswordConfigKey
354326 };
355327 }
356328
357329 @ Override
358330 public boolean deleteBackup (Backup backup , boolean forced ) {
359331 logger .info ("backroll delete backup id: {}" , backup .getExternalId ());
360332 if (backup .getStatus ().equals (Backup .Status .BackingUp )) {
361- throw new CloudRuntimeException ("You can't delete a backup while it still backing up. " );
333+ throw new CloudRuntimeException ("You can't delete a backup while it still BackingUp " );
362334 } else {
363335 logger .debug ("backroll - try delete backup" );
364336 VMInstanceVO vm = vmInstanceDao .findByIdIncludingRemoved (backup .getVmId ());
365337
366- if (backup .getStatus ().equals (Backup .Status .Removed ) || backup .getStatus ().equals (Backup .Status .Failed )) {
338+ if (backup .getStatus ().equals (Backup .Status .Removed ) || backup .getStatus ().equals (Backup .Status .Failed )){
367339 return deleteBackupInDb (backup );
340+ } else {
341+ if (getClient (backup .getZoneId ()).deleteBackup (vm .getUuid (), getBackupName (backup ))) {
342+ logger .debug ("Backup deletion for backup {} complete on backroll side." , backup .getUuid ());
343+ return deleteBackupInDb (backup );
344+ }
368345 }
369-
370- try {
371- getClient (backup .getZoneId ()).deleteBackup (vm .getUuid (), getBackupName (backup ));
372- } catch (Exception e ) {
373- throw new CloudRuntimeException (String .format ("Failed to delete backup %s" , backup .getName ()));
374- }
375-
376- logger .debug ("Backup deletion for backup {} complete on backroll side." , backup .getUuid ());
377- return deleteBackupInDb (backup );
378346 }
347+ return false ;
379348 }
380349
381350 private boolean deleteBackupInDb (Backup backup ) {
@@ -388,14 +357,12 @@ private boolean deleteBackupInDb(Backup backup) {
388357 return false ;
389358 }
390359
391- protected BackrollClient getClient (final Long zoneId ) throws ClientProtocolException , IOException {
360+ protected BackrollClient getClient (final Long zoneId ) {
392361 logger .debug ("Backroll Provider GetClient with zone id {}" , zoneId );
393362 try {
394363 if (backrollClient == null ) {
395364 logger .debug ("backroll client null - instanciation of new one " );
396- backrollClient = new BackrollClient (BackrollUrlConfigKey .valueIn (zoneId ),
397- BackrollAppNameConfigKey .valueIn (zoneId ), BackrollPasswordConfigKey .valueIn (zoneId ), true , 300 ,
398- 600 );
365+ backrollClient = new BackrollClient (BackrollUrlConfigKey .valueIn (zoneId ), BackrollAppNameConfigKey .valueIn (zoneId ), BackrollPasswordConfigKey .valueIn (zoneId ), true , 300 , 600 );
399366 }
400367 return backrollClient ;
401368 } catch (URISyntaxException e ) {
@@ -411,10 +378,8 @@ private String getBackupName(Backup backup) {
411378 }
412379
413380 @ Override
414- public Pair <Boolean , String > restoreBackedUpVolume (Backup backup , String volumeUuid , String hostIp ,
415- String dataStoreUuid , Pair <String , VirtualMachine .State > vmNameAndState ) {
416- logger .debug ("Restoring volume {} from backup {} on the Backroll Backup Provider" , volumeUuid ,
417- backup .getUuid ());
381+ public Pair <Boolean , String > restoreBackedUpVolume (Backup backup , String volumeUuid , String hostIp , String dataStoreUuid , Pair <String , VirtualMachine .State > vmNameAndState ) {
382+ logger .debug ("Restoring volume {} from backup {} on the Backroll Backup Provider" , volumeUuid , backup .getUuid ());
418383 throw new CloudRuntimeException ("Backroll plugin does not support this feature" );
419384 }
420385}
0 commit comments