package org.ovirt.engine.core.bll.validator; import java.util.List; import java.util.function.Predicate; import java.util.regex.Pattern; import java.util.stream.Stream; import javax.inject.Singleton; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.bll.ValidationResult; import org.ovirt.engine.core.bll.network.macpool.MacPool; import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface; import org.ovirt.engine.core.common.businessentities.network.VmNic; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.common.utils.MacAddressValidationPatterns; @Singleton public class VmNicMacsUtils { private static final Pattern VALIDATE_MAC_ADDRESS = Pattern.compile(MacAddressValidationPatterns.UNICAST_MAC_ADDRESS_FORMAT); public ValidationResult validateMacAddress(List<? extends VmNic> vmNics) { for (VmNic iface : vmNics) { if (iface.getMacAddress() != null) { if (!VALIDATE_MAC_ADDRESS.matcher(iface.getMacAddress()).matches()) { return new ValidationResult(EngineMessage.ACTION_TYPE_FAILED_NETWORK_INTERFACE_MAC_INVALID, String.format("$IfaceName %1$s", iface.getName()), String.format("$MacAddress %1$s", iface.getMacAddress())); } } } return ValidationResult.VALID; } public <T extends VmNic> ValidationResult validateThereIsEnoughOfFreeMacs(List<T> vmNics, MacPool macPool, Predicate<T> vnicRequiresNewMacPredicate) { Stream<T> vnicsRequireNewMac = vmNics.stream().filter(vnicRequiresNewMacPredicate); long requiredMacs = vnicsRequireNewMac.count(); boolean notEnoughOfMacs = requiredMacs > 0 && macPool.getAvailableMacsCount() < requiredMacs; return ValidationResult.failWith(EngineMessage.MAC_POOL_NOT_ENOUGH_MAC_ADDRESSES).when(notEnoughOfMacs); } public void replaceInvalidEmptyStringMacAddressesWithNull(List<VmNetworkInterface> vmNetworkInterfaces) { vmNetworkInterfaces.stream() .filter((vmNetworkInterface) -> StringUtils.isEmpty(vmNetworkInterface.getMacAddress())) .forEach(e->e.setMacAddress(null)); } }