use of org.ovirt.engine.core.utils.ovf.xml.XmlNode in project ovirt-engine by oVirt.
the class VmDevicesConverter method parseControllers.
private List<Map<String, Object>> parseControllers(XmlDocument document, List<VmDevice> devices) {
List<VmDevice> dbDevices = filterDevices(devices, VmDeviceGeneralType.CONTROLLER);
// devices with spec params to appear first
dbDevices.sort((d1, d2) -> d1.getSpecParams().isEmpty() && !d2.getSpecParams().isEmpty() ? 1 : 0);
List<Map<String, Object>> result = new ArrayList<>();
for (XmlNode node : selectNodes(document, VmDeviceGeneralType.CONTROLLER)) {
String address = parseAddress(node);
String index = parseAttribute(node, INDEX);
String model = parseAttribute(node, MODEL);
Integer ioThreadId = parseIoThreadId(node);
String devType = "virtio-scsi".equals(model) ? model : parseAttribute(node, TYPE);
boolean devWithModelNone = model != null ? model.equals(UsbControllerModel.NONE.libvirtName) : false;
// which is a special case of a device without address that is still marked as plugged
if (address.isEmpty() && !devWithModelNone) {
continue;
}
Map<String, Object> dev = new HashMap<>();
dev.put(VdsProperties.Type, VmDeviceGeneralType.CONTROLLER.getValue());
dev.put(VdsProperties.Device, devType);
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))).filter(d -> {
if (d.getSpecParams().isEmpty()) {
return true;
}
if (ioThreadId != null && Objects.equals(d.getSpecParams().get(IO_THREAD_ID), ioThreadId)) {
return true;
}
if (Objects.equals(d.getSpecParams().get(INDEX), index) && Objects.equals(d.getSpecParams().get(MODEL), model)) {
return true;
}
return false;
}).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<>();
if (index != null) {
specParams.put(INDEX, index);
}
if (model != null) {
specParams.put(MODEL, model);
}
if (ioThreadId != null) {
specParams.put(IO_THREAD_ID, ioThreadId);
}
dev.put(VdsProperties.SpecParams, specParams);
}
result.add(dev);
}
return result;
}
use of org.ovirt.engine.core.utils.ovf.xml.XmlNode in project ovirt-engine by oVirt.
the class VmDevicesConverter method parseDiskPath.
private String parseDiskPath(XmlNode node) {
XmlNode sourceNode = node.selectSingleNode("source");
if (sourceNode == null) {
return "";
}
XmlAttribute attr = sourceNode.attributes.get("file");
if (attr != null) {
return attr.getValue();
}
attr = sourceNode.attributes.get("dev");
if (attr != null) {
return attr.getValue();
}
attr = sourceNode.attributes.get("name");
if (attr != null) {
return attr.getValue();
}
return "";
}
use of org.ovirt.engine.core.utils.ovf.xml.XmlNode in project ovirt-engine by oVirt.
the class VmDevicesConverter method parseRedirs.
private List<Map<String, Object>> parseRedirs(XmlDocument document, List<VmDevice> devices) {
List<VmDevice> dbDevices = filterDevices(devices, VmDeviceGeneralType.REDIR);
List<Map<String, Object>> result = new ArrayList<>();
for (XmlNode node : document.selectNodes("//*/redirdev")) {
Map<String, Object> dev = new HashMap<>();
dev.put(VdsProperties.Type, VmDeviceGeneralType.REDIR.getValue());
dev.put(VdsProperties.Device, parseAttribute(node, TYPE));
dev.put(VdsProperties.Address, parseAddress(node));
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.utils.ovf.xml.XmlNode in project ovirt-engine by oVirt.
the class VmDevicesConverter method parseUnmanagedHostDevices.
private List<Map<String, Object>> parseUnmanagedHostDevices(XmlDocument document, List<VmDevice> devices, Guid hostId, MemoizingSupplier<Map<Map<String, String>, HostDevice>> addressToHostDeviceSupplier) {
List<VmDevice> dbDevices = filterDevices(devices, VmDeviceGeneralType.HOSTDEV);
List<Map<String, Object>> result = new ArrayList<>();
for (XmlNode node : document.selectNodes("//*/hostdev")) {
Map<String, String> hostAddress = parseHostAddress(node);
if (hostAddress == null) {
continue;
}
if (addressToHostDeviceSupplier.get().containsKey(hostAddress)) {
// managed
continue;
}
Map<String, Object> dev = new HashMap<>();
dev.put(VdsProperties.Type, VmDeviceGeneralType.HOSTDEV.getValue());
dev.put(VdsProperties.Address, parseAddress(node));
dev.put(VdsProperties.Alias, parseAlias(node));
String deviceType = parseAttribute(node, TYPE);
dev.put(VdsProperties.Device, deviceType);
dev.put(VdsProperties.SpecParams, hostAddress);
VmDevice dbDev = correlate(dev, dbDevices, device -> dbDevices.stream().filter(d -> d.getDevice().equals(deviceType) && Objects.equals(d.getSpecParams(), hostAddress)).findFirst().orElse(null));
dev.put(VdsProperties.DeviceId, dbDev != null ? dbDev.getDeviceId().toString() : Guid.newGuid().toString());
result.add(dev);
}
return result;
}
use of org.ovirt.engine.core.utils.ovf.xml.XmlNode in project ovirt-engine by oVirt.
the class VmDevicesConverter method parseHostAddress.
private Map<String, String> parseHostAddress(XmlNode node) {
XmlNode sourceNode = node.selectSingleNode("source");
if (sourceNode == null) {
return null;
}
XmlNode addressNode = sourceNode.selectSingleNode("address");
if (addressNode == null) {
return null;
}
Map<String, String> address = new HashMap<>();
Arrays.asList("domain", "slot", "bus", "function", "device", "host", "target", "lun").forEach(key -> {
XmlAttribute attribute = addressNode.attributes.get(key);
if (attribute != null) {
String valStr = attribute.getValue();
boolean hex = valStr.startsWith("0x");
int val = Integer.parseInt(hex ? valStr.substring(2) : valStr, hex ? 16 : 10);
address.put(key, String.valueOf(val));
}
});
XmlAttribute uuidAttribute = addressNode.attributes.get("uuid");
if (uuidAttribute != null) {
address.put("uuid", uuidAttribute.getValue());
}
return address;
}
Aggregations