Search in sources :

Example 61 with FlowEntry

use of org.onosproject.net.flow.FlowEntry in project fabric-tna by stratum.

the class FabricIntProgrammableTest method testSetupIntConfigWithQueueReportThreshold.

/**
 * Test "setUpIntConfig" function of IntProgrammable with a config that contains
 * queue report threshold config.
 */
@Test
public void testSetupIntConfigWithQueueReportThreshold() {
    final IntReportConfig intConfig = getIntReportConfig(APP_ID, "/int-report-queue-report-threshold.json");
    final List<FlowRule> expectRules = Lists.newArrayList();
    final Capture<FlowRuleOperations> capturedOpsForCollector = newCapture();
    final Capture<FlowRuleOperations> capturedOpsForSubnet = newCapture();
    final Capture<FlowRuleOperations> capturedOpsForQueueThresholds = newCapture();
    final Capture<FlowRule> capturedReportRules = newCapture(CaptureType.ALL);
    final FlowRuleOperations expectedOpsForCollector = FlowRuleOperations.builder().add(buildCollectorWatchlistRule(LEAF_DEVICE_ID)).build();
    // Queue threshold rules.
    // Queue 0 has some old rules which must be removed before adding the new ones.
    final List<FlowRule> queueThresholdRulesToRemove = queueReportFlows(LEAF_DEVICE_ID, 0, 0, (byte) 0);
    final FlowRuleOperations.Builder opsBuilder = FlowRuleOperations.builder();
    queueThresholdRulesToRemove.forEach(opsBuilder::remove);
    opsBuilder.newStage();
    // Add new entries for all queues.
    for (byte queueId = 0; queueId < MAX_QUEUES; queueId++) {
        // threshold config.
        if (queueId == 0) {
            queueReportFlows(LEAF_DEVICE_ID, 1888, 388, queueId).forEach(opsBuilder::add);
        } else if (queueId == 7) {
            // Queue 7 contains the "triggerNs" config only, the value of "resetNs"
            // will be half of "triggerNs".
            queueReportFlows(LEAF_DEVICE_ID, 500, 250, queueId).forEach(opsBuilder::add);
        } else {
            // The rest of the queues use the default queue latency threshold.
            queueReportFlows(LEAF_DEVICE_ID, DEFAULT_QUEUE_REPORT_TRIGGER_LATENCY_THRESHOLD, DEFAULT_QUEUE_REPORT_RESET_LATENCY_THRESHOLD, queueId).forEach(opsBuilder::add);
        }
    }
    final FlowRuleOperations expectedOpsForQueueThresholds = opsBuilder.build();
    expectRules.add(buildReportTableRule(LEAF_DEVICE_ID, false, BMD_TYPE_INT_INGRESS_DROP, INT_REPORT_TYPE_DROP, MIRROR_TYPE_INVALID));
    expectRules.add(buildReportTableRule(LEAF_DEVICE_ID, false, BMD_TYPE_EGRESS_MIRROR, INT_REPORT_TYPE_DROP, MIRROR_TYPE_INT_REPORT));
    expectRules.add(buildReportTableRule(LEAF_DEVICE_ID, false, BMD_TYPE_EGRESS_MIRROR, INT_REPORT_TYPE_FLOW, MIRROR_TYPE_INT_REPORT));
    expectRules.add(buildReportTableRule(LEAF_DEVICE_ID, false, BMD_TYPE_DEFLECTED, INT_REPORT_TYPE_DROP, MIRROR_TYPE_INVALID));
    expectRules.add(buildReportTableRule(LEAF_DEVICE_ID, false, BMD_TYPE_EGRESS_MIRROR, INT_REPORT_TYPE_QUEUE, MIRROR_TYPE_INT_REPORT));
    expectRules.add(buildReportTableRule(LEAF_DEVICE_ID, false, BMD_TYPE_EGRESS_MIRROR, (short) (INT_REPORT_TYPE_QUEUE | INT_REPORT_TYPE_FLOW), MIRROR_TYPE_INT_REPORT));
    expectRules.add(buildFilterConfigFlow(LEAF_DEVICE_ID));
    List<Capture<FlowRule>> captures = Lists.newArrayList();
    for (int i = 0; i < expectRules.size(); i++) {
        Capture<FlowRule> flowRuleCapture = newCapture();
        flowRuleService.applyFlowRules(capture(flowRuleCapture));
        captures.add(flowRuleCapture);
    }
    // Expected steps of method calls, captures, and results.
    reset(flowRuleService);
    final List<FlowEntry> existingFlowEntries = queueThresholdRulesToRemove.stream().map(f -> buildFlowEntry(f)).collect(Collectors.toList());
    expect(flowRuleService.getFlowEntriesById(APP_ID)).andReturn(existingFlowEntries).times(3);
    flowRuleService.apply(capture(capturedOpsForCollector));
    flowRuleService.apply(capture(capturedOpsForSubnet));
    flowRuleService.apply(capture(capturedOpsForQueueThresholds));
    flowRuleService.applyFlowRules(capture(capturedReportRules));
    expectLastCall().times(expectRules.size());
    replay(flowRuleService);
    // Verify values.
    assertTrue(intProgrammable.setUpIntConfig(intConfig));
    assertFlowRuleOperationsEquals(expectedOpsForCollector, capturedOpsForCollector.getValue());
    assertFlowRuleOperationsEquals(EMPTY_FLOW_RULE_OPS, capturedOpsForSubnet.getValue());
    assertFlowRuleOperationsEquals(expectedOpsForQueueThresholds, capturedOpsForQueueThresholds.getValue());
    for (int i = 0; i < expectRules.size(); i++) {
        FlowRule expectRule = expectRules.get(i);
        FlowRule actualRule = capturedReportRules.getValues().get(i);
        assertTrue(expectRule.exactMatch(actualRule));
    }
    verify(flowRuleService);
}
Also used : NetworkConfigService(org.onosproject.net.config.NetworkConfigService) Arrays(java.util.Arrays) HostLocation(org.onosproject.net.HostLocation) EasyMock.capture(org.easymock.EasyMock.capture) DefaultFlowRule(org.onosproject.net.flow.DefaultFlowRule) TestApplicationId(org.onosproject.TestApplicationId) CoreService(org.onosproject.core.CoreService) PortNumber(org.onosproject.net.PortNumber) FlowEntry(org.onosproject.net.flow.FlowEntry) PiActionParam(org.onosproject.net.pi.runtime.PiActionParam) IntReportConfig(org.stratumproject.fabric.tna.inbandtelemetry.IntReportConfig) DefaultTrafficTreatment(org.onosproject.net.flow.DefaultTrafficTreatment) FlowRuleService(org.onosproject.net.flow.FlowRuleService) EasyMock.reset(org.easymock.EasyMock.reset) PiCriterion(org.onosproject.net.flow.criteria.PiCriterion) After(org.junit.After) Map(java.util.Map) ApplicationId(org.onosproject.core.ApplicationId) Parameterized(org.junit.runners.Parameterized) TestUtils.getIntReportConfig(org.stratumproject.fabric.tna.utils.TestUtils.getIntReportConfig) V1MODEL_RECIRC_PORT(org.stratumproject.fabric.tna.Constants.V1MODEL_RECIRC_PORT) ImmutableSet(com.google.common.collect.ImmutableSet) ImmutableMap(com.google.common.collect.ImmutableMap) EasyMock.newCapture(org.easymock.EasyMock.newCapture) FabricUtils.doCareRangeMatch(org.stratumproject.fabric.tna.behaviour.FabricUtils.doCareRangeMatch) Collection(java.util.Collection) Range(com.google.common.collect.Range) Set(java.util.Set) Constants(org.stratumproject.fabric.tna.Constants) Collectors(java.util.stream.Collectors) Sets(com.google.common.collect.Sets) TestUtils.getSrConfig(org.stratumproject.fabric.tna.utils.TestUtils.getSrConfig) EasyMock.partialMockBuilder(org.easymock.EasyMock.partialMockBuilder) List(java.util.List) Assert.assertFalse(org.junit.Assert.assertFalse) FlowRule(org.onosproject.net.flow.FlowRule) GroupBuckets(org.onosproject.net.group.GroupBuckets) DeviceId(org.onosproject.net.DeviceId) DefaultGroupDescription(org.onosproject.net.group.DefaultGroupDescription) GroupDescription(org.onosproject.net.group.GroupDescription) IpPrefix(org.onlab.packet.IpPrefix) Host(org.onosproject.net.Host) RunWith(org.junit.runner.RunWith) ImmutableByteSequence(org.onlab.util.ImmutableByteSequence) SegmentRoutingDeviceConfig(org.onosproject.segmentrouting.config.SegmentRoutingDeviceConfig) GroupBucket(org.onosproject.net.group.GroupBucket) HostService(org.onosproject.net.host.HostService) DefaultHost(org.onosproject.net.DefaultHost) DriverData(org.onosproject.net.driver.DriverData) Lists(com.google.common.collect.Lists) TrafficSelector(org.onosproject.net.flow.TrafficSelector) DefaultGroupBucket.createCloneGroupBucket(org.onosproject.net.group.DefaultGroupBucket.createCloneGroupBucket) ImmutableList(com.google.common.collect.ImmutableList) DefaultGroupKey(org.onosproject.net.group.DefaultGroupKey) TestUtils(org.onlab.junit.TestUtils) EasyMock.replay(org.easymock.EasyMock.replay) EasyMock.createMock(org.easymock.EasyMock.createMock) DefaultTrafficSelector(org.onosproject.net.flow.DefaultTrafficSelector) FlowRuleOperation(org.onosproject.net.flow.FlowRuleOperation) Criterion(org.onosproject.net.flow.criteria.Criterion) Before(org.junit.Before) IpAddress(org.onlab.packet.IpAddress) TpPort(org.onlab.packet.TpPort) TrafficTreatment(org.onosproject.net.flow.TrafficTreatment) EasyMock.anyObject(org.easymock.EasyMock.anyObject) Capture(org.easymock.Capture) DefaultFlowEntry(org.onosproject.net.flow.DefaultFlowEntry) FlowRuleOperations(org.onosproject.net.flow.FlowRuleOperations) EasyMock.anyString(org.easymock.EasyMock.anyString) GroupService(org.onosproject.net.group.GroupService) Assert.assertTrue(org.junit.Assert.assertTrue) Test(org.junit.Test) V1MODEL_INT_REPORT_MIRROR_ID(org.stratumproject.fabric.tna.Constants.V1MODEL_INT_REPORT_MIRROR_ID) EasyMock.expect(org.easymock.EasyMock.expect) TimeUnit(java.util.concurrent.TimeUnit) EasyMock.expectLastCall(org.easymock.EasyMock.expectLastCall) PiAction(org.onosproject.net.pi.runtime.PiAction) IPv4(org.onlab.packet.IPv4) CaptureType(org.easymock.CaptureType) DriverHandler(org.onosproject.net.driver.DriverHandler) HexString(org.onlab.util.HexString) KRYO(org.stratumproject.fabric.tna.behaviour.FabricUtils.KRYO) LoggerFactory.getLogger(org.slf4j.LoggerFactory.getLogger) MacAddress(org.onlab.packet.MacAddress) EasyMock.verify(org.easymock.EasyMock.verify) Collections(java.util.Collections) PiActionId(org.onosproject.net.pi.model.PiActionId) Assert.assertEquals(org.junit.Assert.assertEquals) FlowRuleOperations(org.onosproject.net.flow.FlowRuleOperations) IntReportConfig(org.stratumproject.fabric.tna.inbandtelemetry.IntReportConfig) TestUtils.getIntReportConfig(org.stratumproject.fabric.tna.utils.TestUtils.getIntReportConfig) EasyMock.newCapture(org.easymock.EasyMock.newCapture) Capture(org.easymock.Capture) DefaultFlowRule(org.onosproject.net.flow.DefaultFlowRule) FlowRule(org.onosproject.net.flow.FlowRule) FlowEntry(org.onosproject.net.flow.FlowEntry) DefaultFlowEntry(org.onosproject.net.flow.DefaultFlowEntry) Test(org.junit.Test)

