BUG-1491: handle SET_TP_SRC/SET_TP_DST actions
[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.List;\r
14 \r
15 import org.junit.Assert;\r
16 import org.junit.Before;\r
17 import org.junit.Test;\r
18 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
19 import org.opendaylight.openflowplugin.api.OFConstants;\r
20 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;\r
21 import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;\r
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action;\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.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 = this.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         PacketOutInput message = PacketOutConvertor.toPacketOutInput(\r
91                 transmitPacketInput, version, null, null);\r
92 \r
93         Assert.assertEquals(this.buildActionForNullTransmitPacketInputAction(nodeConnKey,\r
94                         version), message.getAction());\r
95         Assert.assertEquals(OFConstants.OFP_NO_BUFFER, message.getBufferId());\r
96         Assert.assertEquals(new PortNumber(0xfffffffdL), message.getInPort());\r
97         Assert.assertEquals(version, message.getVersion());\r
98         Assert.assertEquals(xid, message.getXid());\r
99         Assert.assertEquals(transmitPacketInput.getPayload(), message.getData());\r
100     }\r
101 \r
102     /**\r
103      * Test for PacketOutConvertor\r
104      */\r
105     @Test\r
106     public void toPacketOutInputAllParmTest(){\r
107         TransmitPacketInputBuilder transmitPacketInputBuilder = new TransmitPacketInputBuilder();\r
108 \r
109         List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actionList = new ArrayList<>();\r
110         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
111 \r
112         OutputActionBuilder output = new OutputActionBuilder();\r
113         output.setMaxLength(OFConstants.OFPCML_NO_BUFFER);\r
114         Uri value = new Uri(OutputPortValues.CONTROLLER.toString());\r
115         output.setOutputNodeConnector(value);\r
116         ab.setAction(new OutputActionCaseBuilder().setOutputAction(\r
117                 output.build()).build());\r
118         ab.setOrder(0);\r
119         ab.setKey(new ActionKey(0));\r
120         actionList.add(ab.build());\r
121 \r
122         Long bufferId = 0xfL;\r
123 \r
124         Long valueForCookie = 0xeL;\r
125         ConnectionCookie connCook = new ConnectionCookie(valueForCookie);\r
126 \r
127         String NODE_ID = "node:1";\r
128 \r
129         NodeRef ref = createNodeRef(NODE_ID);\r
130 \r
131         String portO = "0xfffffffd";\r
132         NodeConnectorKey nEgrConKey = this.createNodeConnKey(NODE_ID, portO);\r
133         NodeConnectorRef nEgressConfRef = new NodeConnectorRef(\r
134                 createNodeConnRef(NODE_ID, nEgrConKey));\r
135 \r
136         String inPort = "2";\r
137         NodeConnectorKey nIngrConKey = this.createNodeConnKey(NODE_ID, inPort);\r
138         NodeConnectorRef nIngressConRef = new NodeConnectorRef(\r
139                 createNodeConnRef(NODE_ID, nIngrConKey));\r
140 \r
141         String _string = new String("sendOutputMsg_TEST");\r
142         byte[] msg = _string.getBytes();\r
143 \r
144         byte[] payload = msg;\r
145 \r
146         transmitPacketInputBuilder.setAction(actionList);\r
147         transmitPacketInputBuilder.setBufferId(bufferId);\r
148         transmitPacketInputBuilder.setConnectionCookie(connCook);\r
149         transmitPacketInputBuilder.setEgress(nEgressConfRef);\r
150         transmitPacketInputBuilder.setIngress(nIngressConRef);\r
151         transmitPacketInputBuilder.setNode(ref);\r
152         transmitPacketInputBuilder.setPayload(payload);\r
153 \r
154         TransmitPacketInput transmitPacketInput = transmitPacketInputBuilder\r
155                 .build();\r
156 \r
157         short version = (short) 0x04;\r
158         byte[] datapathIdByte = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES];\r
159         for(int i = 0; i < datapathIdByte.length; i++){\r
160             datapathIdByte[i] = 1;\r
161         }\r
162         BigInteger datapathId = new BigInteger(1, datapathIdByte);\r
163         Long xid = 0xfffffL;\r
164 \r
165         OpenflowPortsUtil.init();\r
166 \r
167         PacketOutInput message = PacketOutConvertor.toPacketOutInput(\r
168                 transmitPacketInput, version, xid, datapathId);\r
169 \r
170         Assert.assertEquals(transmitPacketInput.getBufferId(),\r
171                 message.getBufferId());\r
172         Assert.assertEquals("PortNumber [_value=" + inPort + "]", message\r
173                 .getInPort().toString());\r
174         Assert.assertEquals((Object) version,\r
175                 Short.valueOf(message.getVersion()));\r
176         Assert.assertEquals(xid, message.getXid());\r
177         Assert.assertEquals(\r
178                 ActionConvertor.getActions(actionList, version, datapathId, null),\r
179                 message.getAction());\r
180         Assert.assertEquals(transmitPacketInput.getPayload(), message.getData());\r
181     }\r
182 \r
183     /**\r
184      * create action\r
185      * \r
186      * @param nConKey\r
187      * @param version\r
188      * @return\r
189      */\r
190     private List<Action> buildActionForNullTransmitPacketInputAction(\r
191             final NodeConnectorKey nConKey, final short version){\r
192 \r
193         PortNumber outPort = getPortNumber(nConKey, version);\r
194         List<Action> actions = new ArrayList<>();\r
195         ActionBuilder aBuild = new ActionBuilder();\r
196         aBuild.setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output.class);\r
197         PortActionBuilder paBuild = new PortActionBuilder();\r
198         paBuild.setPort(outPort);\r
199         aBuild.addAugmentation(PortAction.class, paBuild.build());\r
200         MaxLengthActionBuilder mlBuild = new MaxLengthActionBuilder();\r
201         mlBuild.setMaxLength(0xffff);\r
202         aBuild.addAugmentation(MaxLengthAction.class, mlBuild.build());\r
203         actions.add(aBuild.build());\r
204         return actions;\r
205     }\r
206 \r
207     /**\r
208      * create PortNumber\r
209      * \r
210      * @param nConKey\r
211      * @param ofVersion\r
212      * @return\r
213      */\r
214     private static PortNumber getPortNumber(final NodeConnectorKey nConKey,\r
215             final Short ofVersion){\r
216         String[] split = nConKey.getId().getValue().split(":");\r
217         Long port = OpenflowPortsUtil.getPortFromLogicalName(\r
218                 OpenflowVersion.get(ofVersion), split[split.length - 1]);\r
219         return new PortNumber(port);\r
220     }\r
221 \r
222     /**\r
223      * create NodeConnectorRef\r
224      * \r
225      * @param nodeId\r
226      * @param nConKey\r
227      * @return\r
228      */\r
229     private static NodeConnectorRef createNodeConnRef(final String nodeId,\r
230             final NodeConnectorKey nConKey){\r
231 \r
232         InstanceIdentifier<NodeConnector> path = InstanceIdentifier\r
233                 .<Nodes> builder(Nodes.class)\r
234                 .<Node, NodeKey> child(Node.class,\r
235                         new NodeKey(new NodeId(nodeId)))\r
236                 .<NodeConnector, NodeConnectorKey> child(NodeConnector.class,\r
237                         nConKey).toInstance();\r
238 \r
239         return new NodeConnectorRef(path);\r
240     }\r
241 \r
242     /**\r
243      * create NodeConnectorKey\r
244      * \r
245      * @param nodeId\r
246      * @param port\r
247      * @return\r
248      */\r
249     private NodeConnectorKey createNodeConnKey(final String nodeId,\r
250             final String port){\r
251         StringBuilder sBuild = new StringBuilder(nodeId).append(':').append(\r
252                 port);\r
253 \r
254         return new NodeConnectorKey(new NodeConnectorId(sBuild.toString()));\r
255     }\r
256 \r
257     /**\r
258      * create NodeRef\r
259      * \r
260      * @param nodeId\r
261      * @return\r
262      */\r
263     private static NodeRef createNodeRef(final String nodeId){\r
264         NodeKey key = new NodeKey(new NodeId(nodeId));\r
265         InstanceIdentifier<Node> path = InstanceIdentifier\r
266                 .<Nodes> builder(Nodes.class)\r
267                 .<Node, NodeKey> child(Node.class, key).toInstance();\r
268         return new NodeRef(path);\r
269     }\r
270 }\r