-/*\r
- * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-\r
-package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow;\r
-\r
-import java.math.BigInteger;\r
-import java.util.ArrayList;\r
-import java.util.Collections;\r
-import java.util.List;\r
-import java.util.Optional;\r
-import org.junit.Assert;\r
-import org.junit.Test;\r
-import org.opendaylight.openflowplugin.api.OFConstants;\r
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;\r
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdActionCaseBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.id.action._case.SetVlanIdActionBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowTableRef;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInput;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlow;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlowBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowRef;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ClearActionsCaseBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.GoToTableCaseBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.MeterCaseBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteActionsCaseBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteMetadataCaseBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.clear.actions._case.ClearActionsBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.go.to.table._case.GoToTableBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.meter._case.MeterBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.actions._case.WriteActionsBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.metadata._case.WriteMetadataBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.ApplyActionsCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.GotoTableCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.MeterCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.WriteActionsCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.WriteMetadataCase;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModCommand;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlags;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder;\r
-import org.opendaylight.yangtools.yang.binding.Augmentation;\r
-import org.opendaylight.yangtools.yang.binding.DataContainer;\r
-\r
-/**\r
- * @author michal.polkorab\r
- *\r
- */\r
-public class FlowConvertorTest {\r
-\r
- /**\r
- * Tests {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} }\r
- */\r
- @Test\r
- public void test() {\r
- RemoveFlowInputBuilder flowBuilder = new RemoveFlowInputBuilder();\r
- flowBuilder.setBarrier(false);\r
- flowBuilder.setCookie(new FlowCookie(new BigInteger("4")));\r
- flowBuilder.setCookieMask(new FlowCookie(new BigInteger("5")));\r
- flowBuilder.setTableId((short) 6);\r
- flowBuilder.setStrict(true);\r
- flowBuilder.setIdleTimeout(50);\r
- flowBuilder.setHardTimeout(500);\r
- flowBuilder.setPriority(40);\r
- flowBuilder.setBufferId(18L);\r
- flowBuilder.setOutPort(new BigInteger("65535"));\r
- flowBuilder.setOutGroup(5000L);\r
- flowBuilder.setFlags(null);\r
- flowBuilder.setMatch(null);\r
- RemoveFlowInput flow = flowBuilder.build();\r
-\r
- VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3);\r
- data.setDatapathId(new BigInteger("42"));\r
-\r
- List<FlowModInputBuilder> flowMod = convert(flow, data);\r
-\r
- Assert.assertEquals("Wrong version", 4, flowMod.get(0).getVersion().intValue());\r
- Assert.assertEquals("Wrong cookie", 4, flowMod.get(0).getCookie().intValue());\r
- Assert.assertEquals("Wrong cookie mask", 5, flowMod.get(0).getCookieMask().intValue());\r
- Assert.assertEquals("Wrong table id", 6, flowMod.get(0).getTableId().getValue().intValue());\r
- Assert.assertEquals("Wrong command", FlowModCommand.OFPFCDELETESTRICT, flowMod.get(0).getCommand());\r
- Assert.assertEquals("Wrong idle timeout", 50, flowMod.get(0).getIdleTimeout().intValue());\r
- Assert.assertEquals("Wrong hard timeout", 500, flowMod.get(0).getHardTimeout().intValue());\r
- Assert.assertEquals("Wrong priority", 40, flowMod.get(0).getPriority().intValue());\r
- Assert.assertEquals("Wrong buffer id", 18, flowMod.get(0).getBufferId().intValue());\r
- Assert.assertEquals("Wrong out port", 65535, flowMod.get(0).getOutPort().getValue().intValue());\r
- Assert.assertEquals("Wrong out group", 5000, flowMod.get(0).getOutGroup().intValue());\r
- Assert.assertEquals("Wrong flags", new FlowModFlags(false, false, false, false, false), flowMod.get(0).getFlags());\r
- Assert.assertEquals("Wrong match", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmMatchType",\r
- flowMod.get(0).getMatch().getType().getName());\r
- Assert.assertEquals("Wrong match entries size", 0, flowMod.get(0).getMatch().getMatchEntry().size());\r
- }\r
-\r
- /**\r
- * Tests {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} }\r
- */\r
- @Test\r
- public void testOnlyModifyStrictCommand() {\r
- UpdatedFlowBuilder flowBuilder = new UpdatedFlowBuilder();\r
- flowBuilder.setStrict(true);\r
- UpdatedFlow flow = flowBuilder.build();\r
-\r
- VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_0);\r
- data.setDatapathId(new BigInteger("42"));\r
-\r
- List<FlowModInputBuilder> flowMod = convert(flow, data);\r
-\r
- Assert.assertEquals("Wrong version", 1, flowMod.get(0).getVersion().intValue());\r
- Assert.assertEquals("Wrong command", FlowModCommand.OFPFCADD, flowMod.get(0).getCommand());\r
- }\r
-\r
- /**\r
- * Tests {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} }\r
- */\r
- @Test\r
- public void testInstructionsTranslation() {\r
- AddFlowInputBuilder flowBuilder = new AddFlowInputBuilder();\r
- InstructionsBuilder instructionsBuilder = new InstructionsBuilder();\r
- List<Instruction> instructions = new ArrayList<>();\r
- InstructionBuilder instructionBuilder = new InstructionBuilder();\r
- GoToTableCaseBuilder goToCaseBuilder = new GoToTableCaseBuilder();\r
- GoToTableBuilder goToBuilder = new GoToTableBuilder();\r
- goToBuilder.setTableId((short) 1);\r
- goToCaseBuilder.setGoToTable(goToBuilder.build());\r
- instructionBuilder.setInstruction(goToCaseBuilder.build());\r
- instructionBuilder.setOrder(0);\r
- instructions.add(instructionBuilder.build());\r
- instructionBuilder = new InstructionBuilder();\r
- WriteMetadataCaseBuilder metaCaseBuilder = new WriteMetadataCaseBuilder();\r
- WriteMetadataBuilder metaBuilder = new WriteMetadataBuilder();\r
- metaBuilder.setMetadata(new BigInteger("2"));\r
- metaBuilder.setMetadataMask(new BigInteger("3"));\r
- metaCaseBuilder.setWriteMetadata(metaBuilder.build());\r
- instructionBuilder.setInstruction(metaCaseBuilder.build());\r
- instructionBuilder.setOrder(1);\r
- instructions.add(instructionBuilder.build());\r
- instructionBuilder = new InstructionBuilder();\r
- WriteActionsCaseBuilder writeCaseBuilder = new WriteActionsCaseBuilder();\r
- WriteActionsBuilder writeBuilder = new WriteActionsBuilder();\r
- List<Action> actions = new ArrayList<>();\r
- writeBuilder.setAction(actions);\r
- writeCaseBuilder.setWriteActions(writeBuilder.build());\r
- instructionBuilder.setInstruction(writeCaseBuilder.build());\r
- instructionBuilder.setOrder(2);\r
- instructions.add(instructionBuilder.build());\r
- instructionBuilder = new InstructionBuilder();\r
- ApplyActionsCaseBuilder applyCaseBuilder = new ApplyActionsCaseBuilder();\r
- ApplyActionsBuilder applyBuilder = new ApplyActionsBuilder();\r
- actions = new ArrayList<>();\r
- applyBuilder.setAction(actions);\r
- applyCaseBuilder.setApplyActions(applyBuilder.build());\r
- instructionBuilder.setInstruction(applyCaseBuilder.build());\r
- instructionBuilder.setOrder(3);\r
- instructions.add(instructionBuilder.build());\r
- instructionBuilder = new InstructionBuilder();\r
- ClearActionsCaseBuilder clearCaseBuilder = new ClearActionsCaseBuilder();\r
- ClearActionsBuilder clearBuilder = new ClearActionsBuilder();\r
- actions = new ArrayList<>();\r
- clearBuilder.setAction(actions);\r
- clearCaseBuilder.setClearActions(clearBuilder.build());\r
- instructionBuilder.setInstruction(clearCaseBuilder.build());\r
- instructionBuilder.setOrder(4);\r
- instructions.add(instructionBuilder.build());\r
- instructionBuilder = new InstructionBuilder();\r
- MeterCaseBuilder meterCaseBuilder = new MeterCaseBuilder();\r
- MeterBuilder meterBuilder = new MeterBuilder();\r
- meterBuilder.setMeterId(new MeterId(5L));\r
- meterCaseBuilder.setMeter(meterBuilder.build());\r
- instructionBuilder.setInstruction(meterCaseBuilder.build());\r
- instructionBuilder.setOrder(5);\r
- instructions.add(instructionBuilder.build());\r
- instructionsBuilder.setInstruction(instructions);\r
- flowBuilder.setInstructions(instructionsBuilder.build());\r
- AddFlowInput flow = flowBuilder.build();\r
-\r
- VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_0);\r
- data.setDatapathId(new BigInteger("42"));\r
- List<FlowModInputBuilder> flowMod = convert(flow, data);\r
-\r
- Assert.assertEquals("Wrong version", 1, flowMod.get(0).getVersion().intValue());\r
- Assert.assertEquals("Wrong command", FlowModCommand.OFPFCADD, flowMod.get(0).getCommand());\r
- Assert.assertEquals("Wrong instructions size", 6, flowMod.get(0).getInstruction().size());\r
- org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions\r
- .grouping.Instruction instruction = flowMod.get(0).getInstruction().get(0);\r
- Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
- + ".instruction.rev130731.instruction.grouping.instruction.choice.GotoTableCase", instruction.getInstructionChoice().getImplementedInterface().getName());\r
- GotoTableCase gotoTableCase = (GotoTableCase) instruction.getInstructionChoice();\r
- Assert.assertEquals("Wrong table id", 1, gotoTableCase.getGotoTable().getTableId().intValue());\r
- instruction = flowMod.get(0).getInstruction().get(1);\r
- Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
- + ".instruction.rev130731.instruction.grouping.instruction.choice.WriteMetadataCase", instruction.getInstructionChoice().getImplementedInterface().getName());\r
- WriteMetadataCase writeMetadataCase = (WriteMetadataCase) instruction.getInstructionChoice();\r
- Assert.assertArrayEquals("Wrong metadata", new byte[]{0, 0, 0, 0, 0, 0, 0, 2},\r
- writeMetadataCase.getWriteMetadata().getMetadata());\r
- Assert.assertArrayEquals("Wrong metadata mask", new byte[]{0, 0, 0, 0, 0, 0, 0, 3},\r
- writeMetadataCase.getWriteMetadata().getMetadataMask());\r
- \r
- instruction = flowMod.get(0).getInstruction().get(2);\r
- Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
- + ".instruction.rev130731.instruction.grouping.instruction.choice.WriteActionsCase", instruction.getInstructionChoice().getImplementedInterface().getName());\r
- WriteActionsCase writeActionsCase = (WriteActionsCase) instruction.getInstructionChoice();\r
- Assert.assertEquals("Wrong actions size", 0, writeActionsCase.getWriteActions().getAction().size());\r
- instruction = flowMod.get(0).getInstruction().get(3);\r
- Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
- + ".instruction.rev130731.instruction.grouping.instruction.choice.ApplyActionsCase", instruction.getInstructionChoice().getImplementedInterface().getName());\r
- ApplyActionsCase applyActionsCase = (ApplyActionsCase) instruction.getInstructionChoice();\r
- Assert.assertEquals("Wrong actions size", 0, applyActionsCase.getApplyActions().getAction().size());\r
- instruction = flowMod.get(0).getInstruction().get(4);\r
- Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
- + ".instruction.rev130731.instruction.grouping.instruction.choice.ClearActionsCase", instruction.getInstructionChoice().getImplementedInterface().getName());\r
- instruction = flowMod.get(0).getInstruction().get(5);\r
- Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
- + ".instruction.rev130731.instruction.grouping.instruction.choice.MeterCase", instruction.getInstructionChoice().getImplementedInterface().getName());\r
- MeterCase meterCase = (MeterCase) instruction.getInstructionChoice();\r
- Assert.assertEquals("Wrong meter id", 5, meterCase.getMeter().getMeterId().intValue());\r
- }\r
-\r
- @Test\r
- public void testCloneAndAugmentFlowWithSetVlanId() {\r
- MockFlow mockFlow = new MockFlow();\r
- Action action1 = createAction(\r
- new SetVlanIdActionCaseBuilder().setSetVlanIdAction(\r
- new SetVlanIdActionBuilder().setVlanId(new VlanId(10)).build())\r
- .build(),\r
- 0);\r
-\r
- mockFlow.setMatch(new MatchBuilder().setEthernetMatch(createEthernetMatch()).build());\r
- mockFlow.setInstructions(toApplyInstruction(Collections.singletonList(action1)));\r
-\r
- VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3);\r
- data.setDatapathId(BigInteger.ONE);\r
-\r
- List<FlowModInputBuilder> flowModInputBuilders = convert(mockFlow, data);\r
-\r
- Assert.assertEquals(2, flowModInputBuilders.size());\r
-\r
- }\r
-\r
- private List<FlowModInputBuilder> convert(Flow flow, VersionDatapathIdConvertorData data) {\r
- Optional<List<FlowModInputBuilder>> flowModOptional = ConvertorManager.getInstance().convert(flow, data);\r
- Assert.assertTrue("Flow convertor not found", flowModOptional.isPresent());\r
- return flowModOptional.get();\r
- }\r
-\r
- private static Action createAction(final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action actionCase,\r
- final int order) {\r
- Action action = new ActionBuilder().setOrder(order).setAction(actionCase).build();\r
- return action;\r
- }\r
-\r
- private static EthernetMatch createEthernetMatch() {\r
- EthernetMatchBuilder ethernetMatchBuilder = new EthernetMatchBuilder();\r
- ethernetMatchBuilder.setEthernetType(new EthernetTypeBuilder().setType(new EtherType(33024L)).build());\r
- return ethernetMatchBuilder.build();\r
- }\r
-\r
- private static Instructions toApplyInstruction(\r
- final List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actions) {\r
- return new InstructionsBuilder()\r
- .setInstruction(\r
- Collections.singletonList(\r
- new InstructionBuilder()\r
- .setOrder(0)\r
- .setInstruction(\r
- new ApplyActionsCaseBuilder()\r
- .setApplyActions((new ApplyActionsBuilder()).setAction(actions).build())\r
- .build()\r
- ).build())\r
- ).build();\r
- }\r
-\r
- private static class MockFlow implements AddFlowInput {\r
- private Instructions instructions;\r
- private Match match;\r
-\r
- public void setInstructions(final Instructions instructions) {\r
- this.instructions = instructions;\r
- }\r
-\r
- public void setMatch(final Match match) {\r
- this.match = match;\r
- }\r
-\r
-\r
- @Override\r
- public FlowRef getFlowRef() {\r
- return null;\r
- }\r
-\r
- @Override\r
- public <E extends Augmentation<AddFlowInput>> E getAugmentation(final Class<E> augmentationType) {\r
- return null;\r
- }\r
-\r
- @Override\r
- public FlowTableRef getFlowTable() {\r
- return null;\r
- }\r
-\r
- @Override\r
- public Match getMatch() {\r
- return match;\r
- }\r
-\r
- @Override\r
- public Instructions getInstructions() {\r
- return instructions;\r
- }\r
-\r
- @Override\r
- public String getContainerName() {\r
- return null;\r
- }\r
-\r
- @Override\r
- public FlowCookie getCookieMask() {\r
- return null;\r
- }\r
-\r
- @Override\r
- public Long getBufferId() {\r
- return null;\r
- }\r
-\r
- @Override\r
- public BigInteger getOutPort() {\r
- return null;\r
- }\r
-\r
- @Override\r
- public Long getOutGroup() {\r
- return null;\r
- }\r
-\r
- @Override\r
- public org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags getFlags() {\r
- return null;\r
- }\r
-\r
- @Override\r
- public String getFlowName() {\r
- return null;\r
- }\r
-\r
- @Override\r
- public Boolean isInstallHw() {\r
- return null;\r
- }\r
-\r
- @Override\r
- public Boolean isBarrier() {\r
- return null;\r
- }\r
-\r
- @Override\r
- public Boolean isStrict() {\r
- return null;\r
- }\r
-\r
- @Override\r
- public Integer getPriority() {\r
- return null;\r
- }\r
-\r
- @Override\r
- public Integer getIdleTimeout() {\r
- return null;\r
- }\r
-\r
- @Override\r
- public Integer getHardTimeout() {\r
- return null;\r
- }\r
-\r
- @Override\r
- public FlowCookie getCookie() {\r
- return null;\r
- }\r
-\r
- @Override\r
- public Short getTableId() {\r
- return null;\r
- }\r
-\r
- @Override\r
- public NodeRef getNode() {\r
- return null;\r
- }\r
-\r
- @Override\r
- public Uri getTransactionUri() {\r
- return null;\r
- }\r
-\r
- @Override\r
- public Class<? extends DataContainer> getImplementedInterface() {\r
- return null;\r
- }\r
- }\r
-}
\ No newline at end of file
+/*
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.openflowplugin.api.OFConstants;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdActionCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.id.action._case.SetVlanIdActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowTableRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlow;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlowBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ClearActionsCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.GoToTableCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.MeterCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteActionsCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteMetadataCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.clear.actions._case.ClearActionsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.go.to.table._case.GoToTableBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.meter._case.MeterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.actions._case.WriteActionsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.metadata._case.WriteMetadataBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.ApplyActionsCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.GotoTableCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.MeterCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.WriteActionsCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.WriteMetadataCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModCommand;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlags;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder;
+import org.opendaylight.yangtools.yang.binding.AbstractAugmentable;
+import org.opendaylight.yangtools.yang.common.Uint16;
+import org.opendaylight.yangtools.yang.common.Uint32;
+import org.opendaylight.yangtools.yang.common.Uint64;
+import org.opendaylight.yangtools.yang.common.Uint8;
+
+/**
+ * Unit tests for flow conversion.
+ *
+ * @author michal.polkorab
+ */
+public class FlowConvertorTest {
+ private ConvertorManager convertorManager;
+
+ @Before
+ public void setUp() {
+ convertorManager = ConvertorManagerFactory.createDefaultManager();
+ }
+
+ /**
+ * Tests {@link FlowConvertor#convert(Flow, VersionDatapathIdConvertorData)} }.
+ */
+ @Test
+ public void test() {
+ RemoveFlowInputBuilder flowBuilder = new RemoveFlowInputBuilder();
+ flowBuilder.setBarrier(false);
+ flowBuilder.setCookie(new FlowCookie(Uint64.valueOf(4)));
+ flowBuilder.setCookieMask(new FlowCookie(Uint64.valueOf(5)));
+ flowBuilder.setTableId(Uint8.valueOf(6));
+ flowBuilder.setStrict(true);
+ flowBuilder.setIdleTimeout(Uint16.valueOf(50));
+ flowBuilder.setHardTimeout(Uint16.valueOf(500));
+ flowBuilder.setPriority(Uint16.valueOf(40));
+ flowBuilder.setBufferId(Uint32.valueOf(18));
+ flowBuilder.setOutPort(Uint64.valueOf(65535));
+ flowBuilder.setOutGroup(Uint32.valueOf(5000));
+ flowBuilder.setFlags(null);
+ flowBuilder.setMatch(null);
+ RemoveFlowInput flow = flowBuilder.build();
+
+ VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3);
+ data.setDatapathId(Uint64.valueOf(42));
+
+ List<FlowModInputBuilder> flowMod = convert(flow, data);
+
+ Assert.assertEquals("Wrong version", 4, flowMod.get(0).getVersion().intValue());
+ Assert.assertEquals("Wrong cookie", 4, flowMod.get(0).getCookie().intValue());
+ Assert.assertEquals("Wrong cookie mask", 5, flowMod.get(0).getCookieMask().intValue());
+ Assert.assertEquals("Wrong table id", 6, flowMod.get(0).getTableId().getValue().intValue());
+ Assert.assertEquals("Wrong command", FlowModCommand.OFPFCDELETESTRICT, flowMod.get(0).getCommand());
+ Assert.assertEquals("Wrong idle timeout", 50, flowMod.get(0).getIdleTimeout().intValue());
+ Assert.assertEquals("Wrong hard timeout", 500, flowMod.get(0).getHardTimeout().intValue());
+ Assert.assertEquals("Wrong priority", 40, flowMod.get(0).getPriority().intValue());
+ Assert.assertEquals("Wrong buffer id", 18, flowMod.get(0).getBufferId().intValue());
+ Assert.assertEquals("Wrong out port", 65535, flowMod.get(0).getOutPort().getValue().intValue());
+ Assert.assertEquals("Wrong out group", 5000, flowMod.get(0).getOutGroup().intValue());
+ Assert.assertEquals("Wrong flags", new FlowModFlags(false, false, false, false, false),
+ flowMod.get(0).getFlags());
+ Assert.assertEquals("Wrong match",
+ "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmMatchType",
+ flowMod.get(0).getMatch().getType().getName());
+ Assert.assertEquals("Wrong match entries size", 0, flowMod.get(0).getMatch().nonnullMatchEntry().size());
+ }
+
+ /**
+ * Tests {@link FlowConvertor#convert(Flow, VersionDatapathIdConvertorData)} }.
+ */
+ @Test
+ public void testOnlyModifyStrictCommand() {
+ UpdatedFlowBuilder flowBuilder = new UpdatedFlowBuilder();
+ flowBuilder.setStrict(true);
+ UpdatedFlow flow = flowBuilder.build();
+
+ VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_0);
+ data.setDatapathId(Uint64.valueOf(42));
+
+ List<FlowModInputBuilder> flowMod = convert(flow, data);
+
+ Assert.assertEquals("Wrong version", 1, flowMod.get(0).getVersion().intValue());
+ Assert.assertEquals("Wrong command", FlowModCommand.OFPFCADD, flowMod.get(0).getCommand());
+ }
+
+ /**
+ * Tests {@link FlowConvertor#convert(Flow, VersionDatapathIdConvertorData)} }.
+ */
+ @Test
+ public void testInstructionsTranslation() {
+ InstructionBuilder instructionBuilder = new InstructionBuilder();
+ GoToTableCaseBuilder goToCaseBuilder = new GoToTableCaseBuilder();
+ GoToTableBuilder goToBuilder = new GoToTableBuilder();
+ goToBuilder.setTableId(Uint8.ONE);
+ goToCaseBuilder.setGoToTable(goToBuilder.build());
+ instructionBuilder.setInstruction(goToCaseBuilder.build());
+ instructionBuilder.setOrder(0);
+
+ List<Instruction> instructions = new ArrayList<>();
+ instructions.add(instructionBuilder.build());
+ instructionBuilder = new InstructionBuilder();
+ WriteMetadataCaseBuilder metaCaseBuilder = new WriteMetadataCaseBuilder();
+ WriteMetadataBuilder metaBuilder = new WriteMetadataBuilder();
+ metaBuilder.setMetadata(Uint64.valueOf(2));
+ metaBuilder.setMetadataMask(Uint64.valueOf(3));
+ metaCaseBuilder.setWriteMetadata(metaBuilder.build());
+ instructionBuilder.setInstruction(metaCaseBuilder.build());
+ instructionBuilder.setOrder(1);
+ instructions.add(instructionBuilder.build());
+ instructionBuilder = new InstructionBuilder();
+ WriteActionsCaseBuilder writeCaseBuilder = new WriteActionsCaseBuilder();
+ WriteActionsBuilder writeBuilder = new WriteActionsBuilder();
+ writeBuilder.setAction(Map.of());
+ writeCaseBuilder.setWriteActions(writeBuilder.build());
+ instructionBuilder.setInstruction(writeCaseBuilder.build());
+ instructionBuilder.setOrder(2);
+ instructions.add(instructionBuilder.build());
+ instructionBuilder = new InstructionBuilder();
+ ApplyActionsCaseBuilder applyCaseBuilder = new ApplyActionsCaseBuilder();
+ ApplyActionsBuilder applyBuilder = new ApplyActionsBuilder();
+ applyBuilder.setAction(Map.of());
+ applyCaseBuilder.setApplyActions(applyBuilder.build());
+ instructionBuilder.setInstruction(applyCaseBuilder.build());
+ instructionBuilder.setOrder(3);
+ instructions.add(instructionBuilder.build());
+ instructionBuilder = new InstructionBuilder();
+ ClearActionsCaseBuilder clearCaseBuilder = new ClearActionsCaseBuilder();
+ ClearActionsBuilder clearBuilder = new ClearActionsBuilder();
+ clearBuilder.setAction(Map.of());
+ clearCaseBuilder.setClearActions(clearBuilder.build());
+ instructionBuilder.setInstruction(clearCaseBuilder.build());
+ instructionBuilder.setOrder(4);
+ instructions.add(instructionBuilder.build());
+ instructionBuilder = new InstructionBuilder();
+ MeterCaseBuilder meterCaseBuilder = new MeterCaseBuilder();
+ MeterBuilder meterBuilder = new MeterBuilder();
+ meterBuilder.setMeterId(new MeterId(Uint32.valueOf(5)));
+ meterCaseBuilder.setMeter(meterBuilder.build());
+ instructionBuilder.setInstruction(meterCaseBuilder.build());
+ instructionBuilder.setOrder(5);
+ instructions.add(instructionBuilder.build());
+
+ InstructionsBuilder instructionsBuilder = new InstructionsBuilder();
+ instructionsBuilder.setInstruction(instructions);
+
+ AddFlowInputBuilder flowBuilder = new AddFlowInputBuilder();
+ flowBuilder.setInstructions(instructionsBuilder.build());
+ AddFlowInput flow = flowBuilder.build();
+
+ VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_0);
+ data.setDatapathId(Uint64.valueOf(42));
+ List<FlowModInputBuilder> flowMod = convert(flow, data);
+
+ Assert.assertEquals("Wrong version", 1, flowMod.get(0).getVersion().intValue());
+ Assert.assertEquals("Wrong command", FlowModCommand.OFPFCADD, flowMod.get(0).getCommand());
+ Assert.assertEquals("Wrong instructions size", 6, flowMod.get(0).getInstruction().size());
+ org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions
+ .grouping.Instruction instruction = flowMod.get(0).getInstruction().get(0);
+ Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"
+ + ".instruction.rev130731.instruction.grouping.instruction.choice.GotoTableCase",
+ instruction.getInstructionChoice().implementedInterface().getName());
+ GotoTableCase gotoTableCase = (GotoTableCase) instruction.getInstructionChoice();
+ Assert.assertEquals("Wrong table id", 1, gotoTableCase.getGotoTable().getTableId().intValue());
+ instruction = flowMod.get(0).getInstruction().get(1);
+ Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"
+ + ".instruction.rev130731.instruction.grouping.instruction.choice.WriteMetadataCase",
+ instruction.getInstructionChoice().implementedInterface().getName());
+ WriteMetadataCase writeMetadataCase = (WriteMetadataCase) instruction.getInstructionChoice();
+ Assert.assertArrayEquals("Wrong metadata", new byte[]{0, 0, 0, 0, 0, 0, 0, 2},
+ writeMetadataCase.getWriteMetadata().getMetadata());
+ Assert.assertArrayEquals("Wrong metadata mask", new byte[]{0, 0, 0, 0, 0, 0, 0, 3},
+ writeMetadataCase.getWriteMetadata().getMetadataMask());
+
+ instruction = flowMod.get(0).getInstruction().get(2);
+ Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"
+ + ".instruction.rev130731.instruction.grouping.instruction.choice.WriteActionsCase",
+ instruction.getInstructionChoice().implementedInterface().getName());
+ WriteActionsCase writeActionsCase = (WriteActionsCase) instruction.getInstructionChoice();
+ Assert.assertEquals("Wrong actions size", 0, writeActionsCase.getWriteActions().nonnullAction().size());
+ instruction = flowMod.get(0).getInstruction().get(3);
+ Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"
+ + ".instruction.rev130731.instruction.grouping.instruction.choice.ApplyActionsCase",
+ instruction.getInstructionChoice().implementedInterface().getName());
+ ApplyActionsCase applyActionsCase = (ApplyActionsCase) instruction.getInstructionChoice();
+ Assert.assertEquals("Wrong actions size", 0, applyActionsCase.getApplyActions().nonnullAction().size());
+ instruction = flowMod.get(0).getInstruction().get(4);
+ Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"
+ + ".instruction.rev130731.instruction.grouping.instruction.choice.ClearActionsCase",
+ instruction.getInstructionChoice().implementedInterface().getName());
+ instruction = flowMod.get(0).getInstruction().get(5);
+ Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"
+ + ".instruction.rev130731.instruction.grouping.instruction.choice.MeterCase",
+ instruction.getInstructionChoice().implementedInterface().getName());
+ MeterCase meterCase = (MeterCase) instruction.getInstructionChoice();
+ Assert.assertEquals("Wrong meter id", 5, meterCase.getMeter().getMeterId().intValue());
+ }
+
+ @Test
+ public void testCloneAndAugmentFlowWithSetVlanId() {
+ MockFlow mockFlow = new MockFlow();
+ Action action1 = createAction(
+ new SetVlanIdActionCaseBuilder().setSetVlanIdAction(
+ new SetVlanIdActionBuilder().setVlanId(new VlanId(Uint16.TEN)).build())
+ .build(),
+ 0);
+
+ mockFlow.setMatch(new MatchBuilder().setEthernetMatch(createEthernetMatch()).build());
+ mockFlow.setInstructions(toApplyInstruction(Collections.singletonList(action1)));
+
+ VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3);
+ data.setDatapathId(Uint64.ONE);
+
+ List<FlowModInputBuilder> flowModInputBuilders = convert(mockFlow, data);
+
+ Assert.assertEquals(2, flowModInputBuilders.size());
+
+ }
+
+ private List<FlowModInputBuilder> convert(final Flow flow, final VersionDatapathIdConvertorData data) {
+ Optional<List<FlowModInputBuilder>> flowModOptional = convertorManager.convert(flow, data);
+ Assert.assertTrue("Flow convertor not found", flowModOptional.isPresent());
+ return flowModOptional.get();
+ }
+
+ private static Action createAction(
+ final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action actionCase,
+ final int order) {
+ Action action = new ActionBuilder().setOrder(order).setAction(actionCase).build();
+ return action;
+ }
+
+ private static EthernetMatch createEthernetMatch() {
+ return new EthernetMatchBuilder()
+ .setEthernetType(new EthernetTypeBuilder().setType(new EtherType(Uint32.valueOf(33024))).build())
+ .build();
+ }
+
+ private static Instructions toApplyInstruction(
+ final List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list
+ .Action> actions) {
+ return new InstructionsBuilder().setInstruction(Collections.singletonList(new InstructionBuilder().setOrder(0)
+ .setInstruction(new ApplyActionsCaseBuilder()
+ .setApplyActions(new ApplyActionsBuilder().setAction(actions).build()).build())
+ .build())).build();
+ }
+
+ private static class MockFlow extends AbstractAugmentable<AddFlowInput> implements AddFlowInput {
+ private Instructions instructions;
+ private Match match;
+
+ public void setInstructions(final Instructions instructions) {
+ this.instructions = instructions;
+ }
+
+ public void setMatch(final Match match) {
+ this.match = match;
+ }
+
+ @Override
+ public FlowRef getFlowRef() {
+ return null;
+ }
+
+ @Override
+ public FlowTableRef getFlowTable() {
+ return null;
+ }
+
+ @Override
+ public Match getMatch() {
+ return match;
+ }
+
+ @Override
+ public Instructions getInstructions() {
+ return instructions;
+ }
+
+ @Override
+ public String getContainerName() {
+ return null;
+ }
+
+ @Override
+ public FlowCookie getCookieMask() {
+ return null;
+ }
+
+ @Override
+ public Uint32 getBufferId() {
+ return null;
+ }
+
+ @Override
+ public Uint64 getOutPort() {
+ return null;
+ }
+
+ @Override
+ public Uint32 getOutGroup() {
+ return null;
+ }
+
+ @Override
+ public org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags getFlags() {
+ return null;
+ }
+
+ @Override
+ public String getFlowName() {
+ return null;
+ }
+
+ @Override
+ public Boolean getInstallHw() {
+ return null;
+ }
+
+ @Override
+ public Boolean getBarrier() {
+ return null;
+ }
+
+ @Override
+ public Boolean getStrict() {
+ return null;
+ }
+
+ @Override
+ public Uint16 getPriority() {
+ return null;
+ }
+
+ @Override
+ public Uint16 getIdleTimeout() {
+ return null;
+ }
+
+ @Override
+ public Uint16 getHardTimeout() {
+ return null;
+ }
+
+ @Override
+ public FlowCookie getCookie() {
+ return null;
+ }
+
+ @Override
+ public Uint8 getTableId() {
+ return null;
+ }
+
+ @Override
+ public NodeRef getNode() {
+ return null;
+ }
+
+ @Override
+ public Uri getTransactionUri() {
+ return null;
+ }
+ }
+}