Search in sources :

Example 1 with RerouteAffectedFlows

use of org.openkilda.messaging.command.reroute.RerouteAffectedFlows in project open-kilda by telstra.

the class RerouteServiceTest method shouldSkipRerouteRequestsForFlowWithoutAffectedPathSegment.

@Test
public void shouldSkipRerouteRequestsForFlowWithoutAffectedPathSegment() {
    PathNode islSide = new PathNode(SWITCH_A.getSwitchId(), 1, 0);
    FlowPathRepository pathRepository = mock(FlowPathRepository.class);
    when(pathRepository.findBySegmentEndpoint(eq(islSide.getSwitchId()), eq(islSide.getPortNo()))).thenReturn(asList(regularFlow.getForwardPath(), regularFlow.getReversePath()));
    FlowRepository flowRepository = mock(FlowRepository.class);
    PathSegmentRepository pathSegmentRepository = mock(PathSegmentRepository.class);
    doThrow(new EntityNotFoundException("Not found")).when(pathSegmentRepository).updateFailedStatus(any(), any(), anyBoolean());
    RepositoryFactory repositoryFactory = mock(RepositoryFactory.class);
    when(repositoryFactory.createPathSegmentRepository()).thenReturn(pathSegmentRepository);
    when(repositoryFactory.createFlowPathRepository()).thenReturn(pathRepository);
    when(repositoryFactory.createFlowRepository()).thenReturn(flowRepository);
    PersistenceManager persistenceManager = mock(PersistenceManager.class);
    when(persistenceManager.getRepositoryFactory()).thenReturn(repositoryFactory);
    when(persistenceManager.getTransactionManager()).thenReturn(transactionManager);
    RerouteService rerouteService = new RerouteService(persistenceManager);
    RerouteAffectedFlows request = new RerouteAffectedFlows(islSide, "dummy-reason - unittest");
    rerouteService.rerouteAffectedFlows(carrier, CORRELATION_ID, request);
    verifyZeroInteractions(carrier);
}
Also used : FlowPathRepository(org.openkilda.persistence.repositories.FlowPathRepository) FlowRepository(org.openkilda.persistence.repositories.FlowRepository) YFlowRepository(org.openkilda.persistence.repositories.YFlowRepository) PathSegmentRepository(org.openkilda.persistence.repositories.PathSegmentRepository) PersistenceManager(org.openkilda.persistence.PersistenceManager) EntityNotFoundException(org.openkilda.persistence.exceptions.EntityNotFoundException) RepositoryFactory(org.openkilda.persistence.repositories.RepositoryFactory) RerouteAffectedFlows(org.openkilda.messaging.command.reroute.RerouteAffectedFlows) PathNode(org.openkilda.messaging.info.event.PathNode) Test(org.junit.Test)

Example 2 with RerouteAffectedFlows

use of org.openkilda.messaging.command.reroute.RerouteAffectedFlows in project open-kilda by telstra.

the class RerouteServiceTest method handlePathNoFoundException.

@Test
public void handlePathNoFoundException() {
    PathNode islSide = new PathNode(SWITCH_A.getSwitchId(), 1, 0);
    FlowPathRepository pathRepository = mock(FlowPathRepository.class);
    when(pathRepository.findBySegmentEndpoint(eq(islSide.getSwitchId()), eq(islSide.getPortNo()))).thenReturn(asList(regularFlow.getForwardPath(), regularFlow.getReversePath()));
    FlowRepository flowRepository = mock(FlowRepository.class);
    RepositoryFactory repositoryFactory = mock(RepositoryFactory.class);
    when(repositoryFactory.createPathSegmentRepository()).thenReturn(mock(PathSegmentRepository.class));
    when(repositoryFactory.createFlowPathRepository()).thenReturn(pathRepository);
    when(repositoryFactory.createFlowRepository()).thenReturn(flowRepository);
    PersistenceManager persistenceManager = mock(PersistenceManager.class);
    when(persistenceManager.getRepositoryFactory()).thenReturn(repositoryFactory);
    when(persistenceManager.getTransactionManager()).thenReturn(transactionManager);
    RerouteService rerouteService = new RerouteService(persistenceManager);
    RerouteAffectedFlows request = new RerouteAffectedFlows(islSide, "dummy-reason - unittest");
    rerouteService.rerouteAffectedFlows(carrier, CORRELATION_ID, request);
    verify(flowRepository).updateStatusSafe(eq(regularFlow), eq(FlowStatus.DOWN), any());
    FlowThrottlingData expected = FlowThrottlingData.builder().correlationId(CORRELATION_ID).priority(regularFlow.getPriority()).timeCreate(regularFlow.getTimeCreate()).affectedIsl(Collections.singleton(new IslEndpoint(islSide.getSwitchId(), islSide.getPortNo()))).force(false).effectivelyDown(true).reason(request.getReason()).build();
    verify(carrier).emitRerouteCommand(eq(regularFlow.getFlowId()), eq(expected));
}
Also used : FlowPathRepository(org.openkilda.persistence.repositories.FlowPathRepository) FlowRepository(org.openkilda.persistence.repositories.FlowRepository) YFlowRepository(org.openkilda.persistence.repositories.YFlowRepository) IslEndpoint(org.openkilda.model.IslEndpoint) PathSegmentRepository(org.openkilda.persistence.repositories.PathSegmentRepository) PersistenceManager(org.openkilda.persistence.PersistenceManager) FlowThrottlingData(org.openkilda.wfm.topology.reroute.model.FlowThrottlingData) RepositoryFactory(org.openkilda.persistence.repositories.RepositoryFactory) RerouteAffectedFlows(org.openkilda.messaging.command.reroute.RerouteAffectedFlows) PathNode(org.openkilda.messaging.info.event.PathNode) Test(org.junit.Test)

