2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
10 import java.math.BigInteger;
11 import java.util.ArrayList;
12 import java.util.List;
13 import java.util.Optional;
14 import org.junit.Assert;
15 import org.junit.Before;
16 import org.junit.Test;
17 import org.opendaylight.openflowplugin.api.OFConstants;
18 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
19 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.data.ActionConvertorData;
20 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.XidConvertorData;
21 import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.ActionBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.ConnectionCookie;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;
43 import org.opendaylight.yangtools.binding.util.BindingMap;
44 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
45 import org.opendaylight.yangtools.yang.common.Uint16;
46 import org.opendaylight.yangtools.yang.common.Uint32;
47 import org.opendaylight.yangtools.yang.common.Uint64;
48 import org.opendaylight.yangtools.yang.common.Uint8;
51 * Created by Jakub Toth jatoth@cisco.com on 9/23/14.
53 public class PacketOutConvertorTest {
55 private ConvertorManager convertorManager;
59 convertorManager = ConvertorManagerFactory.createDefaultManager();
63 * Test for {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.PacketOutConvertor}
64 * with null parameters.
67 public void toPacketOutInputAllParmNullTest() {
70 NodeConnectorKey nodeConnKey = PacketOutConvertorTest.createNodeConnKey(nodeId, port);
71 NodeConnectorRef egressConfRef = new NodeConnectorRef(createNodeConnRef(nodeId, nodeConnKey));
73 TransmitPacketInput transmitPacketInput = new TransmitPacketInputBuilder()
74 .setBufferId((Uint32) null)
75 .setConnectionCookie(null)
76 .setNode(createNodeRef(nodeId))
78 .setEgress(egressConfRef)
82 Uint8 version = OFConstants.OFP_VERSION_1_3;
84 XidConvertorData data = new XidConvertorData(version);
85 PacketOutInput message = convert(transmitPacketInput, data);
87 //FIXME : this has to be fixed along with actions changed in openflowjava
89 Assert.assertEquals(buildActionForNullTransmitPacketInputAction(nodeConnKey, version), message.getAction());
91 Assert.assertEquals(OFConstants.OFP_NO_BUFFER, message.getBufferId());
92 Assert.assertEquals(new PortNumber(Uint32.valueOf(0xfffffffdL)), message.getInPort());
93 Assert.assertEquals(version, message.getVersion());
94 Assert.assertEquals(xid, message.getXid());
95 Assert.assertArrayEquals(transmitPacketInput.getPayload(), message.getData());
99 * Test for XidConvertorData.
102 public void toPacketOutInputAllParmTest() {
103 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder ab =
104 new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder();
106 OutputActionBuilder output = new OutputActionBuilder();
107 output.setMaxLength(OFConstants.OFPCML_NO_BUFFER);
108 Uri value = new Uri(OutputPortValues.CONTROLLER.toString());
109 output.setOutputNodeConnector(value);
110 ab.setAction(new OutputActionCaseBuilder().setOutputAction(
111 output.build()).build());
113 ab.withKey(new ActionKey(0));
115 List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actionList =
117 actionList.add(ab.build());
119 final Uint32 bufferId = Uint32.valueOf(0xf);
121 final Uint32 valueForCookie = Uint32.valueOf(0xe);
122 ConnectionCookie connCook = new ConnectionCookie(valueForCookie);
124 String nodeId = "node:1";
126 String portO = "0xfffffffd";
127 NodeConnectorKey egrConKey = PacketOutConvertorTest.createNodeConnKey(nodeId, portO);
128 NodeConnectorRef egressConfRef = new NodeConnectorRef(
129 createNodeConnRef(nodeId, egrConKey));
132 NodeConnectorKey ingrConKey = PacketOutConvertorTest.createNodeConnKey(nodeId, inPort);
133 NodeConnectorRef ingressConRef = new NodeConnectorRef(
134 createNodeConnRef(nodeId, ingrConKey));
136 final TransmitPacketInput transmitPacketInput = new TransmitPacketInputBuilder()
137 .setAction(BindingMap.of(ab.build()))
138 .setBufferId(bufferId)
139 .setConnectionCookie(connCook)
140 .setEgress(egressConfRef)
141 .setIngress(ingressConRef)
142 .setNode(createNodeRef(nodeId))
143 .setPayload("sendOutputMsg_TEST".getBytes())
146 Uint8 version = OFConstants.OFP_VERSION_1_3;
147 byte[] datapathIdByte = new byte[Long.BYTES];
148 for (int i = 0; i < datapathIdByte.length; i++) {
149 datapathIdByte[i] = 1;
151 Uint64 datapathId = Uint64.valueOf(new BigInteger(1, datapathIdByte));
152 Uint32 xid = Uint32.valueOf(0xfffffL);
154 XidConvertorData data = new XidConvertorData(version);
156 data.setDatapathId(datapathId);
157 PacketOutInput message = convert(transmitPacketInput, data);
159 Assert.assertEquals(transmitPacketInput.getBufferId(), message.getBufferId());
160 Assert.assertEquals(Uint32.valueOf(inPort), message.getInPort().getValue());
161 Assert.assertEquals(version, message.getVersion());
162 Assert.assertEquals(xid, message.getXid());
164 ActionConvertorData actionConvertorData = new ActionConvertorData(version);
165 actionConvertorData.setDatapathId(datapathId);
167 Optional<List<Action>> actionsOptional = convertorManager.convert(actionList, actionConvertorData);
169 List<Action> actions = actionsOptional.orElse(null);
170 Assert.assertEquals(actions, message.getAction());
171 Assert.assertArrayEquals(transmitPacketInput.getPayload(), message.getData());
174 private static List<Action> buildActionForNullTransmitPacketInputAction(
175 final NodeConnectorKey nodeConKey, final Uint8 version) {
177 PortNumber outPort = getPortNumber(nodeConKey, version);
179 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice
180 .OutputActionCaseBuilder outputActionCaseBuilder =
181 new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping
182 .action.choice.OutputActionCaseBuilder();
184 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice
185 .output.action._case.OutputActionBuilder outputActionBuilder =
186 new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping
187 .action.choice.output.action._case.OutputActionBuilder();
189 outputActionBuilder.setPort(outPort);
190 outputActionBuilder.setMaxLength(Uint16.MAX_VALUE);
191 outputActionCaseBuilder.setOutputAction(outputActionBuilder.build());
192 ActionBuilder actionBuilder = new ActionBuilder();
193 actionBuilder.setActionChoice(outputActionCaseBuilder.build());
195 List<Action> actions = new ArrayList<>();
196 actions.add(actionBuilder.build());
200 private static PortNumber getPortNumber(final NodeConnectorKey nodeConKey, final Uint8 ofVersion) {
201 Uint32 port = InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.get(ofVersion),
203 return new PortNumber(port);
206 private static NodeConnectorRef createNodeConnRef(final String nodeId, final NodeConnectorKey nodeConKey) {
207 InstanceIdentifier<NodeConnector> path = InstanceIdentifier
208 .builder(Nodes.class)
209 .child(Node.class, new NodeKey(new NodeId(nodeId)))
210 .child(NodeConnector.class, nodeConKey).build();
212 return new NodeConnectorRef(path.toIdentifier());
215 private static NodeConnectorKey createNodeConnKey(final String nodeId, final String port) {
216 StringBuilder builder = new StringBuilder(nodeId).append(':').append(port);
218 return new NodeConnectorKey(new NodeConnectorId(builder.toString()));
221 private static NodeRef createNodeRef(final String nodeId) {
222 NodeKey key = new NodeKey(new NodeId(nodeId));
223 InstanceIdentifier<Node> path = InstanceIdentifier.builder(Nodes.class)
224 .child(Node.class, key)
226 return new NodeRef(path.toIdentifier());
229 private PacketOutInput convert(final TransmitPacketInput transmitPacketInput, final XidConvertorData data) {
230 Optional<PacketOutInput> messageOptional = convertorManager.convert(transmitPacketInput, data);
231 return messageOptional.orElse(PacketOutConvertor.defaultResult(data.getVersion()));