use of org.openkilda.wfm.topology.switchmanager.error.InvalidDataException in project open-kilda by telstra.
the class LagPortOperationService method validatePhysicalPort.
private void validatePhysicalPort(SwitchId switchId, Set<SwitchFeature> features, Integer portNumber) throws InvalidDataException {
if (portNumber == null || portNumber <= 0) {
throw new InvalidDataException(format("Invalid physical port number %s. It can't be null or negative.", portNumber));
}
int bfdPortOffset = config.getBfdPortOffset();
int bfdPortMaxNumber = config.getBfdPortMaxNumber();
if (features.contains(BFD) && portNumber >= bfdPortOffset && portNumber <= bfdPortMaxNumber) {
throw new InvalidDataException(format("Physical port number %d intersects with BFD port range [%d, %d]", portNumber, bfdPortOffset, bfdPortMaxNumber));
}
long lagPortOffset = config.getPoolConfig().getIdMinimum();
if (portNumber >= lagPortOffset) {
throw new InvalidDataException(format("Physical port number %d can't be greater than LAG port offset %d.", portNumber, lagPortOffset));
}
Collection<Isl> isls = islRepository.findByEndpoint(switchId, portNumber);
if (!isls.isEmpty()) {
throw new InvalidDataException(format("Physical port number %d intersects with existing ISLs %s.", portNumber, isls));
}
Optional<SwitchProperties> properties = switchPropertiesRepository.findBySwitchId(switchId);
if (properties.isPresent() && Objects.equals(properties.get().getServer42Port(), portNumber)) {
throw new InvalidDataException(format("Physical port number %d on switch %s is server42 port.", portNumber, switchId));
}
Set<String> flowIds = flowRepository.findByEndpoint(switchId, portNumber).stream().map(Flow::getFlowId).collect(Collectors.toSet());
if (!flowIds.isEmpty()) {
throw new InvalidDataException(format("Physical port %d already used by following flows: %s. You must " + "remove these flows to be able to use the port in LAG.", portNumber, flowIds));
}
Collection<FlowMirrorPath> mirrorPaths = flowMirrorPathRepository.findByEgressSwitchIdAndPort(switchId, portNumber);
if (!mirrorPaths.isEmpty()) {
Map<String, List<PathId>> mirrorPathByFLowIdMap = new HashMap<>();
for (FlowMirrorPath path : mirrorPaths) {
String flowId = path.getFlowMirrorPoints().getFlowPath().getFlowId();
mirrorPathByFLowIdMap.computeIfAbsent(flowId, ignore -> new ArrayList<>());
mirrorPathByFLowIdMap.get(flowId).add(path.getPathId());
}
String message = mirrorPathByFLowIdMap.entrySet().stream().map(entry -> format("flow '%s': %s", entry.getKey(), entry.getValue())).collect(Collectors.joining(", "));
throw new InvalidDataException(format("Physical port %d already used as sink by following mirror points %s", portNumber, message));
}
}
use of org.openkilda.wfm.topology.switchmanager.error.InvalidDataException in project open-kilda by telstra.
the class LagPortOperationService method createTransaction.
private LagLogicalPort createTransaction(SwitchId switchId, Set<Integer> targetPorts) {
// locate switch first to produce correct error if switch is missing
Switch sw = querySwitch(switchId);
if (!isSwitchLagCapable(sw)) {
throw new InvalidDataException(format("Switch %s doesn't support LAG.", sw.getSwitchId()));
}
Set<SwitchFeature> features = sw.getFeatures();
for (Integer portNumber : targetPorts) {
validatePhysicalPort(switchId, features, portNumber);
}
ensureNoLagCollisions(switchId, targetPorts);
LagLogicalPort port = queryPoolManager(switchId).allocate();
port.setPhysicalPorts(targetPorts.stream().map(portNumber -> new PhysicalPort(switchId, portNumber, port)).collect(Collectors.toList()));
log.info("Adding new LAG logical port entry into DB: {}", port);
lagLogicalPortRepository.add(port);
return port;
}
use of org.openkilda.wfm.topology.switchmanager.error.InvalidDataException in project open-kilda by telstra.
the class LagPortOperationService method ensureDeleteIsPossible.
/**
* Verify that LAG logical port can be removed (it exists and do not in use by any flow).
*/
public LagLogicalPort ensureDeleteIsPossible(SwitchId switchId, int logicalPortNumber) {
// locate switch first to produce correct error if switch is missing
Switch sw = querySwitch(switchId);
Optional<LagLogicalPort> port = lagLogicalPortRepository.findBySwitchIdAndPortNumber(switchId, logicalPortNumber);
if (!port.isPresent()) {
throw new LagPortNotFoundException(switchId, logicalPortNumber);
}
List<String> occupiedBy = flowRepository.findByEndpoint(switchId, logicalPortNumber).stream().map(Flow::getFlowId).collect(Collectors.toList());
if (!occupiedBy.isEmpty()) {
throw new InvalidDataException(format("Couldn't delete LAG port '%d' from switch %s because flows '%s' " + "use it as endpoint", logicalPortNumber, switchId, occupiedBy));
}
if (!isSwitchLagCapable(sw)) {
log.error("Processing request for remove existing LAG logical port #{} on switch {} without LAG support", logicalPortNumber, switchId);
}
return port.get();
}
use of org.openkilda.wfm.topology.switchmanager.error.InvalidDataException in project open-kilda by telstra.
the class CreateLagPortFsm method createLagInDb.
void createLagInDb(CreateLagState from, CreateLagState to, CreateLagEvent event, CreateLagContext context) {
log.info("Creating LAG {} on switch {}. Key={}", request, switchId, key);
try {
HashSet<Integer> targetPorts = new HashSet<>(request.getPortNumbers());
lagLogicalPortNumber = lagPortOperationService.createLagPort(switchId, targetPorts);
String ipAddress = lagPortOperationService.getSwitchIpAddress(switchId);
grpcRequest = new CreateLogicalPortRequest(ipAddress, request.getPortNumbers(), lagLogicalPortNumber, LAG);
} catch (InvalidDataException | InconsistentDataException | SwitchNotFoundException e) {
log.error(format("Unable to handle %s. Error: %s", request, e.getMessage()), e);
fire(ERROR, CreateLagContext.builder().error(e).build());
}
}
use of org.openkilda.wfm.topology.switchmanager.error.InvalidDataException in project open-kilda by telstra.
the class DeleteLagPortFsm method createGrpcRequest.
void createGrpcRequest(DeleteLagState from, DeleteLagState to, DeleteLagEvent event, DeleteLagContext context) {
log.info("Removing LAG {} on switch {}. Key={}", request, switchId, key);
try {
lagPortOperationService.ensureDeleteIsPossible(switchId, request.getLogicalPortNumber());
String ipAddress = lagPortOperationService.getSwitchIpAddress(switchId);
grpcRequest = new DeleteLogicalPortRequest(ipAddress, request.getLogicalPortNumber());
} catch (LagPortNotFoundException | InvalidDataException | SwitchNotFoundException | InconsistentDataException e) {
log.error(format("Unable to delete LAG logical port %d on switch %s. Error: %s", request.getLogicalPortNumber(), switchId, e.getMessage()), e);
fire(ERROR, DeleteLagContext.builder().error(e).build());
}
}
Aggregations