Example 3 with RerouteAffectedFlows

use of org.openkilda.messaging.command.reroute.RerouteAffectedFlows in project open-kilda by telstra.

the class NetworkIslServiceTest method continuousReplugVsRoundTripAlive.

@Test
public void continuousReplugVsRoundTripAlive() {
    setupIslStorageStub();
    IslReference referenceAlpha = prepareActiveIsl();
    IslReference referenceBeta = new IslReference(Endpoint.of(referenceAlpha.getSource().getDatapath(), referenceAlpha.getSource().getPortNumber() + 1), referenceAlpha.getDest());
    Instant lastSeen = clock.instant();
    service.roundTripStatusNotification(referenceAlpha, new RoundTripStatus(referenceAlpha.getSource(), IslStatus.ACTIVE));
    IslDataHolder alphaSource = new IslDataHolder(lookupIsl(referenceAlpha.getSource(), referenceAlpha.getDest()));
    IslDataHolder alphaDest = new IslDataHolder(lookupIsl(referenceAlpha.getDest(), referenceAlpha.getSource()));
    IslDataHolder betaSource = new IslDataHolder(makeIsl(referenceBeta.getSource(), referenceBeta.getDest(), false).build());
    IslDataHolder betaDest = new IslDataHolder(makeIsl(referenceBeta.getDest(), referenceBeta.getSource(), false).build());
    IslStatusUpdateNotification alphaNotification = new IslStatusUpdateNotification(referenceAlpha.getSource().getDatapath(), referenceAlpha.getSource().getPortNumber(), referenceAlpha.getDest().getDatapath(), referenceAlpha.getDest().getPortNumber(), IslStatus.MOVED);
    IslStatusUpdateNotification betaNotification = new IslStatusUpdateNotification(referenceBeta.getSource().getDatapath(), referenceBeta.getSource().getPortNumber(), referenceBeta.getDest().getDatapath(), referenceBeta.getDest().getPortNumber(), IslStatus.MOVED);
    for (int i = 0; i < 100; i++) {
        // alpha -> beta
        service.islMove(referenceAlpha.getSource(), referenceAlpha);
        service.islUp(referenceBeta.getSource(), referenceBeta, betaSource);
        service.islUp(referenceBeta.getDest(), referenceBeta, betaDest);
        service.roundTripStatusNotification(referenceBeta, new RoundTripStatus(referenceBeta.getSource(), IslStatus.ACTIVE));
        verifyStatus(referenceAlpha, IslStatus.MOVED);
        verifyStatus(referenceBeta, IslStatus.ACTIVE);
        verify(carrier, times(i + 1)).islStatusUpdateNotification(eq(alphaNotification));
        verify(carrier, times(i + 1)).triggerReroute(argThat(entry -> entry instanceof RerouteAffectedFlows && Objects.equals(new PathNode(referenceAlpha.getSource().getDatapath(), referenceAlpha.getSource().getPortNumber(), 0), entry.getPathNode())));
        verify(carrier, times(i + 1)).triggerReroute(argThat(entry -> entry instanceof RerouteInactiveFlows && Objects.equals(new PathNode(referenceBeta.getSource().getDatapath(), referenceBeta.getSource().getPortNumber(), 0), entry.getPathNode())));
        // beta -> alpha
        service.islMove(referenceBeta.getSource(), referenceBeta);
        service.islUp(referenceAlpha.getSource(), referenceAlpha, alphaSource);
        service.islUp(referenceAlpha.getDest(), referenceAlpha, alphaDest);
        service.roundTripStatusNotification(referenceAlpha, new RoundTripStatus(referenceAlpha.getSource(), IslStatus.ACTIVE));
        verifyStatus(referenceAlpha, IslStatus.ACTIVE);
        verifyStatus(referenceBeta, IslStatus.MOVED);
        verify(carrier, times(i + 1)).islStatusUpdateNotification(eq(betaNotification));
        verify(carrier, times(i + 1)).triggerReroute(argThat(entry -> entry instanceof RerouteAffectedFlows && Objects.equals(new PathNode(referenceBeta.getSource().getDatapath(), referenceBeta.getSource().getPortNumber(), 0), entry.getPathNode())));
        verify(carrier, times(i + 1)).triggerReroute(argThat(entry -> entry instanceof RerouteInactiveFlows && Objects.equals(new PathNode(referenceAlpha.getSource().getDatapath(), referenceAlpha.getSource().getPortNumber(), 0), entry.getPathNode())));
    }
}
Also used : Mockito.mockingDetails(org.mockito.Mockito.mockingDetails) ArgumentMatchers.argThat(org.mockito.ArgumentMatchers.argThat) ArgumentMatchers.eq(org.mockito.ArgumentMatchers.eq) KildaFeatureTogglesRepository(org.openkilda.persistence.repositories.KildaFeatureTogglesRepository) IslReference(org.openkilda.wfm.share.model.IslReference) NetworkOptions(org.openkilda.wfm.topology.network.model.NetworkOptions) IslDataHolder(org.openkilda.wfm.topology.network.model.IslDataHolder) KildaFeatureToggles(org.openkilda.model.KildaFeatureToggles) Mockito.verifyNoMoreInteractions(org.mockito.Mockito.verifyNoMoreInteractions) RerouteAffectedFlows(org.openkilda.messaging.command.reroute.RerouteAffectedFlows) Mockito.doAnswer(org.mockito.Mockito.doAnswer) Duration(java.time.Duration) Map(java.util.Map) LinkProps(org.openkilda.model.LinkProps) ClassRule(org.junit.ClassRule) SwitchProperties(org.openkilda.model.SwitchProperties) IslStatusUpdateNotification(org.openkilda.messaging.info.event.IslStatusUpdateNotification) IslDownReason(org.openkilda.model.IslDownReason) ManualClock(org.openkilda.stubs.ManualClock) FlowPathRepository(org.openkilda.persistence.repositories.FlowPathRepository) BfdStatusUpdate(org.openkilda.wfm.topology.network.model.BfdStatusUpdate) RetryPolicy(net.jodah.failsafe.RetryPolicy) EqualsAndHashCode(lombok.EqualsAndHashCode) Instant(java.time.Instant) BfdSessionStatus(org.openkilda.model.BfdSessionStatus) Objects(java.util.Objects) SwitchPropertiesRepository(org.openkilda.persistence.repositories.SwitchPropertiesRepository) List(java.util.List) Optional(java.util.Optional) RerouteInactiveFlows(org.openkilda.messaging.command.reroute.RerouteInactiveFlows) MockitoJUnitRunner(org.mockito.junit.MockitoJUnitRunner) SwitchRepository(org.openkilda.persistence.repositories.SwitchRepository) Mockito.mock(org.mockito.Mockito.mock) ArgumentMatchers.any(org.mockito.ArgumentMatchers.any) RoundTripStatus(org.openkilda.wfm.topology.network.model.RoundTripStatus) BfdProperties(org.openkilda.model.BfdProperties) TransactionManager(org.openkilda.persistence.tx.TransactionManager) Getter(lombok.Getter) Mock(org.mockito.Mock) RunWith(org.junit.runner.RunWith) HashMap(java.util.HashMap) Mockito.verifyZeroInteractions(org.mockito.Mockito.verifyZeroInteractions) RemoveIslDefaultRulesResult(org.openkilda.messaging.info.discovery.RemoveIslDefaultRulesResult) LinkPropsRepository(org.openkilda.persistence.repositories.LinkPropsRepository) IslControllerNotFoundException(org.openkilda.wfm.topology.network.error.IslControllerNotFoundException) IslRepository(org.openkilda.persistence.repositories.IslRepository) PersistenceManager(org.openkilda.persistence.PersistenceManager) ArgumentMatchers.anyInt(org.mockito.ArgumentMatchers.anyInt) Before(org.junit.Before) InMemoryGraphPersistenceManager(org.openkilda.persistence.inmemory.InMemoryGraphPersistenceManager) Switch(org.openkilda.model.Switch) Endpoint(org.openkilda.wfm.share.model.Endpoint) Mockito.times(org.mockito.Mockito.times) Test(org.junit.Test) Mockito.when(org.mockito.Mockito.when) IslStatus(org.openkilda.model.IslStatus) PathNode(org.openkilda.messaging.info.event.PathNode) Mockito.verify(org.mockito.Mockito.verify) Failsafe(net.jodah.failsafe.Failsafe) RepositoryFactory(org.openkilda.persistence.repositories.RepositoryFactory) Mockito(org.mockito.Mockito) Mockito.never(org.mockito.Mockito.never) SwitchId(org.openkilda.model.SwitchId) Ignore(org.junit.Ignore) InstallIslDefaultRulesResult(org.openkilda.messaging.info.discovery.InstallIslDefaultRulesResult) TransactionCallbackWithoutResult(org.openkilda.persistence.tx.TransactionCallbackWithoutResult) AllArgsConstructor(lombok.AllArgsConstructor) Assert(org.junit.Assert) Mockito.reset(org.mockito.Mockito.reset) Isl(org.openkilda.model.Isl) SwitchStatus(org.openkilda.model.SwitchStatus) Collections(java.util.Collections) Assert.assertEquals(org.junit.Assert.assertEquals) TemporaryFolder(org.junit.rules.TemporaryFolder) NetworkTopologyDashboardLogger(org.openkilda.wfm.topology.network.NetworkTopologyDashboardLogger) IslStatusUpdateNotification(org.openkilda.messaging.info.event.IslStatusUpdateNotification) IslReference(org.openkilda.wfm.share.model.IslReference) Instant(java.time.Instant) RerouteAffectedFlows(org.openkilda.messaging.command.reroute.RerouteAffectedFlows) RoundTripStatus(org.openkilda.wfm.topology.network.model.RoundTripStatus) PathNode(org.openkilda.messaging.info.event.PathNode) RerouteInactiveFlows(org.openkilda.messaging.command.reroute.RerouteInactiveFlows) IslDataHolder(org.openkilda.wfm.topology.network.model.IslDataHolder) Endpoint(org.openkilda.wfm.share.model.Endpoint) Test(org.junit.Test)

