use of org.openkilda.model.SwitchFeature 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.model.SwitchFeature in project open-kilda by telstra.
the class MaxBurstCoefficientLimitationFeature method discover.
@Override
public Optional<SwitchFeature> discover(IOFSwitch sw) {
Optional<SwitchFeature> empty = Optional.empty();
SwitchDescription description = sw.getSwitchDescription();
if (description == null || description.getSoftwareDescription() == null || description.getHardwareDescription() == null) {
return empty;
}
if (NOVIFLOW_SOFTWARE_DESCRIPTION_REGEX.matcher(description.getSoftwareDescription()).matches() && !E_SWITCH_HARDWARE_DESCRIPTION_REGEX.matcher(description.getHardwareDescription()).matches()) {
return Optional.of(SwitchFeature.MAX_BURST_COEFFICIENT_LIMITATION);
}
return Optional.empty();
}
use of org.openkilda.model.SwitchFeature in project open-kilda by telstra.
the class FeatureDetectorServiceTest method discoveryContain.
private void discoveryContain(IOFSwitch sw, SwitchFeature... expectedFeatules) {
replayAll();
Set<SwitchFeature> actualFeatures = featuresDetector.detectSwitch(sw);
for (SwitchFeature expected : expectedFeatules) {
Assert.assertTrue(actualFeatures.contains(expected));
}
}
use of org.openkilda.model.SwitchFeature in project open-kilda by telstra.
the class BfdCommand method checkSwitchCapabilities.
protected void checkSwitchCapabilities(IOFSwitch sw) throws NoFeatureException {
Set<SwitchFeature> features = featureDetector.detectSwitch(sw);
final SwitchFeature requiredFeature = SwitchFeature.BFD;
if (!features.contains(requiredFeature)) {
throw new NoFeatureException(sw.getId(), requiredFeature, features);
}
}
use of org.openkilda.model.SwitchFeature in project open-kilda by telstra.
the class SwitchManager method removeMultitableEndpointIslRules.
@Override
public List<Long> removeMultitableEndpointIslRules(DatapathId dpid, int port) throws SwitchOperationException {
IOFSwitch sw = lookupSwitch(dpid);
List<Long> removedFlows = new ArrayList<>();
Set<SwitchFeature> features = featureDetectorService.detectSwitch(sw);
if (features.contains(NOVIFLOW_PUSH_POP_VXLAN) || features.contains(KILDA_OVS_PUSH_POP_MATCH_VXLAN)) {
removedFlows.add(removeEgressIslVxlanRule(dpid, port));
removedFlows.add(removeTransitIslVxlanRule(dpid, port));
} else {
logger.info("Skip removing of isl multitable vxlan rule for switch {} {}", dpid, port);
}
removedFlows.add(removeEgressIslVlanRule(dpid, port));
return removedFlows;
}
Aggregations