Search in sources :

Example 1 with HostDevice

use of org.ovirt.engine.core.common.businessentities.HostDevice in project ovirt-engine by oVirt.

the class VmDevicesConverter method parseInterfaces.

private List<Map<String, Object>> parseInterfaces(XmlDocument document, List<VmDevice> devices, Guid vmId, MemoizingSupplier<Map<Map<String, String>, HostDevice>> addressToHostDeviceSupplier) {
    List<VmDevice> dbDevices = filterDevices(devices, VmDeviceGeneralType.INTERFACE);
    Map<Guid, VmDevice> devIdToDbDev = dbDevices.stream().collect(Collectors.toMap(device -> device.getDeviceId(), device -> device));
    List<VmNetworkInterface> dbInterfaces = vmNetworkInterfaceDao.getAllForVm(vmId);
    List<Map<String, Object>> result = new ArrayList<>();
    for (XmlNode node : selectNodes(document, VmDeviceGeneralType.INTERFACE)) {
        String type = parseAttribute(node, TYPE);
        Map<String, Object> dev = new HashMap<>();
        if (VmDeviceType.HOST_DEVICE.getName().equals(type)) {
            dev.put(VdsProperties.HostDev, getHostDeviceName(node, addressToHostDeviceSupplier));
        }
        dev.put(VdsProperties.Type, VmDeviceGeneralType.INTERFACE.getValue());
        dev.put(VdsProperties.Device, type);
        dev.put(VdsProperties.Address, parseAddress(node));
        dev.put(VdsProperties.Alias, parseAlias(node));
        String macAddress = parseMacAddress(node);
        // MAC address is a unique identifier of network interface devices
        VmDevice dbDev = correlate(dev, dbDevices, device -> {
            VmNetworkInterface dbInterface = dbInterfaces.stream().filter(iface -> iface.getMacAddress().equalsIgnoreCase(macAddress)).findFirst().orElse(null);
            return dbInterface != null ? devIdToDbDev.get(dbInterface.getId()) : null;
        });
        if (dbDev == null) {
            log.warn("unmanaged network interface with mac address '{}' is ignored", macAddress);
            continue;
        }
        dev.put(VdsProperties.DeviceId, dbDev.getDeviceId().toString());
        dev.put(VdsProperties.SpecParams, dbDev.getSpecParams());
        result.add(dev);
    }
    return result;
}
Also used : VmDeviceType(org.ovirt.engine.core.common.utils.VmDeviceType) Arrays(java.util.Arrays) StringUtils(org.apache.commons.lang.StringUtils) DiskLunMapDao(org.ovirt.engine.core.dao.DiskLunMapDao) Guid(org.ovirt.engine.core.compat.Guid) XmlNamespaceManager(org.ovirt.engine.core.utils.ovf.xml.XmlNamespaceManager) UsbControllerModel(org.ovirt.engine.core.common.businessentities.UsbControllerModel) LoggerFactory(org.slf4j.LoggerFactory) HashMap(java.util.HashMap) XmlAttribute(org.ovirt.engine.core.utils.ovf.xml.XmlAttribute) LibvirtVmXmlBuilder(org.ovirt.engine.core.vdsbroker.builder.vminfo.LibvirtVmXmlBuilder) Singleton(javax.inject.Singleton) Function(java.util.function.Function) DiskImage(org.ovirt.engine.core.common.businessentities.storage.DiskImage) DiskLunMap(org.ovirt.engine.core.common.businessentities.storage.DiskLunMap) ArrayList(java.util.ArrayList) VmDeviceGeneralType(org.ovirt.engine.core.common.businessentities.VmDeviceGeneralType) Inject(javax.inject.Inject) DiskImageDao(org.ovirt.engine.core.dao.DiskImageDao) Map(java.util.Map) VmDevice(org.ovirt.engine.core.common.businessentities.VmDevice) VdsProperties(org.ovirt.engine.core.vdsbroker.vdsbroker.VdsProperties) VmDeviceDao(org.ovirt.engine.core.dao.VmDeviceDao) VmNetworkInterfaceDao(org.ovirt.engine.core.dao.network.VmNetworkInterfaceDao) MemoizingSupplier(org.ovirt.engine.core.utils.MemoizingSupplier) Logger(org.slf4j.Logger) VmNetworkInterface(org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface) XmlNode(org.ovirt.engine.core.utils.ovf.xml.XmlNode) XmlDocument(org.ovirt.engine.core.utils.ovf.xml.XmlDocument) HostDeviceDao(org.ovirt.engine.core.dao.HostDeviceDao) Collectors(java.util.stream.Collectors) Objects(java.util.Objects) HostDevice(org.ovirt.engine.core.common.businessentities.HostDevice) List(java.util.List) SPEC_PARAM_NODE(org.ovirt.engine.core.common.utils.VmDeviceCommonUtils.SPEC_PARAM_NODE) SPEC_PARAM_SIZE(org.ovirt.engine.core.common.utils.VmDeviceCommonUtils.SPEC_PARAM_SIZE) Optional(java.util.Optional) Comparator(java.util.Comparator) Collections(java.util.Collections) XmlNodeList(org.ovirt.engine.core.utils.ovf.xml.XmlNodeList) XmlNode(org.ovirt.engine.core.utils.ovf.xml.XmlNode) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) Guid(org.ovirt.engine.core.compat.Guid) VmDevice(org.ovirt.engine.core.common.businessentities.VmDevice) VmNetworkInterface(org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface) HashMap(java.util.HashMap) DiskLunMap(org.ovirt.engine.core.common.businessentities.storage.DiskLunMap) Map(java.util.Map)

