2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
\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
9 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
\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
49 * Created by Jakub Toth jatoth@cisco.com on 9/23/14.
\r
52 public class PacketOutConvertorTest {
\r
55 public void init() {
\r
56 OpenflowPortsUtil.init();
\r
60 * Test for {@link PacketOutConvertor} with null parameters
\r
63 public void toPacketOutInputAllParmNullTest() {
\r
65 TransmitPacketInputBuilder transmitPacketInputBuilder = new TransmitPacketInputBuilder();
\r
67 Long bufferId = null;
\r
69 String NODE_ID = "0";
\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
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
87 Short version = (short) 0x04;
\r
89 PacketOutInput message = PacketOutConvertor.toPacketOutInput(
\r
90 transmitPacketInput, version, null, null);
\r
92 //FIXME : this has to be fixed along with actions changed in openflowjava
\r
94 Assert.assertEquals(PacketOutConvertorTest.buildActionForNullTransmitPacketInputAction(nodeConnKey,
\r
95 version), message.getAction());
\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
105 * Test for PacketOutConvertor
\r
108 public void toPacketOutInputAllParmTest() {
\r
109 TransmitPacketInputBuilder transmitPacketInputBuilder = new TransmitPacketInputBuilder();
\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
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
121 ab.setKey(new ActionKey(0));
\r
122 actionList.add(ab.build());
\r
124 Long bufferId = 0xfL;
\r
126 Long valueForCookie = 0xeL;
\r
127 ConnectionCookie connCook = new ConnectionCookie(valueForCookie);
\r
129 String NODE_ID = "node:1";
\r
131 NodeRef ref = createNodeRef(NODE_ID);
\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
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
143 String _string = new String("sendOutputMsg_TEST");
\r
144 byte[] msg = _string.getBytes();
\r
146 byte[] payload = msg;
\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
156 TransmitPacketInput transmitPacketInput = transmitPacketInputBuilder
\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
164 BigInteger datapathId = new BigInteger(1, datapathIdByte);
\r
165 Long xid = 0xfffffL;
\r
167 OpenflowPortsUtil.init();
\r
169 PacketOutInput message = PacketOutConvertor.toPacketOutInput(
\r
170 transmitPacketInput, version, xid, datapathId);
\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
182 Optional<List<Action>> actionsOptional = ConvertorManager.getInstance().convert(
\r
183 actionList, actionConvertorData);
\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
197 private static List<Action> buildActionForNullTransmitPacketInputAction(
\r
198 final NodeConnectorKey nConKey, final short version) {
\r
200 PortNumber outPort = getPortNumber(nConKey, version);
\r
201 List<Action> actions = new ArrayList<>();
\r
202 ActionBuilder aBuild = new ActionBuilder();
\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
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
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
219 * create PortNumber
\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
233 * create NodeConnectorRef
\r
239 private static NodeConnectorRef createNodeConnRef(final String nodeId,
\r
240 final NodeConnectorKey nConKey) {
\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
249 return new NodeConnectorRef(path);
\r
253 * create NodeConnectorKey
\r
259 private static NodeConnectorKey createNodeConnKey(final String nodeId,
\r
260 final String port) {
\r
261 StringBuilder sBuild = new StringBuilder(nodeId).append(':').append(
\r
264 return new NodeConnectorKey(new NodeConnectorId(sBuild.toString()));
\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