use of org.openkilda.model.FlowPath in project open-kilda by telstra.
the class RemoveRulesAction method buildResources.
private FlowResources buildResources(Flow flow, FlowPath path, FlowPath oppositePath) {
FlowPath forwardPath;
FlowPath reversePath;
if (path.isForward()) {
forwardPath = path;
reversePath = oppositePath;
} else {
forwardPath = oppositePath;
reversePath = path;
}
EncapsulationResources encapsulationResources;
if (!flow.isOneSwitchFlow()) {
encapsulationResources = resourcesManager.getEncapsulationResources(forwardPath.getPathId(), reversePath.getPathId(), flow.getEncapsulationType()).orElse(null);
} else {
encapsulationResources = null;
}
return FlowResources.builder().unmaskedCookie(forwardPath.getCookie().getFlowEffectiveId()).forward(PathResources.builder().pathId(forwardPath.getPathId()).meterId(forwardPath.getMeterId()).encapsulationResources(encapsulationResources).build()).reverse(PathResources.builder().pathId(reversePath.getPathId()).meterId(reversePath.getMeterId()).encapsulationResources(encapsulationResources).build()).build();
}
use of org.openkilda.model.FlowPath in project open-kilda by telstra.
the class RemoveRulesAction method perform.
@Override
protected void perform(State from, State to, Event event, FlowDeleteContext context, FlowDeleteFsm stateMachine) {
Flow flow = getFlow(stateMachine.getFlowId());
FlowCommandBuilder commandBuilder = commandBuilderFactory.getBuilder(flow.getEncapsulationType());
Collection<FlowSegmentRequestFactory> commands = new ArrayList<>();
Set<PathId> protectedPaths = Stream.of(flow.getProtectedForwardPathId(), flow.getProtectedReversePathId()).filter(Objects::nonNull).collect(Collectors.toSet());
Set<PathId> processed = new HashSet<>();
MirrorContext mirrorContext = MirrorContext.builder().removeFlowOperation(true).build();
for (FlowPath path : flow.getPaths()) {
PathId pathId = path.getPathId();
if (processed.add(pathId)) {
FlowPath oppositePath = flow.getOppositePathId(pathId).filter(oppPathId -> !pathId.equals(oppPathId)).flatMap(flow::getPath).orElse(null);
if (oppositePath != null) {
processed.add(oppositePath.getPathId());
}
if (oppositePath != null) {
stateMachine.getFlowResources().add(buildResources(flow, path, oppositePath));
if (protectedPaths.contains(pathId)) {
commands.addAll(commandBuilder.buildAllExceptIngress(stateMachine.getCommandContext(), flow, path, oppositePath, mirrorContext));
} else {
SpeakerRequestBuildContext speakerRequestBuildContext = SpeakerRequestBuildContext.builder().forward(buildPathContext(flow, path)).reverse(buildPathContext(flow, oppositePath)).deleteOperation(true).build();
commands.addAll(commandBuilder.buildAll(stateMachine.getCommandContext(), flow, path, oppositePath, speakerRequestBuildContext, mirrorContext));
}
} else {
log.warn("No opposite path found for {}, trying to delete as unpaired path", pathId);
stateMachine.getFlowResources().add(buildResources(flow, path, path));
if (protectedPaths.contains(pathId)) {
commands.addAll(commandBuilder.buildAllExceptIngress(stateMachine.getCommandContext(), flow, path, null, mirrorContext));
} else {
SpeakerRequestBuildContext speakerRequestBuildContext = SpeakerRequestBuildContext.builder().forward(buildPathContext(flow, path)).reverse(PathContext.builder().build()).deleteOperation(true).build();
commands.addAll(commandBuilder.buildAll(stateMachine.getCommandContext(), flow, path, null, speakerRequestBuildContext, mirrorContext));
}
}
}
}
stateMachine.clearPendingAndRetriedCommands();
if (commands.isEmpty()) {
stateMachine.saveActionToHistory("No need to remove rules");
stateMachine.fire(Event.RULES_REMOVED);
} else {
SpeakerRemoveSegmentEmitter.INSTANCE.emitBatch(stateMachine.getCarrier(), commands, stateMachine.getRemoveCommands());
stateMachine.getPendingCommands().addAll(stateMachine.getRemoveCommands().keySet());
stateMachine.saveActionToHistory("Remove commands for rules have been sent");
}
}
use of org.openkilda.model.FlowPath in project open-kilda by telstra.
the class EmitUpdateRulesRequestsAction method buildCommands.
private Collection<FlowSegmentRequestFactory> buildCommands(FlowMirrorPointCreateFsm stateMachine, Flow flow) {
final FlowCommandBuilder commandBuilder = commandBuilderFactory.getBuilder(flow.getEncapsulationType());
PathId flowPathId = stateMachine.getFlowPathId();
FlowPath path = flow.getPath(flowPathId).orElseThrow(() -> new FlowProcessingException(ErrorType.NOT_FOUND, format("Flow path %s not found", flowPathId)));
PathId oppositePathId = flow.getOppositePathId(flowPathId).orElseThrow(() -> new FlowProcessingException(ErrorType.NOT_FOUND, format("Opposite flow path id for path %s not found", flowPathId)));
FlowPath oppositePath = flow.getPath(oppositePathId).orElse(null);
RequestedFlowMirrorPoint mirrorPoint = stateMachine.getRequestedFlowMirrorPoint();
CommandContext context = stateMachine.getCommandContext();
SpeakerRequestBuildContext speakerContext = buildBaseSpeakerContextForInstall(path.getSrcSwitchId(), path.getDestSwitchId());
if (mirrorPoint.getMirrorPointSwitchId().equals(path.getSrcSwitchId())) {
return new ArrayList<>(commandBuilder.buildIngressOnlyOneDirection(context, flow, path, oppositePath, speakerContext.getForward(), MirrorContext.builder().buildMirrorFactoryOnly(true).addNewGroup(stateMachine.isAddNewGroup()).build()));
} else if (mirrorPoint.getMirrorPointSwitchId().equals(path.getDestSwitchId())) {
return new ArrayList<>(commandBuilder.buildEgressOnlyOneDirection(context, flow, path, oppositePath, MirrorContext.builder().buildMirrorFactoryOnly(true).addNewGroup(stateMachine.isAddNewGroup()).build()));
}
return Collections.emptyList();
}
use of org.openkilda.model.FlowPath in project open-kilda by telstra.
the class EmitCommandRequestsAction method buildCommands.
private Collection<FlowSegmentRequestFactory> buildCommands(FlowCommandBuilder commandBuilder, FlowMirrorPointDeleteFsm stateMachine, Flow flow, FlowMirrorPoints mirrorPoints) {
FlowPath path = mirrorPoints.getFlowPath();
FlowPath oppositePath = path.isForward() ? flow.getReversePath() : flow.getForwardPath();
CommandContext context = stateMachine.getCommandContext();
SpeakerRequestBuildContext speakerContext = buildBaseSpeakerContextForInstall(path.getSrcSwitchId(), path.getDestSwitchId());
if (mirrorPoints.getMirrorSwitchId().equals(path.getSrcSwitchId())) {
return new ArrayList<>(commandBuilder.buildIngressOnlyOneDirection(context, flow, path, oppositePath, speakerContext.getForward(), MirrorContext.builder().buildMirrorFactoryOnly(true).build()));
} else if (mirrorPoints.getMirrorSwitchId().equals(path.getDestSwitchId())) {
return new ArrayList<>(commandBuilder.buildEgressOnlyOneDirection(context, flow, path, oppositePath, MirrorContext.builder().buildMirrorFactoryOnly(true).build()));
}
return Collections.emptyList();
}
use of org.openkilda.model.FlowPath in project open-kilda by telstra.
the class RemoveOldRulesAction method perform.
@Override
protected void perform(State from, State to, Event event, FlowPathSwapContext context, FlowPathSwapFsm stateMachine) {
Flow flow = getFlow(stateMachine.getFlowId());
FlowCommandBuilder commandBuilder = commandBuilderFactory.getBuilder(flow.getEncapsulationType());
FlowPath oldPrimaryForward = flow.getProtectedForwardPath();
FlowPath oldPrimaryReverse = flow.getProtectedReversePath();
SpeakerRequestBuildContext speakerContext = buildSpeakerContextForRemovalIngressOnly(flow.getSrcSwitchId(), flow.getDestSwitchId());
Collection<FlowSegmentRequestFactory> commands = new ArrayList<>(commandBuilder.buildIngressOnly(stateMachine.getCommandContext(), flow, oldPrimaryForward, oldPrimaryReverse, speakerContext, MirrorContext.builder().removeFlowOperation(true).build()));
commands.addAll(commandBuilder.buildEgressOnly(stateMachine.getCommandContext(), flow, oldPrimaryForward, oldPrimaryReverse, MirrorContext.builder().buildMirrorFactoryOnly(true).removeFlowOperation(true).build()));
stateMachine.clearPendingAndRetriedAndFailedCommands();
SpeakerRemoveSegmentEmitter.INSTANCE.emitBatch(stateMachine.getCarrier(), commands, stateMachine.getRemoveCommands());
stateMachine.getRemoveCommands().forEach((key, value) -> stateMachine.addPendingCommand(key, value.getSwitchId()));
stateMachine.saveActionToHistory("Remove commands for old rules have been sent");
}
Aggregations