Skip to content

Commit 118bbe2

Browse files
committed
Cleanup the created VM if restore fails afterwards.
1 parent 6bedc27 commit 118bbe2

File tree

2 files changed

+27
-9
lines changed

2 files changed

+27
-9
lines changed

api/src/main/java/org/apache/cloudstack/api/command/user/vm/BaseDeployVMCmd.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -533,7 +533,7 @@ public List<DiskOfferingInfo> getDataDiskOfferingsInfo() {
533533
HashMap<String, String> dataDisk = (HashMap<String, String>)iter.next();
534534
String diskOfferingUuid = dataDisk.get(ApiConstants.DISK_OFFERING_ID);
535535
if (diskOfferingUuid == null) {
536-
throw new InvalidParameterValueException("Disk offering id is required for data disk");
536+
throw new InvalidParameterValueException("diskofferingid parameter is required for datadiskdetails");
537537
}
538538
DiskOffering diskOffering = _entityMgr.findByUuid(DiskOffering.class, diskOfferingUuid);
539539
if (diskOffering == null) {
@@ -546,6 +546,9 @@ public List<DiskOfferingInfo> getDataDiskOfferingsInfo() {
546546
Long size = null;
547547
Long minIops = null;
548548
Long maxIops = null;
549+
if (dataDisk.get(ApiConstants.DEVICE_ID) == null) {
550+
throw new InvalidParameterValueException("deviceid parameter is required for datadiskdetails");
551+
}
549552
Long deviceId = Long.parseLong(dataDisk.get(ApiConstants.DEVICE_ID));
550553
if (diskOffering.isCustomized()) {
551554
if (dataDisk.get(ApiConstants.SIZE) == null) {

server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9480,16 +9480,31 @@ public UserVm restoreVMFromBackup(CreateVMFromBackupCmd cmd) throws ResourceUnav
94809480
long vmId = cmd.getEntityId();
94819481
Map<Long, DiskOffering> diskOfferingMap = cmd.getDataDiskTemplateToDiskOfferingMap();
94829482
Map<VirtualMachineProfile.Param, Object> additonalParams = new HashMap<>();
9483-
UserVm vm = startVirtualMachine(vmId, null, null, null, diskOfferingMap, additonalParams, null);
9483+
UserVm vm;
94849484

9485-
boolean status = false;
9486-
status = stopVirtualMachine(CallContext.current().getCallingUserId(), vm.getId()) ;
9487-
if (!status) {
9488-
expungeVm(vm.getId());
9489-
throw new CloudRuntimeException("Unable to stop the instance before restore ");
9490-
}
9485+
try {
9486+
vm = startVirtualMachine(vmId, null, null, null, diskOfferingMap, additonalParams, null);
9487+
9488+
boolean status = stopVirtualMachine(CallContext.current().getCallingUserId(), vm.getId()) ;
9489+
if (!status) {
9490+
UserVmVO vmVO = _vmDao.findById(vmId);
9491+
expunge(vmVO);
9492+
logger.debug("Successfully cleaned up VM {} after create instance from backup failed", vmId);
9493+
throw new CloudRuntimeException("Unable to stop the instance before restore");
9494+
}
9495+
9496+
backupManager.restoreBackupToVM(cmd.getBackupId(), vmId);
94919497

9492-
backupManager.restoreBackupToVM(cmd.getBackupId(), vmId);
9498+
} catch (Exception e) {
9499+
UserVmVO vmVO = _vmDao.findById(vmId);
9500+
try {
9501+
expunge(vmVO);
9502+
logger.debug("Successfully cleaned up VM {} after create instance from backup failed", vmId);
9503+
} catch (Exception cleanupException) {
9504+
logger.debug("Failed to cleanup VM {} after create instance from backup failed", vmId, cleanupException);
9505+
}
9506+
throw e;
9507+
}
94939508

94949509
Account owner = _accountService.getActiveAccountById(cmd.getEntityOwnerId());
94959510
UserVmVO userVm = _vmDao.findById(vmId);

0 commit comments

Comments
 (0)