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));
}
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;
}
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;
}
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());
}
Aggregations