Example 62 with FlowEntry

use of org.onosproject.net.flow.FlowEntry in project onos by opennetworkinglab.

the class VirtualNetworkFlowRuleManager method removeFlowRulesById.

@Override
public void removeFlowRulesById(ApplicationId id) {
    Set<FlowRule> flowEntries = Sets.newHashSet();
    for (Device d : deviceService.getDevices()) {
        for (FlowEntry flowEntry : store.getFlowEntries(networkId(), d.id())) {
            if (flowEntry.appId() == id.id()) {
                flowEntries.add(flowEntry);
            }
        }
    }
    removeFlowRules(Iterables.toArray(flowEntries, FlowRule.class));
}
Also used : Device(org.onosproject.net.Device) FlowRule(org.onosproject.net.flow.FlowRule) FlowEntry(org.onosproject.net.flow.FlowEntry) DefaultFlowEntry(org.onosproject.net.flow.DefaultFlowEntry)

Example 63 with FlowEntry

use of org.onosproject.net.flow.FlowEntry in project onos by opennetworkinglab.

the class VirtualFlowsListCommand method printFlows.

/**
 * Prints flows.
 *
 * @param d     the device
 * @param flows the set of flows for that device
 * @param coreService core system service
 */
protected void printFlows(Device d, List<FlowEntry> flows, CoreService coreService) {
    List<FlowEntry> filteredFlows = flows.stream().filter(f -> contentFilter.filter(f)).collect(Collectors.toList());
    boolean empty = filteredFlows == null || filteredFlows.isEmpty();
    print("deviceId=%s, flowRuleCount=%d", d.id(), empty ? 0 : filteredFlows.size());
    if (empty || countOnly) {
        return;
    }
    for (FlowEntry f : filteredFlows) {
        if (shortOutput) {
            print(SHORT_FORMAT, f.state(), f.bytes(), f.packets(), f.tableId(), f.priority(), f.selector().criteria(), printTreatment(f.treatment()));
        } else {
            ApplicationId appId = coreService.getAppId(f.appId());
            print(LONG_FORMAT, Long.toHexString(f.id().value()), f.state(), f.bytes(), f.packets(), f.life(), f.liveType(), f.priority(), f.tableId(), appId != null ? appId.name() : "<none>", f.selector().criteria(), f.treatment());
        }
    }
}
Also used : StringFilter(org.onlab.util.StringFilter) Comparators(org.onosproject.utils.Comparators) FlowEntryState(org.onosproject.net.flow.FlowEntry.FlowEntryState) CoreService(org.onosproject.core.CoreService) DeviceService(org.onosproject.net.device.DeviceService) FlowEntry(org.onosproject.net.flow.FlowEntry) ObjectNode(com.fasterxml.jackson.databind.node.ObjectNode) Command(org.apache.karaf.shell.api.action.Command) ArrayList(java.util.ArrayList) FlowRuleService(org.onosproject.net.flow.FlowRuleService) FlowRuleStatusCompleter(org.onosproject.cli.net.FlowRuleStatusCompleter) Map(java.util.Map) ApplicationId(org.onosproject.core.ApplicationId) VirtualNetworkService(org.onosproject.incubator.net.virtual.VirtualNetworkService) NetworkId(org.onosproject.incubator.net.virtual.NetworkId) JsonNode(com.fasterxml.jackson.databind.JsonNode) PlaceholderCompleter(org.onosproject.cli.PlaceholderCompleter) TrafficTreatment(org.onosproject.net.flow.TrafficTreatment) Device(org.onosproject.net.Device) Predicate(java.util.function.Predicate) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) Argument(org.apache.karaf.shell.api.action.Argument) Collectors(java.util.stream.Collectors) ArrayNode(com.fasterxml.jackson.databind.node.ArrayNode) AbstractShellCommand(org.onosproject.cli.AbstractShellCommand) List(java.util.List) Lists.newArrayList(com.google.common.collect.Lists.newArrayList) TreeMap(java.util.TreeMap) Service(org.apache.karaf.shell.api.action.lifecycle.Service) Completion(org.apache.karaf.shell.api.action.Completion) Option(org.apache.karaf.shell.api.action.Option) DeviceId(org.onosproject.net.DeviceId) Collections(java.util.Collections) SortedMap(java.util.SortedMap) ApplicationId(org.onosproject.core.ApplicationId) FlowEntry(org.onosproject.net.flow.FlowEntry)

