package org.ovirt.engine.core.common.utils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.ovirt.engine.core.common.businessentities.network.Bond;
import org.ovirt.engine.core.common.businessentities.network.IPv4Address;
import org.ovirt.engine.core.common.businessentities.network.IpConfiguration;
import org.ovirt.engine.core.common.businessentities.network.IpV6Address;
import org.ovirt.engine.core.common.businessentities.network.Ipv4BootProtocol;
import org.ovirt.engine.core.common.businessentities.network.Ipv6BootProtocol;
import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface;
public class NetworkCommonUtils {
public static Map<String, List<String>> getBondNameToBondSlaveNamesMap(Collection<? extends VdsNetworkInterface> nics) {
Map<String, List<String>> result = new HashMap<>();
Map<String, List<VdsNetworkInterface>> map = getBondNameToBondSlavesMap(nics);
for (Map.Entry<String, List<VdsNetworkInterface>> entry : map.entrySet()) {
result.put(entry.getKey(), getNicNames(entry.getValue()));
}
return result;
}
public static Map<String, List<VdsNetworkInterface>> getBondNameToBondSlavesMap(Collection<? extends VdsNetworkInterface> nics) {
Map<String, List<VdsNetworkInterface>> bondToSlaves = new HashMap<>();
for (VdsNetworkInterface nic : nics) {
if (nic.isPartOfBond()) {
String bondName = nic.getBondName();
if (!bondToSlaves.containsKey(bondName)) {
bondToSlaves.put(bondName, new ArrayList<VdsNetworkInterface>());
}
bondToSlaves.get(bondName).add(nic);
}
}
return bondToSlaves;
}
private static List<String> getNicNames(List<VdsNetworkInterface> nics) {
List<String> result = new ArrayList<>(nics.size());
for (VdsNetworkInterface nic : nics) {
result.add(nic.getName());
}
return result;
}
public static Collection<VdsNetworkInterface> getBondsWithSlavesInformation(Collection<? extends VdsNetworkInterface> nics) {
List<VdsNetworkInterface> bonds = new ArrayList<>();
fillBondSlaves(nics);
for (VdsNetworkInterface nic : nics) {
if (nic instanceof Bond) {
bonds.add(nic);
}
}
return bonds;
}
public static void fillBondSlaves(Collection<? extends VdsNetworkInterface> nics) {
Map<String, List<String>> bondToSlaves = getBondNameToBondSlaveNamesMap(nics);
for (VdsNetworkInterface nic : nics) {
if (nic instanceof Bond) {
Bond bond = (Bond) nic;
bond.setSlaves(bondToSlaves.containsKey(bond.getName()) ? bondToSlaves.get(bond.getName())
: new ArrayList<String>());
}
}
}
public static IpConfiguration createDefaultIpConfiguration() {
IpConfiguration ipConfiguration = new IpConfiguration();
IPv4Address iPv4Address = createDefaultIpv4Address();
ipConfiguration.getIPv4Addresses().add(iPv4Address);
IpV6Address ipv6Address = createDefaultIpv6Address();
ipConfiguration.getIpV6Addresses().add(ipv6Address);
return ipConfiguration;
}
public static IPv4Address createDefaultIpv4Address() {
IPv4Address ipv4Address = new IPv4Address();
ipv4Address.setBootProtocol(Ipv4BootProtocol.NONE);
return ipv4Address;
}
public static IpV6Address createDefaultIpv6Address() {
IpV6Address ipv6Address = new IpV6Address();
ipv6Address.setBootProtocol(Ipv6BootProtocol.NONE);
return ipv6Address;
}
/**
* Returns the underlying interface name of a given nic
*
* @return Base interface name if the nic is a vlan device.
* Otherwise, the name of the nic
*/
public static String stripVlan(VdsNetworkInterface nic) {
return isVlan(nic) ? nic.getBaseInterface() : nic.getName();
}
/**
* Determine if a given network interface is a vlan device
*
* @param nic
* the nic to check.
* @return <code>true</code> iff the nic is a vlan.
*/
public static boolean isVlan(VdsNetworkInterface nic) {
return nic.getVlanId() != null;
}
}