Skip to content

Commit f703751

Browse files
committed
Add volume size checks for rootdisk and overrride rootdisk
1 parent 0f2606f commit f703751

File tree

5 files changed

+46
-29
lines changed

5 files changed

+46
-29
lines changed

api/src/main/java/org/apache/cloudstack/backup/BackupManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ public interface BackupManager extends BackupService, Configurable, PluggableSer
260260

261261
List<DiskOfferingInfo> getDataDiskOfferingListFromBackup(Backup backup);
262262

263-
void updateDiskOfferingSizeFromBackup(List<DiskOfferingInfo> dataDiskOfferingsInfo, Backup backup);
263+
void checkDiskOfferingSizeAgainstBackup(List<DiskOfferingInfo> dataDiskOfferingsInfo, Backup backup);
264264

265265
Map<String, String> getVmDetailsForBackup(VirtualMachine vm);
266266

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

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9369,14 +9369,15 @@ public UserVm allocateVMFromBackup(CreateVMFromBackupCmd cmd) throws Insufficien
93699369
VirtualMachineTemplate template = _templateDao.findById(templateId);
93709370
verifyTemplate(cmd, template, serviceOffering.getId());
93719371

9372-
Long size = null;
9372+
Long size = cmd.getSize();
9373+
93739374
Long diskOfferingId = cmd.getDiskOfferingId();
93749375
Boolean isIso = template.getFormat().equals(ImageFormat.ISO);
93759376
if (diskOfferingId != null) {
93769377
if (!isIso) {
93779378
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);
93789379
}
9379-
DiskOffering diskOffering = _entityMgr.findById(DiskOffering.class, diskOfferingId);
9380+
DiskOffering diskOffering = _diskOfferingDao.findById(diskOfferingId);
93809381
if (diskOffering == null) {
93819382
throw new InvalidParameterValueException("Unable to find disk offering " + diskOfferingId);
93829383
}
@@ -9387,28 +9388,45 @@ public UserVm allocateVMFromBackup(CreateVMFromBackupCmd cmd) throws Insufficien
93879388

93889389
Long overrideDiskOfferingId = cmd.getOverrideDiskOfferingId();
93899390

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();
94059398
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+
}
94069424
}
94079425
}
94089426

94099427
List<DiskOfferingInfo> dataDiskOfferingsInfo = cmd.getDataDiskOfferingsInfo();
94109428
if (dataDiskOfferingsInfo != null) {
9411-
backupManager.updateDiskOfferingSizeFromBackup(dataDiskOfferingsInfo, backup);
9429+
backupManager.checkDiskOfferingSizeAgainstBackup(dataDiskOfferingsInfo, backup);
94129430
} else {
94139431
dataDiskOfferingsInfo = backupManager.getDataDiskOfferingListFromBackup(backup);
94149432
}
@@ -9425,10 +9443,6 @@ public UserVm allocateVMFromBackup(CreateVMFromBackupCmd cmd) throws Insufficien
94259443
ipToNetworkMap = backupManager.getIpToNetworkMapFromBackup(backup, cmd.getPreserveIp(), networkIds);
94269444
}
94279445

9428-
if (size == null) {
9429-
size = cmd.getSize();
9430-
}
9431-
94329446
return createVirtualMachine(cmd, zone, owner, serviceOffering, template, hypervisorType, diskOfferingId, size, overrideDiskOfferingId, dataDiskOfferingsInfo, networkIds, ipToNetworkMap);
94339447
}
94349448

server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1007,7 +1007,7 @@ private Backup.VolumeInfo getVolumeInfo(List<Backup.VolumeInfo> backedUpVolumes,
10071007
}
10081008

