package org.ovirt.engine.core.bll.network.host;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.ovirt.engine.core.common.businessentities.BusinessEntityMap;
import org.ovirt.engine.core.common.businessentities.Cluster;
import org.ovirt.engine.core.common.businessentities.network.HostNetworkQos;
import org.ovirt.engine.core.common.businessentities.network.Network;
import org.ovirt.engine.core.common.businessentities.network.NetworkAttachment;
import org.ovirt.engine.core.common.businessentities.network.ReportedConfigurations;
import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.ClusterDao;
import org.ovirt.engine.core.dao.VdsDao;
import org.ovirt.engine.core.dao.network.InterfaceDao;
import org.ovirt.engine.core.dao.network.NetworkDao;
import org.ovirt.engine.core.utils.NetworkInSyncWithVdsNetworkInterface;
import org.ovirt.engine.core.vdsbroker.EffectiveHostNetworkQos;
@Singleton
public class ReportedConfigurationsFiller {
private final InterfaceDao interfaceDao;
private final NetworkDao networkDao;
private final VdsDao vdsDao;
private final ClusterDao clusterDao;
private EffectiveHostNetworkQos effectiveHostNetworkQos;
@Inject
public ReportedConfigurationsFiller(InterfaceDao interfaceDao,
NetworkDao networkDao,
VdsDao vdsDao,
ClusterDao clusterDao,
EffectiveHostNetworkQos effectiveHostNetworkQos) {
this.interfaceDao = interfaceDao;
this.networkDao = networkDao;
this.vdsDao = vdsDao;
this.clusterDao = clusterDao;
this.effectiveHostNetworkQos = effectiveHostNetworkQos;
}
public void fillReportedConfigurations(List<VdsNetworkInterface> allInterfacesForHost,
BusinessEntityMap<Network> networkMap,
List<NetworkAttachment> networkAttachments,
Guid clusterId) {
Cluster cluster = clusterDao.get(clusterId);
Map<String, VdsNetworkInterface> networkNameToNicMap = nicsByNetworkId(allInterfacesForHost);
for (NetworkAttachment networkAttachment : networkAttachments) {
fillReportedConfigurations(networkNameToNicMap, networkMap, networkAttachment, cluster);
}
}
public void fillReportedConfigurations(List<NetworkAttachment> networkAttachments, Guid hostId) {
List<VdsNetworkInterface> allInterfacesForHost = interfaceDao.getAllInterfacesForVds(hostId);
Guid clusterId = vdsDao.get(hostId).getClusterId();
BusinessEntityMap<Network> networkMap = new BusinessEntityMap<>(networkDao.getAllForCluster(clusterId));
fillReportedConfigurations(allInterfacesForHost, networkMap, networkAttachments, clusterId);
}
private void fillReportedConfigurations(Map<String, VdsNetworkInterface> networkNameToNicMap,
BusinessEntityMap<Network> networkMap,
NetworkAttachment networkAttachment,
Cluster cluster) {
Network network = networkMap.get(networkAttachment.getNetworkId());
VdsNetworkInterface nic =
getNicToWhichIsNetworkAttached(networkNameToNicMap, networkMap, networkAttachment);
if (nic != null) {
NetworkInSyncWithVdsNetworkInterface isInSync =
createNetworkInSyncWithVdsNetworkInterface(networkAttachment, nic, network, cluster);
ReportedConfigurations reportedConfigurations = isInSync.reportConfigurationsOnHost();
networkAttachment.setReportedConfigurations(reportedConfigurations);
}
}
NetworkInSyncWithVdsNetworkInterface createNetworkInSyncWithVdsNetworkInterface(NetworkAttachment networkAttachment,
VdsNetworkInterface nic,
Network network,
Cluster cluster) {
HostNetworkQos hostNetworkQos = effectiveHostNetworkQos.getQos(networkAttachment, network);
return new NetworkInSyncWithVdsNetworkInterface(nic, network, hostNetworkQos, networkAttachment, cluster);
}
private Map<String, VdsNetworkInterface> nicsByNetworkId(List<VdsNetworkInterface> nics) {
Map<String, VdsNetworkInterface> result = new HashMap<>();
for (VdsNetworkInterface nic : nics) {
if (nic.getNetworkName() != null) {
result.put(nic.getNetworkName(), nic);
}
}
return result;
}
private VdsNetworkInterface getNicToWhichIsNetworkAttached(Map<String, VdsNetworkInterface> networkNameToNicMap,
BusinessEntityMap<Network> networkMap,
NetworkAttachment networkAttachment) {
Guid networkId = networkAttachment.getNetworkId();
Network network = networkMap.get(networkId);
return networkNameToNicMap.get(network.getName());
}
public void fillReportedConfiguration(NetworkAttachment networkAttachment, Guid hostId) {
fillReportedConfigurations(Collections.singletonList(networkAttachment), hostId);
}
}