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