package org.ovirt.engine.core.bll.validator.network; import java.util.Collection; import javax.inject.Singleton; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.bll.ValidationResult; 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.NetworkAttachment; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.utils.ReplacementUtils; @Singleton public class NetworkAttachmentIpConfigurationValidator { static final String VAR_NETWORK_NAME = "networkName"; static final String VAR_INTERFACE_NAME = "interfaceName"; static final String VAR_BOOT_PROTOCOL = "BootProtocol"; public ValidationResult validateNetworkAttachmentIpConfiguration( Collection<NetworkAttachment> attachmentsToConfigure) { for (NetworkAttachment networkAttachment : attachmentsToConfigure) { IpConfiguration ipConfiguration = networkAttachment.getIpConfiguration(); if (ipConfiguration == null || !(ipConfiguration.hasIpv4PrimaryAddressSet() || ipConfiguration.hasIpv6PrimaryAddressSet())) { return incompleteIpConfigurationValidationResult( EngineMessage.NETWORK_ATTACHMENT_MISSING_IP_CONFIGURATION, networkAttachment.getNetworkName(), networkAttachment.getNicName()); } final ValidationResult ipv4ValidationResult = validateIpv4Configuration(networkAttachment); if (!ipv4ValidationResult.isValid()) { return ipv4ValidationResult; } final ValidationResult ipv6ValidationResult = validateIpv6Configuration(networkAttachment); if (!ipv6ValidationResult.isValid()) { return ipv6ValidationResult; } } return ValidationResult.VALID; } private ValidationResult validateIpv4Configuration(NetworkAttachment networkAttachment) { IpConfiguration ipConfiguration = networkAttachment.getIpConfiguration(); if (!ipConfiguration.hasIpv4PrimaryAddressSet()) { return ValidationResult.VALID; } IPv4Address iPv4Address = ipConfiguration.getIpv4PrimaryAddress(); String networkName = networkAttachment.getNetworkName(); String nicName = networkAttachment.getNicName(); if (iPv4Address.getBootProtocol() == null) { return incompleteIpConfigurationValidationResult( EngineMessage.NETWORK_ATTACHMENT_IP_CONFIGURATION_MISSING_BOOT_PROTOCOL, networkName, nicName); } Ipv4BootProtocol bootProtocol = iPv4Address.getBootProtocol(); if (bootProtocol == Ipv4BootProtocol.STATIC_IP) { if (!validStaticIpv4AddressDetails(iPv4Address)) { return incompleteIpConfigurationValidationResult( EngineMessage.NETWORK_ATTACHMENT_IP_CONFIGURATION_STATIC_BOOT_PROTOCOL_MISSING_IP_ADDRESS_DETAILS, networkName, nicName); } } else { if (!isEmptyIpv4AddressDetails(iPv4Address)) { return new ValidationResult( EngineMessage.NETWORK_ATTACHMENT_IP_CONFIGURATION_INCOMPATIBLE_BOOT_PROTOCOL_AND_IP_ADDRESS_DETAILS, ReplacementUtils.createSetVariableString(VAR_NETWORK_NAME, networkName), ReplacementUtils.createSetVariableString(VAR_INTERFACE_NAME, nicName), ReplacementUtils.createSetVariableString(VAR_BOOT_PROTOCOL, bootProtocol.getDisplayName())); } } return ValidationResult.VALID; } private ValidationResult validateIpv6Configuration(NetworkAttachment networkAttachment) { final IpConfiguration ipConfiguration = networkAttachment.getIpConfiguration(); if (!ipConfiguration.hasIpv6PrimaryAddressSet()) { return ValidationResult.VALID; } IpV6Address ipv6Address = ipConfiguration.getIpv6PrimaryAddress(); String networkName = networkAttachment.getNetworkName(); String nicName = networkAttachment.getNicName(); if (ipv6Address.getBootProtocol() == null) { return incompleteIpConfigurationValidationResult( EngineMessage.NETWORK_ATTACHMENT_IP_CONFIGURATION_MISSING_BOOT_PROTOCOL, networkName, nicName); } Ipv6BootProtocol bootProtocol = ipv6Address.getBootProtocol(); if (bootProtocol == Ipv6BootProtocol.STATIC_IP) { if (!validStaticIpv6AddressDetails(ipv6Address)) { return incompleteIpConfigurationValidationResult( EngineMessage.NETWORK_ATTACHMENT_IP_CONFIGURATION_STATIC_BOOT_PROTOCOL_MISSING_IP_ADDRESS_DETAILS, networkName, nicName); } } else { if (!isEmptyIpv6AddressDetails(ipv6Address)) { return new ValidationResult( EngineMessage.NETWORK_ATTACHMENT_IP_CONFIGURATION_INCOMPATIBLE_BOOT_PROTOCOL_AND_IP_ADDRESS_DETAILS, ReplacementUtils.createSetVariableString(VAR_NETWORK_NAME, networkName), ReplacementUtils.createSetVariableString(VAR_INTERFACE_NAME, nicName), ReplacementUtils.createSetVariableString(VAR_BOOT_PROTOCOL, bootProtocol.getDisplayName())); } } return ValidationResult.VALID; } private boolean isEmptyIpv4AddressDetails(IPv4Address iPv4Address) { return StringUtils.isEmpty(iPv4Address.getAddress()) && StringUtils.isEmpty(iPv4Address.getNetmask()) && StringUtils.isEmpty(iPv4Address.getGateway()); } private boolean isEmptyIpv6AddressDetails(IpV6Address ipv6Address) { return StringUtils.isEmpty(ipv6Address.getAddress()) && ipv6Address.getPrefix() == null && StringUtils.isEmpty(ipv6Address.getGateway()); } private boolean validStaticIpv4AddressDetails(IPv4Address iPv4Address) { return !(StringUtils.isEmpty(iPv4Address.getAddress()) || StringUtils.isEmpty(iPv4Address.getNetmask())); } private boolean validStaticIpv6AddressDetails(IpV6Address ipv6Address) { return !(StringUtils.isEmpty(ipv6Address.getAddress()) || ipv6Address.getPrefix() == null); } private ValidationResult incompleteIpConfigurationValidationResult(EngineMessage engineMessage, String networkName, String interfaceName) { return new ValidationResult(engineMessage, ReplacementUtils.createSetVariableString(VAR_NETWORK_NAME, networkName), ReplacementUtils.createSetVariableString(VAR_INTERFACE_NAME, interfaceName)); } }