Search in sources :

Example 1 with IntersectionComputer

use of org.openkilda.wfm.share.service.IntersectionComputer in project open-kilda by telstra.

the class FlowOperationsService method getFlowPath.

/**
 * Returns flow path. If flow has group, returns also path for each flow in group.
 *
 * @param flowId the flow to get a path.
 */
public List<FlowPathDto> getFlowPath(String flowId) throws FlowNotFoundException {
    flowDashboardLogger.onFlowPathsRead(flowId);
    Flow flow = flowRepository.findById(flowId).orElseThrow(() -> new FlowNotFoundException(flowId));
    String groupId = flow.getDiverseGroupId();
    if (groupId == null) {
        return Collections.singletonList(toFlowPathDtoBuilder(flow).build());
    } else {
        Collection<Flow> flowsInGroup = flowRepository.findByDiverseGroupId(groupId);
        Collection<FlowPath> flowPathsInGroup = flowPathRepository.findByFlowGroupId(groupId);
        IntersectionComputer primaryIntersectionComputer = new IntersectionComputer(flow.getFlowId(), flow.getForwardPathId(), flow.getReversePathId(), flowPathsInGroup);
        // target flow primary path
        FlowPathDtoBuilder targetFlowDtoBuilder = this.toFlowPathDtoBuilder(flow).segmentsStats(primaryIntersectionComputer.getOverlappingStats());
        // other flows in the the group
        List<FlowPathDto> payloads = flowsInGroup.stream().filter(e -> !e.getFlowId().equals(flowId)).map(e -> this.mapGroupPathFlowDto(e, true, primaryIntersectionComputer)).collect(Collectors.toList());
        if (flow.isAllocateProtectedPath()) {
            IntersectionComputer protectedIntersectionComputer = new IntersectionComputer(flow.getFlowId(), flow.getProtectedForwardPathId(), flow.getProtectedReversePathId(), flowPathsInGroup);
            // target flow protected path
            targetFlowDtoBuilder.protectedPath(FlowProtectedPathDto.builder().forwardPath(buildPathFromFlow(flow, flow.getProtectedForwardPath())).reversePath(buildPathFromFlow(flow, flow.getProtectedReversePath())).segmentsStats(protectedIntersectionComputer.getOverlappingStats()).build());
            // other flows in the the group
            List<FlowPathDto> protectedPathPayloads = flowsInGroup.stream().filter(e -> !e.getFlowId().equals(flowId)).map(e -> this.mapGroupPathFlowDto(e, false, protectedIntersectionComputer)).collect(Collectors.toList());
            payloads = union(payloads, protectedPathPayloads);
        }
        payloads.add(targetFlowDtoBuilder.build());
        return payloads;
    }
}
Also used : MAX_LATENCY(org.openkilda.model.PathComputationStrategy.MAX_LATENCY) FlowStats(org.openkilda.model.FlowStats) IslNotFoundException(org.openkilda.wfm.error.IslNotFoundException) FlowPath(org.openkilda.model.FlowPath) SwitchNotFoundException(org.openkilda.wfm.error.SwitchNotFoundException) MessageException(org.openkilda.messaging.error.MessageException) FlowMirrorPoint(org.openkilda.messaging.nbtopology.response.FlowMirrorPointsDumpResponse.FlowMirrorPoint) Flow(org.openkilda.model.Flow) IntersectionComputer(org.openkilda.wfm.share.service.IntersectionComputer) Duration(java.time.Duration) FlowRepository(org.openkilda.persistence.repositories.FlowRepository) SwitchConnectedDeviceRepository(org.openkilda.persistence.repositories.SwitchConnectedDeviceRepository) IslEndpoint(org.openkilda.model.IslEndpoint) FlowNotFoundException(org.openkilda.wfm.error.FlowNotFoundException) PathComputationStrategy(org.openkilda.model.PathComputationStrategy) YSubFlow(org.openkilda.model.YSubFlow) FlowPathRepository(org.openkilda.persistence.repositories.FlowPathRepository) FlowMirrorPoints(org.openkilda.model.FlowMirrorPoints) Collection(java.util.Collection) Set(java.util.Set) RetryPolicy(net.jodah.failsafe.RetryPolicy) PersistenceException(org.openkilda.persistence.exceptions.PersistenceException) Collectors(java.util.stream.Collectors) String.format(java.lang.String.format) Sets(com.google.common.collect.Sets) FlowResponse(org.openkilda.messaging.info.flow.FlowResponse) YFlowRepository(org.openkilda.persistence.repositories.YFlowRepository) Objects(java.util.Objects) FlowRerouteRequest(org.openkilda.messaging.command.flow.FlowRerouteRequest) Slf4j(lombok.extern.slf4j.Slf4j) List(java.util.List) Stream(java.util.stream.Stream) FlowPatch(org.openkilda.messaging.model.FlowPatch) Builder(lombok.Builder) FlowsDumpRequest(org.openkilda.messaging.nbtopology.request.FlowsDumpRequest) DetectConnectedDevicesDto(org.openkilda.messaging.model.DetectConnectedDevicesDto) Optional(java.util.Optional) SwitchRepository(org.openkilda.persistence.repositories.SwitchRepository) ListUtils.union(org.apache.commons.collections4.ListUtils.union) TransactionManager(org.openkilda.persistence.tx.TransactionManager) FlowStatsRepository(org.openkilda.persistence.repositories.FlowStatsRepository) FlowPathMapper(org.openkilda.wfm.share.mappers.FlowPathMapper) PathNodePayload(org.openkilda.messaging.payload.flow.PathNodePayload) Function(java.util.function.Function) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) Lists(com.google.common.collect.Lists) PatchEndpoint(org.openkilda.messaging.model.PatchEndpoint) FlowPathDtoBuilder(org.openkilda.messaging.model.FlowPathDto.FlowPathDtoBuilder) IslRepository(org.openkilda.persistence.repositories.IslRepository) FlowPathDto(org.openkilda.messaging.model.FlowPathDto) YFlow(org.openkilda.model.YFlow) FlowProtectedPathDto(org.openkilda.messaging.model.FlowPathDto.FlowProtectedPathDto) FlowRequest(org.openkilda.messaging.command.flow.FlowRequest) FlowEndpoint(org.openkilda.model.FlowEndpoint) RequestedFlowMapper(org.openkilda.wfm.share.mappers.RequestedFlowMapper) FlowOperationsDashboardLogger(org.openkilda.wfm.share.logger.FlowOperationsDashboardLogger) ErrorType(org.openkilda.messaging.error.ErrorType) LATENCY(org.openkilda.model.PathComputationStrategy.LATENCY) RepositoryFactory(org.openkilda.persistence.repositories.RepositoryFactory) FlowMapper(org.openkilda.wfm.share.mappers.FlowMapper) FlowFilter(org.openkilda.model.FlowFilter) SwitchId(org.openkilda.model.SwitchId) FlowOperationsCarrier(org.openkilda.wfm.topology.nbworker.bolts.FlowOperationsCarrier) Data(lombok.Data) FlowMirrorPath(org.openkilda.model.FlowMirrorPath) VisibleForTesting(com.google.common.annotations.VisibleForTesting) Collections(java.util.Collections) SwitchConnectedDevice(org.openkilda.model.SwitchConnectedDevice) FlowNotFoundException(org.openkilda.wfm.error.FlowNotFoundException) FlowPathDto(org.openkilda.messaging.model.FlowPathDto) FlowPathDtoBuilder(org.openkilda.messaging.model.FlowPathDto.FlowPathDtoBuilder) IntersectionComputer(org.openkilda.wfm.share.service.IntersectionComputer) FlowPath(org.openkilda.model.FlowPath) Flow(org.openkilda.model.Flow) YSubFlow(org.openkilda.model.YSubFlow) YFlow(org.openkilda.model.YFlow)

Aggregations

VisibleForTesting (com.google.common.annotations.VisibleForTesting)1 Lists (com.google.common.collect.Lists)1 Sets (com.google.common.collect.Sets)1 String.format (java.lang.String.format)1 Duration (java.time.Duration)1 ArrayList (java.util.ArrayList)1 Collection (java.util.Collection)1 Collections (java.util.Collections)1 HashSet (java.util.HashSet)1 List (java.util.List)1 Objects (java.util.Objects)1 Optional (java.util.Optional)1 Set (java.util.Set)1 Function (java.util.function.Function)1 Collectors (java.util.stream.Collectors)1 Stream (java.util.stream.Stream)1 Builder (lombok.Builder)1 Data (lombok.Data)1 Slf4j (lombok.extern.slf4j.Slf4j)1 RetryPolicy (net.jodah.failsafe.RetryPolicy)1