You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by da...@apache.org on 2021/02/01 09:56:01 UTC
[cloudstack] branch 4.14 updated: server: select root disk based on
user input during vm import (#4591)
This is an automated email from the ASF dual-hosted git repository.
dahn pushed a commit to branch 4.14
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.14 by this push:
new 9b45ec2 server: select root disk based on user input during vm import (#4591)
9b45ec2 is described below
commit 9b45ec275a371d8fb22d7814a5410202ec70179b
Author: Abhishek Kumar <ab...@gmail.com>
AuthorDate: Mon Feb 1 15:25:09 2021 +0530
server: select root disk based on user input during vm import (#4591)
Signed-off-by: Abhishek Kumar <ab...@gmail.com>
---
.../apache/cloudstack/vm/VmImportManagerImpl.java | 38 +++++++++++++++++++---
1 file changed, 33 insertions(+), 5 deletions(-)
diff --git a/server/src/main/java/org/apache/cloudstack/vm/VmImportManagerImpl.java b/server/src/main/java/org/apache/cloudstack/vm/VmImportManagerImpl.java
index 1856a12..a3ee04e 100644
--- a/server/src/main/java/org/apache/cloudstack/vm/VmImportManagerImpl.java
+++ b/server/src/main/java/org/apache/cloudstack/vm/VmImportManagerImpl.java
@@ -500,6 +500,35 @@ public class VmImportManagerImpl implements VmImportService {
return storagePool;
}
+ private Pair<UnmanagedInstanceTO.Disk, List<UnmanagedInstanceTO.Disk>> getRootAndDataDisks(List<UnmanagedInstanceTO.Disk> disks, final Map<String, Long> dataDiskOfferingMap) {
+ UnmanagedInstanceTO.Disk rootDisk = null;
+ List<UnmanagedInstanceTO.Disk> dataDisks = new ArrayList<>();
+ if (disks.size() == 1) {
+ rootDisk = disks.get(0);
+ return new Pair<>(rootDisk, dataDisks);
+ }
+ Set<String> callerDiskIds = dataDiskOfferingMap.keySet();
+ if (callerDiskIds.size() != disks.size() - 1) {
+ 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);
+ LOGGER.error(String.format("%s. %s parameter can be used to provide disk offerings for the disks", msg, ApiConstants.DATADISK_OFFERING_LIST));
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, msg);
+ }
+ List<String> diskIdsWithoutOffering = new ArrayList<>();
+ for (UnmanagedInstanceTO.Disk disk : disks) {
+ String diskId = disk.getDiskId();
+ if (!callerDiskIds.contains(diskId)) {
+ diskIdsWithoutOffering.add(diskId);
+ rootDisk = disk;
+ } else {
+ dataDisks.add(disk);
+ }
+ }
+ if (diskIdsWithoutOffering.size() > 1) {
+ 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)));
+ }
+ return new Pair<>(rootDisk, dataDisks);
+ }
+
private void checkUnmanagedDiskAndOfferingForImport(UnmanagedInstanceTO.Disk disk, DiskOffering diskOffering, ServiceOffering serviceOffering, final Account owner, final DataCenter zone, final Cluster cluster, final boolean migrateAllowed)
throws ServerApiException, PermissionDeniedException, ResourceAllocationException {
if (serviceOffering == null && diskOffering == null) {
@@ -910,17 +939,16 @@ public class VmImportManagerImpl implements VmImportService {
if (CollectionUtils.isEmpty(unmanagedInstanceDisks)) {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("No attached disks found for the unmanaged VM: %s", instanceName));
}
- final UnmanagedInstanceTO.Disk rootDisk = unmanagedInstance.getDisks().get(0);
+ Pair<UnmanagedInstanceTO.Disk, List<UnmanagedInstanceTO.Disk>> rootAndDataDisksPair = getRootAndDataDisks(unmanagedInstanceDisks, dataDiskOfferingMap);
+ final UnmanagedInstanceTO.Disk rootDisk = rootAndDataDisksPair.first();
+ final List<UnmanagedInstanceTO.Disk> dataDisks = rootAndDataDisksPair.second();
if (rootDisk == null || Strings.isNullOrEmpty(rootDisk.getController())) {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM import failed. Unable to retrieve root disk details for VM: %s ", instanceName));
}
allDetails.put(VmDetailConstants.ROOT_DISK_CONTROLLER, rootDisk.getController());
- List<UnmanagedInstanceTO.Disk> dataDisks = new ArrayList<>();
try {
checkUnmanagedDiskAndOfferingForImport(rootDisk, null, validatedServiceOffering, owner, zone, cluster, migrateAllowed);
- if (unmanagedInstanceDisks.size() > 1) { // Data disk(s) present
- dataDisks.addAll(unmanagedInstanceDisks);
- dataDisks.remove(0);
+ if (CollectionUtils.isNotEmpty(dataDisks)) { // Data disk(s) present
checkUnmanagedDiskAndOfferingForImport(dataDisks, dataDiskOfferingMap, owner, zone, cluster, migrateAllowed);
allDetails.put(VmDetailConstants.DATA_DISK_CONTROLLER, dataDisks.get(0).getController());
}