* and is available at http://www.eclipse.org/legal/epl-v10.html\r
*/\r
\r
-package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;\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.openflowjava.protocol.api.util.EncodeConstants;\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.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.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
public class FlowConvertorTest {\r
\r
/**\r
- * Tests {@link FlowConvertor#toFlowModInputs(Flow, short, BigInteger)}\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
flowBuilder.setMatch(null);\r
RemoveFlowInput flow = flowBuilder.build();\r
\r
- List<FlowModInputBuilder> flowMod = FlowConvertor\r
- .toFlowModInputs(flow, EncodeConstants.OF13_VERSION_ID, new BigInteger("42"));\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
}\r
\r
/**\r
- * Tests {@link FlowConvertor#toFlowModInputs(Flow, short, BigInteger)}\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
flowBuilder.setStrict(true);\r
UpdatedFlow flow = flowBuilder.build();\r
\r
- List<FlowModInputBuilder> flowMod = FlowConvertor\r
- .toFlowModInputs(flow, EncodeConstants.OF10_VERSION_ID, new BigInteger("42"));\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 FlowConvertor#toFlowModInputs(Flow, short, BigInteger)}\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
flowBuilder.setInstructions(instructionsBuilder.build());\r
AddFlowInput flow = flowBuilder.build();\r
\r
- List<FlowModInputBuilder> flowMod = FlowConvertor\r
- .toFlowModInputs(flow, EncodeConstants.OF10_VERSION_ID, new BigInteger("42"));\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
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