Search in sources :

Example 1 with FlowStats

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

the class ActionServiceTest method shouldFailTier1AndDoNotSendRerouteRequestWhenToggleIsFalse.

@Test
public void shouldFailTier1AndDoNotSendRerouteRequestWhenToggleIsFalse() {
    transactionManager.doInTransaction(() -> {
        KildaFeatureToggles featureToggles = featureTogglesRepository.find().orElseThrow(() -> new IllegalStateException("Feature toggle not found"));
        featureToggles.setFlowLatencyMonitoringReactions(false);
    });
    service.processFlowLatencyMeasurement(flow.getFlowId(), FlowDirection.FORWARD, NANOSECOND);
    service.processFlowLatencyMeasurement(flow.getFlowId(), FlowDirection.REVERSE, NANOSECOND);
    Duration latency = Duration.ofNanos((long) (flow.getMaxLatency() * (1 + THRESHOLD)) + 5);
    for (int i = 0; i < 10; i++) {
        clock.adjust(Duration.ofSeconds(10));
        service.processFlowLatencyMeasurement(flow.getFlowId(), FlowDirection.FORWARD, latency);
        service.processFlowLatencyMeasurement(flow.getFlowId(), FlowDirection.REVERSE, latency.minus(NANOSECOND));
        service.processTick();
        if (i == 0) {
            assertTrue(service.fsms.values().stream().allMatch(fsm -> UNSTABLE.equals(fsm.getCurrentState())));
        }
    }
    assertEquals(2, service.fsms.values().size());
    assertTrue(service.fsms.values().stream().allMatch(fsm -> TIER_1_FAILED.equals(fsm.getCurrentState())));
    FlowStats actual = flowStatsRepository.findByFlowId(flow.getFlowId()).orElseThrow(() -> new IllegalStateException("Flow not found"));
    assertEquals(latency.getNano(), actual.getForwardLatency().intValue());
    assertEquals(latency.minus(NANOSECOND).getNano(), actual.getReverseLatency().intValue());
    verifyNoMoreInteractions(carrier);
}
Also used : FlowDirection(org.openkilda.server42.messaging.FlowDirection) Arrays(java.util.Arrays) FlowStats(org.openkilda.model.FlowStats) InMemoryGraphBasedTest(org.openkilda.persistence.inmemory.InMemoryGraphBasedTest) HEALTHY(org.openkilda.wfm.topology.flowmonitoring.fsm.FlowLatencyMonitoringFsm.State.HEALTHY) Mock(org.mockito.Mock) FlowStatsRepository(org.openkilda.persistence.repositories.FlowStatsRepository) RunWith(org.junit.runner.RunWith) KildaFeatureTogglesRepository(org.openkilda.persistence.repositories.KildaFeatureTogglesRepository) PathNodePayload(org.openkilda.messaging.payload.flow.PathNodePayload) TIER_2_FAILED(org.openkilda.wfm.topology.flowmonitoring.fsm.FlowLatencyMonitoringFsm.State.TIER_2_FAILED) TIER_1_FAILED(org.openkilda.wfm.topology.flowmonitoring.fsm.FlowLatencyMonitoringFsm.State.TIER_1_FAILED) FlowLatencyMonitoringFsm(org.openkilda.wfm.topology.flowmonitoring.fsm.FlowLatencyMonitoringFsm) Flow(org.openkilda.model.Flow) KildaFeatureToggles(org.openkilda.model.KildaFeatureToggles) Mockito.verifyNoMoreInteractions(org.mockito.Mockito.verifyNoMoreInteractions) UNSTABLE(org.openkilda.wfm.topology.flowmonitoring.fsm.FlowLatencyMonitoringFsm.State.UNSTABLE) FlowDefaults(org.openkilda.persistence.dummy.FlowDefaults) Duration(java.time.Duration) FlowPathDto(org.openkilda.messaging.model.FlowPathDto) FlowRepository(org.openkilda.persistence.repositories.FlowRepository) PersistenceDummyEntityFactory(org.openkilda.persistence.dummy.PersistenceDummyEntityFactory) Before(org.junit.Before) FlowEndpoint(org.openkilda.model.FlowEndpoint) FlowOperationsCarrier(org.openkilda.wfm.topology.flowmonitoring.bolt.FlowOperationsCarrier) PathComputationStrategy(org.openkilda.model.PathComputationStrategy) ManualClock(org.openkilda.stubs.ManualClock) UpdateFlowCommand(org.openkilda.messaging.info.flow.UpdateFlowCommand) Assert.assertTrue(org.junit.Assert.assertTrue) Mockito.times(org.mockito.Mockito.times) Test(org.junit.Test) Mockito.verify(org.mockito.Mockito.verify) SwitchId(org.openkilda.model.SwitchId) MockitoJUnitRunner(org.mockito.junit.MockitoJUnitRunner) Assert.assertEquals(org.junit.Assert.assertEquals) FlowStats(org.openkilda.model.FlowStats) KildaFeatureToggles(org.openkilda.model.KildaFeatureToggles) Duration(java.time.Duration) FlowEndpoint(org.openkilda.model.FlowEndpoint) InMemoryGraphBasedTest(org.openkilda.persistence.inmemory.InMemoryGraphBasedTest) Test(org.junit.Test)

