Search in sources :

Example 1 with IllegalSwitchPropertiesException

use of org.openkilda.wfm.error.IllegalSwitchPropertiesException in project open-kilda by telstra.

the class SwitchOperationsService method validateSwitchProperties.

private void validateSwitchProperties(SwitchId switchId, SwitchProperties updatedSwitchProperties) {
    if (!updatedSwitchProperties.isMultiTable()) {
        String propertyErrorMessage = "Illegal switch properties combination for switch %s. '%s' property " + "can be set to 'true' only if 'multiTable' property is 'true'.";
        if (updatedSwitchProperties.isSwitchLldp()) {
            throw new IllegalSwitchPropertiesException(format(propertyErrorMessage, switchId, "switchLldp"));
        }
        if (updatedSwitchProperties.isSwitchArp()) {
            throw new IllegalSwitchPropertiesException(format(propertyErrorMessage, switchId, "switchArp"));
        }
        List<String> flowsWitchEnabledLldp = flowRepository.findByEndpointSwitchWithEnabledLldp(switchId).stream().map(Flow::getFlowId).collect(Collectors.toList());
        if (!flowsWitchEnabledLldp.isEmpty()) {
            throw new IllegalSwitchPropertiesException(format("Illegal switch properties combination for switch %s. " + "Detect Connected Devices feature is turn on for following flows [%s]. " + "For correct work of this feature switch property 'multiTable' must be set to 'true' " + "Please disable detecting of connected devices via LLDP for each flow before set " + "'multiTable' property to 'false'", switchId, String.join(", ", flowsWitchEnabledLldp)));
        }
        List<String> flowsWithEnabledArp = flowRepository.findByEndpointSwitchWithEnabledArp(switchId).stream().map(Flow::getFlowId).collect(Collectors.toList());
        if (!flowsWithEnabledArp.isEmpty()) {
            throw new IllegalSwitchPropertiesException(format("Illegal switch properties combination for switch %s. " + "Detect Connected Devices feature via ARP is turn on for following flows [%s]. " + "For correct work of this feature switch property 'multiTable' must be set to 'true' " + "Please disable detecting of connected devices via ARP for each flow before set " + "'multiTable' property to 'false'", switchId, String.join(", ", flowsWithEnabledArp)));
        }
    }
    if (updatedSwitchProperties.getServer42Port() != null) {
        Optional<PhysicalPort> physicalPort = physicalPortRepository.findBySwitchIdAndPortNumber(switchId, updatedSwitchProperties.getServer42Port());
        if (physicalPort.isPresent()) {
            throw new IllegalSwitchPropertiesException(format("Illegal server42 port '%d' on switch %s. This port is part of LAG '%d'. Please " + "delete LAG port or choose another server42 port.", updatedSwitchProperties.getServer42Port(), switchId, physicalPort.get().getLagLogicalPort().getLogicalPortNumber()));
        }
    }
    if (updatedSwitchProperties.isServer42FlowRtt()) {
        String errorMessage = "Illegal switch properties combination for switch %s. To enable property " + "'server42_flow_rtt' you need to specify valid property '%s'";
        if (updatedSwitchProperties.getServer42Port() == null) {
            throw new IllegalSwitchPropertiesException(format(errorMessage, switchId, "server42_port"));
        }
        if (updatedSwitchProperties.getServer42MacAddress() == null) {
            throw new IllegalSwitchPropertiesException(format(errorMessage, switchId, "server42_mac_address"));
        }
        if (updatedSwitchProperties.getServer42Vlan() == null) {
            throw new IllegalSwitchPropertiesException(format(errorMessage, switchId, "server42_vlan"));
        }
    }
    if (updatedSwitchProperties.getServer42IslRtt() == RttState.ENABLED) {
        String errorMessage = "Illegal switch properties combination for switch %s. To enable property " + "'server42_isl_rtt' you need to specify valid property '%s'";
        if (updatedSwitchProperties.getServer42Port() == null) {
            throw new IllegalSwitchPropertiesException(format(errorMessage, switchId, "server42_port"));
        }
        if (updatedSwitchProperties.getServer42MacAddress() == null) {
            throw new IllegalSwitchPropertiesException(format(errorMessage, switchId, "server42_mac_address"));
        }
        if (updatedSwitchProperties.getServer42Vlan() == null) {
            throw new IllegalSwitchPropertiesException(format(errorMessage, switchId, "server42_vlan"));
        }
    }
    Collection<FlowMirrorPoints> flowMirrorPoints = flowMirrorPointsRepository.findBySwitchId(switchId);
    if (!flowMirrorPoints.isEmpty() && (updatedSwitchProperties.isSwitchLldp() || updatedSwitchProperties.isSwitchArp())) {
        throw new IllegalSwitchPropertiesException(format("Flow mirror point is created on the switch %s, " + "switchLldp or switchArp can not be set to true.", switchId));
    }
    if (updatedSwitchProperties.getServer42Port() != null) {
        String errorMessage = "SwitchId '%s' and port '%d' belong to the %s endpoint. " + "Cannot specify port '%d' as port for server 42.";
        int server42port = updatedSwitchProperties.getServer42Port();
        Collection<Flow> flows = flowRepository.findByEndpoint(switchId, server42port);
        if (!flows.isEmpty()) {
            throw new IllegalSwitchPropertiesException(format(errorMessage, switchId, server42port, "flow", server42port));
        }
        Collection<FlowMirrorPath> flowMirrorPaths = flowMirrorPathRepository.findByEgressSwitchIdAndPort(switchId, server42port);
        if (!flowMirrorPaths.isEmpty()) {
            throw new IllegalSwitchPropertiesException(format(errorMessage, switchId, server42port, "flow mirror path", server42port));
        }
    }
}
Also used : IllegalSwitchPropertiesException(org.openkilda.wfm.error.IllegalSwitchPropertiesException) FlowMirrorPoints(org.openkilda.model.FlowMirrorPoints) PhysicalPort(org.openkilda.model.PhysicalPort) IslEndpoint(org.openkilda.model.IslEndpoint) FlowMirrorPath(org.openkilda.model.FlowMirrorPath) Flow(org.openkilda.model.Flow)

