This is an automated email from the ASF dual-hosted git repository.
dahn pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/main by this push:
new 9f5c3ffc553 Improve logs in UnmanagedVMsManagerImpl class (#7213)
9f5c3ffc553 is described below
commit 9f5c3ffc5532bfcf8f23a5f6bca78beab485b24f
Author: SadiJr <[email protected]>
AuthorDate: Fri Sep 29 11:12:26 2023 -0300
Improve logs in UnmanagedVMsManagerImpl class (#7213)
Co-authored-by: SadiJr <[email protected]>
Co-authored-by: Stephan Krug <[email protected]>
---
.../cloudstack/vm/UnmanagedVMsManagerImpl.java | 176 ++++++++++-----------
1 file changed, 80 insertions(+), 96 deletions(-)
diff --git
a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java
b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java
index eab1e98c800..12665a7db7b 100644
--- a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java
+++ b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java
@@ -58,7 +58,6 @@ import com.cloud.agent.api.GetUnmanagedInstancesAnswer;
import com.cloud.agent.api.GetUnmanagedInstancesCommand;
import com.cloud.agent.api.PrepareUnmanageVMInstanceAnswer;
import com.cloud.agent.api.PrepareUnmanageVMInstanceCommand;
-import com.cloud.capacity.CapacityManager;
import com.cloud.configuration.Config;
import com.cloud.configuration.Resource;
import com.cloud.dc.DataCenter;
@@ -121,6 +120,7 @@ import com.cloud.user.ResourceLimitService;
import com.cloud.user.UserVO;
import com.cloud.user.dao.UserDao;
import com.cloud.uservm.UserVm;
+import com.cloud.utils.LogUtils;
import com.cloud.utils.Pair;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.NetUtils;
@@ -138,7 +138,6 @@ import com.cloud.vm.VmDetailConstants;
import com.cloud.vm.dao.NicDao;
import com.cloud.vm.dao.UserVmDao;
import com.cloud.vm.dao.VMInstanceDao;
-import com.cloud.vm.snapshot.dao.VMSnapshotDao;
import com.google.gson.Gson;
public class UnmanagedVMsManagerImpl implements UnmanagedVMsManager {
@@ -186,8 +185,6 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
@Inject
private VMInstanceDao vmDao;
@Inject
- private CapacityManager capacityManager;
- @Inject
private VolumeApiService volumeApiService;
@Inject
private DeploymentPlanningManager deploymentPlanningManager;
@@ -206,8 +203,6 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
@Inject
private GuestOSHypervisorDao guestOSHypervisorDao;
@Inject
- private VMSnapshotDao vmSnapshotDao;
- @Inject
private SnapshotDao snapshotDao;
@Inject
private UserVmDao userVmDao;
@@ -335,7 +330,6 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
String[] split = path.split(" ");
path = split[split.length - 1];
split = path.split("/");
- ;
path = split[split.length - 1];
split = path.split("\\.");
path = split[0];
@@ -387,26 +381,29 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
private ServiceOfferingVO getUnmanagedInstanceServiceOffering(final
UnmanagedInstanceTO instance, ServiceOfferingVO serviceOffering, final Account
owner, final DataCenter zone, final Map<String, String> details)
throws ServerApiException, PermissionDeniedException,
ResourceAllocationException {
if (instance == null) {
- throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("VM is not valid"));
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Cannot
find VM to import.");
}
if (serviceOffering == null) {
- throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Service offering is not valid"));
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Cannot find service offering used to import VM [%s].",
instance.getName()));
}
accountService.checkAccess(owner, serviceOffering, zone);
final Integer cpu = instance.getCpuCores();
final Integer memory = instance.getMemory();
Integer cpuSpeed = instance.getCpuSpeed() == null ? 0 :
instance.getCpuSpeed();
+
if (cpu == null || cpu == 0) {
- throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("CPU cores for VM (%s) not valid", instance.getName()));
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("CPU cores [%s] is not valid for importing VM [%s].", cpu,
instance.getName()));
}
if (memory == null || memory == 0) {
- throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Memory for VM (%s) not valid", instance.getName()));
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Memory [%s] is not valid for importing VM [%s].", memory,
instance.getName()));
}
+
if (serviceOffering.isDynamic()) {
if (details.containsKey(VmDetailConstants.CPU_SPEED)) {
try {
cpuSpeed =
Integer.parseInt(details.get(VmDetailConstants.CPU_SPEED));
} catch (Exception e) {
+ LOGGER.error(String.format("Failed to get CPU speed for
importing VM [%s] due to [%s].", instance.getName(), e.getMessage()), e);
}
}
Map<String, String> parameters = new HashMap<>();
@@ -429,8 +426,8 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Service offering (%s) %dMHz CPU speed does not match VM CPU
speed %dMHz and VM is not in powered off state (Power state: %s)",
serviceOffering.getUuid(), serviceOffering.getSpeed(), cpuSpeed,
instance.getPowerState()));
}
}
- resourceLimitService.checkResourceLimit(owner,
Resource.ResourceType.cpu, new Long(serviceOffering.getCpu()));
- resourceLimitService.checkResourceLimit(owner,
Resource.ResourceType.memory, new Long(serviceOffering.getRamSize()));
+ resourceLimitService.checkResourceLimit(owner,
Resource.ResourceType.cpu, Long.valueOf(serviceOffering.getCpu()));
+ resourceLimitService.checkResourceLimit(owner,
Resource.ResourceType.memory, Long.valueOf(serviceOffering.getRamSize()));
return serviceOffering;
}
@@ -520,10 +517,10 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
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)
+ private void checkUnmanagedDiskAndOfferingForImport(String instanceName,
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) {
- throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Disk offering for disk ID: %s not found during VM import",
disk.getDiskId()));
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Disk offering for disk ID [%s] not found during VM [%s]
import.", disk.getDiskId(), instanceName));
}
if (diskOffering != null) {
accountService.checkAccess(owner, diskOffering, zone);
@@ -544,15 +541,15 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
}
}
- private void
checkUnmanagedDiskAndOfferingForImport(List<UnmanagedInstanceTO.Disk> disks,
final Map<String, Long> diskOfferingMap, final Account owner, final DataCenter
zone, final Cluster cluster, final boolean migrateAllowed)
+ private void checkUnmanagedDiskAndOfferingForImport(String intanceName,
List<UnmanagedInstanceTO.Disk> disks, final Map<String, Long> diskOfferingMap,
final Account owner, final DataCenter zone, final Cluster cluster, final
boolean migrateAllowed)
throws ServerApiException, PermissionDeniedException,
ResourceAllocationException {
String diskController = null;
for (UnmanagedInstanceTO.Disk disk : disks) {
if (disk == null) {
- throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Unable to retrieve disk details for VM"));
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Unable to retrieve disk details for VM [%s].", intanceName));
}
if (!diskOfferingMap.containsKey(disk.getDiskId())) {
- throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Disk offering for disk ID: %s not found during VM import",
disk.getDiskId()));
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Disk offering for disk ID [%s] not found during VM import.",
disk.getDiskId()));
}
if (StringUtils.isEmpty(diskController)) {
diskController = disk.getController();
@@ -561,17 +558,12 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Multiple data disk controllers of different type (%s, %s) are
not supported for import. Please make sure that all data disk controllers are
of the same type", diskController, disk.getController()));
}
}
- checkUnmanagedDiskAndOfferingForImport(disk,
diskOfferingDao.findById(diskOfferingMap.get(disk.getDiskId())), null, owner,
zone, cluster, migrateAllowed);
+ checkUnmanagedDiskAndOfferingForImport(intanceName, disk,
diskOfferingDao.findById(diskOfferingMap.get(disk.getDiskId())), null, owner,
zone, cluster, migrateAllowed);
}
}
- private void checkUnmanagedNicAndNetworkForImport(UnmanagedInstanceTO.Nic
nic, Network network, final DataCenter zone, final Account owner, final boolean
autoAssign) throws ServerApiException {
- if (nic == null) {
- throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Unable to retrieve NIC details during VM import"));
- }
- if (network == null) {
- throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Network for nic ID: %s not found during VM import",
nic.getNicId()));
- }
+ private void checkUnmanagedNicAndNetworkForImport(String instanceName,
UnmanagedInstanceTO.Nic nic, Network network, final DataCenter zone, final
Account owner, final boolean autoAssign) throws ServerApiException {
+ basicNetworkChecks(instanceName, nic, network);
if (network.getDataCenterId() != zone.getId()) {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Network(ID: %s) for nic(ID: %s) belongs to a different zone than
VM to be imported", network.getUuid(), nic.getNicId()));
}
@@ -588,34 +580,31 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
}
String pvLanType = nic.getPvlanType() == null ? "" :
nic.getPvlanType().toLowerCase().substring(0, 1);
if (nic.getVlan() != null && nic.getVlan() != 0 && nic.getPvlan() !=
null && nic.getPvlan() != 0 &&
- (StringUtils.isEmpty(network.getBroadcastUri().toString()) ||
-
!networkBroadcastUri.equals(String.format("pvlan://%d-%s%d", nic.getVlan(),
pvLanType, nic.getPvlan())))) {
+ (StringUtils.isEmpty(networkBroadcastUri) ||
!String.format("pvlan://%d-%s%d", nic.getVlan(), pvLanType,
nic.getPvlan()).equals(networkBroadcastUri))) {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("PVLAN of network(ID: %s) %s is found different from the VLAN of
nic(ID: %s) pvlan://%d-%s%d during VM import", network.getUuid(),
networkBroadcastUri, nic.getNicId(), nic.getVlan(), pvLanType, nic.getPvlan()));
}
}
- private void
checkUnmanagedNicAndNetworkHostnameForImport(UnmanagedInstanceTO.Nic nic,
Network network, final String hostName) throws ServerApiException {
+ private void basicNetworkChecks(String instanceName,
UnmanagedInstanceTO.Nic nic, Network network) {
if (nic == null) {
- throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Unable to retrieve NIC details during VM import"));
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Unable to retrieve the NIC details used by VM [%s] from VMware.
Please check if this VM have NICs in VMWare.", instanceName));
}
if (network == null) {
- throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Network for nic ID: %s not found during VM import",
nic.getNicId()));
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Network for nic ID: %s not found during VM import.",
nic.getNicId()));
}
+ }
+
+ private void checkUnmanagedNicAndNetworkHostnameForImport(String
instanceName, UnmanagedInstanceTO.Nic nic, Network network, final String
hostName) throws ServerApiException {
+ basicNetworkChecks(instanceName, nic, network);
// Check for duplicate hostname in network, get all vms hostNames in
the network
List<String> hostNames = vmDao.listDistinctHostNames(network.getId());
if (CollectionUtils.isNotEmpty(hostNames) &&
hostNames.contains(hostName)) {
- throw new InvalidParameterValueException("The vm with hostName " +
hostName + " already exists in the network domain: " +
network.getNetworkDomain() + "; network="
- + network);
+ throw new InvalidParameterValueException(String.format("VM with
Name [%s] already exists in the network [%s] domain [%s]. Cannot import another
VM with the same name. Pleasy try again with a different name.", hostName,
network, network.getNetworkDomain()));
}
}
- private void
checkUnmanagedNicIpAndNetworkForImport(UnmanagedInstanceTO.Nic nic, Network
network, final Network.IpAddresses ipAddresses) throws ServerApiException {
- if (nic == null) {
- throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Unable to retrieve NIC details during VM import"));
- }
- if (network == null) {
- throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Network for nic ID: %s not found during VM import",
nic.getNicId()));
- }
+ private void checkUnmanagedNicIpAndNetworkForImport(String instanceName,
UnmanagedInstanceTO.Nic nic, Network network, final Network.IpAddresses
ipAddresses) throws ServerApiException {
+ basicNetworkChecks(instanceName, nic, network);
// Check IP is assigned for non L2 networks
if (!network.getGuestType().equals(Network.GuestType.L2) &&
(ipAddresses == null || StringUtils.isEmpty(ipAddresses.getIp4Address()))) {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("NIC(ID: %s) needs a valid IP address for it to be associated
with network(ID: %s). %s parameter of API can be used for this",
nic.getNicId(), network.getUuid(), ApiConstants.NIC_IP_ADDRESS_LIST));
@@ -629,7 +618,7 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
}
}
- private Map<String, Long>
getUnmanagedNicNetworkMap(List<UnmanagedInstanceTO.Nic> nics, final Map<String,
Long> callerNicNetworkMap, final Map<String, Network.IpAddresses>
callerNicIpAddressMap, final DataCenter zone, final String hostName, final
Account owner) throws ServerApiException {
+ private Map<String, Long> getUnmanagedNicNetworkMap(String instanceName,
List<UnmanagedInstanceTO.Nic> nics, final Map<String, Long>
callerNicNetworkMap, final Map<String, Network.IpAddresses>
callerNicIpAddressMap, final DataCenter zone, final String hostName, final
Account owner) throws ServerApiException {
Map<String, Long> nicNetworkMap = new HashMap<>();
String nicAdapter = null;
for (UnmanagedInstanceTO.Nic nic : nics) {
@@ -654,22 +643,23 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
continue;
}
try {
- checkUnmanagedNicAndNetworkForImport(nic,
networkVO, zone, owner, true);
+ checkUnmanagedNicAndNetworkForImport(instanceName,
nic, networkVO, zone, owner, true);
network = networkVO;
} catch (Exception e) {
+ LOGGER.error(String.format("Error when checking
NIC [%s] of unmanaged instance to import due to [%s]." , nic.getNicId(),
e.getMessage()), e);
}
if (network != null) {
- checkUnmanagedNicAndNetworkHostnameForImport(nic,
network, hostName);
- checkUnmanagedNicIpAndNetworkForImport(nic,
network, ipAddresses);
+
checkUnmanagedNicAndNetworkHostnameForImport(instanceName, nic, network,
hostName);
+
checkUnmanagedNicIpAndNetworkForImport(instanceName, nic, network, ipAddresses);
break;
}
}
}
} else {
network =
networkDao.findById(callerNicNetworkMap.get(nic.getNicId()));
- checkUnmanagedNicAndNetworkForImport(nic, network, zone,
owner, false);
- checkUnmanagedNicAndNetworkHostnameForImport(nic, network,
hostName);
- checkUnmanagedNicIpAndNetworkForImport(nic, network,
ipAddresses);
+ checkUnmanagedNicAndNetworkForImport(instanceName, nic,
network, zone, owner, false);
+ checkUnmanagedNicAndNetworkHostnameForImport(instanceName,
nic, network, hostName);
+ checkUnmanagedNicIpAndNetworkForImport(instanceName, nic,
network, ipAddresses);
}
if (network == null) {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Suitable network for nic(ID: %s) not found during VM import",
nic.getNicId()));
@@ -745,14 +735,10 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
try {
dest = deploymentPlanningManager.planDeployment(profile, plan,
excludeList, null);
} catch (Exception e) {
- LOGGER.warn(String.format("VM import failed for unmanaged vm:
%s during vm migration, finding deployment destination", vm.getInstanceName()),
e);
+ String errorMsg = String.format("VM import failed for
Unmanaged VM [%s] during VM migration, cannot find deployment destination due
to [%s].", vm.getInstanceName(), e.getMessage());
+ LOGGER.warn(errorMsg, e);
cleanupFailedImportVM(vm);
- throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("VM import failed for unmanaged vm: %s during vm migration,
finding deployment destination", vm.getInstanceName()));
- }
- if (dest != null) {
- if (LOGGER.isDebugEnabled()) {
- LOGGER.debug(" Found " + dest + " for migrating the vm
to");
- }
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
errorMsg);
}
if (dest == null) {
cleanupFailedImportVM(vm);
@@ -769,9 +755,10 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
}
vm = userVmManager.getUserVm(vm.getId());
} catch (Exception e) {
- LOGGER.error(String.format("VM import failed for unmanaged vm:
%s during vm migration", vm.getInstanceName()), e);
+ String errorMsg = String.format("VM import failed for
Unmanaged VM [%s] during VM migration due to [%s].", vm.getInstanceName(),
e.getMessage());
+ LOGGER.error(errorMsg, e);
cleanupFailedImportVM(vm);
- throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("VM import failed for unmanaged vm: %s during vm migration. %s",
userVm.getInstanceName(), e.getMessage()));
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
errorMsg);
}
}
for (Pair<DiskProfile, StoragePool> diskProfileStoragePool :
diskProfileStoragePoolList) {
@@ -857,9 +844,9 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
private void publishVMUsageUpdateResourceCount(final UserVm userVm,
ServiceOfferingVO serviceOfferingVO) {
if (userVm == null || serviceOfferingVO == null) {
- LOGGER.error("Failed to publish usage records during VM import");
+ LOGGER.error(String.format("Failed to publish usage records during
VM import because VM [%s] or ServiceOffering [%s] is null.", userVm,
serviceOfferingVO));
cleanupFailedImportVM(userVm);
- throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("VM import failed for unmanaged vm during publishing usage
records"));
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "VM
import failed for Unmanaged VM during publishing Usage Records.");
}
try {
if (!serviceOfferingVO.isDynamic()) {
@@ -874,13 +861,13 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
userVm.getHypervisorType().toString(),
VirtualMachine.class.getName(), userVm.getUuid(), userVm.isDisplayVm());
}
} catch (Exception e) {
- LOGGER.error(String.format("Failed to publish usage records during
VM import for unmanaged vm %s", userVm.getInstanceName()), e);
+ LOGGER.error(String.format("Failed to publish usage records during
VM import for unmanaged VM [%s] due to [%s].", userVm.getInstanceName(),
e.getMessage()), e);
cleanupFailedImportVM(userVm);
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("VM import failed for unmanaged vm %s during publishing usage
records", userVm.getInstanceName()));
}
resourceLimitService.incrementResourceCount(userVm.getAccountId(),
Resource.ResourceType.user_vm, userVm.isDisplayVm());
- resourceLimitService.incrementResourceCount(userVm.getAccountId(),
Resource.ResourceType.cpu, userVm.isDisplayVm(), new
Long(serviceOfferingVO.getCpu()));
- resourceLimitService.incrementResourceCount(userVm.getAccountId(),
Resource.ResourceType.memory, userVm.isDisplayVm(), new
Long(serviceOfferingVO.getRamSize()));
+ resourceLimitService.incrementResourceCount(userVm.getAccountId(),
Resource.ResourceType.cpu, userVm.isDisplayVm(),
Long.valueOf(serviceOfferingVO.getCpu()));
+ resourceLimitService.incrementResourceCount(userVm.getAccountId(),
Resource.ResourceType.memory, userVm.isDisplayVm(),
Long.valueOf(serviceOfferingVO.getRamSize()));
// Save usage event and update resource count for user vm volumes
List<VolumeVO> volumes = volumeDao.findByInstance(userVm.getId());
for (VolumeVO volume : volumes) {
@@ -911,14 +898,17 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
final ServiceOfferingVO
serviceOffering, final Map<String, Long> dataDiskOfferingMap,
final Map<String, Long>
nicNetworkMap, final Map<String, Network.IpAddresses> callerNicIpAddressMap,
final Map<String, String>
details, final boolean migrateAllowed, final boolean forced) {
+ 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].",
+ unmanagedInstance, instanceName, zone, cluster, host,
template, serviceOffering, dataDiskOfferingMap, nicNetworkMap, details));
UserVm userVm = null;
ServiceOfferingVO validatedServiceOffering = null;
try {
validatedServiceOffering =
getUnmanagedInstanceServiceOffering(unmanagedInstance, serviceOffering, owner,
zone, details);
} catch (Exception e) {
- LOGGER.error("Service offering for VM import not compatible", e);
- throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Failed to import VM: %s. %s", unmanagedInstance.getName(),
StringUtils.defaultString(e.getMessage())));
+ String errorMsg = String.format("Failed to import Unmanaged VM
[%s] because the service offering [%s] is not compatible due to [%s].",
unmanagedInstance.getName(), serviceOffering.getUuid(),
StringUtils.defaultIfEmpty(e.getMessage(), ""));
+ LOGGER.error(errorMsg, e);
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
errorMsg);
}
String internalCSName = unmanagedInstance.getInternalCSName();
@@ -950,9 +940,9 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
}
allDetails.put(VmDetailConstants.ROOT_DISK_CONTROLLER,
rootDisk.getController());
try {
- checkUnmanagedDiskAndOfferingForImport(rootDisk, null,
validatedServiceOffering, owner, zone, cluster, migrateAllowed);
+
checkUnmanagedDiskAndOfferingForImport(unmanagedInstance.getName(), rootDisk,
null, validatedServiceOffering, owner, zone, cluster, migrateAllowed);
if (CollectionUtils.isNotEmpty(dataDisks)) { // Data disk(s)
present
- checkUnmanagedDiskAndOfferingForImport(dataDisks,
dataDiskOfferingMap, owner, zone, cluster, migrateAllowed);
+
checkUnmanagedDiskAndOfferingForImport(unmanagedInstance.getName(), dataDisks,
dataDiskOfferingMap, owner, zone, cluster, migrateAllowed);
allDetails.put(VmDetailConstants.DATA_DISK_CONTROLLER,
dataDisks.get(0).getController());
}
resourceLimitService.checkResourceLimit(owner,
Resource.ResourceType.volume, unmanagedInstanceDisks.size());
@@ -962,7 +952,7 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
}
// Check NICs and supplied networks
Map<String, Network.IpAddresses> nicIpAddressMap =
getNicIpAddresses(unmanagedInstance.getNics(), callerNicIpAddressMap);
- Map<String, Long> allNicNetworkMap =
getUnmanagedNicNetworkMap(unmanagedInstance.getNics(), nicNetworkMap,
nicIpAddressMap, zone, hostName, owner);
+ Map<String, Long> allNicNetworkMap =
getUnmanagedNicNetworkMap(unmanagedInstance.getName(),
unmanagedInstance.getNics(), nicNetworkMap, nicIpAddressMap, zone, hostName,
owner);
if (!CollectionUtils.isEmpty(unmanagedInstance.getNics())) {
allDetails.put(VmDetailConstants.NIC_ADAPTER,
unmanagedInstance.getNics().get(0).getAdapterType());
}
@@ -976,8 +966,9 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
validatedServiceOffering, null, hostName,
cluster.getHypervisorType(), allDetails, powerState);
} catch (InsufficientCapacityException ice) {
- LOGGER.error(String.format("Failed to import vm name: %s",
instanceName), ice);
- throw new
ServerApiException(ApiErrorCode.INSUFFICIENT_CAPACITY_ERROR, ice.getMessage());
+ String errorMsg = String.format("Failed to import VM [%s] due to
[%s].", instanceName, ice.getMessage());
+ LOGGER.error(errorMsg, ice);
+ throw new
ServerApiException(ApiErrorCode.INSUFFICIENT_CAPACITY_ERROR, errorMsg);
}
if (userVm == null) {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
String.format("Failed to import vm name: %s", instanceName));
@@ -1035,23 +1026,29 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
return userVm;
}
- @Override
- public ListResponse<UnmanagedInstanceResponse>
listUnmanagedInstances(ListUnmanagedInstancesCmd cmd) {
+ private Cluster basicAccessChecks(Long clusterId) {
final Account caller = CallContext.current().getCallingAccount();
if (caller.getType() != Account.Type.ADMIN) {
- throw new PermissionDeniedException(String.format("Cannot perform
this operation, Calling account is not root admin: %s", caller.getUuid()));
+ throw new PermissionDeniedException(String.format("Cannot perform
this operation, caller account [%s] is not ROOT Admin.", caller.getUuid()));
}
- final Long clusterId = cmd.getClusterId();
if (clusterId == null) {
- throw new InvalidParameterValueException(String.format("Cluster ID
cannot be null"));
+ throw new InvalidParameterValueException("Cluster ID cannot be
null.");
}
final Cluster cluster = clusterDao.findById(clusterId);
if (cluster == null) {
- throw new InvalidParameterValueException(String.format("Cluster
ID: %d cannot be found", clusterId));
+ throw new InvalidParameterValueException(String.format("Cluster
with ID [%d] cannot be found.", clusterId));
}
if (cluster.getHypervisorType() != Hypervisor.HypervisorType.VMware) {
- throw new InvalidParameterValueException(String.format("VM
ingestion is currently not supported for hypervisor: %s",
cluster.getHypervisorType().toString()));
+ throw new InvalidParameterValueException(String.format("VM import
is currently not supported for hypervisor [%s].",
cluster.getHypervisorType().toString()));
}
+ return cluster;
+ }
+
+ @Override
+ public ListResponse<UnmanagedInstanceResponse>
listUnmanagedInstances(ListUnmanagedInstancesCmd cmd) {
+ Long clusterId = cmd.getClusterId();
+ Cluster cluster = basicAccessChecks(clusterId);
+
String keyword = cmd.getKeyword();
if (StringUtils.isNotEmpty(keyword)) {
keyword = keyword.toLowerCase();
@@ -1093,25 +1090,13 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
@Override
public UserVmResponse importUnmanagedInstance(ImportUnmanagedInstanceCmd
cmd) {
- final Account caller = CallContext.current().getCallingAccount();
- if (caller.getType() != Account.Type.ADMIN) {
- throw new PermissionDeniedException(String.format("Cannot perform
this operation, Calling account is not root admin: %s", caller.getUuid()));
- }
- final Long clusterId = cmd.getClusterId();
- if (clusterId == null) {
- throw new InvalidParameterValueException(String.format("Cluster ID
cannot be null"));
- }
- final Cluster cluster = clusterDao.findById(clusterId);
- if (cluster == null) {
- throw new InvalidParameterValueException(String.format("Cluster
ID: %d cannot be found", clusterId));
- }
- if (cluster.getHypervisorType() != Hypervisor.HypervisorType.VMware) {
- throw new InvalidParameterValueException(String.format("VM import
is currently not supported for hypervisor: %s",
cluster.getHypervisorType().toString()));
- }
+ Long clusterId = cmd.getClusterId();
+ Cluster cluster = basicAccessChecks(clusterId);
+
final DataCenter zone =
dataCenterDao.findById(cluster.getDataCenterId());
final String instanceName = cmd.getName();
if (StringUtils.isEmpty(instanceName)) {
- throw new InvalidParameterValueException(String.format("Instance
name cannot be empty"));
+ throw new InvalidParameterValueException("Instance name cannot be
empty");
}
if (cmd.getDomainId() != null &&
StringUtils.isEmpty(cmd.getAccountName())) {
throw new InvalidParameterValueException("domainid parameter must
be specified with account parameter");
@@ -1140,7 +1125,7 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
}
final Long serviceOfferingId = cmd.getServiceOfferingId();
if (serviceOfferingId == null) {
- throw new InvalidParameterValueException(String.format("Service
offering ID cannot be null"));
+ throw new InvalidParameterValueException("Service offering ID
cannot be null");
}
final ServiceOfferingVO serviceOffering =
serviceOfferingDao.findById(serviceOfferingId);
if (serviceOffering == null) {
@@ -1160,7 +1145,7 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
String hostName = cmd.getHostName();
if (StringUtils.isEmpty(hostName)) {
if (!NetUtils.verifyDomainNameLabel(instanceName, true)) {
- throw new InvalidParameterValueException(String.format("Please
provide hostname for the VM. VM name contains unsupported characters for it to
be used as hostname"));
+ throw new InvalidParameterValueException("Please provide a
valid hostname for the VM. VM name contains unsupported characters that cannot
be used as hostname.");
}
hostName = instanceName;
}
@@ -1232,7 +1217,7 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
template.setGuestOSId(guestOSHypervisor.getGuestOsId());
}
userVm = importVirtualMachineInternal(unmanagedInstance,
instanceName, zone, cluster, host,
- template, displayName, hostName, caller, owner,
userId,
+ template, displayName, hostName,
CallContext.current().getCallingAccount(), owner, userId,
serviceOffering, dataDiskOfferingMap,
nicNetworkMap, nicIpAddressMap,
details, cmd.getMigrateAllowed(), forced);
@@ -1316,8 +1301,7 @@ public class UnmanagedVMsManagerImpl implements
UnmanagedVMsManager {
}
if (hostId == null) {
- throw new CloudRuntimeException("Cannot find a host to verify if
the VM to unmanage " +
- "with id = " + vmVO.getUuid() + " exists.");
+ throw new CloudRuntimeException(String.format("Cannot find a host
to verify if the VM [%s] exists. Thus we are unable to unmanage it.",
vmVO.getUuid()));
}
return hostId;
}