package org.ovirt.engine.core.bll.network.host; 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.bll.ValidationResult; import org.ovirt.engine.core.common.businessentities.BusinessEntityMap; import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.businessentities.network.NetworkAttachment; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.utils.NetworkUtils; import org.ovirt.engine.core.utils.ReplacementUtils; public class NetworkMtuValidator { public static final String VAR_NETWORK_MTU_DIFFERENCES_LIST = "NETWORK_MTU_DIFFERENCES_LIST"; private final BusinessEntityMap<Network> networkBusinessEntityMap; public NetworkMtuValidator(BusinessEntityMap<Network> networkBusinessEntityMap) { this.networkBusinessEntityMap = networkBusinessEntityMap; } /** * Validates there is no differences on MTU value between non-VM network to Vlans over the same interface/bond */ public ValidationResult validateMtu(Collection<NetworkAttachment> attachmentsToConfigure) { return validateMtu(getNetworksOnNics(attachmentsToConfigure)); } ValidationResult validateMtu(Map<String, List<Network>> nicsToNetworks) { for (List<Network> networksOnNic : nicsToNetworks.values()) { if (!networksOnNicMatchMtu(networksOnNic)) { ValidationResult validationResult = reportMtuDifferences(networksOnNic); if (!validationResult.isValid()) { return validationResult; } } } return ValidationResult.VALID; } Map<String, List<Network>> getNetworksOnNics(Collection<NetworkAttachment> attachmentsToConfigure) { Map<String, List<Network>> nicsToNetworks = new HashMap<>(); for (NetworkAttachment attachment : attachmentsToConfigure) { String nicName = attachment.getNicName(); if (!nicsToNetworks.containsKey(nicName)) { nicsToNetworks.put(nicName, new ArrayList<>()); } Network networkToConfigure = networkBusinessEntityMap.get(attachment.getNetworkId()); nicsToNetworks.get(nicName).add(networkToConfigure); } return nicsToNetworks; } private ValidationResult reportMtuDifferences(List<Network> ifaceNetworks) { List<String> mtuDiffNetworks = new ArrayList<>(); for (Network net : ifaceNetworks) { mtuDiffNetworks.add(String.format("%s(%s)", net.getName(), net.getMtu() == 0 ? "default" : String.valueOf(net.getMtu()))); } return new ValidationResult(EngineMessage.NETWORK_MTU_DIFFERENCES, ReplacementUtils.replaceWith(VAR_NETWORK_MTU_DIFFERENCES_LIST, mtuDiffNetworks)); } private boolean networksOnNicMatchMtu(List<Network> networksOnNic) { final Network nonVlanNetwork = networksOnNic.stream() .filter(network -> !NetworkUtils.isVlan(network)) .findFirst() .orElse(null); if (nonVlanNetwork == null) { return true; } int nonVlanNetworkActualMtu = getMtuActualValue(nonVlanNetwork); return networksOnNic.stream().map(network -> getMtuActualValue(network)).noneMatch( networkMtu -> networkMtu != nonVlanNetworkActualMtu); } private int getMtuActualValue(Network network) { return network.getMtu() == 0 ? NetworkUtils.getDefaultMtu() : network.getMtu(); } }