Skip to content

Commit c434e06

Browse files
committed
Refactor importing VM method
1 parent 6aaaa83 commit c434e06

File tree

1 file changed

+94
-41
lines changed

1 file changed

+94
-41
lines changed

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

Lines changed: 94 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,50 +1109,41 @@ protected void checkUnmanagedDiskLimits(Account account, UnmanagedInstanceTO.Dis
11091109
}
11101110
}
11111111

1112-
private UserVm importVirtualMachineInternal(final UnmanagedInstanceTO unmanagedInstance, final String instanceName, final DataCenter zone, final Cluster cluster, final HostVO host,
1113-
final VirtualMachineTemplate template, final String displayName, final String hostName, final Account caller, final Account owner, final Long userId,
1114-
final ServiceOfferingVO serviceOffering, final Map<String, Long> dataDiskOfferingMap,
1115-
final Map<String, Long> nicNetworkMap, final Map<String, Network.IpAddresses> callerNicIpAddressMap,
1116-
final Map<String, String> details, final boolean migrateAllowed, final boolean forced, final boolean isImportUnmanagedFromSameHypervisor) {
1117-
logger.debug(LogUtils.logGsonWithoutException("Trying to import VM [%s] with name [%s], in zone [%s], cluster [%s], and host [%s], using template [%s], service offering [%s], disks map [%s], NICs map [%s] and details [%s].",
1118-
unmanagedInstance, instanceName, zone, cluster, host, template, serviceOffering, dataDiskOfferingMap, nicNetworkMap, details));
1119-
UserVm userVm = null;
1120-
ServiceOfferingVO validatedServiceOffering = null;
1112+
protected ServiceOfferingVO validateAndGetServiceOffering(UnmanagedInstanceTO unmanagedInstance, ServiceOfferingVO serviceOffering, Account owner, DataCenter zone, Map<String, String> details, Cluster cluster) {
11211113
try {
1122-
validatedServiceOffering = getUnmanagedInstanceServiceOffering(unmanagedInstance, serviceOffering, owner, zone, details, cluster.getHypervisorType());
1114+
return getUnmanagedInstanceServiceOffering(unmanagedInstance, serviceOffering, owner, zone, details, cluster.getHypervisorType());
11231115
} catch (Exception e) {
11241116
String errorMsg = String.format("Failed to import Unmanaged VM [%s] because the service offering [%s] is not compatible due to [%s].", unmanagedInstance, serviceOffering, StringUtils.defaultIfEmpty(e.getMessage(), ""));
11251117
logger.error(errorMsg, e);
11261118
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, errorMsg);
11271119
}
1120+
}
11281121

1129-
String internalCSName = unmanagedInstance.getInternalCSName();
1130-
if (StringUtils.isEmpty(internalCSName)) {
1131-
internalCSName = instanceName;
1132-
}
1133-
Map<String, String> allDetails = new HashMap<>(details);
1122+
protected String getUnmanagedInstanceInternalName(UnmanagedInstanceTO unmanagedInstance, String instanceName) {
1123+
return StringUtils.isEmpty(unmanagedInstance.getInternalCSName()) ?
1124+
instanceName :
1125+
unmanagedInstance.getInternalCSName();
1126+
}
1127+
1128+
protected void addImportingVMDynamicOfferingDetails(ServiceOfferingVO validatedServiceOffering, ServiceOfferingVO serviceOffering, Map<String, String> allDetails) {
11341129
if (validatedServiceOffering.isDynamic()) {
11351130
allDetails.put(VmDetailConstants.CPU_NUMBER, String.valueOf(validatedServiceOffering.getCpu()));
11361131
allDetails.put(VmDetailConstants.MEMORY, String.valueOf(validatedServiceOffering.getRamSize()));
11371132
if (serviceOffering.getSpeed() == null) {
11381133
allDetails.put(VmDetailConstants.CPU_SPEED, String.valueOf(validatedServiceOffering.getSpeed()));
11391134
}
11401135
}
1136+
}
11411137