Example 2 with IllegalSwitchPropertiesException

use of org.openkilda.wfm.error.IllegalSwitchPropertiesException in project open-kilda by telstra.

the class SwitchOperationsService method updateSwitchProperties.

/**
 * Update switch properties.
 *
 * @param switchId            target switch id
 * @param switchPropertiesDto switch properties
 * @throws IllegalSwitchPropertiesException  if switch properties are incorrect
 * @throws SwitchPropertiesNotFoundException if switch properties is not found by switch id
 */
public SwitchPropertiesDto updateSwitchProperties(SwitchId switchId, SwitchPropertiesDto switchPropertiesDto) {
    if (isEmpty(switchPropertiesDto.getSupportedTransitEncapsulation())) {
        throw new IllegalSwitchPropertiesException("Supported transit encapsulations should not be null or empty");
    }
    SwitchProperties update = SwitchPropertiesMapper.INSTANCE.map(switchPropertiesDto);
    UpdateSwitchPropertiesResult result = transactionManager.doInTransaction(() -> {
        SwitchProperties switchProperties = switchPropertiesRepository.findBySwitchId(switchId).orElseThrow(() -> new SwitchPropertiesNotFoundException(switchId));
        final SwitchProperties oldProperties = new SwitchProperties(switchProperties);
        validateSwitchProperties(switchId, update);
        // must be called before updating of switchProperties object
        final boolean isSwitchSyncNeeded = isSwitchSyncNeeded(switchProperties, update);
        switchProperties.setMultiTable(update.isMultiTable());
        switchProperties.setSwitchLldp(update.isSwitchLldp());
        switchProperties.setSwitchArp(update.isSwitchArp());
        switchProperties.setSupportedTransitEncapsulation(update.getSupportedTransitEncapsulation());
        switchProperties.setServer42FlowRtt(update.isServer42FlowRtt());
        switchProperties.setServer42IslRtt(update.getServer42IslRtt());
        switchProperties.setServer42Port(update.getServer42Port());
        switchProperties.setServer42Vlan(update.getServer42Vlan());
        switchProperties.setServer42MacAddress(update.getServer42MacAddress());
        log.info("Updating {} switch properties from {} to {}. Is switch sync needed: {}", switchId, oldProperties, switchProperties, isSwitchSyncNeeded);
        return new UpdateSwitchPropertiesResult(SwitchPropertiesMapper.INSTANCE.map(switchProperties), isSwitchSyncNeeded);
    });
    if (result.isSwitchSyncRequired()) {
        carrier.requestSwitchSync(switchId);
    }
    if (switchPropertiesDto.isServer42FlowRtt()) {
        carrier.enableServer42FlowRttOnSwitch(switchId);
    } else {
        carrier.disableServer42FlowRttOnSwitch(switchId);
    }
    if (switchPropertiesDto.getServer42IslRtt() != SwitchPropertiesDto.RttState.DISABLED) {
        carrier.enableServer42IslRttOnSwitch(switchId);
    } else {
        carrier.disableServer42IslRttOnSwitch(switchId);
    }
    return result.switchPropertiesDto;
}
Also used : SwitchPropertiesNotFoundException(org.openkilda.wfm.error.SwitchPropertiesNotFoundException) IllegalSwitchPropertiesException(org.openkilda.wfm.error.IllegalSwitchPropertiesException) SwitchProperties(org.openkilda.model.SwitchProperties)

Aggregations

IllegalSwitchPropertiesException (org.openkilda.wfm.error.IllegalSwitchPropertiesException)2 Flow (org.openkilda.model.Flow)1 FlowMirrorPath (org.openkilda.model.FlowMirrorPath)1 FlowMirrorPoints (org.openkilda.model.FlowMirrorPoints)1 IslEndpoint (org.openkilda.model.IslEndpoint)1 PhysicalPort (org.openkilda.model.PhysicalPort)1 SwitchProperties (org.openkilda.model.SwitchProperties)1 SwitchPropertiesNotFoundException (org.openkilda.wfm.error.SwitchPropertiesNotFoundException)1