Example 2 with FlowStats

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

the class ActionServiceTest method shouldFailTier1AndDoNotSendRerouteRequestForCostStrategy.

@Test
public void shouldFailTier1AndDoNotSendRerouteRequestForCostStrategy() {
    transactionManager.doInTransaction(() -> {
        Flow flowSetup = flowRepository.findById(flow.getFlowId()).orElseThrow(() -> new IllegalStateException("Flow not found"));
        flowSetup.setPathComputationStrategy(PathComputationStrategy.COST);
    });
    service.processFlowLatencyMeasurement(flow.getFlowId(), FlowDirection.FORWARD, NANOSECOND);
    service.processFlowLatencyMeasurement(flow.getFlowId(), FlowDirection.REVERSE, NANOSECOND);
    Duration latency = Duration.ofNanos((long) (flow.getMaxLatency() * (1 + THRESHOLD)) + 5);
    for (int i = 0; i < 10; i++) {
        clock.adjust(Duration.ofSeconds(10));
        service.processFlowLatencyMeasurement(flow.getFlowId(), FlowDirection.FORWARD, latency);
        service.processFlowLatencyMeasurement(flow.getFlowId(), FlowDirection.REVERSE, latency.minus(NANOSECOND));
        service.processTick();
        if (i == 0) {
            assertTrue(service.fsms.values().stream().allMatch(fsm -> UNSTABLE.equals(fsm.getCurrentState())));
        }
    }
    assertEquals(2, service.fsms.values().size());
    assertTrue(service.fsms.values().stream().allMatch(fsm -> TIER_1_FAILED.equals(fsm.getCurrentState())));
    FlowStats actual = flowStatsRepository.findByFlowId(flow.getFlowId()).orElseThrow(() -> new IllegalStateException("Flow not found"));
    assertEquals(latency.getNano(), actual.getForwardLatency().intValue());
    assertEquals(latency.minus(NANOSECOND).getNano(), actual.getReverseLatency().intValue());
    verifyNoMoreInteractions(carrier);
}
Also used : FlowDirection(org.openkilda.server42.messaging.FlowDirection) Arrays(java.util.Arrays) FlowStats(org.openkilda.model.FlowStats) InMemoryGraphBasedTest(org.openkilda.persistence.inmemory.InMemoryGraphBasedTest) HEALTHY(org.openkilda.wfm.topology.flowmonitoring.fsm.FlowLatencyMonitoringFsm.State.HEALTHY) Mock(org.mockito.Mock) FlowStatsRepository(org.openkilda.persistence.repositories.FlowStatsRepository) RunWith(org.junit.runner.RunWith) KildaFeatureTogglesRepository(org.openkilda.persistence.repositories.KildaFeatureTogglesRepository) PathNodePayload(org.openkilda.messaging.payload.flow.PathNodePayload) TIER_2_FAILED(org.openkilda.wfm.topology.flowmonitoring.fsm.FlowLatencyMonitoringFsm.State.TIER_2_FAILED) TIER_1_FAILED(org.openkilda.wfm.topology.flowmonitoring.fsm.FlowLatencyMonitoringFsm.State.TIER_1_FAILED) FlowLatencyMonitoringFsm(org.openkilda.wfm.topology.flowmonitoring.fsm.FlowLatencyMonitoringFsm) Flow(org.openkilda.model.Flow) KildaFeatureToggles(org.openkilda.model.KildaFeatureToggles) Mockito.verifyNoMoreInteractions(org.mockito.Mockito.verifyNoMoreInteractions) UNSTABLE(org.openkilda.wfm.topology.flowmonitoring.fsm.FlowLatencyMonitoringFsm.State.UNSTABLE) FlowDefaults(org.openkilda.persistence.dummy.FlowDefaults) Duration(java.time.Duration) FlowPathDto(org.openkilda.messaging.model.FlowPathDto) FlowRepository(org.openkilda.persistence.repositories.FlowRepository) PersistenceDummyEntityFactory(org.openkilda.persistence.dummy.PersistenceDummyEntityFactory) Before(org.junit.Before) FlowEndpoint(org.openkilda.model.FlowEndpoint) FlowOperationsCarrier(org.openkilda.wfm.topology.flowmonitoring.bolt.FlowOperationsCarrier) PathComputationStrategy(org.openkilda.model.PathComputationStrategy) ManualClock(org.openkilda.stubs.ManualClock) UpdateFlowCommand(org.openkilda.messaging.info.flow.UpdateFlowCommand) Assert.assertTrue(org.junit.Assert.assertTrue) Mockito.times(org.mockito.Mockito.times) Test(org.junit.Test) Mockito.verify(org.mockito.Mockito.verify) SwitchId(org.openkilda.model.SwitchId) MockitoJUnitRunner(org.mockito.junit.MockitoJUnitRunner) Assert.assertEquals(org.junit.Assert.assertEquals) FlowStats(org.openkilda.model.FlowStats) Duration(java.time.Duration) FlowEndpoint(org.openkilda.model.FlowEndpoint) Flow(org.openkilda.model.Flow) InMemoryGraphBasedTest(org.openkilda.persistence.inmemory.InMemoryGraphBasedTest) Test(org.junit.Test)