Example 64 with FlowEntry

use of org.onosproject.net.flow.FlowEntry in project onos by opennetworkinglab.

the class DefaultVirtualFlowRuleProvider method virtualize.

private FlowEntry virtualize(FlowEntry flowEntry) {
    FlowRule vRule = virtualizeFlowRule(flowEntry);
    if (vRule == null) {
        return null;
    }
    FlowEntry vEntry = new DefaultFlowEntry(vRule, flowEntry.state(), flowEntry.life(), flowEntry.packets(), flowEntry.bytes());
    return vEntry;
}
Also used : DefaultFlowEntry(org.onosproject.net.flow.DefaultFlowEntry) DefaultFlowRule(org.onosproject.net.flow.DefaultFlowRule) FlowRule(org.onosproject.net.flow.FlowRule) FlowEntry(org.onosproject.net.flow.FlowEntry) DefaultFlowEntry(org.onosproject.net.flow.DefaultFlowEntry)

Example 65 with FlowEntry

use of org.onosproject.net.flow.FlowEntry in project onos by opennetworkinglab.

the class ECFlowRuleStoreTest method testAddFlow.

/**
 * Tests adding a flowrule.
 */
@Test
public void testAddFlow() {
    FlowEntry flowEntry = new DefaultFlowEntry(flowRule);
    FlowRuleOperation op = new FlowRuleOperation(flowRule, FlowRuleOperation.Type.ADD);
    Multimap<DeviceId, FlowRuleBatchEntry> perDeviceBatches = ArrayListMultimap.create();
    perDeviceBatches.put(op.rule().deviceId(), new FlowRuleBatchEntry(FlowRuleBatchEntry.FlowRuleOperation.ADD, op.rule()));
    FlowRuleBatchOperation b = new FlowRuleBatchOperation(perDeviceBatches.get(deviceId), deviceId, 1);
    flowStoreImpl.storeBatch(b);
    FlowEntry flowEntry1 = flowStoreImpl.getFlowEntry(flowRule);
    assertEquals("PENDING_ADD", flowEntry1.state().toString());
    flowStoreImpl.addOrUpdateFlowRule(flowEntry);
    assertFlowsOnDevice(deviceId, 1);
    FlowEntry flowEntry2 = flowStoreImpl.getFlowEntry(flowRule);
    assertEquals("ADDED", flowEntry2.state().toString());
    assertThat(flowStoreImpl.getTableStatistics(deviceId), notNullValue());
}
Also used : FlowRuleBatchOperation(org.onosproject.net.flow.oldbatch.FlowRuleBatchOperation) DefaultFlowEntry(org.onosproject.net.flow.DefaultFlowEntry) DeviceId(org.onosproject.net.DeviceId) FlowRuleBatchEntry(org.onosproject.net.flow.oldbatch.FlowRuleBatchEntry) FlowEntry(org.onosproject.net.flow.FlowEntry) DefaultFlowEntry(org.onosproject.net.flow.DefaultFlowEntry) FlowRuleOperation(org.onosproject.net.flow.FlowRuleOperation) Test(org.junit.Test)