Example 2 with HostDevice

use of org.ovirt.engine.core.common.businessentities.HostDevice in project ovirt-engine by oVirt.

the class VmDevicesConverter method parseManagedHostDevices.

/**
 * This method processes managed host devices (those that are set by the engine).
 * That means that the device should already exist in the database and can be correlated
 * with one of the devices of the host. Host devices that were designed to be added as
 * unmanaged devices, like mdev devices, are handled separately.
 */
private List<Map<String, Object>> parseManagedHostDevices(XmlDocument document, List<VmDevice> devices, Guid hostId, MemoizingSupplier<Map<Map<String, String>, HostDevice>> addressToHostDeviceSupplier) {
    List<VmDevice> dbDevices = filterDevices(devices, VmDeviceGeneralType.HOSTDEV);
    if (dbDevices.isEmpty()) {
        return Collections.emptyList();
    }
    List<Map<String, Object>> result = new ArrayList<>();
    for (XmlNode node : document.selectNodes("//*/hostdev")) {
        Map<String, String> hostAddress = parseHostAddress(node);
        if (hostAddress == null) {
            continue;
        }
        HostDevice hostDevice = addressToHostDeviceSupplier.get().get(hostAddress);
        if (hostDevice == null) {
            // unmanaged
            continue;
        }
        Map<String, Object> dev = new HashMap<>();
        dev.put(VdsProperties.Address, parseAddress(node));
        dev.put(VdsProperties.Type, VmDeviceGeneralType.HOSTDEV.getValue());
        dev.put(VdsProperties.Alias, parseAlias(node));
        dev.put(VdsProperties.Device, hostDevice.getDeviceName());
        VmDevice dbDev = correlate(dev, dbDevices, device -> dbDevices.stream().filter(d -> d.getDevice().equals(hostDevice.getDeviceName())).findFirst().orElse(null));
        if (dbDev == null) {
            log.warn("VM host device '{}' does not exist in the database, thus ignored", hostDevice.getDeviceName());
            continue;
        }
        dev.put(VdsProperties.DeviceId, dbDev.getDeviceId().toString());
        dev.put(VdsProperties.SpecParams, dbDev.getSpecParams());
        result.add(dev);
    }
    return result;
}
Also used : VmDeviceType(org.ovirt.engine.core.common.utils.VmDeviceType) Arrays(java.util.Arrays) StringUtils(org.apache.commons.lang.StringUtils) DiskLunMapDao(org.ovirt.engine.core.dao.DiskLunMapDao) Guid(org.ovirt.engine.core.compat.Guid) XmlNamespaceManager(org.ovirt.engine.core.utils.ovf.xml.XmlNamespaceManager) UsbControllerModel(org.ovirt.engine.core.common.businessentities.UsbControllerModel) LoggerFactory(org.slf4j.LoggerFactory) HashMap(java.util.HashMap) XmlAttribute(org.ovirt.engine.core.utils.ovf.xml.XmlAttribute) LibvirtVmXmlBuilder(org.ovirt.engine.core.vdsbroker.builder.vminfo.LibvirtVmXmlBuilder) Singleton(javax.inject.Singleton) Function(java.util.function.Function) DiskImage(org.ovirt.engine.core.common.businessentities.storage.DiskImage) DiskLunMap(org.ovirt.engine.core.common.businessentities.storage.DiskLunMap) ArrayList(java.util.ArrayList) VmDeviceGeneralType(org.ovirt.engine.core.common.businessentities.VmDeviceGeneralType) Inject(javax.inject.Inject) DiskImageDao(org.ovirt.engine.core.dao.DiskImageDao) Map(java.util.Map) VmDevice(org.ovirt.engine.core.common.businessentities.VmDevice) VdsProperties(org.ovirt.engine.core.vdsbroker.vdsbroker.VdsProperties) VmDeviceDao(org.ovirt.engine.core.dao.VmDeviceDao) VmNetworkInterfaceDao(org.ovirt.engine.core.dao.network.VmNetworkInterfaceDao) MemoizingSupplier(org.ovirt.engine.core.utils.MemoizingSupplier) Logger(org.slf4j.Logger) VmNetworkInterface(org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface) XmlNode(org.ovirt.engine.core.utils.ovf.xml.XmlNode) XmlDocument(org.ovirt.engine.core.utils.ovf.xml.XmlDocument) HostDeviceDao(org.ovirt.engine.core.dao.HostDeviceDao) Collectors(java.util.stream.Collectors) Objects(java.util.Objects) HostDevice(org.ovirt.engine.core.common.businessentities.HostDevice) List(java.util.List) SPEC_PARAM_NODE(org.ovirt.engine.core.common.utils.VmDeviceCommonUtils.SPEC_PARAM_NODE) SPEC_PARAM_SIZE(org.ovirt.engine.core.common.utils.VmDeviceCommonUtils.SPEC_PARAM_SIZE) Optional(java.util.Optional) Comparator(java.util.Comparator) Collections(java.util.Collections) XmlNodeList(org.ovirt.engine.core.utils.ovf.xml.XmlNodeList) XmlNode(org.ovirt.engine.core.utils.ovf.xml.XmlNode) HostDevice(org.ovirt.engine.core.common.businessentities.HostDevice) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) VmDevice(org.ovirt.engine.core.common.businessentities.VmDevice) HashMap(java.util.HashMap) DiskLunMap(org.ovirt.engine.core.common.businessentities.storage.DiskLunMap) Map(java.util.Map)

