7a78c11c207e742e6e0ed2bc68a599286a76a9a5
[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.XidConvertorData;
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 import org.opendaylight.yangtools.yang.common.Uint32;
48 import org.opendaylight.yangtools.yang.common.Uint64;
49 import org.opendaylight.yangtools.yang.common.Uint8;
50
51 /**
52  * Created by Jakub Toth jatoth@cisco.com on 9/23/14.
53  */
54
55 public class PacketOutConvertorTest {
56
57     private ConvertorManager convertorManager;
58
59     @Before
60     public void setUp() {
61         convertorManager = ConvertorManagerFactory.createDefaultManager();
62     }
63
64     /**
65      * Test for {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.PacketOutConvertor}
66      *  with null parameters.
67      */
68     @Test
69     public void toPacketOutInputAllParmNullTest() {
70
71         TransmitPacketInputBuilder transmitPacketInputBuilder = new TransmitPacketInputBuilder();
72
73         Long bufferId = null;
74
75         String nodeId = "0";
76         String port = "0";
77
78         NodeRef ref = createNodeRef(nodeId);
79         NodeConnectorKey nodeConnKey = PacketOutConvertorTest.createNodeConnKey(nodeId, port);
80         NodeConnectorRef egressConfRef = new NodeConnectorRef(
81                 createNodeConnRef(nodeId, nodeConnKey));
82
83         transmitPacketInputBuilder.setBufferId(bufferId);
84         transmitPacketInputBuilder.setConnectionCookie(null);
85         transmitPacketInputBuilder.setAction(null);
86         transmitPacketInputBuilder.setNode(ref);
87         transmitPacketInputBuilder.setPayload(null);
88         transmitPacketInputBuilder.setEgress(egressConfRef);
89         transmitPacketInputBuilder.setIngress(null);
90         TransmitPacketInput transmitPacketInput = transmitPacketInputBuilder
91                 .build();
92
93         Short version = (short) 0x04;
94         Long xid = null;
95         XidConvertorData data = new XidConvertorData(version);
96         PacketOutInput message = convert(transmitPacketInput, data);
97
98         //FIXME : this has to be fixed along with actions changed in openflowjava
99
100         Assert.assertEquals(buildActionForNullTransmitPacketInputAction(nodeConnKey, version), message.getAction());
101
102         Assert.assertEquals(OFConstants.OFP_NO_BUFFER, message.getBufferId());
103         Assert.assertEquals(new PortNumber(0xfffffffdL), message.getInPort());
104         Assert.assertEquals(Uint8.valueOf(version), message.getVersion());
105         Assert.assertEquals(xid, message.getXid());
106         Assert.assertArrayEquals(transmitPacketInput.getPayload(), message.getData());
107     }
108
109     /**
110      * Test for XidConvertorData.
111      */
112     @Test
113     public void toPacketOutInputAllParmTest() {
114         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder ab =
115                 new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder();
116
117         OutputActionBuilder output = new OutputActionBuilder();
118         output.setMaxLength(OFConstants.OFPCML_NO_BUFFER);
119         Uri value = new Uri(OutputPortValues.CONTROLLER.toString());
120         output.setOutputNodeConnector(value);
121         ab.setAction(new OutputActionCaseBuilder().setOutputAction(
122                 output.build()).build());
123         ab.setOrder(0);
124         ab.withKey(new ActionKey(0));
125
126         List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actionList =
127                 new ArrayList<>();
128         actionList.add(ab.build());
129
130         Long bufferId = 0xfL;
131
132         Long valueForCookie = 0xeL;
133         ConnectionCookie connCook = new ConnectionCookie(valueForCookie);
134
135         String nodeId = "node:1";
136
137         NodeRef ref = createNodeRef(nodeId);
138
139         String portO = "0xfffffffd";
140         NodeConnectorKey egrConKey = PacketOutConvertorTest.createNodeConnKey(nodeId, portO);
141         NodeConnectorRef egressConfRef = new NodeConnectorRef(
142                 createNodeConnRef(nodeId, egrConKey));
143
144         String inPort = "2";
145         NodeConnectorKey ingrConKey = PacketOutConvertorTest.createNodeConnKey(nodeId, inPort);
146         NodeConnectorRef ingressConRef = new NodeConnectorRef(
147                 createNodeConnRef(nodeId, ingrConKey));
148
149         String string = new String("sendOutputMsg_TEST");
150         byte[] msg = string.getBytes();
151
152         byte[] payload = msg;
153
154         TransmitPacketInputBuilder transmitPacketInputBuilder = new TransmitPacketInputBuilder();
155         transmitPacketInputBuilder.setAction(actionList);
156         transmitPacketInputBuilder.setBufferId(bufferId);
157         transmitPacketInputBuilder.setConnectionCookie(connCook);
158         transmitPacketInputBuilder.setEgress(egressConfRef);
159         transmitPacketInputBuilder.setIngress(ingressConRef);
160         transmitPacketInputBuilder.setNode(ref);
161         transmitPacketInputBuilder.setPayload(payload);
162
163         final TransmitPacketInput transmitPacketInput = transmitPacketInputBuilder.build();
164
165         Short version = (short) 0x04;
166         byte[] datapathIdByte = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES];
167         for (int i = 0; i < datapathIdByte.length; i++) {
168             datapathIdByte[i] = 1;
169         }
170         Uint64 datapathId = Uint64.valueOf(new BigInteger(1, datapathIdByte));
171         Uint32 xid = Uint32.valueOf(0xfffffL);
172
173         XidConvertorData data = new XidConvertorData(version);
174         data.setXid(xid);
175         data.setDatapathId(datapathId);
176         PacketOutInput message = convert(transmitPacketInput, data);
177
178         Assert.assertEquals(transmitPacketInput.getBufferId(), message.getBufferId());
179         Assert.assertEquals(Uint32.valueOf(inPort), message.getInPort().getValue());
180         Assert.assertEquals(Uint8.valueOf(version), message.getVersion());
181         Assert.assertEquals(xid, message.getXid());
182
183         ActionConvertorData actionConvertorData = new ActionConvertorData(version);
184         actionConvertorData.setDatapathId(datapathId);
185
186         Optional<List<Action>> actionsOptional = convertorManager.convert(actionList, actionConvertorData);
187
188         List<Action> actions = actionsOptional.orElse(Collections.emptyList());
189         Assert.assertEquals(actions, message.getAction());
190         Assert.assertArrayEquals(transmitPacketInput.getPayload(), message.getData());
191     }
192
193     private static List<Action> buildActionForNullTransmitPacketInputAction(
194             final NodeConnectorKey nodeConKey, final short version) {
195
196         PortNumber outPort = getPortNumber(nodeConKey, version);
197
198         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice
199             .OutputActionCaseBuilder outputActionCaseBuilder =
200                 new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping
201                     .action.choice.OutputActionCaseBuilder();
202
203         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice
204             .output.action._case.OutputActionBuilder outputActionBuilder =
205                 new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping
206                     .action.choice.output.action._case.OutputActionBuilder();
207
208         outputActionBuilder.setPort(outPort);
209         outputActionBuilder.setMaxLength(0xffff);
210         outputActionCaseBuilder.setOutputAction(outputActionBuilder.build());
211         ActionBuilder actionBuilder = new ActionBuilder();
212         actionBuilder.setActionChoice(outputActionCaseBuilder.build());
213
214         List<Action> actions = new ArrayList<>();
215         actions.add(actionBuilder.build());
216         return actions;
217     }
218
219     private static PortNumber getPortNumber(final NodeConnectorKey nodeConKey, final Short ofVersion) {
220         Uint32 port = InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.get(ofVersion),
221                 nodeConKey.getId());
222         return new PortNumber(port);
223     }
224
225     private static NodeConnectorRef createNodeConnRef(final String nodeId, final NodeConnectorKey nodeConKey) {
226         InstanceIdentifier<NodeConnector> path = InstanceIdentifier
227                 .builder(Nodes.class)
228                 .child(Node.class,
229                         new NodeKey(new NodeId(nodeId)))
230                 .child(NodeConnector.class,
231                         nodeConKey).build();
232
233         return new NodeConnectorRef(path);
234     }
235
236     private static NodeConnectorKey createNodeConnKey(final String nodeId, final String port) {
237         StringBuilder builder = new StringBuilder(nodeId).append(':').append(port);
238
239         return new NodeConnectorKey(new NodeConnectorId(builder.toString()));
240     }
241
242     private static NodeRef createNodeRef(final String nodeId) {
243         NodeKey key = new NodeKey(new NodeId(nodeId));
244         InstanceIdentifier<Node> path = InstanceIdentifier
245                 .builder(Nodes.class)
246                 .child(Node.class, key).build();
247         return new NodeRef(path);
248     }
249
250     private PacketOutInput convert(final TransmitPacketInput transmitPacketInput, final XidConvertorData data) {
251         Optional<PacketOutInput> messageOptional = convertorManager.convert(transmitPacketInput, data);
252         return messageOptional.orElse(PacketOutConvertor.defaultResult(data.getVersion()));
253     }
254 }