Example 4 with RerouteAffectedFlows

use of org.openkilda.messaging.command.reroute.RerouteAffectedFlows in project open-kilda by telstra.

the class RerouteBolt method handleCommandMessage.

private void handleCommandMessage(CommandMessage commandMessage) {
    CommandData commandData = commandMessage.getData();
    String correlationId = getCommandContext().getCorrelationId();
    if (commandData instanceof RerouteAffectedFlows) {
        rerouteService.rerouteAffectedFlows(this, correlationId, (RerouteAffectedFlows) commandData);
    } else if (commandData instanceof RerouteAffectedInactiveFlows) {
        rerouteService.rerouteInactiveAffectedFlows(this, correlationId, ((RerouteAffectedInactiveFlows) commandData).getSwitchId());
    } else if (commandData instanceof RerouteInactiveFlows) {
        rerouteService.rerouteInactiveFlows(this, correlationId, (RerouteInactiveFlows) commandData);
    } else if (commandData instanceof FlowRerouteRequest) {
        rerouteService.processRerouteRequest(this, correlationId, (FlowRerouteRequest) commandData);
    } else if (commandData instanceof YFlowRerouteRequest) {
        rerouteService.processRerouteRequest(this, correlationId, (YFlowRerouteRequest) commandData);
    } else {
        unhandledInput(getCurrentTuple());
    }
}
Also used : YFlowRerouteRequest(org.openkilda.messaging.command.yflow.YFlowRerouteRequest) FlowRerouteRequest(org.openkilda.messaging.command.flow.FlowRerouteRequest) YFlowRerouteRequest(org.openkilda.messaging.command.yflow.YFlowRerouteRequest) RerouteAffectedFlows(org.openkilda.messaging.command.reroute.RerouteAffectedFlows) CommandData(org.openkilda.messaging.command.CommandData) RerouteInactiveFlows(org.openkilda.messaging.command.reroute.RerouteInactiveFlows) RerouteAffectedInactiveFlows(org.openkilda.messaging.command.reroute.RerouteAffectedInactiveFlows)