1142-
if (!migrateAllowed && host != null && !hostSupportsServiceOfferingAndTemplate(host, validatedServiceOffering, template)) {
1143-
throw new InvalidParameterValueException(String.format("Service offering: %s or template: %s is not compatible with host: %s of unmanaged VM: %s", serviceOffering.getUuid(), template.getUuid(), host.getUuid(), instanceName));
1144-
}
1145-
// Check disks and supplied disk offerings
1146-
List<UnmanagedInstanceTO.Disk> unmanagedInstanceDisks = unmanagedInstance.getDisks();
1147-
if (CollectionUtils.isEmpty(unmanagedInstanceDisks)) {
1148-
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("No attached disks found for the unmanaged VM: %s", instanceName));
1149-
}
1150-
Pair<UnmanagedInstanceTO.Disk, List<UnmanagedInstanceTO.Disk>> rootAndDataDisksPair = getRootAndDataDisks(unmanagedInstanceDisks, dataDiskOfferingMap);
1151-
final UnmanagedInstanceTO.Disk rootDisk = rootAndDataDisksPair.first();
1152-
final List<UnmanagedInstanceTO.Disk> dataDisks = rootAndDataDisksPair.second();
1153-
if (rootDisk == null || StringUtils.isEmpty(rootDisk.getController())) {
1154-
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM import failed. Unable to retrieve root disk details for VM: %s ", instanceName));
1155-
}
1138+
protected void checkImportingVMDisksAndDiskOfferings(UnmanagedInstanceTO unmanagedInstance,
1139+
UnmanagedInstanceTO.Disk rootDisk,
1140+
List<UnmanagedInstanceTO.Disk> dataDisks,
1141+
Map<String, Long> dataDiskOfferingMap,
1142+
ServiceOfferingVO validatedServiceOffering, Cluster cluster,
1143+
Map<String, String> allDetails,
1144+
boolean isImportUnmanagedFromSameHypervisor, Account owner,
1145+
DataCenter zone, ServiceOfferingVO serviceOffering,
1146+
boolean migrateAllowed) {
11561147
if (cluster.getHypervisorType() == Hypervisor.HypervisorType.KVM) {
11571148
Long rootDiskOfferingId = validatedServiceOffering.getDiskOfferingId();
11581149
DiskOffering rootDiskOffering = diskOfferingDao.findById(rootDiskOfferingId);
@@ -1177,24 +1168,41 @@ private UserVm importVirtualMachineInternal(final UnmanagedInstanceTO unmanagedI
11771168
logger.error("Volume resource allocation error for owner: {}", owner, e);
11781169
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Volume resource allocation error for owner: %s. %s", owner.getUuid(), StringUtils.defaultString(e.getMessage())));
11791170
}
1171+
}
1172+
1173+
private Pair<UnmanagedInstanceTO.Disk, List<UnmanagedInstanceTO.Disk>> getUnmanagedInstanceDisksPair(UnmanagedInstanceTO unmanagedInstance, Map<String, Long> dataDiskOfferingMap, String instanceName) {
1174+
List<UnmanagedInstanceTO.Disk> unmanagedInstanceDisks = unmanagedInstance.getDisks();
1175+
if (CollectionUtils.isEmpty(unmanagedInstanceDisks)) {
1176+
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("No attached disks found for the unmanaged VM: %s", instanceName));
1177+
}
1178+
Pair<UnmanagedInstanceTO.Disk, List<UnmanagedInstanceTO.Disk>> rootAndDataDisksPair = getRootAndDataDisks(unmanagedInstanceDisks, dataDiskOfferingMap);
1179+
final UnmanagedInstanceTO.Disk rootDisk = rootAndDataDisksPair.first();
1180+
if (rootDisk == null || StringUtils.isEmpty(rootDisk.getController())) {
1181+
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM import failed. Unable to retrieve root disk details for VM: %s ", instanceName));
1182+
}
1183+
return rootAndDataDisksPair;
1184+
}
1185+
1186+
private VirtualMachine.PowerState getImportingVMPowerState(UnmanagedInstanceTO unmanagedInstance) {
1187+
return unmanagedInstance.getPowerState().equals(UnmanagedInstanceTO.PowerState.PowerOn) ?
1188+
VirtualMachine.PowerState.PowerOn :
1189+
VirtualMachine.PowerState.PowerOff;
1190+
}
1191+
1192+
private void checkImportingVMNics(UnmanagedInstanceTO unmanagedInstance, Map<String, Network.IpAddresses> callerNicIpAddressMap, Map<String, String> allDetails, Map<String, Long> nicNetworkMap, Account owner, DataCenter zone, Cluster cluster, String hostName) {
11801193
// Check NICs and supplied networks
1181-
Map<String, Network.IpAddresses> nicIpAddressMap = getNicIpAddresses(unmanagedInstance.getNics(), callerNicIpAddressMap);
1182-
Map<String, Long> allNicNetworkMap = getUnmanagedNicNetworkMap(unmanagedInstance.getName(), unmanagedInstance.getNics(), nicNetworkMap, nicIpAddressMap, zone, hostName, owner, cluster.getHypervisorType());
11831194
if (!CollectionUtils.isEmpty(unmanagedInstance.getNics())) {
11841195
allDetails.put(VmDetailConstants.NIC_ADAPTER, unmanagedInstance.getNics().get(0).getAdapterType());
11851196
}
11861197

11871198
if (StringUtils.isNotEmpty(unmanagedInstance.getVncPassword())) {
11881199
allDetails.put(VmDetailConstants.KVM_VNC_PASSWORD, unmanagedInstance.getVncPassword());
11891200
}
1201+
}
11901202

