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 org.junit.Assert;
\r
12 import org.junit.Before;
\r
13 import org.junit.Test;
\r
14 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
\r
15 import org.opendaylight.openflowplugin.api.OFConstants;
\r
16 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
\r
17 import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;
\r
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;
\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;
\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;
\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.ActionBuilder;
\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.ConnectionCookie;
\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;
\r
39 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
\r
40 import java.math.BigInteger;
\r
41 import java.util.ArrayList;
\r
42 import java.util.List;
\r
45 * Created by Jakub Toth jatoth@cisco.com on 9/23/14.
\r
48 public class PacketOutConvertorTest {
\r
51 public void init() {
\r
52 OpenflowPortsUtil.init();
\r
56 * Test for {@link PacketOutConvertor} with null parameters
\r
59 public void toPacketOutInputAllParmNullTest() {
\r
61 TransmitPacketInputBuilder transmitPacketInputBuilder = new TransmitPacketInputBuilder();
\r
63 Long bufferId = null;
\r
65 String NODE_ID = "0";
\r
68 NodeRef ref = createNodeRef(NODE_ID);
\r
69 NodeConnectorKey nodeConnKey = this.createNodeConnKey(NODE_ID, port);
\r
70 NodeConnectorRef nEgressConfRef = new NodeConnectorRef(
\r
71 createNodeConnRef(NODE_ID, nodeConnKey));
\r
73 transmitPacketInputBuilder.setBufferId(bufferId);
\r
74 transmitPacketInputBuilder.setConnectionCookie(null);
\r
75 transmitPacketInputBuilder.setAction(null);
\r
76 transmitPacketInputBuilder.setNode(ref);
\r
77 transmitPacketInputBuilder.setPayload(null);
\r
78 transmitPacketInputBuilder.setEgress(nEgressConfRef);
\r
79 transmitPacketInputBuilder.setIngress(null);
\r
80 TransmitPacketInput transmitPacketInput = transmitPacketInputBuilder
\r
83 Short version = (short) 0x04;
\r
85 PacketOutInput message = PacketOutConvertor.toPacketOutInput(
\r
86 transmitPacketInput, version, null, null);
\r
88 //FIXME : this has to be fixed along with actions changed in openflowjava
\r
90 Assert.assertEquals(this.buildActionForNullTransmitPacketInputAction(nodeConnKey,
\r
91 version), message.getAction());
\r
93 Assert.assertEquals(OFConstants.OFP_NO_BUFFER, message.getBufferId());
\r
94 Assert.assertEquals(new PortNumber(0xfffffffdL), message.getInPort());
\r
95 Assert.assertEquals(version, message.getVersion());
\r
96 Assert.assertEquals(xid, message.getXid());
\r
97 Assert.assertArrayEquals(transmitPacketInput.getPayload(), message.getData());
\r
101 * Test for PacketOutConvertor
\r
104 public void toPacketOutInputAllParmTest() {
\r
105 TransmitPacketInputBuilder transmitPacketInputBuilder = new TransmitPacketInputBuilder();
\r
107 List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actionList = new ArrayList<>();
\r
108 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
110 OutputActionBuilder output = new OutputActionBuilder();
\r
111 output.setMaxLength(OFConstants.OFPCML_NO_BUFFER);
\r
112 Uri value = new Uri(OutputPortValues.CONTROLLER.toString());
\r
113 output.setOutputNodeConnector(value);
\r
114 ab.setAction(new OutputActionCaseBuilder().setOutputAction(
\r
115 output.build()).build());
\r
117 ab.setKey(new ActionKey(0));
\r
118 actionList.add(ab.build());
\r
120 Long bufferId = 0xfL;
\r
122 Long valueForCookie = 0xeL;
\r
123 ConnectionCookie connCook = new ConnectionCookie(valueForCookie);
\r
125 String NODE_ID = "node:1";
\r
127 NodeRef ref = createNodeRef(NODE_ID);
\r
129 String portO = "0xfffffffd";
\r
130 NodeConnectorKey nEgrConKey = this.createNodeConnKey(NODE_ID, portO);
\r
131 NodeConnectorRef nEgressConfRef = new NodeConnectorRef(
\r
132 createNodeConnRef(NODE_ID, nEgrConKey));
\r
134 String inPort = "2";
\r
135 NodeConnectorKey nIngrConKey = this.createNodeConnKey(NODE_ID, inPort);
\r
136 NodeConnectorRef nIngressConRef = new NodeConnectorRef(
\r
137 createNodeConnRef(NODE_ID, nIngrConKey));
\r
139 String _string = new String("sendOutputMsg_TEST");
\r
140 byte[] msg = _string.getBytes();
\r
142 byte[] payload = msg;
\r
144 transmitPacketInputBuilder.setAction(actionList);
\r
145 transmitPacketInputBuilder.setBufferId(bufferId);
\r
146 transmitPacketInputBuilder.setConnectionCookie(connCook);
\r
147 transmitPacketInputBuilder.setEgress(nEgressConfRef);
\r
148 transmitPacketInputBuilder.setIngress(nIngressConRef);
\r
149 transmitPacketInputBuilder.setNode(ref);
\r
150 transmitPacketInputBuilder.setPayload(payload);
\r
152 TransmitPacketInput transmitPacketInput = transmitPacketInputBuilder
\r
155 short version = (short) 0x04;
\r
156 byte[] datapathIdByte = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES];
\r
157 for (int i = 0; i < datapathIdByte.length; i++) {
\r
158 datapathIdByte[i] = 1;
\r
160 BigInteger datapathId = new BigInteger(1, datapathIdByte);
\r
161 Long xid = 0xfffffL;
\r
163 OpenflowPortsUtil.init();
\r
165 PacketOutInput message = PacketOutConvertor.toPacketOutInput(
\r
166 transmitPacketInput, version, xid, datapathId);
\r
168 Assert.assertEquals(transmitPacketInput.getBufferId(),
\r
169 message.getBufferId());
\r
170 Assert.assertEquals("PortNumber [_value=" + inPort + "]", message
\r
171 .getInPort().toString());
\r
172 Assert.assertEquals((Object) version,
\r
173 Short.valueOf(message.getVersion()));
\r
174 Assert.assertEquals(xid, message.getXid());
\r
175 Assert.assertEquals(
\r
176 ActionConvertor.getActions(actionList, version, datapathId, null),
\r
177 message.getAction());
\r
178 Assert.assertArrayEquals(transmitPacketInput.getPayload(), message.getData());
\r
188 private List<Action> buildActionForNullTransmitPacketInputAction(
\r
189 final NodeConnectorKey nConKey, final short version) {
\r
191 PortNumber outPort = getPortNumber(nConKey, version);
\r
192 List<Action> actions = new ArrayList<>();
\r
193 ActionBuilder aBuild = new ActionBuilder();
\r
195 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.OutputActionCaseBuilder outputActionCaseBuilder =
\r
196 new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.OutputActionCaseBuilder();
\r
198 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.output.action._case.OutputActionBuilder outputActionBuilder =
\r
199 new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.output.action._case.OutputActionBuilder();
\r
201 outputActionBuilder.setPort(outPort);
\r
202 outputActionBuilder.setMaxLength(0xffff);
\r
203 outputActionCaseBuilder.setOutputAction(outputActionBuilder.build());
\r
204 aBuild.setActionChoice(outputActionCaseBuilder.build());
\r
205 actions.add(aBuild.build());
\r
210 * create PortNumber
\r
216 private static PortNumber getPortNumber(final NodeConnectorKey nConKey,
\r
217 final Short ofVersion) {
\r
218 String[] split = nConKey.getId().getValue().split(":");
\r
219 Long port = OpenflowPortsUtil.getPortFromLogicalName(
\r
220 OpenflowVersion.get(ofVersion), split[split.length - 1]);
\r
221 return new PortNumber(port);
\r
225 * create NodeConnectorRef
\r
231 private static NodeConnectorRef createNodeConnRef(final String nodeId,
\r
232 final NodeConnectorKey nConKey) {
\r
234 InstanceIdentifier<NodeConnector> path = InstanceIdentifier
\r
235 .<Nodes>builder(Nodes.class)
\r
236 .<Node, NodeKey>child(Node.class,
\r
237 new NodeKey(new NodeId(nodeId)))
\r
238 .<NodeConnector, NodeConnectorKey>child(NodeConnector.class,
\r
241 return new NodeConnectorRef(path);
\r
245 * create NodeConnectorKey
\r
251 private NodeConnectorKey createNodeConnKey(final String nodeId,
\r
252 final String port) {
\r
253 StringBuilder sBuild = new StringBuilder(nodeId).append(':').append(
\r
256 return new NodeConnectorKey(new NodeConnectorId(sBuild.toString()));
\r
265 private static NodeRef createNodeRef(final String nodeId) {
\r
266 NodeKey key = new NodeKey(new NodeId(nodeId));
\r
267 InstanceIdentifier<Node> path = InstanceIdentifier
\r
268 .<Nodes>builder(Nodes.class)
\r
269 .<Node, NodeKey>child(Node.class, key).build();
\r
270 return new NodeRef(path);
\r