2 * Copyright (c) 2014 Ericsson India Global Services Pvt Ltd. 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.action;
10 import java.math.BigInteger;
11 import java.util.ArrayList;
12 import java.util.Collections;
13 import java.util.List;
14 import java.util.Optional;
15 import org.junit.Assert;
16 import org.junit.Before;
17 import org.junit.Test;
18 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
19 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.data.ActionConvertorData;
20 import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInCaseBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOutCaseBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtlCaseBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCaseBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionCaseBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCaseBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionCaseBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionCaseBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCaseBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionCaseBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionCaseBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCaseBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCaseBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionCaseBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlActionCaseBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueActionCaseBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.in._case.CopyTtlInBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.out._case.CopyTtlOutBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.mpls.ttl._case.DecMplsTtlBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtlBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.group.action._case.GroupActionBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.mpls.action._case.PopMplsActionBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.pbb.action._case.PopPbbActionBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.vlan.action._case.PopVlanActionBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.mpls.action._case.PushMplsActionBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.pbb.action._case.PushPbbActionBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.vlan.action._case.PushVlanActionBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetFieldBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.mpls.ttl.action._case.SetMplsTtlActionBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.ttl.action._case.SetNwTtlActionBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.queue.action._case.SetQueueActionBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.CopyTtlInCase;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.CopyTtlOutCase;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.DecMplsTtlCase;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.DecNwTtlCase;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.GroupCase;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.OutputActionCase;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PopMplsCase;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PopVlanCase;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PushMplsCase;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PushPbbCase;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PushVlanCase;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetFieldCase;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetMplsTtlCase;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetNwTtlCase;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetQueueCase;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
78 * test for {@link ActionConvertor}
80 public class ActionConvertorTest {
82 List<Action> actions = new ArrayList<>();
83 static Integer actionItem = 0;
86 * prepare OpenflowPortsUtil util class
90 OpenflowPortsUtil.init();
94 public void testActionConvertorwithallParameters() {
100 setQueueActionData();
105 setExperimenterData();
108 ActionConvertorData data = new ActionConvertorData((short) 0X4);
109 data.setDatapathId(BigInteger.ONE);
111 Optional<List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action>> OFActionsList =
112 ConvertorManager.getInstance().convert(actions, data);
114 outputActions(OFActionsList.orElse(Collections.emptyList()));
118 private void setExperimenterData() {
120 // TODO:SAL API Missing
124 private void dropActionData() {
125 ActionBuilder AB = new ActionBuilder();
126 AB.setOrder(actionItem).setAction(new DropActionCaseBuilder().build());
128 actions.add(actionItem++, AB.build());
132 private void setFieldData() {
134 SetFieldBuilder matchBuilder = new SetFieldBuilder();
136 matchBuilder.setInPort(new NodeConnectorId("openflow:1:2125"));
138 SetFieldBuilder setFB = new SetFieldBuilder();
140 ActionBuilder AB = new ActionBuilder();
141 AB.setOrder(actionItem).setAction(new SetFieldCaseBuilder().setSetField(setFB.build()).build());
143 actions.add(actionItem++, AB.build());
147 private void pbbActionData() {
148 PushPbbActionBuilder pushpbb = new PushPbbActionBuilder();
149 pushpbb.setEthernetType(10);
151 ActionBuilder AB = new ActionBuilder();
152 AB.setOrder(actionItem).setAction(new PushPbbActionCaseBuilder().setPushPbbAction(pushpbb.build()).build());
154 actions.add(actionItem++, AB.build());
156 PopPbbActionBuilder popPBB = new PopPbbActionBuilder();
158 ActionBuilder AB1 = new ActionBuilder();
159 AB1.setOrder(actionItem).setAction(new PopPbbActionCaseBuilder().setPopPbbAction(popPBB.build()).build());
161 actions.add(actionItem++, AB1.build());
165 private void NwTtlAction() {
166 SetNwTtlActionBuilder setNwTtlActionBuilder = new SetNwTtlActionBuilder();
168 setNwTtlActionBuilder.setNwTtl((short) 1);
169 ActionBuilder AB = new ActionBuilder();
170 AB.setOrder(actionItem).setAction(new SetNwTtlActionCaseBuilder().setSetNwTtlAction(setNwTtlActionBuilder.build()).build());
172 actions.add(actionItem++, AB.build());
174 DecNwTtlBuilder necNwTtlBuilder = new DecNwTtlBuilder();
177 ActionBuilder AB1 = new ActionBuilder();
178 AB1.setOrder(actionItem).setAction(new DecNwTtlCaseBuilder().setDecNwTtl(necNwTtlBuilder.build()).build());
180 actions.add(actionItem++, AB1.build());
184 private void setGroupAction() {
186 GroupActionBuilder grpIdAB = new GroupActionBuilder();
187 grpIdAB.setGroup("98");
189 ActionBuilder AB = new ActionBuilder();
190 AB.setOrder(actionItem).setAction(new GroupActionCaseBuilder().setGroupAction(grpIdAB.build()).build());
192 actions.add(actionItem++, AB.build());
196 // TODO - check if this method is needed (private and never used locally) - see line 94
198 private static void outputActions(final List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action> oFActionsList) {
200 for (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action action : oFActionsList) {
202 if (action.getActionChoice() instanceof OutputActionCase) {
203 OutputActionCase outputActionCase = (OutputActionCase) action.getActionChoice();
204 Assert.assertEquals((Integer) 10, (outputActionCase.getOutputAction().getMaxLength()));
205 long port = 4294967293L;
206 Assert.assertEquals(port, (long) (outputActionCase.getOutputAction().getPort().getValue()));
210 if (action.getActionChoice() instanceof CopyTtlInCase) {
211 CopyTtlInCase copyTtlInCase = (CopyTtlInCase) action.getActionChoice();
212 Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), CopyTtlInCase.class.getName());
215 if (action.getActionChoice() instanceof CopyTtlOutCase) {
216 Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), CopyTtlOutCase.class.getName());
219 if (action.getActionChoice() instanceof
220 // TODO:getMplsTtl is missing.
222 Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), SetMplsTtlCase.class.getName());
225 if (action.getActionChoice() instanceof DecMplsTtlCase) {
226 Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(),
227 DecMplsTtlCase.class.getName());
230 if (action.getActionChoice() instanceof PushMplsCase) {
231 PushMplsCase pushMplsCase = (PushMplsCase) action.getActionChoice();
232 EtherType etherType = pushMplsCase.getPushMplsAction().getEthertype();
234 if (etherType != null) {
235 Assert.assertEquals((Integer) 10, etherType.getValue());
239 if (action.getActionChoice() instanceof PopMplsCase) {
240 PopMplsCase popMplsCase = (PopMplsCase) action.getActionChoice();
241 Assert.assertEquals((Integer) 10, (popMplsCase.getPopMplsAction().getEthertype().getValue()));
244 if (action.getActionChoice() instanceof
246 // TODO:SetQueue,I dont have getQueueId
248 Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), SetQueueCase.class.getName());
251 if (action.getActionChoice() instanceof GroupCase) {
252 GroupCase groupCase = (GroupCase) action.getActionChoice();
253 Assert.assertEquals(98, (long) (groupCase.getGroupAction().getGroupId()));
256 if (action.getActionChoice() instanceof PushVlanCase) {
257 Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), PushVlanCase.class.getName());
260 if (action.getActionChoice() instanceof PopVlanCase) {
261 Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), PopVlanCase.class.getName());
264 if (action.getActionChoice() instanceof SetNwTtlCase) {
265 Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), SetNwTtlCase.class.getName());
267 if (action.getActionChoice() instanceof DecNwTtlCase) {
268 Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), DecNwTtlCase.class.getName());
270 if (action.getActionChoice() instanceof PushPbbCase) {
271 PushPbbCase pushPbbCase = (PushPbbCase) action.getActionChoice();
272 if (pushPbbCase.getPushPbbAction().getEthertype() != null) {
273 Assert.assertEquals((Integer) 10, pushPbbCase.getPushPbbAction().getEthertype().getValue());
277 if (action.getActionChoice() instanceof PopMplsCase) {
278 Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), PopMplsCase.class.getName());
280 if (action.getActionChoice() instanceof SetFieldCase) {
281 SetFieldCase setFieldCase = (SetFieldCase) action.getActionChoice();
282 Assert.assertNotNull(setFieldCase.getSetFieldAction());
285 Assert.assertEquals(OpenflowBasicClass.class, sf.getMatchEntry().get(0).getOxmClass());
287 if (sf.getMatchEntry().get(0).getOxmMatchField().equals(InPort.class)) {
288 InPortCase inPortCase = ((InPortCase) sf.getMatchEntry().get(0).getMatchEntryValue());
289 Assert.assertEquals(2125, inPortCase.getInPort().getPortNumber().getValue().intValue());
301 private void OutputActionData() {
302 OutputActionBuilder outputB = new OutputActionBuilder();
303 outputB.setMaxLength(10);
304 Uri uri = new Uri(OutputPortValues.CONTROLLER.toString());
305 outputB.setOutputNodeConnector(uri);
307 ActionBuilder AB = new ActionBuilder();
308 AB.setOrder(actionItem).setAction(new OutputActionCaseBuilder().setOutputAction(outputB.build()).build());
310 actions.add(actionItem++, AB.build());
314 private void CopyTtlData() {
315 CopyTtlOutBuilder copyB = new CopyTtlOutBuilder();
317 ActionBuilder AB = new ActionBuilder();
318 AB.setOrder(actionItem).setAction(new CopyTtlOutCaseBuilder().setCopyTtlOut(copyB.build()).build());
320 actions.add(actionItem++, AB.build());
322 CopyTtlInBuilder copyTtlInBuilder = new CopyTtlInBuilder();
324 ActionBuilder AB1 = new ActionBuilder();
325 AB1.setOrder(actionItem).setAction(new CopyTtlInCaseBuilder().setCopyTtlIn(copyTtlInBuilder.build()).build());
327 actions.add(actionItem++, AB1.build());
331 private void MplsTtlActionData() {
333 SetMplsTtlActionBuilder setMplsTtlActionB = new SetMplsTtlActionBuilder();
335 setMplsTtlActionB.setMplsTtl((short) 10);
336 ActionBuilder AB1 = new ActionBuilder();
337 AB1.setOrder(actionItem).setAction(new SetMplsTtlActionCaseBuilder().setSetMplsTtlAction(setMplsTtlActionB.build()).build());
340 actions.add(actionItem++, AB1.build());
342 DecMplsTtlBuilder decMplsTtlB = new DecMplsTtlBuilder();
344 ActionBuilder AB = new ActionBuilder();
345 AB.setOrder(actionItem).setAction(new DecMplsTtlCaseBuilder().setDecMplsTtl(decMplsTtlB.build()).build());
347 actions.add(actionItem++, AB.build());
350 private void vlanActionData() {
351 PushVlanActionBuilder pvB = new PushVlanActionBuilder();
353 pvB.setVlanId(new VlanId(10));
355 ActionBuilder AB1 = new ActionBuilder();
356 AB1.setOrder(actionItem).setAction(new PushVlanActionCaseBuilder().setPushVlanAction(pvB.build()).build());
358 actions.add(actionItem++, AB1.build());
360 PopVlanActionBuilder popVAB = new PopVlanActionBuilder();
362 ActionBuilder AB = new ActionBuilder();
363 AB.setOrder(actionItem).setAction(new PopVlanActionCaseBuilder().setPopVlanAction(popVAB.build()).build());
365 actions.add(actionItem++, AB.build());
369 private void mplsActionData() {
371 PushMplsActionBuilder pushMB = new PushMplsActionBuilder();
372 pushMB.setEthernetType(10);
374 ActionBuilder AB = new ActionBuilder();
375 AB.setOrder(actionItem).setAction(new PushMplsActionCaseBuilder().setPushMplsAction(pushMB.build()).build());
377 actions.add(actionItem++, AB.build());
379 PopMplsActionBuilder popMB = new PopMplsActionBuilder();
380 popMB.setEthernetType(10);
382 ActionBuilder AB1 = new ActionBuilder();
383 AB1.setOrder(actionItem).setAction(new PopMplsActionCaseBuilder().setPopMplsAction(popMB.build()).build());
385 actions.add(actionItem++, AB1.build());
388 private void setQueueActionData() {
390 SetQueueActionBuilder setQB = new SetQueueActionBuilder();
391 setQB.setQueue("99");
393 ActionBuilder AB1 = new ActionBuilder();
394 AB1.setOrder(actionItem).setAction(new SetQueueActionCaseBuilder().setSetQueueAction(setQB.build()).build());
396 actions.add(actionItem++, AB1.build());