1191-
VirtualMachine.PowerState powerState = VirtualMachine.PowerState.PowerOff;
1192-
if (unmanagedInstance.getPowerState().equals(UnmanagedInstanceTO.PowerState.PowerOn)) {
1193-
powerState = VirtualMachine.PowerState.PowerOn;
1194-
}
1195-
1203+
private UserVm importAndGetImportingVM(DataCenter zone, HostVO host, VirtualMachineTemplate template, String internalCSName, String displayName, Account owner, Account caller, Long userId, ServiceOfferingVO validatedServiceOffering, String hostName, Cluster cluster, VirtualMachine.PowerState powerState, Map<String, String> allDetails, String instanceName) {
11961204
try {
1197-
userVm = userVmManager.importVM(zone, host, template, internalCSName, displayName, owner,
1205+
return userVmManager.importVM(zone, host, template, internalCSName, displayName, owner,
11981206
null, caller, true, null, owner.getAccountId(), userId,
11991207
validatedServiceOffering, null, hostName,
12001208
cluster.getHypervisorType(), allDetails, powerState, null);
@@ -1203,11 +1211,9 @@ private UserVm importVirtualMachineInternal(final UnmanagedInstanceTO unmanagedI
12031211
logger.error(errorMsg, ice);
12041212
throw new ServerApiException(ApiErrorCode.INSUFFICIENT_CAPACITY_ERROR, errorMsg);
12051213
}
1214+
}
12061215

1207-
if (userVm == null) {
1208-
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to import vm name: %s", instanceName));
1209-
}
1210-
List<Pair<DiskProfile, StoragePool>> diskProfileStoragePoolList = new ArrayList<>();
1216+
private void importVMDisksAfterImportingVM(UserVm userVm, Cluster cluster, VirtualMachineTemplate template, Account owner, UnmanagedInstanceTO.Disk rootDisk, List<UnmanagedInstanceTO.Disk> dataDisks, Map<String, String> details, ServiceOfferingVO serviceOffering, Map<String, Long> dataDiskOfferingMap, String instanceName, List<Pair<DiskProfile, StoragePool>> diskProfileStoragePoolList) {
12111217
try {
12121218
if (rootDisk.getCapacity() == null || rootDisk.getCapacity() == 0) {
12131219
throw new InvalidParameterValueException(String.format("Root disk ID: %s size is invalid", rootDisk.getDiskId()));
@@ -1239,6 +1245,9 @@ private UserVm importVirtualMachineInternal(final UnmanagedInstanceTO unmanagedI
12391245
cleanupFailedImportVM(userVm);
12401246
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to import volumes while importing vm: %s. %s", instanceName, StringUtils.defaultString(e.getMessage())));
12411247
}
1248+
}
1249+
1250+
private void importVMNicsAfterImportingVM(UnmanagedInstanceTO unmanagedInstance, Map<String, Long> allNicNetworkMap, UserVm userVm, boolean forced, String instanceName, Map<String, Network.IpAddresses> nicIpAddressMap) {
12421251
try {
12431252
int nicIndex = 0;
12441253
for (UnmanagedInstanceTO.Nic nic : unmanagedInstance.getNics()) {
@@ -1252,6 +1261,50 @@ private UserVm importVirtualMachineInternal(final UnmanagedInstanceTO unmanagedI
12521261
cleanupFailedImportVM(userVm);
12531262
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to import NICs while importing vm: %s. %s", instanceName, StringUtils.defaultString(e.getMessage())));
12541263
}
1264+
}
1265+
1266+
private UserVm importVirtualMachineInternal(final UnmanagedInstanceTO unmanagedInstance, final String instanceName, final DataCenter zone, final Cluster cluster, final HostVO host,
1267+
final VirtualMachineTemplate template, final String displayName, final String hostName, final Account caller, final Account owner, final Long userId,
1268+
final ServiceOfferingVO serviceOffering, final Map<String, Long> dataDiskOfferingMap,
1269+
final Map<String, Long> nicNetworkMap, final Map<String, Network.IpAddresses> callerNicIpAddressMap,
1270+
final Map<String, String> details, final boolean migrateAllowed, final boolean forced, final boolean isImportUnmanagedFromSameHypervisor) {
1271+
logger.debug(LogUtils.logGsonWithoutException("Trying to import VM [%s] with name [%s], in zone [%s], cluster [%s], and host [%s], using template [%s], service offering [%s], disks map [%s], NICs map [%s] and details [%s].",
1272+
unmanagedInstance, instanceName, zone, cluster, host, template, serviceOffering, dataDiskOfferingMap, nicNetworkMap, details));
1273+
1274+
ServiceOfferingVO validatedServiceOffering = validateAndGetServiceOffering(unmanagedInstance, serviceOffering, owner, zone, details, cluster);
1275+
String internalCSName = getUnmanagedInstanceInternalName(unmanagedInstance, instanceName);
1276+
Map<String, String> allDetails = new HashMap<>(details);
1277+
addImportingVMDynamicOfferingDetails(validatedServiceOffering, serviceOffering, allDetails);
1278+
1279+
if (!migrateAllowed && host != null && !hostSupportsServiceOfferingAndTemplate(host, validatedServiceOffering, template)) {
1280+
throw new InvalidParameterValueException(String.format("Service offering: %s or template: %s is not compatible with host: %s of unmanaged VM: %s", serviceOffering.getUuid(), template.getUuid(), host.getUuid(), instanceName));
1281+
}
1282+
1283+
Pair<UnmanagedInstanceTO.Disk, List<UnmanagedInstanceTO.Disk>> disksPair = getUnmanagedInstanceDisksPair(unmanagedInstance, dataDiskOfferingMap, instanceName);
1284+
UnmanagedInstanceTO.Disk rootDisk = disksPair.first();
1285+
List<UnmanagedInstanceTO.Disk> dataDisks = disksPair.second();
1286+
1287+
checkImportingVMDisksAndDiskOfferings(unmanagedInstance, rootDisk, dataDisks, dataDiskOfferingMap,
1288+
validatedServiceOffering, cluster, allDetails, isImportUnmanagedFromSameHypervisor,
1289+
owner, zone, serviceOffering, migrateAllowed);
1290+
1291+
Map<String, Network.IpAddresses> nicIpAddressMap = getNicIpAddresses(unmanagedInstance.getNics(), callerNicIpAddressMap);
1292+
Map<String, Long> allNicNetworkMap = getUnmanagedNicNetworkMap(unmanagedInstance.getName(), unmanagedInstance.getNics(), nicNetworkMap, nicIpAddressMap, zone, hostName, owner, cluster.getHypervisorType());
1293+
checkImportingVMNics(unmanagedInstance, callerNicIpAddressMap, allDetails, nicNetworkMap,
1294+
owner, zone, cluster, hostName);
1295+
1296+
VirtualMachine.PowerState powerState = getImportingVMPowerState(unmanagedInstance);
1297+
1298+
UserVm userVm = importAndGetImportingVM(zone, host, template, internalCSName, displayName, owner, caller,
1299+
userId, validatedServiceOffering, hostName, cluster, powerState, allDetails, instanceName);
1300+
1301+
if (userVm == null) {
1302+
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to import vm name: %s", instanceName));
1303+
}
1304+
1305+
List<Pair<DiskProfile, StoragePool>> diskProfileStoragePoolList = new ArrayList<>();
1306+
importVMDisksAfterImportingVM(userVm, cluster, template, owner, rootDisk, dataDisks, details, serviceOffering, dataDiskOfferingMap, instanceName, diskProfileStoragePoolList);
1307+
importVMNicsAfterImportingVM(unmanagedInstance, allNicNetworkMap, userVm, forced, instanceName, nicIpAddressMap);
12551308
if (migrateAllowed) {
12561309
userVm = migrateImportedVM(host, template, validatedServiceOffering, userVm, owner, diskProfileStoragePoolList);
12571310
}

0 commit comments

Comments
 (0)