Aggregations

FlowEntry (org.onosproject.net.flow.FlowEntry)123 DefaultFlowEntry (org.onosproject.net.flow.DefaultFlowEntry)61 FlowRule (org.onosproject.net.flow.FlowRule)51 Test (org.junit.Test)31 DefaultFlowRule (org.onosproject.net.flow.DefaultFlowRule)31 FlowRuleService (org.onosproject.net.flow.FlowRuleService)27 ArrayList (java.util.ArrayList)24 StoredFlowEntry (org.onosproject.net.flow.StoredFlowEntry)23 DeviceId (org.onosproject.net.DeviceId)20 Device (org.onosproject.net.Device)19 PortNumber (org.onosproject.net.PortNumber)17 TrafficSelector (org.onosproject.net.flow.TrafficSelector)16 Instruction (org.onosproject.net.flow.instructions.Instruction)16 DeviceService (org.onosproject.net.device.DeviceService)15 List (java.util.List)14 DefaultTrafficSelector (org.onosproject.net.flow.DefaultTrafficSelector)13 TrafficTreatment (org.onosproject.net.flow.TrafficTreatment)13 ObjectNode (com.fasterxml.jackson.databind.node.ObjectNode)12 HashSet (java.util.HashSet)12 ArrayNode (com.fasterxml.jackson.databind.node.ArrayNode)11