Bug 5540 - PacketOutConvertor
[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     @Before\r
56     public void init() {\r
57         OpenflowPortsUtil.init();\r
58     }\r
59 \r
60     /**\r
61      * Test for {@link PacketOutConvertor} with null parameters\r
62      */\r
63     @Test\r
64     public void toPacketOutInputAllParmNullTest() {\r
65 \r
66         TransmitPacketInputBuilder transmitPacketInputBuilder = new TransmitPacketInputBuilder();\r
67 \r
68         Long bufferId = null;\r
69 \r
70         String NODE_ID = "0";\r
71         String port = "0";\r
72 \r
73         NodeRef ref = createNodeRef(NODE_ID);\r
74         NodeConnectorKey nodeConnKey = PacketOutConvertorTest.createNodeConnKey(NODE_ID, port);\r
75         NodeConnectorRef nEgressConfRef = new NodeConnectorRef(\r
76                 createNodeConnRef(NODE_ID, nodeConnKey));\r
77 \r
78         transmitPacketInputBuilder.setBufferId(bufferId);\r
79         transmitPacketInputBuilder.setConnectionCookie(null);\r
80         transmitPacketInputBuilder.setAction(null);\r
81         transmitPacketInputBuilder.setNode(ref);\r
82         transmitPacketInputBuilder.setPayload(null);\r
83         transmitPacketInputBuilder.setEgress(nEgressConfRef);\r
84         transmitPacketInputBuilder.setIngress(null);\r
85         TransmitPacketInput transmitPacketInput = transmitPacketInputBuilder\r
86                 .build();\r
87 \r
88         Short version = (short) 0x04;\r
89         Long xid = null;\r
90         PacketOutConvertorData data = new PacketOutConvertorData(version);\r
91         PacketOutInput message = convert(transmitPacketInput, data);\r
92 \r
93         //FIXME : this has to be fixed along with actions changed in openflowjava\r
94 \r
95         Assert.assertEquals(buildActionForNullTransmitPacketInputAction(nodeConnKey, version), message.getAction());\r
96 \r
97         Assert.assertEquals(OFConstants.OFP_NO_BUFFER, message.getBufferId());\r
98         Assert.assertEquals(new PortNumber(0xfffffffdL), message.getInPort());\r
99         Assert.assertEquals(version, message.getVersion());\r
100         Assert.assertEquals(xid, message.getXid());\r
101         Assert.assertArrayEquals(transmitPacketInput.getPayload(), message.getData());\r
102     }\r
103 \r
104     /**\r
105      * Test for PacketOutConvertor\r
106      */\r
107     @Test\r
108     public void toPacketOutInputAllParmTest() {\r
109         TransmitPacketInputBuilder transmitPacketInputBuilder = new TransmitPacketInputBuilder();\r
110 \r
111         List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actionList = new ArrayList<>();\r
112         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
113 \r
114         OutputActionBuilder output = new OutputActionBuilder();\r
115         output.setMaxLength(OFConstants.OFPCML_NO_BUFFER);\r
116         Uri value = new Uri(OutputPortValues.CONTROLLER.toString());\r
117         output.setOutputNodeConnector(value);\r
118         ab.setAction(new OutputActionCaseBuilder().setOutputAction(\r
119                 output.build()).build());\r
120         ab.setOrder(0);\r
121         ab.setKey(new ActionKey(0));\r
122         actionList.add(ab.build());\r
123 \r
124         Long bufferId = 0xfL;\r
125 \r
126         Long valueForCookie = 0xeL;\r
127         ConnectionCookie connCook = new ConnectionCookie(valueForCookie);\r
128 \r
129         String NODE_ID = "node:1";\r
130 \r
131         NodeRef ref = createNodeRef(NODE_ID);\r
132 \r
133         String portO = "0xfffffffd";\r
134         NodeConnectorKey nEgrConKey = PacketOutConvertorTest.createNodeConnKey(NODE_ID, portO);\r
135         NodeConnectorRef nEgressConfRef = new NodeConnectorRef(\r
136                 createNodeConnRef(NODE_ID, nEgrConKey));\r
137 \r
138         String inPort = "2";\r
139         NodeConnectorKey nIngrConKey = PacketOutConvertorTest.createNodeConnKey(NODE_ID, inPort);\r
140         NodeConnectorRef nIngressConRef = new NodeConnectorRef(\r
141                 createNodeConnRef(NODE_ID, nIngrConKey));\r
142 \r
143         String _string = new String("sendOutputMsg_TEST");\r
144         byte[] msg = _string.getBytes();\r
145 \r
146         byte[] payload = msg;\r
147 \r
148         transmitPacketInputBuilder.setAction(actionList);\r
149         transmitPacketInputBuilder.setBufferId(bufferId);\r
150         transmitPacketInputBuilder.setConnectionCookie(connCook);\r
151         transmitPacketInputBuilder.setEgress(nEgressConfRef);\r
152         transmitPacketInputBuilder.setIngress(nIngressConRef);\r
153         transmitPacketInputBuilder.setNode(ref);\r
154         transmitPacketInputBuilder.setPayload(payload);\r
155 \r
156         TransmitPacketInput transmitPacketInput = transmitPacketInputBuilder\r
157                 .build();\r
158 \r
159         short version = (short) 0x04;\r
160         byte[] datapathIdByte = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES];\r
161         for (int i = 0; i < datapathIdByte.length; i++) {\r
162             datapathIdByte[i] = 1;\r
163         }\r
164         BigInteger datapathId = new BigInteger(1, datapathIdByte);\r
165         Long xid = 0xfffffL;\r
166 \r
167         OpenflowPortsUtil.init();\r
168 \r
169         PacketOutConvertorData data = new PacketOutConvertorData(version);\r
170         data.setXid(xid);\r
171         data.setDatapathId(datapathId);\r
172         PacketOutInput message = convert(transmitPacketInput, data);\r
173 \r
174         Assert.assertEquals(transmitPacketInput.getBufferId(),\r
175                 message.getBufferId());\r
176         Assert.assertEquals("PortNumber [_value=" + inPort + "]", message\r
177                 .getInPort().toString());\r
178         Assert.assertEquals((Object) version,\r
179                 Short.valueOf(message.getVersion()));\r
180         Assert.assertEquals(xid, message.getXid());\r
181 \r
182         ActionConvertorData actionConvertorData = new ActionConvertorData(version);\r
183         actionConvertorData.setDatapathId(datapathId);\r
184 \r
185         Optional<List<Action>> actionsOptional = ConvertorManager.getInstance().convert(\r
186                 actionList, actionConvertorData);\r
187 \r
188         List<Action> actions = actionsOptional.orElse(Collections.emptyList());\r
189         Assert.assertEquals(actions, message.getAction());\r
190         Assert.assertArrayEquals(transmitPacketInput.getPayload(), message.getData());\r
191     }\r
192 \r
193     /**\r
194      * create action\r
195      *\r
196      * @param nConKey\r
197      * @param version\r
198      * @return\r
199      */\r
200     private static List<Action> buildActionForNullTransmitPacketInputAction(\r
201             final NodeConnectorKey nConKey, final short version) {\r
202 \r
203         PortNumber outPort = getPortNumber(nConKey, version);\r
204         List<Action> actions = new ArrayList<>();\r
205         ActionBuilder aBuild = new ActionBuilder();\r
206 \r
207         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.OutputActionCaseBuilder outputActionCaseBuilder =\r
208                 new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.OutputActionCaseBuilder();\r
209 \r
210         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.output.action._case.OutputActionBuilder outputActionBuilder =\r
211                 new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.output.action._case.OutputActionBuilder();\r
212 \r
213         outputActionBuilder.setPort(outPort);\r
214         outputActionBuilder.setMaxLength(0xffff);\r
215         outputActionCaseBuilder.setOutputAction(outputActionBuilder.build());\r
216         aBuild.setActionChoice(outputActionCaseBuilder.build());\r
217         actions.add(aBuild.build());\r
218         return actions;\r
219     }\r
220 \r
221     /**\r
222      * create PortNumber\r
223      *\r
224      * @param nConKey\r
225      * @param ofVersion\r
226      * @return\r
227      */\r
228     private static PortNumber getPortNumber(final NodeConnectorKey nConKey,\r
229                                             final Short ofVersion) {\r
230         Long port = InventoryDataServiceUtil.portNumberfromNodeConnectorId(\r
231                 OpenflowVersion.get(ofVersion), nConKey.getId());\r
232         return new PortNumber(port);\r
233     }\r
234 \r
235     /**\r
236      * create NodeConnectorRef\r
237      *\r
238      * @param nodeId\r
239      * @param nConKey\r
240      * @return\r
241      */\r
242     private static NodeConnectorRef createNodeConnRef(final String nodeId,\r
243                                                       final NodeConnectorKey nConKey) {\r
244 \r
245         InstanceIdentifier<NodeConnector> path = InstanceIdentifier\r
246                 .<Nodes>builder(Nodes.class)\r
247                 .<Node, NodeKey>child(Node.class,\r
248                         new NodeKey(new NodeId(nodeId)))\r
249                 .<NodeConnector, NodeConnectorKey>child(NodeConnector.class,\r
250                         nConKey).build();\r
251 \r
252         return new NodeConnectorRef(path);\r
253     }\r
254 \r
255     /**\r
256      * create NodeConnectorKey\r
257      *\r
258      * @param nodeId\r
259      * @param port\r
260      * @return\r
261      */\r
262     private static NodeConnectorKey createNodeConnKey(final String nodeId,\r
263                                                       final String port) {\r
264         StringBuilder sBuild = new StringBuilder(nodeId).append(':').append(\r
265                 port);\r
266 \r
267         return new NodeConnectorKey(new NodeConnectorId(sBuild.toString()));\r
268     }\r
269 \r
270     /**\r
271      * create NodeRef\r
272      *\r
273      * @param nodeId\r
274      * @return\r
275      */\r
276     private static NodeRef createNodeRef(final String nodeId) {\r
277         NodeKey key = new NodeKey(new NodeId(nodeId));\r
278         InstanceIdentifier<Node> path = InstanceIdentifier\r
279                 .<Nodes>builder(Nodes.class)\r
280                 .<Node, NodeKey>child(Node.class, key).build();\r
281         return new NodeRef(path);\r
282     }\r
283 \r
284     private PacketOutInput convert(TransmitPacketInput transmitPacketInput, PacketOutConvertorData data) {\r
285         Optional<PacketOutInput> messageOptional = ConvertorManager.getInstance().convert(transmitPacketInput, data);\r
286         return messageOptional.orElse(PacketOutConvertor.defaultResult(data.getVersion()));\r
287     }\r
288 }\r