10091009
@Override
1010-
public void updateDiskOfferingSizeFromBackup(List<DiskOfferingInfo> dataDiskOfferingsInfo, Backup backup) {
1010+
public void checkDiskOfferingSizeAgainstBackup(List<DiskOfferingInfo> dataDiskOfferingsInfo, Backup backup) {
10111011
List<DiskOfferingInfo> dataDiskOfferingsInfoFromBackup = getDataDiskOfferingListFromBackup(backup);
10121012
if (dataDiskOfferingsInfoFromBackup == null) {
10131013
return;
@@ -1016,8 +1016,9 @@ public void updateDiskOfferingSizeFromBackup(List<DiskOfferingInfo> dataDiskOffe
10161016
for (DiskOfferingInfo diskOfferingInfo : dataDiskOfferingsInfo) {
10171017
if (index < dataDiskOfferingsInfoFromBackup.size()) {
10181018
if (diskOfferingInfo.getSize() < dataDiskOfferingsInfoFromBackup.get(index).getSize()) {
1019-
throw new InvalidParameterValueException(String.format("Backed-up volume size [%d]GiB cannot be greater than the instance volume size [%d]GiB.",
1020-
dataDiskOfferingsInfoFromBackup.get(index).getSize(), diskOfferingInfo.getSize()));
1019+
throw new InvalidParameterValueException(
1020+
String.format("Instance volume size %d[GiB] cannot be less than the backed-up volume size %d[GiB].",
1021+
diskOfferingInfo.getSize(), dataDiskOfferingsInfoFromBackup.get(index).getSize()));
10211022
}
10221023
}
10231024
index++;

server/src/test/java/com/cloud/vm/UserVmManagerImplTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3328,6 +3328,7 @@ public void testAllocateVMFromBackupUsingBackupValues() throws InsufficientCapac
33283328
when(cmd.getNetworkIds()).thenReturn(null);
33293329
when(cmd.getIpToNetworkMap()).thenReturn(null);
33303330
when(cmd.getDataDiskOfferingsInfo()).thenReturn(null);
3331+
when(cmd.getOverrideDiskOfferingId()).thenReturn(null);
33313332

33323333
Account owner = mock(Account.class);
33333334
when(accountService.getActiveAccountById(accountId)).thenReturn(owner);
@@ -3440,7 +3441,8 @@ public void testAllocateVMFromBackupUsingCmdValuesWithISO() throws InsufficientC
34403441
ServiceOfferingVO serviceOffering = mock(ServiceOfferingVO.class);
34413442
DiskOfferingVO rootDiskOffering = mock(DiskOfferingVO.class);
34423443
when(_serviceOfferingDao.findById(serviceOfferingId)).thenReturn(serviceOffering);
3443-
when(entityManager.findById(DiskOffering.class, rootDiskOfferingId)).thenReturn(rootDiskOffering);
3444+
when(rootDiskOffering.getDiskSize()).thenReturn(100000000L);
3445+
when(diskOfferingDao.findById(rootDiskOfferingId)).thenReturn(rootDiskOffering);
34443446

34453447
Map<String, String> diskDetails = new HashMap<>();
34463448
diskDetails.put(ApiConstants.DISK_OFFERING_ID, "disk-offering-uuid");

server/src/test/java/org/apache/cloudstack/backup/BackupManagerTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -902,7 +902,7 @@ public void getDataDiskOfferingListFromBackupNullIops() {
902902
}
903903

904904
@Test (expected = InvalidParameterValueException.class)
905-
public void testUpdateDiskOfferingSizeFromBackup() {
905+
public void testCheckDiskOfferingSizeAgainstBackup() {
906906
Long sizeInBackup = 5L * 1024 * 1024 * 1024;
907907
Long sizeInCmd = 2L;
908908
Backup backup = mock(Backup.class);
@@ -917,7 +917,7 @@ public void testUpdateDiskOfferingSizeFromBackup() {
917917
when(diskOfferingDao.findByUuid("disk-offering-uuid-1")).thenReturn(diskOffering);
918918
List<DiskOfferingInfo> diskOfferingInfoList = List.of(new DiskOfferingInfo(diskOffering, sizeInCmd, 1L, null, null));
919919

920-
backupManager.updateDiskOfferingSizeFromBackup(diskOfferingInfoList, backup);
920+
backupManager.checkDiskOfferingSizeAgainstBackup(diskOfferingInfoList, backup);
921921
}
922922

923923
@Test

0 commit comments

Comments
 (0)