@@ -9369,14 +9369,15 @@ public UserVm allocateVMFromBackup(CreateVMFromBackupCmd cmd) throws Insufficien
9369
9369
VirtualMachineTemplate template = _templateDao.findById(templateId);
9370
9370
verifyTemplate(cmd, template, serviceOffering.getId());
9371
9371
9372
- Long size = null;
9372
+ Long size = cmd.getSize();
9373
+
9373
9374
Long diskOfferingId = cmd.getDiskOfferingId();
9374
9375
Boolean isIso = template.getFormat().equals(ImageFormat.ISO);
9375
9376
if (diskOfferingId != null) {
9376
9377
if (!isIso) {
9377
9378
throw new InvalidParameterValueException(ApiConstants.DISK_OFFERING_ID + " parameter is supported for creating instance from backup only for ISO. For creating VMs with templates, please use the parameter " + ApiConstants.DATADISKS_DETAILS);
9378
9379
}
9379
- DiskOffering diskOffering = _entityMgr .findById(DiskOffering.class, diskOfferingId);
9380
+ DiskOffering diskOffering = _diskOfferingDao .findById(diskOfferingId);
9380
9381
if (diskOffering == null) {
9381
9382
throw new InvalidParameterValueException("Unable to find disk offering " + diskOfferingId);
9382
9383
}
@@ -9387,28 +9388,45 @@ public UserVm allocateVMFromBackup(CreateVMFromBackupCmd cmd) throws Insufficien
9387
9388
9388
9389
Long overrideDiskOfferingId = cmd.getOverrideDiskOfferingId();
9389
9390
9390
- if (isIso && diskOfferingId == null) {
9391
- DiskOfferingInfo rootDiskOfferingInfo = backupManager.getRootDiskOfferingInfoFromBackup(backup);
9392
- if (rootDiskOfferingInfo == null) {
9393
- throw new CloudRuntimeException("Unable to find root disk offering with the uuid stored in backup. Please specify a valid root disk offering id while creating instance");
9394
- }
9395
- diskOfferingId = rootDiskOfferingInfo.getDiskOffering().getId();
9396
- updateDetailsWithRootDiskAttributes(cmd.getDetails(), rootDiskOfferingInfo);
9397
- size = rootDiskOfferingInfo.getSize();
9398
- }
9399
-
9400
- if (!isIso && overrideDiskOfferingId == null) {
9401
- DiskOfferingInfo rootDiskOfferingInfo = backupManager.getRootDiskOfferingInfoFromBackup(backup);
9402
- if (rootDiskOfferingInfo != null &&
9403
- serviceOffering.getDiskOfferingId() != rootDiskOfferingInfo.getDiskOffering().getId()) {
9404
- overrideDiskOfferingId = rootDiskOfferingInfo.getDiskOffering().getId();
9391
+ DiskOfferingInfo rootDiskOfferingInfo = backupManager.getRootDiskOfferingInfoFromBackup(backup);
9392
+ if (isIso) {
9393
+ if (diskOfferingId == null) {
9394
+ if (rootDiskOfferingInfo == null) {
9395
+ throw new CloudRuntimeException("Unable to find root disk offering with the uuid stored in backup. Please specify a valid root disk offering id while creating instance");
9396
+ }
9397
+ diskOfferingId = rootDiskOfferingInfo.getDiskOffering().getId();
9405
9398
updateDetailsWithRootDiskAttributes(cmd.getDetails(), rootDiskOfferingInfo);
9399
+ size = rootDiskOfferingInfo.getSize();
9400
+ } else {
9401
+ DiskOffering rootDiskOffering = _diskOfferingDao.findById(diskOfferingId);
9402
+ Long rootDiskSize = rootDiskOffering.isCustomized() ? size : rootDiskOffering.getDiskSize() / GiB_TO_BYTES;
9403
+ if (rootDiskOfferingInfo != null && rootDiskSize < rootDiskOfferingInfo.getSize()) {
9404
+ throw new InvalidParameterValueException(
9405
+ String.format("Instance volume size %d[GiB] cannot be less than the backed-up volume size %d[GiB].",
9406
+ rootDiskSize, rootDiskOfferingInfo.getSize()));
9407
+ }
9408
+ }
9409
+ } else {
9410
+ if (overrideDiskOfferingId == null) {
9411
+ if (rootDiskOfferingInfo != null && serviceOffering.getDiskOfferingId() != rootDiskOfferingInfo.getDiskOffering().getId()) {
9412
+ overrideDiskOfferingId = rootDiskOfferingInfo.getDiskOffering().getId();
9413
+ updateDetailsWithRootDiskAttributes(cmd.getDetails(), rootDiskOfferingInfo);
9414
+ }
9415
+ } else {
9416
+ DiskOffering overrideDiskOffering = _diskOfferingDao.findById(overrideDiskOfferingId);
9417
+ String diskSizeDetail = cmd.getDetails().get(VmDetailConstants.ROOT_DISK_SIZE);
9418
+ Long diskSize = diskSizeDetail != null ? Long.parseLong(diskSizeDetail) : overrideDiskOffering.getDiskSize() / GiB_TO_BYTES;
9419
+ if (rootDiskOfferingInfo != null && diskSize < rootDiskOfferingInfo.getSize()) {
9420
+ throw new InvalidParameterValueException(
9421
+ String.format("Instance volume size %d[GiB] cannot be less than the backed-up volume size %d[GiB].",
9422
+ diskSize, rootDiskOfferingInfo.getSize()));
9423
+ }
9406
9424
}
9407
9425
}
9408
9426
9409
9427
List<DiskOfferingInfo> dataDiskOfferingsInfo = cmd.getDataDiskOfferingsInfo();
9410
9428
if (dataDiskOfferingsInfo != null) {
9411
- backupManager.updateDiskOfferingSizeFromBackup (dataDiskOfferingsInfo, backup);
9429
+ backupManager.checkDiskOfferingSizeAgainstBackup (dataDiskOfferingsInfo, backup);
9412
9430
} else {
9413
9431
dataDiskOfferingsInfo = backupManager.getDataDiskOfferingListFromBackup(backup);
9414
9432
}
@@ -9425,10 +9443,6 @@ public UserVm allocateVMFromBackup(CreateVMFromBackupCmd cmd) throws Insufficien
9425
9443
ipToNetworkMap = backupManager.getIpToNetworkMapFromBackup(backup, cmd.getPreserveIp(), networkIds);
9426
9444
}
9427
9445
9428
- if (size == null) {
9429
- size = cmd.getSize();
9430
- }
9431
-
9432
9446
return createVirtualMachine(cmd, zone, owner, serviceOffering, template, hypervisorType, diskOfferingId, size, overrideDiskOfferingId, dataDiskOfferingsInfo, networkIds, ipToNetworkMap);
9433
9447
}
9434
9448
0 commit comments