Example 5 with RerouteAffectedFlows

use of org.openkilda.messaging.command.reroute.RerouteAffectedFlows in project open-kilda by telstra.

the class RerouteServiceTest method handlePathNoFoundExceptionForSubYFlow.

@Test
public void handlePathNoFoundExceptionForSubYFlow() {
    PathNode islSide = new PathNode(SWITCH_A.getSwitchId(), 1, 0);
    FlowPathRepository pathRepository = mock(FlowPathRepository.class);
    when(pathRepository.findBySegmentEndpoint(eq(islSide.getSwitchId()), eq(islSide.getPortNo()))).thenReturn(asList(subFlow.getForwardPath(), subFlow.getReversePath()));
    FlowRepository flowRepository = mock(FlowRepository.class);
    YFlowRepository yFlowRepository = mock(YFlowRepository.class);
    RepositoryFactory repositoryFactory = mock(RepositoryFactory.class);
    when(repositoryFactory.createPathSegmentRepository()).thenReturn(mock(PathSegmentRepository.class));
    when(repositoryFactory.createFlowPathRepository()).thenReturn(pathRepository);
    when(repositoryFactory.createFlowRepository()).thenReturn(flowRepository);
    when(repositoryFactory.createYFlowRepository()).thenReturn(yFlowRepository);
    PersistenceManager persistenceManager = mock(PersistenceManager.class);
    when(persistenceManager.getRepositoryFactory()).thenReturn(repositoryFactory);
    when(persistenceManager.getTransactionManager()).thenReturn(transactionManager);
    RerouteService rerouteService = new RerouteService(persistenceManager);
    RerouteAffectedFlows request = new RerouteAffectedFlows(islSide, "dummy-reason - unittest");
    rerouteService.rerouteAffectedFlows(carrier, CORRELATION_ID, request);
    verify(flowRepository).updateStatusSafe(eq(subFlow), eq(FlowStatus.DOWN), any());
    FlowThrottlingData expected = FlowThrottlingData.builder().correlationId(CORRELATION_ID).priority(regularYFlow.getPriority()).timeCreate(regularYFlow.getTimeCreate()).affectedIsl(Collections.singleton(new IslEndpoint(islSide.getSwitchId(), islSide.getPortNo()))).force(false).effectivelyDown(true).reason(request.getReason()).yFlow(true).build();
    verify(carrier).emitRerouteCommand(eq(regularYFlow.getYFlowId()), eq(expected));
}
Also used : FlowPathRepository(org.openkilda.persistence.repositories.FlowPathRepository) FlowRepository(org.openkilda.persistence.repositories.FlowRepository) YFlowRepository(org.openkilda.persistence.repositories.YFlowRepository) IslEndpoint(org.openkilda.model.IslEndpoint) YFlowRepository(org.openkilda.persistence.repositories.YFlowRepository) PathSegmentRepository(org.openkilda.persistence.repositories.PathSegmentRepository) PersistenceManager(org.openkilda.persistence.PersistenceManager) FlowThrottlingData(org.openkilda.wfm.topology.reroute.model.FlowThrottlingData) RepositoryFactory(org.openkilda.persistence.repositories.RepositoryFactory) RerouteAffectedFlows(org.openkilda.messaging.command.reroute.RerouteAffectedFlows) PathNode(org.openkilda.messaging.info.event.PathNode) Test(org.junit.Test)

Aggregations

RerouteAffectedFlows (org.openkilda.messaging.command.reroute.RerouteAffectedFlows)6 PathNode (org.openkilda.messaging.info.event.PathNode)5 Test (org.junit.Test)4 PersistenceManager (org.openkilda.persistence.PersistenceManager)4 FlowPathRepository (org.openkilda.persistence.repositories.FlowPathRepository)4 RepositoryFactory (org.openkilda.persistence.repositories.RepositoryFactory)4 RerouteInactiveFlows (org.openkilda.messaging.command.reroute.RerouteInactiveFlows)2 FlowRepository (org.openkilda.persistence.repositories.FlowRepository)2 PathSegmentRepository (org.openkilda.persistence.repositories.PathSegmentRepository)2 YFlowRepository (org.openkilda.persistence.repositories.YFlowRepository)2 Endpoint (org.openkilda.wfm.share.model.Endpoint)2 Duration (java.time.Duration)1 Instant (java.time.Instant)1 Collections (java.util.Collections)1 HashMap (java.util.HashMap)1 List (java.util.List)1 Map (java.util.Map)1 Objects (java.util.Objects)1 Optional (java.util.Optional)1 AllArgsConstructor (lombok.AllArgsConstructor)1