Skip to content

Commit 020c42a

Browse files
committed
server: select root disk based on user input during vm import
Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
1 parent f70da10 commit 020c42a

1 file changed

Lines changed: 33 additions & 5 deletions

File tree

server/src/main/java/org/apache/cloudstack/vm/VmImportManagerImpl.java

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,35 @@ private StoragePool getStoragePool(final UnmanagedInstanceTO.Disk disk, final Da
500500
return storagePool;
501501
}
502502

503+
private Pair<UnmanagedInstanceTO.Disk, List<UnmanagedInstanceTO.Disk>> getRootAndDataDisks(List<UnmanagedInstanceTO.Disk> disks, final Map<String, Long> dataDiskOfferingMap) {
504+
UnmanagedInstanceTO.Disk rootDisk = null;
505+
List<UnmanagedInstanceTO.Disk> dataDisks = new ArrayList<>();
506+
if (disks.size() == 1) {
507+
rootDisk = disks.get(0);
508+
return new Pair<>(rootDisk, dataDisks);
509+
}
510+
Set<String> callerDiskIds = dataDiskOfferingMap.keySet();
511+
if (callerDiskIds.size() != disks.size() - 1) {
512+
String msg = String.format("VM has total %d disks for which %d disk offering mappings provided. %d disks need a disk offering for import", disks.size(), callerDiskIds.size(), disks.size()-1);
513+
LOGGER.error(String.format("%s. %s parameter can be used to provide disk offerings for the disks", msg, ApiConstants.DATADISK_OFFERING_LIST));
514+
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, msg);
515+
}
516+
List<String> diskIdsWithoutOffering = new ArrayList<>();
517+
for (UnmanagedInstanceTO.Disk disk : disks) {
518+
String diskId = disk.getDiskId();
519+
if (!callerDiskIds.contains(diskId)) {
520+
diskIdsWithoutOffering.add(diskId);
521+
rootDisk = disk;
522+
} else {
523+
dataDisks.add(disk);
524+
}
525+
}
526+
if (diskIdsWithoutOffering.size() > 1) {
527+
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM has total %d disks, disk offering mapping not provided for %d disks. Disk IDs that may need a disk offering - %s", disks.size(), diskIdsWithoutOffering.size()-1, String.join(", ", diskIdsWithoutOffering)));
528+
}
529+
return new Pair<>(rootDisk, dataDisks);
530+
}
531+
503532
private void checkUnmanagedDiskAndOfferingForImport(UnmanagedInstanceTO.Disk disk, DiskOffering diskOffering, ServiceOffering serviceOffering, final Account owner, final DataCenter zone, final Cluster cluster, final boolean migrateAllowed)
504533
throws ServerApiException, PermissionDeniedException, ResourceAllocationException {
505534
if (serviceOffering == null && diskOffering == null) {
@@ -910,17 +939,16 @@ private UserVm importVirtualMachineInternal(final UnmanagedInstanceTO unmanagedI
910939
if (CollectionUtils.isEmpty(unmanagedInstanceDisks)) {
911940
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("No attached disks found for the unmanaged VM: %s", instanceName));
912941
}
913-
final UnmanagedInstanceTO.Disk rootDisk = unmanagedInstance.getDisks().get(0);
942+
Pair<UnmanagedInstanceTO.Disk, List<UnmanagedInstanceTO.Disk>> rootAndDataDisksPair = getRootAndDataDisks(unmanagedInstanceDisks, dataDiskOfferingMap);
943+
final UnmanagedInstanceTO.Disk rootDisk = rootAndDataDisksPair.first();
944+
final List<UnmanagedInstanceTO.Disk> dataDisks = rootAndDataDisksPair.second();
914945
if (rootDisk == null || Strings.isNullOrEmpty(rootDisk.getController())) {
915946
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM import failed. Unable to retrieve root disk details for VM: %s ", instanceName));
916947
}
917948
allDetails.put(VmDetailConstants.ROOT_DISK_CONTROLLER, rootDisk.getController());
918-
List<UnmanagedInstanceTO.Disk> dataDisks = new ArrayList<>();
919949
try {
920950
checkUnmanagedDiskAndOfferingForImport(rootDisk, null, validatedServiceOffering, owner, zone, cluster, migrateAllowed);
921-
if (unmanagedInstanceDisks.size() > 1) { // Data disk(s) present
922-
dataDisks.addAll(unmanagedInstanceDisks);
923-
dataDisks.remove(0);
951+
if (CollectionUtils.isNotEmpty(dataDisks)) { // Data disk(s) present
924952
checkUnmanagedDiskAndOfferingForImport(dataDisks, dataDiskOfferingMap, owner, zone, cluster, migrateAllowed);
925953
allDetails.put(VmDetailConstants.DATA_DISK_CONTROLLER, dataDisks.get(0).getController());
926954
}

0 commit comments

Comments
 (0)