Example 3 with FlowStats

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

the class ActionServiceTest method shouldFailTier2AndSendRerouteRequest.

@Test
public void shouldFailTier2AndSendRerouteRequest() {
    transactionManager.doInTransaction(() -> {
        Flow flowSetup = flowRepository.findById(flow.getFlowId()).orElseThrow(() -> new IllegalStateException("Flow not found"));
        flowSetup.setPathComputationStrategy(PathComputationStrategy.MAX_LATENCY);
    });
    service.processFlowLatencyMeasurement(flow.getFlowId(), FlowDirection.FORWARD, NANOSECOND);
    service.processFlowLatencyMeasurement(flow.getFlowId(), FlowDirection.REVERSE, NANOSECOND);
    Duration latency = Duration.ofNanos((long) (flow.getMaxLatencyTier2() * (1 + THRESHOLD)) + 5);
    for (int i = 0; i < 10; i++) {
        clock.adjust(Duration.ofSeconds(10));
        service.processFlowLatencyMeasurement(flow.getFlowId(), FlowDirection.FORWARD, latency);
        service.processFlowLatencyMeasurement(flow.getFlowId(), FlowDirection.REVERSE, latency.minus(NANOSECOND));
        service.processTick();
        if (i == 0) {
            assertTrue(service.fsms.values().stream().allMatch(fsm -> UNSTABLE.equals(fsm.getCurrentState())));
        }
    }
    assertEquals(2, service.fsms.values().size());
    assertTrue(service.fsms.values().stream().allMatch(fsm -> TIER_2_FAILED.equals(fsm.getCurrentState())));
    FlowStats actual = flowStatsRepository.findByFlowId(flow.getFlowId()).orElseThrow(() -> new IllegalStateException("Flow not found"));
    assertEquals(latency.getNano(), actual.getForwardLatency().intValue());
    assertEquals(latency.minus(NANOSECOND).getNano(), actual.getReverseLatency().intValue());
    verify(carrier, times(2)).sendFlowRerouteRequest(flow.getFlowId());
    verifyNoMoreInteractions(carrier);
}
Also used : FlowDirection(org.openkilda.server42.messaging.FlowDirection) Arrays(java.util.Arrays) FlowStats(org.openkilda.model.FlowStats) InMemoryGraphBasedTest(org.openkilda.persistence.inmemory.InMemoryGraphBasedTest) HEALTHY(org.openkilda.wfm.topology.flowmonitoring.fsm.FlowLatencyMonitoringFsm.State.HEALTHY) Mock(org.mockito.Mock) FlowStatsRepository(org.openkilda.persistence.repositories.FlowStatsRepository) RunWith(org.junit.runner.RunWith) KildaFeatureTogglesRepository(org.openkilda.persistence.repositories.KildaFeatureTogglesRepository) PathNodePayload(org.openkilda.messaging.payload.flow.PathNodePayload) TIER_2_FAILED(org.openkilda.wfm.topology.flowmonitoring.fsm.FlowLatencyMonitoringFsm.State.TIER_2_FAILED) TIER_1_FAILED(org.openkilda.wfm.topology.flowmonitoring.fsm.FlowLatencyMonitoringFsm.State.TIER_1_FAILED) FlowLatencyMonitoringFsm(org.openkilda.wfm.topology.flowmonitoring.fsm.FlowLatencyMonitoringFsm) Flow(org.openkilda.model.Flow) KildaFeatureToggles(org.openkilda.model.KildaFeatureToggles) Mockito.verifyNoMoreInteractions(org.mockito.Mockito.verifyNoMoreInteractions) UNSTABLE(org.openkilda.wfm.topology.flowmonitoring.fsm.FlowLatencyMonitoringFsm.State.UNSTABLE) FlowDefaults(org.openkilda.persistence.dummy.FlowDefaults) Duration(java.time.Duration) FlowPathDto(org.openkilda.messaging.model.FlowPathDto) FlowRepository(org.openkilda.persistence.repositories.FlowRepository) PersistenceDummyEntityFactory(org.openkilda.persistence.dummy.PersistenceDummyEntityFactory) Before(org.junit.Before) FlowEndpoint(org.openkilda.model.FlowEndpoint) FlowOperationsCarrier(org.openkilda.wfm.topology.flowmonitoring.bolt.FlowOperationsCarrier) PathComputationStrategy(org.openkilda.model.PathComputationStrategy) ManualClock(org.openkilda.stubs.ManualClock) UpdateFlowCommand(org.openkilda.messaging.info.flow.UpdateFlowCommand) Assert.assertTrue(org.junit.Assert.assertTrue) Mockito.times(org.mockito.Mockito.times) Test(org.junit.Test) Mockito.verify(org.mockito.Mockito.verify) SwitchId(org.openkilda.model.SwitchId) MockitoJUnitRunner(org.mockito.junit.MockitoJUnitRunner) Assert.assertEquals(org.junit.Assert.assertEquals) FlowStats(org.openkilda.model.FlowStats) Duration(java.time.Duration) FlowEndpoint(org.openkilda.model.FlowEndpoint) Flow(org.openkilda.model.Flow) InMemoryGraphBasedTest(org.openkilda.persistence.inmemory.InMemoryGraphBasedTest) Test(org.junit.Test)

