Search in sources :

Example 21 with FlowMirrorPoints

use of org.openkilda.model.FlowMirrorPoints in project open-kilda by telstra.

the class ResourceAllocationAction method allocate.

@Override
protected void allocate(FlowMirrorPointCreateFsm stateMachine) throws RecoverableException, UnroutableFlowException, ResourceAllocationException {
    RequestedFlowMirrorPoint mirrorPoint = stateMachine.getRequestedFlowMirrorPoint();
    transactionManager.doInTransaction(() -> {
        Flow flow = getFlow(mirrorPoint.getFlowId());
        FlowPath flowPath = getFlowPath(mirrorPoint, flow);
        stateMachine.setFlowPathId(flowPath.getPathId());
        Optional<FlowMirrorPoints> foundFlowMirrorPoints = flowMirrorPointsRepository.findByPathIdAndSwitchId(flowPath.getPathId(), mirrorPoint.getMirrorPointSwitchId());
        FlowMirrorPoints flowMirrorPoints;
        if (foundFlowMirrorPoints.isPresent()) {
            flowMirrorPoints = foundFlowMirrorPoints.get();
        } else {
            flowMirrorPoints = createFlowMirrorPoints(mirrorPoint, flowPath);
            stateMachine.setAddNewGroup(true);
        }
        Switch sinkSwitch = switchRepository.findById(mirrorPoint.getSinkEndpoint().getSwitchId()).orElseThrow(() -> new FlowProcessingException(ErrorType.NOT_FOUND, format("Switch %s not found", mirrorPoint.getSinkEndpoint().getSwitchId())));
        stateMachine.setUnmaskedCookie(resourcesManager.getAllocatedCookie(flow.getFlowId()));
        FlowSegmentCookie cookie = FlowSegmentCookie.builder().flowEffectiveId(stateMachine.getUnmaskedCookie()).mirror(true).build();
        SwitchProperties switchProperties = getSwitchProperties(sinkSwitch.getSwitchId());
        boolean dstWithMultiTable = switchProperties != null ? switchProperties.isMultiTable() : kildaConfigurationRepository.getOrDefault().getUseMultiTable();
        FlowMirrorPath flowMirrorPath = FlowMirrorPath.builder().pathId(stateMachine.getMirrorPathId()).mirrorSwitch(flowMirrorPoints.getMirrorSwitch()).egressSwitch(sinkSwitch).egressPort(mirrorPoint.getSinkEndpoint().getPortNumber()).egressOuterVlan(mirrorPoint.getSinkEndpoint().getOuterVlanId()).egressInnerVlan(mirrorPoint.getSinkEndpoint().getInnerVlanId()).cookie(cookie).bandwidth(flow.getBandwidth()).ignoreBandwidth(flow.isIgnoreBandwidth()).status(FlowPathStatus.IN_PROGRESS).egressWithMultiTable(dstWithMultiTable).build();
        flowMirrorPathRepository.add(flowMirrorPath);
        flowMirrorPoints.addPaths(flowMirrorPath);
    // TODO: add path allocation in case when src switch is not equal to dst switch
    });
    stateMachine.saveActionToHistory("New mirror path was created", format("The flow mirror path %s was created (with allocated resources)", stateMachine.getMirrorPathId()));
}
Also used : FlowSegmentCookie(org.openkilda.model.cookie.FlowSegmentCookie) RequestedFlowMirrorPoint(org.openkilda.wfm.topology.flowhs.model.RequestedFlowMirrorPoint) Switch(org.openkilda.model.Switch) FlowProcessingException(org.openkilda.wfm.topology.flowhs.exception.FlowProcessingException) FlowMirrorPoints(org.openkilda.model.FlowMirrorPoints) FlowPath(org.openkilda.model.FlowPath) SwitchProperties(org.openkilda.model.SwitchProperties) FlowMirrorPath(org.openkilda.model.FlowMirrorPath) Flow(org.openkilda.model.Flow)

Example 22 with FlowMirrorPoints

use of org.openkilda.model.FlowMirrorPoints in project open-kilda by telstra.

the class EmitCommandRequestsAction method perform.

@Override
protected void perform(State from, State to, Event event, FlowMirrorPointDeleteContext context, FlowMirrorPointDeleteFsm stateMachine) {
    String flowId = stateMachine.getFlowId();
    Flow flow = getFlow(flowId);
    PathId flowPathId = stateMachine.getFlowPathId();
    SwitchId mirrorSwitchId = stateMachine.getMirrorSwitchId();
    FlowMirrorPoints mirrorPoints = flowMirrorPointsRepository.findByPathIdAndSwitchId(flowPathId, mirrorSwitchId).orElseThrow(() -> new FlowProcessingException(ErrorType.NOT_FOUND, format("Flow mirror points for flow path %s and mirror switch id %s not found", flowPathId, mirrorSwitchId)));
    FlowCommandBuilder commandBuilder = commandBuilderFactory.getBuilder(flow.getEncapsulationType());
    Collection<FlowSegmentRequestFactory> commands = buildCommands(commandBuilder, stateMachine, flow, mirrorPoints);
    // emitting
    SpeakerRequestEmitter requestEmitter;
    if (mirrorPoints.getMirrorPaths().isEmpty()) {
        requestEmitter = SpeakerRemoveSegmentEmitter.INSTANCE;
    } else {
        requestEmitter = SpeakerInstallSegmentEmitter.INSTANCE;
    }
    requestEmitter.emitBatch(stateMachine.getCarrier(), commands, stateMachine.getCommands());
    stateMachine.getCommands().forEach((key, value) -> stateMachine.getPendingCommands().put(key, value.getSwitchId()));
    if (commands.isEmpty()) {
        stateMachine.saveActionToHistory("No need to remove group");
    } else {
        stateMachine.saveActionToHistory("Commands for removing group have been sent");
    }
}
Also used : PathId(org.openkilda.model.PathId) SpeakerRequestEmitter(org.openkilda.wfm.topology.flowhs.utils.SpeakerRequestEmitter) FlowSegmentRequestFactory(org.openkilda.floodlight.api.request.factory.FlowSegmentRequestFactory) FlowProcessingException(org.openkilda.wfm.topology.flowhs.exception.FlowProcessingException) FlowMirrorPoints(org.openkilda.model.FlowMirrorPoints) FlowCommandBuilder(org.openkilda.wfm.topology.flowhs.service.FlowCommandBuilder) SwitchId(org.openkilda.model.SwitchId) Flow(org.openkilda.model.Flow)

