Search in sources :

Example 1 with FlowSetFieldAction

use of org.openkilda.messaging.info.rule.FlowSetFieldAction in project open-kilda by telstra.

the class OfFlowStatsMapper method fillFlowAction.

private void fillFlowAction(FlowApplyActions.FlowApplyActionsBuilder flowActions, OFActionSetField action) {
    OFOxm<?> field = action.getField();
    String value = field.getValue().toString();
    if (MatchField.VLAN_VID.getName().equals(field.getMatchField().getName())) {
        value = String.valueOf(Long.decode(value) & VLAN_MASK);
    }
    flowActions.setFieldAction(new FlowSetFieldAction(field.getMatchField().getName(), value));
}
Also used : FlowSetFieldAction(org.openkilda.messaging.info.rule.FlowSetFieldAction)

Example 2 with FlowSetFieldAction

use of org.openkilda.messaging.info.rule.FlowSetFieldAction in project open-kilda by telstra.

the class SimpleSwitchRuleConverter method buildSimpleSwitchRule.

private SimpleSwitchRule buildSimpleSwitchRule(SwitchId switchId, FlowEntry flowEntry, SwitchMeterEntries meters, SwitchGroupEntries groups) {
    SimpleSwitchRule rule = SimpleSwitchRule.builder().switchId(switchId).cookie(flowEntry.getCookie()).pktCount(flowEntry.getPacketCount()).byteCount(flowEntry.getByteCount()).version(flowEntry.getVersion()).build();
    if (flowEntry.getMatch() != null) {
        rule.setInPort(NumberUtils.toInt(flowEntry.getMatch().getInPort()));
        rule.setInVlan(NumberUtils.toInt(flowEntry.getMatch().getVlanVid()));
        rule.setTunnelId(Optional.ofNullable(flowEntry.getMatch().getTunnelId()).map(Integer::decode).orElse(NumberUtils.INTEGER_ZERO));
    }
    if (flowEntry.getInstructions() != null) {
        if (flowEntry.getInstructions().getApplyActions() != null) {
            FlowApplyActions applyActions = flowEntry.getInstructions().getApplyActions();
            List<FlowSetFieldAction> setFields = Optional.ofNullable(applyActions.getSetFieldActions()).orElse(new ArrayList<>());
            rule.setOutVlan(setFields.stream().filter(Objects::nonNull).filter(action -> VLAN_VID.equals(action.getFieldName())).map(FlowSetFieldAction::getFieldValue).map(NumberUtils::toInt).collect(Collectors.toList()));
            String outPort = applyActions.getFlowOutput();
            if (IN_PORT.equals(outPort) && flowEntry.getMatch() != null) {
                outPort = flowEntry.getMatch().getInPort();
            }
            rule.setOutPort(NumberUtils.toInt(outPort));
            if (rule.getTunnelId() == NumberUtils.INTEGER_ZERO) {
                rule.setTunnelId(Optional.ofNullable(applyActions.getPushVxlan()).map(Integer::parseInt).orElse(NumberUtils.INTEGER_ZERO));
            }
            if (NumberUtils.isParsable(applyActions.getGroup()) && groups != null && groups.getGroupEntries() != null) {
                int groupId = NumberUtils.toInt(applyActions.getGroup());
                List<SimpleGroupBucket> buckets = groups.getGroupEntries().stream().filter(config -> config.getGroupId() == groupId).map(GroupEntry::getBuckets).map(this::mapGroupBuckets).findFirst().orElse(Collections.emptyList());
                rule.setGroupId(groupId);
                rule.setGroupBuckets(buckets);
            }
        }
        Optional.ofNullable(flowEntry.getInstructions().getGoToMeter()).ifPresent(meterId -> {
            rule.setMeterId(meterId);
            if (meters != null && meters.getMeterEntries() != null) {
                meters.getMeterEntries().stream().filter(entry -> meterId.equals(entry.getMeterId())).findFirst().ifPresent(entry -> {
                    rule.setMeterRate(entry.getRate());
                    rule.setMeterBurstSize(entry.getBurstSize());
                    rule.setMeterFlags(entry.getFlags());
                });
            }
        });
    }
    return rule;
}
Also used : FlowSetFieldAction(org.openkilda.messaging.info.rule.FlowSetFieldAction) FlowApplyActions(org.openkilda.messaging.info.rule.FlowApplyActions) FlowEndpoint(org.openkilda.model.FlowEndpoint) SimpleGroupBucket(org.openkilda.wfm.share.utils.rule.validation.SimpleSwitchRule.SimpleGroupBucket) NumberUtils(org.apache.commons.lang3.math.NumberUtils)

Example 3 with FlowSetFieldAction

use of org.openkilda.messaging.info.rule.FlowSetFieldAction in project open-kilda by telstra.

the class SimpleSwitchRuleConverter method mapGroupBuckets.