Example 4 with FlowStats

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

the class ActionServiceTest method shouldFailTier2AndDoNotSendRerouteRequestForCostStrategy.

@Test
public void shouldFailTier2AndDoNotSendRerouteRequestForCostStrategy() {
    transactionManager.doInTransaction(() -> {
        Flow flowSetup = flowRepository.findById(flow.getFlowId()).orElseThrow(() -> new IllegalStateException("Flow not found"));
        flowSetup.setPathComputationStrategy(PathComputationStrategy.COST);
    });
    service.processFlowLatencyMeasurement(flow.getFlowId(), FlowDirection.FORWARD, NANOSECOND);
    service.processFlowLatencyMeasurement(flow.getFlowId(), FlowDirection.REVERSE, NANOSECOND);
    Duration latency = Duration.ofNanos((long) (flow.getMaxLatencyTier2() * (1 + THRESHOLD)) + 5);
    for (int i = 0; i < 10; i++) {
        clock.adjust(Duration.ofSeconds(10));
        service.processFlowLatencyMeasurement(flow.getFlowId(), FlowDirection.FORWARD, latency);
        service.processFlowLatencyMeasurement(flow.getFlowId(), FlowDirection.REVERSE, latency.minus(NANOSECOND));
        service.processTick();
        if (i == 0) {
            assertTrue(service.fsms.values().stream().allMatch(fsm -> UNSTABLE.equals(fsm.getCurrentState())));
        }
    }
    assertEquals(2, service.fsms.values().size());
    assertTrue(service.fsms.values().stream().allMatch(fsm -> TIER_2_FAILED.equals(fsm.getCurrentState())));
    FlowStats actual = flowStatsRepository.findByFlowId(flow.getFlowId()).orElseThrow(() -> new IllegalStateException("Flow not found"));
    assertEquals(latency.getNano(), actual.getForwardLatency().intValue());
    assertEquals(latency.minus(NANOSECOND).getNano(), actual.getReverseLatency().intValue());
    verifyNoMoreInteractions(carrier);
}
Also used : FlowDirection(org.openkilda.server42.messaging.FlowDirection) Arrays(java.util.Arrays) FlowStats(org.openkilda.model.FlowStats) InMemoryGraphBasedTest(org.openkilda.persistence.inmemory.InMemoryGraphBasedTest) HEALTHY(org.openkilda.wfm.topology.flowmonitoring.fsm.FlowLatencyMonitoringFsm.State.HEALTHY) Mock(org.mockito.Mock) FlowStatsRepository(org.openkilda.persistence.repositories.FlowStatsRepository) RunWith(org.junit.runner.RunWith) KildaFeatureTogglesRepository(org.openkilda.persistence.repositories.KildaFeatureTogglesRepository) PathNodePayload(org.openkilda.messaging.payload.flow.PathNodePayload) TIER_2_FAILED(org.openkilda.wfm.topology.flowmonitoring.fsm.FlowLatencyMonitoringFsm.State.TIER_2_FAILED) TIER_1_FAILED(org.openkilda.wfm.topology.flowmonitoring.fsm.FlowLatencyMonitoringFsm.State.TIER_1_FAILED) FlowLatencyMonitoringFsm(org.openkilda.wfm.topology.flowmonitoring.fsm.FlowLatencyMonitoringFsm) Flow(org.openkilda.model.Flow) KildaFeatureToggles(org.openkilda.model.KildaFeatureToggles) Mockito.verifyNoMoreInteractions(org.mockito.Mockito.verifyNoMoreInteractions) UNSTABLE(org.openkilda.wfm.topology.flowmonitoring.fsm.FlowLatencyMonitoringFsm.State.UNSTABLE) FlowDefaults(org.openkilda.persistence.dummy.FlowDefaults) Duration(java.time.Duration) FlowPathDto(org.openkilda.messaging.model.FlowPathDto) FlowRepository(org.openkilda.persistence.repositories.FlowRepository) PersistenceDummyEntityFactory(org.openkilda.persistence.dummy.PersistenceDummyEntityFactory) Before(org.junit.Before) FlowEndpoint(org.openkilda.model.FlowEndpoint) FlowOperationsCarrier(org.openkilda.wfm.topology.flowmonitoring.bolt.FlowOperationsCarrier) PathComputationStrategy(org.openkilda.model.PathComputationStrategy) ManualClock(org.openkilda.stubs.ManualClock) UpdateFlowCommand(org.openkilda.messaging.info.flow.UpdateFlowCommand) Assert.assertTrue(org.junit.Assert.assertTrue) Mockito.times(org.mockito.Mockito.times) Test(org.junit.Test) Mockito.verify(org.mockito.Mockito.verify) SwitchId(org.openkilda.model.SwitchId) MockitoJUnitRunner(org.mockito.junit.MockitoJUnitRunner) Assert.assertEquals(org.junit.Assert.assertEquals) FlowStats(org.openkilda.model.FlowStats) Duration(java.time.Duration) FlowEndpoint(org.openkilda.model.FlowEndpoint) Flow(org.openkilda.model.Flow) InMemoryGraphBasedTest(org.openkilda.persistence.inmemory.InMemoryGraphBasedTest) Test(org.junit.Test)