Example 23 with FlowMirrorPoints

use of org.openkilda.model.FlowMirrorPoints in project open-kilda by telstra.

the class DeallocateFlowMirrorPathResourcesAction method perform.

@Override
protected void perform(State from, State to, Event event, FlowMirrorPointDeleteContext context, FlowMirrorPointDeleteFsm stateMachine) {
    PathId mirrorPathId = stateMachine.getMirrorPathId();
    FlowMirrorPath flowMirrorPath = flowMirrorPathRepository.findById(mirrorPathId).orElseThrow(() -> new FlowProcessingException(ErrorType.NOT_FOUND, format("Flow mirror point %s not found", mirrorPathId)));
    FlowMirrorPoints flowMirrorPoints = flowMirrorPath.getFlowMirrorPoints();
    stateMachine.setFlowPathId(flowMirrorPoints.getFlowPathId());
    stateMachine.setMirrorSwitchId(flowMirrorPoints.getMirrorSwitchId());
    resourcesManager.deallocateCookie(flowMirrorPath.getCookie().getFlowEffectiveId());
    flowMirrorPathRepository.remove(stateMachine.getMirrorPathId());
    stateMachine.saveActionToHistory("Flow mirror path resources were deallocated", format("The flow resources for mirror path %s were deallocated", stateMachine.getMirrorPathId()));
    stateMachine.setMirrorPathResourcesDeallocated(true);
}
Also used : PathId(org.openkilda.model.PathId) FlowProcessingException(org.openkilda.wfm.topology.flowhs.exception.FlowProcessingException) FlowMirrorPoints(org.openkilda.model.FlowMirrorPoints) FlowMirrorPath(org.openkilda.model.FlowMirrorPath)

Example 24 with FlowMirrorPoints

use of org.openkilda.model.FlowMirrorPoints in project open-kilda by telstra.

the class FermaFlowMirrorPointsRepositoryTest method shouldDeleteFlowPath.

@Test
public void shouldDeleteFlowPath() {
    FlowMirrorPoints flowMirrorPoints = createTestFlowMirrorPoints();
    transactionManager.doInTransaction(() -> flowMirrorPointsRepository.remove(flowMirrorPoints));
    assertEquals(0, flowMirrorPointsRepository.findAll().size());
}
Also used : FlowMirrorPoints(org.openkilda.model.FlowMirrorPoints) InMemoryGraphBasedTest(org.openkilda.persistence.inmemory.InMemoryGraphBasedTest) Test(org.junit.Test)

Example 25 with FlowMirrorPoints

use of org.openkilda.model.FlowMirrorPoints in project open-kilda by telstra.

the class FermaFlowMirrorPointsRepositoryTest method shouldCreateFlowMirrorPaths.

@Test
public void shouldCreateFlowMirrorPaths() {
    createTestFlowMirrorPoints();
    Collection<FlowMirrorPoints> allPaths = flowMirrorPointsRepository.findAll();
    assertThat(allPaths, hasSize(1));
    FlowMirrorPoints flowMirrorPoints = flowMirrorPointsRepository.findByGroupId(TEST_GROUP_ID).get();
    assertEquals(switchA.getSwitchId(), flowMirrorPoints.getMirrorSwitch().getSwitchId());
}
Also used : FlowMirrorPoints(org.openkilda.model.FlowMirrorPoints) InMemoryGraphBasedTest(org.openkilda.persistence.inmemory.InMemoryGraphBasedTest) Test(org.junit.Test)

Aggregations

FlowMirrorPoints (org.openkilda.model.FlowMirrorPoints)26 Flow (org.openkilda.model.Flow)11 PathId (org.openkilda.model.PathId)10 FlowMirrorPath (org.openkilda.model.FlowMirrorPath)7 FlowPath (org.openkilda.model.FlowPath)7 SwitchId (org.openkilda.model.SwitchId)7 ArrayList (java.util.ArrayList)6 Test (org.junit.Test)6 Switch (org.openkilda.model.Switch)6 InMemoryGraphBasedTest (org.openkilda.persistence.inmemory.InMemoryGraphBasedTest)6 FlowEndpoint (org.openkilda.model.FlowEndpoint)5 PathSegment (org.openkilda.model.PathSegment)5 List (java.util.List)4 Optional (java.util.Optional)4 Collectors (java.util.stream.Collectors)4 MirrorGroup (org.openkilda.model.MirrorGroup)4 Collections (java.util.Collections)3 Iterator (java.util.Iterator)3 FlowSideAdapter (org.openkilda.adapter.FlowSideAdapter)3 GroupId (org.openkilda.model.GroupId)3