Example 3 with HostDevice

use of org.ovirt.engine.core.common.businessentities.HostDevice in project ovirt-engine by oVirt.

the class VfSchedulerImpl method findFreeVfForVnic.

/*
     * @param nicToUsedVfs used to calculate all used VFs by given nic.
     * Mapped by nic id. Map<Guid, List<String>> nicToUsedVfs = new HashMap<>();
     * This collection is changed as side-effect of calling this method.
     * @param fetchedNics caching. This collection is changed as side-effect of calling this method.
     * Not to query same nic multiple times from db.
     * Mapped by VdsNetworkInterface.getId() Map<Guid, VdsNetworkInterface> fetchedNics = new HashMap<>();
     */
private String findFreeVfForVnic(List<HostNicVfsConfig> vfsConfigs, Map<Guid, List<String>> nicToUsedVfs, Map<Guid, VdsNetworkInterface> fetchedNics, Network vnicNetwork, Guid vmId, boolean shouldCheckDirectlyAttachedVmDevices) {
    for (HostNicVfsConfig vfsConfig : vfsConfigs) {
        if (vfsConfig.getNumOfVfs() != 0 && isNetworkInVfsConfig(vnicNetwork, vfsConfig)) {
            Guid nicId = vfsConfig.getNicId();
            List<String> skipVfs = new ArrayList<>();
            HostDevice freeVf = getFreeVf(nicId, nicToUsedVfs, fetchedNics, skipVfs);
            while (freeVf != null && (isSharingIommuGroup(freeVf) || (shouldCheckDirectlyAttachedVmDevices && shouldBeDirectlyAttached(freeVf.getName(), vmId)))) {
                skipVfs.add(freeVf.getName());
                freeVf = getFreeVf(nicId, nicToUsedVfs, fetchedNics, skipVfs);
            }
            if (freeVf != null) {
                return freeVf.getName();
            }
        }
    }
    return null;
}
Also used : HostNicVfsConfig(org.ovirt.engine.core.common.businessentities.network.HostNicVfsConfig) HostDevice(org.ovirt.engine.core.common.businessentities.HostDevice) ArrayList(java.util.ArrayList) Guid(org.ovirt.engine.core.compat.Guid)