Example 5 with FlowStats

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

the class ActionService method saveFlowLatency.

@Override
public void saveFlowLatency(String flowId, String direction, long latency) {
    try {
        transactionManager.doInTransaction(() -> {
            FlowStats flowStats = flowStatsRepository.findByFlowId(flowId).orElse(null);
            if (flowStats == null) {
                Optional<Flow> flow = flowRepository.findById(flowId);
                if (flow.isPresent()) {
                    FlowStats toCreate = new FlowStats(flow.get(), null, null);
                    flowStatsRepository.add(toCreate);
                    flowStats = toCreate;
                } else {
                    log.warn("Can't save latency for flow '{}'. Flow not found.", flowId);
                    return;
                }
            }
            if (FORWARD.name().toLowerCase().equals(direction)) {
                flowStats.setForwardLatency(latency);
            } else {
                flowStats.setReverseLatency(latency);
            }
        });
    } catch (PersistenceException e) {
        log.error("Can't save latency for flow '{}'.", flowId, e);
    }
}
Also used : FlowStats(org.openkilda.model.FlowStats) PersistenceException(org.openkilda.persistence.exceptions.PersistenceException) Flow(org.openkilda.model.Flow)

Aggregations

Flow (org.openkilda.model.Flow)9 FlowStats (org.openkilda.model.FlowStats)9 Duration (java.time.Duration)7 Arrays (java.util.Arrays)7 Assert.assertEquals (org.junit.Assert.assertEquals)7 Assert.assertTrue (org.junit.Assert.assertTrue)7 Before (org.junit.Before)7 Test (org.junit.Test)7 RunWith (org.junit.runner.RunWith)7 Mock (org.mockito.Mock)7 Mockito.times (org.mockito.Mockito.times)7 Mockito.verify (org.mockito.Mockito.verify)7 Mockito.verifyNoMoreInteractions (org.mockito.Mockito.verifyNoMoreInteractions)7 MockitoJUnitRunner (org.mockito.junit.MockitoJUnitRunner)7 UpdateFlowCommand (org.openkilda.messaging.info.flow.UpdateFlowCommand)7 FlowPathDto (org.openkilda.messaging.model.FlowPathDto)7 PathNodePayload (org.openkilda.messaging.payload.flow.PathNodePayload)7 FlowEndpoint (org.openkilda.model.FlowEndpoint)7 KildaFeatureToggles (org.openkilda.model.KildaFeatureToggles)7 PathComputationStrategy (org.openkilda.model.PathComputationStrategy)7