use of org.openkilda.messaging.info.event.PathInfoData in project open-kilda by telstra.
the class FlowCacheTest method getPathIntersection.
@Test
public void getPathIntersection() throws Exception {
networkCache.createIsl(NetworkTopologyConstants.isl14);
networkCache.createIsl(NetworkTopologyConstants.isl41);
PathNode node;
ImmutablePair<PathInfoData, PathInfoData> path43 = computer.getPath(makeFlow("collide-flow-one", NetworkTopologyConstants.sw4, NetworkTopologyConstants.sw3, 5), defaultStrategy);
System.out.println(path43);
List<PathNode> nodesForward43 = new ArrayList<>();
node = new PathNode(NetworkTopologyConstants.isl45.getPath().get(0));
node.setSeqId(0);
nodesForward43.add(node);
node = new PathNode(NetworkTopologyConstants.isl45.getPath().get(1));
node.setSeqId(1);
nodesForward43.add(node);
node = new PathNode(NetworkTopologyConstants.isl53.getPath().get(0));
node.setSeqId(2);
nodesForward43.add(node);
node = new PathNode(NetworkTopologyConstants.isl53.getPath().get(1));
node.setSeqId(3);
nodesForward43.add(node);
PathInfoData islForwardPath43 = new PathInfoData(NetworkTopologyConstants.isl45.getLatency() + NetworkTopologyConstants.isl53.getLatency(), nodesForward43);
List<PathNode> nodesReverse43 = new ArrayList<>();
node = new PathNode(NetworkTopologyConstants.isl35.getPath().get(0));
node.setSeqId(0);
nodesReverse43.add(node);
node = new PathNode(NetworkTopologyConstants.isl35.getPath().get(1));
node.setSeqId(1);
nodesReverse43.add(node);
node = new PathNode(NetworkTopologyConstants.isl54.getPath().get(0));
node.setSeqId(2);
nodesReverse43.add(node);
node = new PathNode(NetworkTopologyConstants.isl54.getPath().get(1));
node.setSeqId(3);
nodesReverse43.add(node);
PathInfoData islReversePath43 = new PathInfoData(NetworkTopologyConstants.isl35.getLatency() + NetworkTopologyConstants.isl54.getLatency(), nodesReverse43);
assertEquals(islForwardPath43, path43.left);
assertEquals(islReversePath43, path43.right);
ImmutablePair<PathInfoData, PathInfoData> path23 = computer.getPath(makeFlow("collide-flow-two", NetworkTopologyConstants.sw2, NetworkTopologyConstants.sw3, 5), defaultStrategy);
System.out.println(path23);
List<PathNode> nodesForward23 = new ArrayList<>();
node = new PathNode(NetworkTopologyConstants.isl25.getPath().get(0));
node.setSeqId(0);
nodesForward23.add(node);
node = new PathNode(NetworkTopologyConstants.isl25.getPath().get(1));
node.setSeqId(1);
nodesForward23.add(node);
PathNode node1 = new PathNode(NetworkTopologyConstants.isl53.getPath().get(0));
node1.setSeqId(2);
nodesForward23.add(node1);
PathNode node2 = new PathNode(NetworkTopologyConstants.isl53.getPath().get(1));
node2.setSeqId(3);
nodesForward23.add(node2);
PathInfoData islForwardPath23 = new PathInfoData(NetworkTopologyConstants.isl25.getLatency() + NetworkTopologyConstants.isl53.getLatency(), nodesForward23);
List<PathNode> nodesReverse23 = new ArrayList<>();
PathNode node3 = new PathNode(NetworkTopologyConstants.isl35.getPath().get(0));
node3.setSeqId(0);
nodesReverse23.add(node3);
PathNode node4 = new PathNode(NetworkTopologyConstants.isl35.getPath().get(1));
node4.setSeqId(1);
nodesReverse23.add(node4);
node = new PathNode(NetworkTopologyConstants.isl52.getPath().get(0));
node.setSeqId(2);
nodesReverse23.add(node);
node = new PathNode(NetworkTopologyConstants.isl52.getPath().get(1));
node.setSeqId(3);
nodesReverse23.add(node);
PathInfoData islReversePath23 = new PathInfoData(NetworkTopologyConstants.isl35.getLatency() + NetworkTopologyConstants.isl52.getLatency(), nodesReverse23);
assertEquals(islForwardPath23, path23.left);
assertEquals(islReversePath23, path23.right);
ImmutablePair<Set<PathNode>, Set<PathNode>> expected = new ImmutablePair<>(new HashSet<>(Arrays.asList(node1, node2)), new HashSet<>(Arrays.asList(node3, node4)));
assertEquals(expected, flowCache.getPathIntersection(path43, path23));
assertEquals(expected, flowCache.getPathIntersection(path23, path43));
}
use of org.openkilda.messaging.info.event.PathInfoData in project open-kilda by telstra.
the class StartReroutingYFlowAction method perform.
@Override
protected void perform(State from, State to, Event event, YFlowRerouteContext context, YFlowRerouteFsm stateMachine) {
String yFlowId = stateMachine.getYFlowId();
List<FlowPath> flowPaths = transactionManager.doInTransaction(() -> {
YFlow yFlow = getYFlow(yFlowId);
saveOldResources(stateMachine, yFlow);
stateMachine.setDeleteOldYFlowCommands(buildYFlowDeleteCommands(yFlow, stateMachine.getCommandContext()));
SwitchId sharedSwitchId = yFlow.getSharedEndpoint().getSwitchId();
return yFlow.getSubFlows().stream().map(YSubFlow::getFlow).flatMap(flow -> Stream.of(flow.getForwardPath(), flow.getReversePath())).filter(path -> sharedSwitchId.equals(path.getSrcSwitchId())).collect(Collectors.toList());
});
stateMachine.setOldYFlowPathCookies(flowPaths.stream().map(FlowPath::getCookie).map(FlowSegmentCookie::getValue).collect(Collectors.toList()));
List<PathSegment> sharedPathSegments = IntersectionComputer.calculatePathIntersectionFromSource(flowPaths);
PathInfoData sharedPath = FlowPathMapper.INSTANCE.map(sharedPathSegments);
stateMachine.setOldSharedPath(sharedPath);
List<SubFlowPathDto> subFlowPathDtos = flowPaths.stream().map(flowPath -> new SubFlowPathDto(flowPath.getFlowId(), FlowPathMapper.INSTANCE.map(flowPath))).sorted(Comparator.comparing(SubFlowPathDto::getFlowId)).collect(Collectors.toList());
stateMachine.setOldSubFlowPathDtos(subFlowPathDtos);
}
use of org.openkilda.messaging.info.event.PathInfoData in project open-kilda by telstra.
the class DatabaseSupportImpl method getPaths.
/**
* Get all possible paths between source and destination switches.
*
* @param src source switch ID
* @param dst destination switch ID
* @return list of PathInfoData objects
*/
@Override
@SuppressWarnings("unchecked")
public List<PathInfoData> getPaths(SwitchId src, SwitchId dst) {
return transactionManager.doInTransaction(() -> {
FramedGraph framedGraph = getGraph();
GraphTraversal<?, ?> rawTraversal = framedGraph.traverse(input -> input.V().hasLabel(SwitchFrame.FRAME_LABEL).has(SwitchFrame.SWITCH_ID_PROPERTY, src.toString()).repeat(__.outE(IslFrame.FRAME_LABEL).has(IslFrame.STATUS_PROPERTY, "active").inV().hasLabel(SwitchFrame.FRAME_LABEL).simplePath()).until(__.has(SwitchFrame.SWITCH_ID_PROPERTY, dst.toString()).or().loops().is(DEFAULT_DEPTH)).has(SwitchFrame.SWITCH_ID_PROPERTY, dst.toString()).path()).getRawTraversal();
List<PathInfoData> deserializedResults = new ArrayList<>();
while (rawTraversal.hasNext()) {
ImmutablePath tpPath = (ImmutablePath) rawTraversal.next();
List<PathNode> resultPath = new ArrayList<>();
int seqId = 0;
for (Object hop : tpPath) {
if (hop instanceof Edge) {
Edge edge = (Edge) hop;
Vertex srcVertex = edge.outVertex();
resultPath.add(new PathNode(new SwitchId((String) srcVertex.property(SwitchFrame.SWITCH_ID_PROPERTY).value()), (Integer) edge.property(IslFrame.SRC_PORT_PROPERTY).value(), seqId++, (Long) edge.property(IslFrame.LATENCY_PROPERTY).value()));
Vertex dstVertex = edge.inVertex();
resultPath.add(new PathNode(new SwitchId((String) dstVertex.property(SwitchFrame.SWITCH_ID_PROPERTY).value()), (Integer) edge.property(IslFrame.DST_PORT_PROPERTY).value(), seqId++, (Long) edge.property(IslFrame.LATENCY_PROPERTY).value()));
}
}
deserializedResults.add(new PathInfoData(0, resultPath));
}
return deserializedResults;
});
}
use of org.openkilda.messaging.info.event.PathInfoData in project open-kilda by telstra.
the class FlowPathMapper method map.
/**
* Convert {@link FlowPath} to {@link PathInfoData}.
*/
public PathInfoData map(FlowPath path) {
PathInfoData result = new PathInfoData();
if (path != null) {
result.setLatency(path.getLatency());
int seqId = 0;
List<PathNode> nodes = new ArrayList<>();
for (PathSegment pathSegment : path.getSegments()) {
nodes.add(new PathNode(pathSegment.getSrcSwitchId(), pathSegment.getSrcPort(), seqId++, pathSegment.getLatency()));
nodes.add(new PathNode(pathSegment.getDestSwitchId(), pathSegment.getDestPort(), seqId++));
}
result.setPath(nodes);
}
return result;
}
use of org.openkilda.messaging.info.event.PathInfoData in project open-kilda by telstra.
the class PostResourceAllocationAction method buildRerouteResponseMessage.
private Message buildRerouteResponseMessage(FlowPath currentForward, FlowPath newForward, CommandContext commandContext) {
PathInfoData currentPath = FlowPathMapper.INSTANCE.map(currentForward);
PathInfoData resultPath = Optional.ofNullable(newForward).map(FlowPathMapper.INSTANCE::map).orElse(currentPath);
FlowRerouteResponse response = new FlowRerouteResponse(resultPath, !resultPath.equals(currentPath));
return new InfoMessage(response, commandContext.getCreateTime(), commandContext.getCorrelationId());
}
Aggregations