private List<SimpleGroupBucket> mapGroupBuckets(List<GroupBucket> buckets) {
    List<SimpleGroupBucket> simpleGroupBuckets = new ArrayList<>();
    for (GroupBucket bucket : buckets) {
        FlowApplyActions actions = bucket.getApplyActions();
        if (actions == null || !NumberUtils.isParsable(actions.getFlowOutput())) {
            continue;
        }
        int bucketPort = NumberUtils.toInt(actions.getFlowOutput());
        int bucketVlan = 0;
        if (actions.getSetFieldActions() != null && actions.getSetFieldActions().size() == 1) {
            FlowSetFieldAction setFieldAction = actions.getSetFieldActions().get(0);
            if (VLAN_VID.equals(setFieldAction.getFieldName())) {
                bucketVlan = NumberUtils.toInt(setFieldAction.getFieldValue());
            }
        }
        int bucketVni = 0;
        if (actions.getPushVxlan() != null) {
            bucketVni = NumberUtils.toInt(actions.getPushVxlan());
        }
        simpleGroupBuckets.add(new SimpleGroupBucket(bucketPort, bucketVlan, bucketVni));
    }
    simpleGroupBuckets.sort(this::compareSimpleGroupBucket);
    return simpleGroupBuckets;
}
Also used : FlowSetFieldAction(org.openkilda.messaging.info.rule.FlowSetFieldAction) ArrayList(java.util.ArrayList) SimpleGroupBucket(org.openkilda.wfm.share.utils.rule.validation.SimpleSwitchRule.SimpleGroupBucket) GroupBucket(org.openkilda.messaging.info.rule.GroupBucket) FlowApplyActions(org.openkilda.messaging.info.rule.FlowApplyActions) SimpleGroupBucket(org.openkilda.wfm.share.utils.rule.validation.SimpleSwitchRule.SimpleGroupBucket) FlowEndpoint(org.openkilda.model.FlowEndpoint)

Example 4 with FlowSetFieldAction

use of org.openkilda.messaging.info.rule.FlowSetFieldAction in project open-kilda by telstra.

the class OfFlowStatsMapperTest method testFlowEntry.

@Test
public void testFlowEntry() {
    OFFlowStatsEntry ofEntry = buildFlowStatsEntry();
    FlowEntry entry = OfFlowStatsMapper.INSTANCE.toFlowEntry(ofEntry);
    assertEquals(tableId, entry.getTableId());
    assertEquals(cookie, entry.getCookie());
    assertEquals(packetCount, entry.getPacketCount());
    assertEquals(byteCount, entry.getByteCount());
    assertEquals(durationSec, entry.getDurationSeconds());
    assertEquals(durationNsec, entry.getDurationNanoSeconds());
    assertEquals(hardTimeout, entry.getHardTimeout());
    assertEquals(idleTimeout, entry.getIdleTimeout());
    assertEquals(priority, entry.getPriority());
    assertEquals(String.valueOf(vlanVid.getVlan()), entry.getMatch().getVlanVid());
    assertEquals(ethType.toString(), entry.getMatch().getEthType());
    assertEquals(ethDst.toString(), entry.getMatch().getEthDst());
    assertEquals(port.toString(), entry.getMatch().getInPort());
    assertEquals(ipProto.toString(), entry.getMatch().getIpProto());
    assertEquals(udpSrc.toString(), entry.getMatch().getUdpSrc());
    assertEquals(udpDst.toString(), entry.getMatch().getUdpDst());
    FlowSetFieldAction flowSetEthSrcAction = new FlowSetFieldAction("eth_src", MAC_ADDRESS_1);
    FlowSetFieldAction flowSetEthDstAction = new FlowSetFieldAction("eth_dst", MAC_ADDRESS_2);
    FlowCopyFieldAction flowCopyFieldAction = FlowCopyFieldAction.builder().bits(String.valueOf(bits)).srcOffset(String.valueOf(srcOffset)).dstOffset(String.valueOf(dstOffset)).srcOxm(String.valueOf(oxmSrcHeader)).dstOxm(String.valueOf(oxmDstHeader)).build();
    FlowSwapFieldAction flowSwapFieldAction = FlowSwapFieldAction.builder().bits(String.valueOf(bits)).srcOffset(String.valueOf(srcOffset)).dstOffset(String.valueOf(dstOffset)).srcOxm(String.valueOf(oxmSrcHeader)).dstOxm(String.valueOf(oxmDstHeader)).build();
    FlowApplyActions applyActions = new FlowApplyActions(port.toString(), Lists.newArrayList(flowSetEthSrcAction, flowSetEthDstAction), ethType.toString(), null, null, null, group.toString(), flowCopyFieldAction, flowSwapFieldAction);
    FlowInstructions instructions = new FlowInstructions(applyActions, null, meterId, goToTable.getValue());
    assertEquals(instructions, entry.getInstructions());
}
Also used : OFFlowStatsEntry(org.projectfloodlight.openflow.protocol.OFFlowStatsEntry) FlowSetFieldAction(org.openkilda.messaging.info.rule.FlowSetFieldAction) FlowSwapFieldAction(org.openkilda.messaging.info.rule.FlowSwapFieldAction) FlowInstructions(org.openkilda.messaging.info.rule.FlowInstructions) FlowApplyActions(org.openkilda.messaging.info.rule.FlowApplyActions) FlowEntry(org.openkilda.messaging.info.rule.FlowEntry) FlowCopyFieldAction(org.openkilda.messaging.info.rule.FlowCopyFieldAction) Test(org.junit.Test)

Aggregations

FlowSetFieldAction (org.openkilda.messaging.info.rule.FlowSetFieldAction)4 FlowApplyActions (org.openkilda.messaging.info.rule.FlowApplyActions)3 FlowEndpoint (org.openkilda.model.FlowEndpoint)2 SimpleGroupBucket (org.openkilda.wfm.share.utils.rule.validation.SimpleSwitchRule.SimpleGroupBucket)2 ArrayList (java.util.ArrayList)1 NumberUtils (org.apache.commons.lang3.math.NumberUtils)1 Test (org.junit.Test)1 FlowCopyFieldAction (org.openkilda.messaging.info.rule.FlowCopyFieldAction)1 FlowEntry (org.openkilda.messaging.info.rule.FlowEntry)1 FlowInstructions (org.openkilda.messaging.info.rule.FlowInstructions)1 FlowSwapFieldAction (org.openkilda.messaging.info.rule.FlowSwapFieldAction)1 GroupBucket (org.openkilda.messaging.info.rule.GroupBucket)1 OFFlowStatsEntry (org.projectfloodlight.openflow.protocol.OFFlowStatsEntry)1