use of org.ovirt.engine.core.common.businessentities.VmDevice in project ovirt-engine by oVirt.
the class VmDevicesConverter method parseDisks.
private List<Map<String, Object>> parseDisks(XmlDocument document, List<VmDevice> devices) {
List<VmDevice> dbDevices = filterDevices(devices, VmDeviceGeneralType.DISK);
MemoizingSupplier<Map<Guid, String>> diskToLunSupplier = new MemoizingSupplier<>(() -> diskLunMapDao.getAll().stream().collect(Collectors.toMap(DiskLunMap::getDiskId, DiskLunMap::getLunId)));
List<Map<String, Object>> result = new ArrayList<>();
for (XmlNode node : selectNodes(document, VmDeviceGeneralType.DISK)) {
Map<String, Object> dev = new HashMap<>();
dev.put(VdsProperties.Type, VmDeviceGeneralType.DISK.getValue());
String diskType = parseAttribute(node, DEVICE);
dev.put(VdsProperties.Device, diskType);
dev.put(VdsProperties.Address, parseAddress(node));
dev.put(VdsProperties.Alias, parseAlias(node));
String path = parseDiskPath(node);
VmDevice dbDev = correlate(dev, dbDevices, device -> findDiskDeviceInDbByPath(dbDevices, diskType, path, diskToLunSupplier));
if (dbDev == null) {
log.warn("unmanaged disk with path '{}' is ignored", path);
continue;
}
dbDevices.remove(dbDev);
dev.put(VdsProperties.ImageId, parseImageIdFromPath(path));
dev.put(VdsProperties.DeviceId, dbDev.getDeviceId().toString());
dev.put(VdsProperties.SpecParams, dbDev.getSpecParams());
List<Map<String, Object>> volumeChain = parseVolumeChain(node);
if (!volumeChain.isEmpty()) {
dev.put(VdsProperties.VolumeChain, volumeChain.toArray());
}
result.add(dev);
}
return result;
}
use of org.ovirt.engine.core.common.businessentities.VmDevice in project ovirt-engine by oVirt.
the class VmDevicesConverter method parseMemories.
private List<Map<String, Object>> parseMemories(XmlDocument document, List<VmDevice> devices) {
List<VmDevice> dbDevices = filterDevices(devices, VmDeviceGeneralType.MEMORY);
List<Map<String, Object>> result = new ArrayList<>();
for (XmlNode node : selectNodes(document, VmDeviceGeneralType.MEMORY)) {
Map<String, Object> dev = new HashMap<>();
dev.put(VdsProperties.Type, VmDeviceGeneralType.MEMORY.getValue());
dev.put(VdsProperties.Device, VmDeviceGeneralType.MEMORY.getValue());
dev.put(VdsProperties.Address, parseAddress(node));
dev.put(VdsProperties.Alias, parseAlias(node));
XmlNode target = node.selectSingleNode("target");
if (target == null) {
continue;
}
String devNode = target.selectSingleNode(NODE).innerText;
String devSize = kiloBytesToMegaBytes(target.selectSingleNode(SIZE).innerText);
VmDevice dbDev = correlate(dev, dbDevices, device -> dbDevices.stream().sorted(// try to match managed devices first
Comparator.comparing(VmDevice::isManaged).reversed()).filter(d -> d.getDevice().equals(device.get(VdsProperties.Device))).filter(d -> Objects.equals(d.getSpecParams().get(SPEC_PARAM_NODE).toString(), devNode)).filter(d -> Objects.equals(d.getSpecParams().get(SPEC_PARAM_SIZE).toString(), devSize)).findFirst().orElse(null));
if (dbDev != null) {
dbDevices.remove(dbDev);
dev.put(VdsProperties.DeviceId, dbDev.getDeviceId().toString());
dev.put(VdsProperties.SpecParams, dbDev.getSpecParams());
} else {
dev.put(VdsProperties.DeviceId, Guid.newGuid().toString());
Map<String, Object> specParams = new HashMap<>();
specParams.put(SPEC_PARAM_NODE, devNode);
specParams.put(SPEC_PARAM_SIZE, devSize);
dev.put(VdsProperties.SpecParams, specParams);
}
result.add(dev);
}
return result;
}
use of org.ovirt.engine.core.common.businessentities.VmDevice in project ovirt-engine by oVirt.
the class VmDevicesConverter method parseChannels.
private List<Map<String, Object>> parseChannels(XmlDocument document, List<VmDevice> devices) {
List<VmDevice> dbDevices = filterDevices(devices, VmDeviceGeneralType.CHANNEL);
List<Map<String, Object>> result = new ArrayList<>();
for (XmlNode node : selectNodes(document, VmDeviceGeneralType.CHANNEL)) {
String address = parseAddress(node);
// Ignore channel devices without address
if (address.isEmpty()) {
continue;
}
Map<String, Object> dev = new HashMap<>();
dev.put(VdsProperties.Type, VmDeviceGeneralType.CHANNEL.getValue());
// shouldn't it be VdsProperties.DeviceType?
dev.put(VdsProperties.Device, parseAttribute(node, TYPE));
dev.put(VdsProperties.Address, address);
dev.put(VdsProperties.Alias, parseAlias(node));
VmDevice dbDev = correlate(dev, dbDevices, device -> dbDevices.stream().filter(d -> d.getDevice().equals(device.get(VdsProperties.Device))).findFirst().orElse(null));
if (dbDev != null) {
dbDevices.remove(dbDev);
dev.put(VdsProperties.DeviceId, dbDev.getDeviceId().toString());
dev.put(VdsProperties.SpecParams, dbDev.getSpecParams());
} else {
dev.put(VdsProperties.DeviceId, Guid.newGuid().toString());
}
result.add(dev);
}
return result;
}
use of org.ovirt.engine.core.common.businessentities.VmDevice in project ovirt-engine by oVirt.
the class VmDevicesMonitoring method handleRemovedDevices.
/**
* Handles devices that were removed by libvirt. Unmanaged devices are marked to be removed, managed devices are
* unplugged - the address is cleared and isPlugged is set to false.
*
* @param libvirtDevices list of IDs of devices that were returned by libvirt
* @param dbDevices list of all devices present in the DB
*/
private void handleRemovedDevices(Change change, Guid vmId, Set<Guid> libvirtDevices, List<VmDevice> dbDevices) {
for (VmDevice device : dbDevices) {
if (libvirtDevices.contains(device.getDeviceId())) {
continue;
}
if (deviceWithoutAddress(device)) {
continue;
}
if (device.isManaged()) {
if (device.isPlugged()) {
device.setPlugged(Boolean.FALSE);
device.setAddress("");
change.addDeviceToUpdate(device);
log.debug("VM '{}' managed pluggable device was unplugged : '{}'", vmId, device);
} else if (!devicePluggable(device)) {
log.error("VM '{}' managed non pluggable device was removed unexpectedly from libvirt: '{}'", vmId, device);
}
} else {
change.addDeviceIdToRemove(device.getId());
log.debug("VM '{}' unmanaged device was marked for remove : {1}", vmId, device);
}
}
}
use of org.ovirt.engine.core.common.businessentities.VmDevice in project ovirt-engine by oVirt.
the class VmDevicesMonitoring method processVmDevices.
/**
* Actually process the VM device update and store individual device additions/updates/removals
* in the <code>change</code>.
*/
private void processVmDevices(Change change, Map<String, Object> vmInfo) {
Guid vmId = getVmId(vmInfo);
Set<Guid> processedDeviceIds = new HashSet<>();
List<VmDevice> dbDevices = getVmDeviceDao().getVmDeviceByVmId(vmId);
Map<VmDeviceId, VmDevice> dbDeviceMap = Entities.businessEntitiesById(dbDevices);
for (Object o : (Object[]) vmInfo.get(VdsProperties.Devices)) {
Map<String, Object> vdsmDevice = (Map<String, Object>) o;
if (vdsmDevice.get(VdsProperties.Address) == null) {
logDeviceInformation(vmId, vdsmDevice);
continue;
}
Guid deviceId = getDeviceId(vdsmDevice);
VmDevice dbDevice = dbDeviceMap.get(new VmDeviceId(deviceId, vmId));
if (dbDevice == null) {
dbDevice = getByDeviceType((String) vdsmDevice.get(VdsProperties.Device), dbDeviceMap);
deviceId = dbDevice != null ? dbDevice.getDeviceId() : deviceId;
}
String logicalName = getDeviceLogicalName(vmInfo, vdsmDevice);
if (deviceId == null || dbDevice == null) {
VmDevice newDevice = buildNewVmDevice(vmId, vdsmDevice, logicalName);
if (newDevice != null) {
change.addDeviceToAdd(newDevice);
processedDeviceIds.add(newDevice.getDeviceId());
}
} else {
dbDevice.setPlugged(Boolean.TRUE);
dbDevice.setAddress(vdsmDevice.get(VdsProperties.Address).toString());
dbDevice.setAlias(StringUtils.defaultString((String) vdsmDevice.get(VdsProperties.Alias)));
dbDevice.setLogicalName(logicalName);
dbDevice.setHostDevice(StringUtils.defaultString((String) vdsmDevice.get(VdsProperties.HostDev)));
change.addDeviceToUpdate(dbDevice);
processedDeviceIds.add(deviceId);
}
}
handleRemovedDevices(change, vmId, processedDeviceIds, dbDevices);
}
Aggregations