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));
}
}
}
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;
}
Aggregations