Example 4 with HostDevice

use of org.ovirt.engine.core.common.businessentities.HostDevice in project ovirt-engine by oVirt.

the class HostDeviceDaoTest method testGetHostDevicesByHostIdAndIommuGroup.

@Test
public void testGetHostDevicesByHostIdAndIommuGroup() {
    List<HostDevice> hostDevices = dao.getHostDevicesByHostIdAndIommuGroup(FixturesTool.VDS_RHEL6_NFS_SPM, EXISTING_IOMMU_GROUP);
    assertEquals(TOTAL_DEVICES_IN_GROUP, hostDevices.size());
    for (HostDevice hostDevice : hostDevices) {
        assertEquals(FixturesTool.VDS_RHEL6_NFS_SPM, hostDevice.getHostId());
        assertEquals(Integer.valueOf(EXISTING_IOMMU_GROUP), hostDevice.getIommuGroup());
    }
}
Also used : HostDevice(org.ovirt.engine.core.common.businessentities.HostDevice) Test(org.junit.Test)

Example 5 with HostDevice

use of org.ovirt.engine.core.common.businessentities.HostDevice in project ovirt-engine by oVirt.

the class HostDeviceDaoTest method setVmIdOnHostDeviceTest.

@Test
public void setVmIdOnHostDeviceTest() {
    HostDevice before = getNetworkDevice();
    assertNull(before.getVmId());
    Guid vmId = FixturesTool.VM_WITH_NO_ATTACHED_DISKS;
    dao.setVmIdOnHostDevice(before.getId(), vmId);
    before.setVmId(vmId);
    HostDevice after = dao.get(before.getId());
    assertEquals(before, after);
}
Also used : HostDevice(org.ovirt.engine.core.common.businessentities.HostDevice) Guid(org.ovirt.engine.core.compat.Guid) Test(org.junit.Test)

Aggregations

HostDevice (org.ovirt.engine.core.common.businessentities.HostDevice)46 Test (org.junit.Test)17 ArrayList (java.util.ArrayList)16 Guid (org.ovirt.engine.core.compat.Guid)14 Map (java.util.Map)11 List (java.util.List)10 VdsNetworkInterface (org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface)10 HashMap (java.util.HashMap)9 VmDevice (org.ovirt.engine.core.common.businessentities.VmDevice)9 Collectors (java.util.stream.Collectors)8 HostNicVfsConfig (org.ovirt.engine.core.common.businessentities.network.HostNicVfsConfig)7 VmNetworkInterface (org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface)7 HostDeviceDao (org.ovirt.engine.core.dao.HostDeviceDao)7 Arrays (java.util.Arrays)6 Collections (java.util.Collections)6 Objects (java.util.Objects)6 Inject (javax.inject.Inject)6 StringUtils (org.apache.commons.lang.StringUtils)6 VmDeviceGeneralType (org.ovirt.engine.core.common.businessentities.VmDeviceGeneralType)6 VmDeviceDao (org.ovirt.engine.core.dao.VmDeviceDao)6