Bug 5540 - ActionConvertor, ActionResponseConvertor
[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.util.InventoryDataServiceUtil;\r
24 import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;\r
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.ActionBuilder;\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.ConnectionCookie;\r
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;\r
46 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
47 \r
48 /**\r
49  * Created by Jakub Toth jatoth@cisco.com on 9/23/14.\r
50  */\r
51 \r
52 public class PacketOutConvertorTest {\r
53 \r
54     @Before\r
55     public void init() {\r
56         OpenflowPortsUtil.init();\r
57     }\r
58 \r
59     /**\r
60      * Test for {@link PacketOutConvertor} with null parameters\r
61      */\r
62     @Test\r
63     public void toPacketOutInputAllParmNullTest() {\r
64 \r
65         TransmitPacketInputBuilder transmitPacketInputBuilder = new TransmitPacketInputBuilder();\r
66 \r
67         Long bufferId = null;\r
68 \r
69         String NODE_ID = "0";\r
70         String port = "0";\r
71 \r
72         NodeRef ref = createNodeRef(NODE_ID);\r
73         NodeConnectorKey nodeConnKey = PacketOutConvertorTest.createNodeConnKey(NODE_ID, port);\r
74         NodeConnectorRef nEgressConfRef = new NodeConnectorRef(\r
75                 createNodeConnRef(NODE_ID, nodeConnKey));\r
76 \r
77         transmitPacketInputBuilder.setBufferId(bufferId);\r
78         transmitPacketInputBuilder.setConnectionCookie(null);\r
79         transmitPacketInputBuilder.setAction(null);\r
80         transmitPacketInputBuilder.setNode(ref);\r
81         transmitPacketInputBuilder.setPayload(null);\r
82         transmitPacketInputBuilder.setEgress(nEgressConfRef);\r
83         transmitPacketInputBuilder.setIngress(null);\r
84         TransmitPacketInput transmitPacketInput = transmitPacketInputBuilder\r
85                 .build();\r
86 \r
87         Short version = (short) 0x04;\r
88         Long xid = null;\r
89         PacketOutInput message = PacketOutConvertor.toPacketOutInput(\r
90                 transmitPacketInput, version, null, null);\r
91 \r
92         //FIXME : this has to be fixed along with actions changed in openflowjava\r
93 \r
94         Assert.assertEquals(PacketOutConvertorTest.buildActionForNullTransmitPacketInputAction(nodeConnKey,\r
95                 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         PacketOutInput message = PacketOutConvertor.toPacketOutInput(\r
170                 transmitPacketInput, version, xid, datapathId);\r
171 \r
172         Assert.assertEquals(transmitPacketInput.getBufferId(),\r
173                 message.getBufferId());\r
174         Assert.assertEquals("PortNumber [_value=" + inPort + "]", message\r
175                 .getInPort().toString());\r
176         Assert.assertEquals((Object) version,\r
177                 Short.valueOf(message.getVersion()));\r
178         Assert.assertEquals(xid, message.getXid());\r
179         ActionConvertorData actionConvertorData = new ActionConvertorData(version);\r
180         actionConvertorData.setDatapathId(datapathId);\r
181 \r
182         Optional<List<Action>> actionsOptional = ConvertorManager.getInstance().convert(\r
183                 actionList, actionConvertorData);\r
184 \r
185         List<Action> actions = actionsOptional.orElse(Collections.emptyList());\r
186         Assert.assertEquals(actions, message.getAction());\r
187         Assert.assertArrayEquals(transmitPacketInput.getPayload(), message.getData());\r
188     }\r
189 \r
190     /**\r
191      * create action\r
192      *\r
193      * @param nConKey\r
194      * @param version\r
195      * @return\r
196      */\r
197     private static List<Action> buildActionForNullTransmitPacketInputAction(\r
198             final NodeConnectorKey nConKey, final short version) {\r
199 \r
200         PortNumber outPort = getPortNumber(nConKey, version);\r
201         List<Action> actions = new ArrayList<>();\r
202         ActionBuilder aBuild = new ActionBuilder();\r
203 \r
204         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.OutputActionCaseBuilder outputActionCaseBuilder =\r
205                 new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.OutputActionCaseBuilder();\r
206 \r
207         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.output.action._case.OutputActionBuilder outputActionBuilder =\r
208                 new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.output.action._case.OutputActionBuilder();\r
209 \r
210         outputActionBuilder.setPort(outPort);\r
211         outputActionBuilder.setMaxLength(0xffff);\r
212         outputActionCaseBuilder.setOutputAction(outputActionBuilder.build());\r
213         aBuild.setActionChoice(outputActionCaseBuilder.build());\r
214         actions.add(aBuild.build());\r
215         return actions;\r
216     }\r
217 \r
218     /**\r
219      * create PortNumber\r
220      *\r
221      * @param nConKey\r
222      * @param ofVersion\r
223      * @return\r
224      */\r
225     private static PortNumber getPortNumber(final NodeConnectorKey nConKey,\r
226                                             final Short ofVersion) {\r
227         Long port = InventoryDataServiceUtil.portNumberfromNodeConnectorId(\r
228                 OpenflowVersion.get(ofVersion), nConKey.getId());\r
229         return new PortNumber(port);\r
230     }\r
231 \r
232     /**\r
233      * create NodeConnectorRef\r
234      *\r
235      * @param nodeId\r
236      * @param nConKey\r
237      * @return\r
238      */\r
239     private static NodeConnectorRef createNodeConnRef(final String nodeId,\r
240                                                       final NodeConnectorKey nConKey) {\r
241 \r
242         InstanceIdentifier<NodeConnector> path = InstanceIdentifier\r
243                 .<Nodes>builder(Nodes.class)\r
244                 .<Node, NodeKey>child(Node.class,\r
245                         new NodeKey(new NodeId(nodeId)))\r
246                 .<NodeConnector, NodeConnectorKey>child(NodeConnector.class,\r
247                         nConKey).build();\r
248 \r
249         return new NodeConnectorRef(path);\r
250     }\r
251 \r
252     /**\r
253      * create NodeConnectorKey\r
254      *\r
255      * @param nodeId\r
256      * @param port\r
257      * @return\r
258      */\r
259     private static NodeConnectorKey createNodeConnKey(final String nodeId,\r
260                                                       final String port) {\r
261         StringBuilder sBuild = new StringBuilder(nodeId).append(':').append(\r
262                 port);\r
263 \r
264         return new NodeConnectorKey(new NodeConnectorId(sBuild.toString()));\r
265     }\r
266 \r
267     /**\r
268      * create NodeRef\r
269      *\r
270      * @param nodeId\r
271      * @return\r
272      */\r
273     private static NodeRef createNodeRef(final String nodeId) {\r
274         NodeKey key = new NodeKey(new NodeId(nodeId));\r
275         InstanceIdentifier<Node> path = InstanceIdentifier\r
276                 .<Nodes>builder(Nodes.class)\r
277                 .<Node, NodeKey>child(Node.class, key).build();\r
278         return new NodeRef(path);\r
279     }\r
280 }\r