use of org.apache.commons.lang3.ArrayUtils.isNotEmpty in project cloudstack by apache.
the class VmwareResource method mapSpecDisksToClonedDisksAndTearDownDatadisks.
/**
* Modify the specDisks information to match the cloned VM's disks (from vmMo VM)
*/
private void mapSpecDisksToClonedDisksAndTearDownDatadisks(VirtualMachineMO vmMo, String vmInternalCSName, DiskTO[] specDisks) {
try {
s_logger.debug("Mapping spec disks information to cloned VM disks for VM " + vmInternalCSName);
if (vmMo != null && ArrayUtils.isNotEmpty(specDisks)) {
List<VirtualDisk> vmDisks = vmMo.getVirtualDisksOrderedByKey();
List<VirtualDisk> rootDisks = new ArrayList<>();
List<DiskTO> sortedRootDisksFromSpec = Arrays.asList(sortVolumesByDeviceId(specDisks)).stream().filter(x -> x.getType() == Volume.Type.ROOT).collect(Collectors.toList());
for (int i = 0; i < sortedRootDisksFromSpec.size(); i++) {
DiskTO specDisk = sortedRootDisksFromSpec.get(i);
VirtualDisk vmDisk = vmDisks.get(i);
DataTO dataVolume = specDisk.getData();
if (dataVolume instanceof VolumeObjectTO) {
VolumeObjectTO volumeObjectTO = (VolumeObjectTO) dataVolume;
if (!volumeObjectTO.getSize().equals(vmDisk.getCapacityInBytes())) {
s_logger.info("Mapped disk size is not the same as the cloned VM disk size: " + volumeObjectTO.getSize() + " - " + vmDisk.getCapacityInBytes());
}
VirtualDeviceBackingInfo backingInfo = vmDisk.getBacking();
if (backingInfo instanceof VirtualDiskFlatVer2BackingInfo) {
VirtualDiskFlatVer2BackingInfo backing = (VirtualDiskFlatVer2BackingInfo) backingInfo;
String fileName = backing.getFileName();
if (StringUtils.isNotBlank(fileName)) {
String[] fileNameParts = fileName.split(" ");
String datastoreUuid = fileNameParts[0].replace("[", "").replace("]", "");
String relativePath = fileNameParts[1].split("/")[1].replace(".vmdk", "");
String vmSpecDatastoreUuid = volumeObjectTO.getDataStore().getUuid().replaceAll("-", "");
if (!datastoreUuid.equals(vmSpecDatastoreUuid)) {
s_logger.info("Mapped disk datastore UUID is not the same as the cloned VM datastore UUID: " + datastoreUuid + " - " + vmSpecDatastoreUuid);
}
volumeObjectTO.setPath(relativePath);
specDisk.setPath(relativePath);
rootDisks.add(vmDisk);
} else {
s_logger.error("Empty backing filename for volume " + volumeObjectTO.getName());
}
} else {
s_logger.error("Could not get volume backing info for volume " + volumeObjectTO.getName());
}
}
}
vmDisks.removeAll(rootDisks);
if (CollectionUtils.isNotEmpty(vmDisks)) {
s_logger.info("Tearing down datadisks for deploy-as-is VM");
tearDownVMDisks(vmMo, vmDisks);
}
}
} catch (Exception e) {
String msg = "Error mapping deploy-as-is VM disks from cloned VM " + vmInternalCSName;
s_logger.error(msg, e);
throw new CloudRuntimeException(e);
}
}
Aggregations