Merge "Mask Support for TCP and UDP ports in nicira extension "
[openflowplugin.git] / openflowplugin / src / test / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / PacketOutConvertorTest.java
1 /*\r
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 \r
9 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;\r
10 \r
11 import java.math.BigInteger;\r
12 import java.util.ArrayList;\r
13 import java.util.Collections;\r
14 import java.util.List;\r
15 import java.util.Optional;\r
16 import org.junit.Assert;\r
17 import org.junit.Before;\r
18 import org.junit.Test;\r
19 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
20 import org.opendaylight.openflowplugin.api.OFConstants;\r
21 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;\r
22 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.data.ActionConvertorData;\r
23 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.PacketOutConvertorData;\r
24 import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;\r
25 import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;\r
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.ActionBuilder;\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;\r
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.ConnectionCookie;\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;\r
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;\r
47 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
48 \r
49 /**\r
50  * Created by Jakub Toth jatoth@cisco.com on 9/23/14.\r
51  */\r
52 \r
53 public class PacketOutConvertorTest {\r
54 \r
55     private ConvertorManager convertorManager;\r
56 \r
57     @Before\r
58     public void setUp() {\r
59         OpenflowPortsUtil.init();\r
60         convertorManager = ConvertorManagerFactory.createDefaultManager();\r
61     }\r
62 \r
63     /**\r
64      * Test for {@link PacketOutConvertor} with null parameters\r
65      */\r
66     @Test\r
67     public void toPacketOutInputAllParmNullTest() {\r
68 \r
69         TransmitPacketInputBuilder transmitPacketInputBuilder = new TransmitPacketInputBuilder();\r
70 \r
71         Long bufferId = null;\r
72 \r
73         String NODE_ID = "0";\r
74         String port = "0";\r
75 \r
76         NodeRef ref = createNodeRef(NODE_ID);\r
77         NodeConnectorKey nodeConnKey = PacketOutConvertorTest.createNodeConnKey(NODE_ID, port);\r
78         NodeConnectorRef nEgressConfRef = new NodeConnectorRef(\r
79                 createNodeConnRef(NODE_ID, nodeConnKey));\r
80 \r
81         transmitPacketInputBuilder.setBufferId(bufferId);\r
82         transmitPacketInputBuilder.setConnectionCookie(null);\r
83         transmitPacketInputBuilder.setAction(null);\r
84         transmitPacketInputBuilder.setNode(ref);\r
85         transmitPacketInputBuilder.setPayload(null);\r
86         transmitPacketInputBuilder.setEgress(nEgressConfRef);\r
87         transmitPacketInputBuilder.setIngress(null);\r
88         TransmitPacketInput transmitPacketInput = transmitPacketInputBuilder\r
89                 .build();\r
90 \r
91         Short version = (short) 0x04;\r
92         Long xid = null;\r
93         PacketOutConvertorData data = new PacketOutConvertorData(version);\r
94         PacketOutInput message = convert(transmitPacketInput, data);\r
95 \r
96         //FIXME : this has to be fixed along with actions changed in openflowjava\r
97 \r
98         Assert.assertEquals(buildActionForNullTransmitPacketInputAction(nodeConnKey, version), message.getAction());\r
99 \r
100         Assert.assertEquals(OFConstants.OFP_NO_BUFFER, message.getBufferId());\r
101         Assert.assertEquals(new PortNumber(0xfffffffdL), message.getInPort());\r
102         Assert.assertEquals(version, message.getVersion());\r
103         Assert.assertEquals(xid, message.getXid());\r
104         Assert.assertArrayEquals(transmitPacketInput.getPayload(), message.getData());\r
105     }\r
106 \r
107     /**\r
108      * Test for PacketOutConvertor\r
109      */\r
110     @Test\r
111     public void toPacketOutInputAllParmTest() {\r
112         TransmitPacketInputBuilder transmitPacketInputBuilder = new TransmitPacketInputBuilder();\r
113 \r
114         List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actionList = new ArrayList<>();\r
115         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder ab = new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder();\r
116 \r
117         OutputActionBuilder output = new OutputActionBuilder();\r
118         output.setMaxLength(OFConstants.OFPCML_NO_BUFFER);\r
119         Uri value = new Uri(OutputPortValues.CONTROLLER.toString());\r
120         output.setOutputNodeConnector(value);\r
121         ab.setAction(new OutputActionCaseBuilder().setOutputAction(\r
122                 output.build()).build());\r
123         ab.setOrder(0);\r
124         ab.setKey(new ActionKey(0));\r
125         actionList.add(ab.build());\r
126 \r
127         Long bufferId = 0xfL;\r
128 \r
129         Long valueForCookie = 0xeL;\r
130         ConnectionCookie connCook = new ConnectionCookie(valueForCookie);\r
131 \r
132         String NODE_ID = "node:1";\r
133 \r
134         NodeRef ref = createNodeRef(NODE_ID);\r
135 \r
136         String portO = "0xfffffffd";\r
137         NodeConnectorKey nEgrConKey = PacketOutConvertorTest.createNodeConnKey(NODE_ID, portO);\r
138         NodeConnectorRef nEgressConfRef = new NodeConnectorRef(\r
139                 createNodeConnRef(NODE_ID, nEgrConKey));\r
140 \r
141         String inPort = "2";\r
142         NodeConnectorKey nIngrConKey = PacketOutConvertorTest.createNodeConnKey(NODE_ID, inPort);\r
143         NodeConnectorRef nIngressConRef = new NodeConnectorRef(\r
144                 createNodeConnRef(NODE_ID, nIngrConKey));\r
145 \r
146         String _string = new String("sendOutputMsg_TEST");\r
147         byte[] msg = _string.getBytes();\r
148 \r
149         byte[] payload = msg;\r
150 \r
151         transmitPacketInputBuilder.setAction(actionList);\r
152         transmitPacketInputBuilder.setBufferId(bufferId);\r
153         transmitPacketInputBuilder.setConnectionCookie(connCook);\r
154         transmitPacketInputBuilder.setEgress(nEgressConfRef);\r
155         transmitPacketInputBuilder.setIngress(nIngressConRef);\r
156         transmitPacketInputBuilder.setNode(ref);\r
157         transmitPacketInputBuilder.setPayload(payload);\r
158 \r
159         TransmitPacketInput transmitPacketInput = transmitPacketInputBuilder\r
160                 .build();\r
161 \r
162         short version = (short) 0x04;\r
163         byte[] datapathIdByte = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES];\r
164         for (int i = 0; i < datapathIdByte.length; i++) {\r
165             datapathIdByte[i] = 1;\r
166         }\r
167         BigInteger datapathId = new BigInteger(1, datapathIdByte);\r
168         Long xid = 0xfffffL;\r
169 \r
170         OpenflowPortsUtil.init();\r
171 \r
172         PacketOutConvertorData data = new PacketOutConvertorData(version);\r
173         data.setXid(xid);\r
174         data.setDatapathId(datapathId);\r
175         PacketOutInput message = convert(transmitPacketInput, data);\r
176 \r
177         Assert.assertEquals(transmitPacketInput.getBufferId(),\r
178                 message.getBufferId());\r
179         Assert.assertEquals("PortNumber [_value=" + inPort + "]", message\r
180                 .getInPort().toString());\r
181         Assert.assertEquals((Object) version,\r
182                 Short.valueOf(message.getVersion()));\r
183         Assert.assertEquals(xid, message.getXid());\r
184 \r
185         ActionConvertorData actionConvertorData = new ActionConvertorData(version);\r
186         actionConvertorData.setDatapathId(datapathId);\r
187 \r
188         Optional<List<Action>> actionsOptional = convertorManager.convert(\r
189                 actionList, actionConvertorData);\r
190 \r
191         List<Action> actions = actionsOptional.orElse(Collections.emptyList());\r
192         Assert.assertEquals(actions, message.getAction());\r
193         Assert.assertArrayEquals(transmitPacketInput.getPayload(), message.getData());\r
194     }\r
195 \r
196     /**\r
197      * create action\r
198      *\r
199      * @param nConKey\r
200      * @param version\r
201      * @return\r
202      */\r
203     private static List<Action> buildActionForNullTransmitPacketInputAction(\r
204             final NodeConnectorKey nConKey, final short version) {\r
205 \r
206         PortNumber outPort = getPortNumber(nConKey, version);\r
207         List<Action> actions = new ArrayList<>();\r
208         ActionBuilder aBuild = new ActionBuilder();\r
209 \r
210         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.OutputActionCaseBuilder outputActionCaseBuilder =\r
211                 new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.OutputActionCaseBuilder();\r
212 \r
213         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.output.action._case.OutputActionBuilder outputActionBuilder =\r
214                 new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.output.action._case.OutputActionBuilder();\r
215 \r
216         outputActionBuilder.setPort(outPort);\r
217         outputActionBuilder.setMaxLength(0xffff);\r
218         outputActionCaseBuilder.setOutputAction(outputActionBuilder.build());\r
219         aBuild.setActionChoice(outputActionCaseBuilder.build());\r
220         actions.add(aBuild.build());\r
221         return actions;\r
222     }\r
223 \r
224     /**\r
225      * create PortNumber\r
226      *\r
227      * @param nConKey\r
228      * @param ofVersion\r
229      * @return\r
230      */\r
231     private static PortNumber getPortNumber(final NodeConnectorKey nConKey,\r
232                                             final Short ofVersion) {\r
233         Long port = InventoryDataServiceUtil.portNumberfromNodeConnectorId(\r
234                 OpenflowVersion.get(ofVersion), nConKey.getId());\r
235         return new PortNumber(port);\r
236     }\r
237 \r
238     /**\r
239      * create NodeConnectorRef\r
240      *\r
241      * @param nodeId\r
242      * @param nConKey\r
243      * @return\r
244      */\r
245     private static NodeConnectorRef createNodeConnRef(final String nodeId,\r
246                                                       final NodeConnectorKey nConKey) {\r
247 \r
248         InstanceIdentifier<NodeConnector> path = InstanceIdentifier\r
249                 .<Nodes>builder(Nodes.class)\r
250                 .<Node, NodeKey>child(Node.class,\r
251                         new NodeKey(new NodeId(nodeId)))\r
252                 .<NodeConnector, NodeConnectorKey>child(NodeConnector.class,\r
253                         nConKey).build();\r
254 \r
255         return new NodeConnectorRef(path);\r
256     }\r
257 \r
258     /**\r
259      * create NodeConnectorKey\r
260      *\r
261      * @param nodeId\r
262      * @param port\r
263      * @return\r
264      */\r
265     private static NodeConnectorKey createNodeConnKey(final String nodeId,\r
266                                                       final String port) {\r
267         StringBuilder sBuild = new StringBuilder(nodeId).append(':').append(\r
268                 port);\r
269 \r
270         return new NodeConnectorKey(new NodeConnectorId(sBuild.toString()));\r
271     }\r
272 \r
273     /**\r
274      * create NodeRef\r
275      *\r
276      * @param nodeId\r
277      * @return\r
278      */\r
279     private static NodeRef createNodeRef(final String nodeId) {\r
280         NodeKey key = new NodeKey(new NodeId(nodeId));\r
281         InstanceIdentifier<Node> path = InstanceIdentifier\r
282                 .<Nodes>builder(Nodes.class)\r
283                 .<Node, NodeKey>child(Node.class, key).build();\r
284         return new NodeRef(path);\r
285     }\r
286 \r
287     private PacketOutInput convert(TransmitPacketInput transmitPacketInput, PacketOutConvertorData data) {\r
288         Optional<PacketOutInput> messageOptional = convertorManager.convert(transmitPacketInput, data);\r
289         return messageOptional.orElse(PacketOutConvertor.defaultResult(data.getVersion()));\r
290     }\r
291 }\r