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.util.ArrayList;
11 import java.util.Collections;
12 import java.util.List;
13 import java.util.Optional;
14 import org.junit.Assert;
15 import org.junit.Test;
16 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
17 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
18 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.data.ActionConvertorData;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInCaseBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOutCaseBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtlCaseBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCaseBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionCaseBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCaseBuilder;
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.PopMplsActionCaseBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionCaseBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCaseBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionCaseBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionCaseBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCaseBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCaseBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionCaseBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlActionCaseBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueActionCaseBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.in._case.CopyTtlInBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.out._case.CopyTtlOutBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.mpls.ttl._case.DecMplsTtlBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtlBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.group.action._case.GroupActionBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.mpls.action._case.PopMplsActionBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.pbb.action._case.PopPbbActionBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.vlan.action._case.PopVlanActionBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.mpls.action._case.PushMplsActionBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.pbb.action._case.PushPbbActionBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.vlan.action._case.PushVlanActionBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetFieldBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.mpls.ttl.action._case.SetMplsTtlActionBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.ttl.action._case.SetNwTtlActionBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.queue.action._case.SetQueueActionBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.CopyTtlInCase;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.CopyTtlOutCase;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.DecMplsTtlCase;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.DecNwTtlCase;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.GroupCase;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.OutputActionCase;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PopMplsCase;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PopVlanCase;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PushMplsCase;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PushPbbCase;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PushVlanCase;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetFieldCase;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetMplsTtlCase;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetNwTtlCase;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetQueueCase;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
74 import org.opendaylight.yangtools.yang.common.Uint16;
75 import org.opendaylight.yangtools.yang.common.Uint32;
76 import org.opendaylight.yangtools.yang.common.Uint64;
79 * test for {@link ActionConvertor}.
81 public class ActionConvertorTest {
83 List<Action> actions = new ArrayList<>();
84 static Integer actionItem = 0;
87 public void testActionConvertorwithallParameters() {
98 setExperimenterData();
101 ActionConvertorData data = new ActionConvertorData((short) 0X4);
102 data.setDatapathId(Uint64.ONE);
103 final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
105 Optional<List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping
106 .Action>> ofActionsList = convertorManager.convert(actions, data);
108 outputActions(ofActionsList.orElse(Collections.emptyList()));
112 private void setExperimenterData() {
114 // TODO:SAL API Missing
118 private void dropActionData() {
119 ActionBuilder actionBuilder = new ActionBuilder();
120 actionBuilder.setOrder(actionItem).setAction(new DropActionCaseBuilder().build());
122 actions.add(actionItem++, actionBuilder.build());
126 private void setFieldData() {
128 SetFieldBuilder matchBuilder = new SetFieldBuilder();
130 matchBuilder.setInPort(new NodeConnectorId("openflow:1:2125"));
132 SetFieldBuilder setFB = new SetFieldBuilder();
134 ActionBuilder actionBuilder = new ActionBuilder();
135 actionBuilder.setOrder(actionItem).setAction(new SetFieldCaseBuilder().setSetField(setFB.build()).build());
137 actions.add(actionItem++, actionBuilder.build());
141 private void pbbActionData() {
142 PushPbbActionBuilder pushpbb = new PushPbbActionBuilder();
143 pushpbb.setEthernetType(10);
145 ActionBuilder actionBuilder = new ActionBuilder();
146 actionBuilder.setOrder(actionItem).setAction(new PushPbbActionCaseBuilder()
147 .setPushPbbAction(pushpbb.build()).build());
149 actions.add(actionItem++, actionBuilder.build());
151 PopPbbActionBuilder popPBB = new PopPbbActionBuilder();
153 ActionBuilder actionBuilder1 = new ActionBuilder();
154 actionBuilder1.setOrder(actionItem).setAction(new PopPbbActionCaseBuilder()
155 .setPopPbbAction(popPBB.build()).build());
157 actions.add(actionItem++, actionBuilder1.build());
161 private void nwTtlAction() {
162 SetNwTtlActionBuilder setNwTtlActionBuilder = new SetNwTtlActionBuilder();
164 setNwTtlActionBuilder.setNwTtl((short) 1);
165 ActionBuilder actionBuilder = new ActionBuilder();
166 actionBuilder.setOrder(actionItem).setAction(new SetNwTtlActionCaseBuilder()
167 .setSetNwTtlAction(setNwTtlActionBuilder.build()).build());
169 actions.add(actionItem++, actionBuilder.build());
171 DecNwTtlBuilder necNwTtlBuilder = new DecNwTtlBuilder();
174 ActionBuilder actionBuilder1 = new ActionBuilder();
175 actionBuilder1.setOrder(actionItem).setAction(
176 new DecNwTtlCaseBuilder().setDecNwTtl(necNwTtlBuilder.build()).build());
178 actions.add(actionItem++, actionBuilder1.build());
182 private void setGroupAction() {
184 GroupActionBuilder grpIdAB = new GroupActionBuilder();
185 grpIdAB.setGroup("98");
187 ActionBuilder actionBuilder = new ActionBuilder();
188 actionBuilder.setOrder(actionItem).setAction(new GroupActionCaseBuilder()
189 .setGroupAction(grpIdAB.build()).build());
191 actions.add(actionItem++, actionBuilder.build());
195 // TODO - check if this method is needed (private and never used locally) - see line 94
197 private static void outputActions(final List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common
198 .action.rev150203.actions.grouping.Action> ofActionsList) {
200 for (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action
201 action : ofActionsList) {
202 if (action.getActionChoice() instanceof OutputActionCase) {
203 OutputActionCase outputActionCase = (OutputActionCase) action.getActionChoice();
204 Assert.assertEquals(Uint16.valueOf(10), outputActionCase.getOutputAction().getMaxLength());
205 Assert.assertEquals(Uint32.valueOf(4294967293L),
206 outputActionCase.getOutputAction().getPort().getValue());
208 if (action.getActionChoice() instanceof CopyTtlInCase) {
209 Assert.assertEquals(action.getActionChoice().implementedInterface().getName(),
210 CopyTtlInCase.class.getName());
213 if (action.getActionChoice() instanceof CopyTtlOutCase) {
214 Assert.assertEquals(action.getActionChoice().implementedInterface().getName(),
215 CopyTtlOutCase.class.getName());
218 if (action.getActionChoice() instanceof SetMplsTtlCase) {
219 Assert.assertEquals(action.getActionChoice().implementedInterface().getName(),
220 SetMplsTtlCase.class.getName());
223 if (action.getActionChoice() instanceof DecMplsTtlCase) {
224 Assert.assertEquals(action.getActionChoice().implementedInterface().getName(),
225 DecMplsTtlCase.class.getName());
228 if (action.getActionChoice() instanceof PushMplsCase) {
229 PushMplsCase pushMplsCase = (PushMplsCase) action.getActionChoice();
230 EtherType etherType = pushMplsCase.getPushMplsAction().getEthertype();
232 if (etherType != null) {
233 Assert.assertEquals(10, etherType.getValue().toJava());
237 if (action.getActionChoice() instanceof PopMplsCase) {
238 PopMplsCase popMplsCase = (PopMplsCase) action.getActionChoice();
239 Assert.assertEquals(10, popMplsCase.getPopMplsAction().getEthertype().getValue().toJava());
242 if (action.getActionChoice() instanceof SetQueueCase) {
243 Assert.assertEquals(action.getActionChoice().implementedInterface().getName(),
244 SetQueueCase.class.getName());
247 if (action.getActionChoice() instanceof GroupCase) {
248 GroupCase groupCase = (GroupCase) action.getActionChoice();
249 Assert.assertEquals(Uint32.valueOf(98), groupCase.getGroupAction().getGroupId());
252 if (action.getActionChoice() instanceof PushVlanCase) {
253 Assert.assertEquals(action.getActionChoice().implementedInterface().getName(),
254 PushVlanCase.class.getName());
257 if (action.getActionChoice() instanceof PopVlanCase) {
258 Assert.assertEquals(action.getActionChoice().implementedInterface().getName(),
259 PopVlanCase.class.getName());
262 if (action.getActionChoice() instanceof SetNwTtlCase) {
263 Assert.assertEquals(action.getActionChoice().implementedInterface().getName(),
264 SetNwTtlCase.class.getName());
266 if (action.getActionChoice() instanceof DecNwTtlCase) {
267 Assert.assertEquals(action.getActionChoice().implementedInterface().getName(),
268 DecNwTtlCase.class.getName());
270 if (action.getActionChoice() instanceof PushPbbCase) {
271 PushPbbCase pushPbbCase = (PushPbbCase) action.getActionChoice();
272 if (pushPbbCase.getPushPbbAction().getEthertype() != null) {
273 Assert.assertEquals(10, pushPbbCase.getPushPbbAction().getEthertype().getValue().toJava());
277 if (action.getActionChoice() instanceof PopMplsCase) {
278 Assert.assertEquals(action.getActionChoice().implementedInterface().getName(),
279 PopMplsCase.class.getName());
281 if (action.getActionChoice() instanceof SetFieldCase) {
282 SetFieldCase setFieldCase = (SetFieldCase) action.getActionChoice();
283 Assert.assertNotNull(setFieldCase.getSetFieldAction());
286 Assert.assertEquals(OpenflowBasicClass.class, sf.getMatchEntry().get(0).getOxmClass());
288 if (sf.getMatchEntry().get(0).getOxmMatchField().equals(InPort.class)) {
289 InPortCase inPortCase = ((InPortCase) sf.getMatchEntry().get(0).getMatchEntryValue());
290 Assert.assertEquals(2125, inPortCase.getInPort().getPortNumber().getValue().intValue());
302 private void outputActionData() {
303 OutputActionBuilder outputB = new OutputActionBuilder();
304 outputB.setMaxLength(10);
305 Uri uri = new Uri(OutputPortValues.CONTROLLER.toString());
306 outputB.setOutputNodeConnector(uri);
308 ActionBuilder actionBuilder = new ActionBuilder();
309 actionBuilder.setOrder(actionItem).setAction(new OutputActionCaseBuilder()
310 .setOutputAction(outputB.build()).build());
312 actions.add(actionItem++, actionBuilder.build());
316 private void copyTtlData() {
317 CopyTtlOutBuilder copyB = new CopyTtlOutBuilder();
319 ActionBuilder actionBuilder = new ActionBuilder();
320 actionBuilder.setOrder(actionItem).setAction(new CopyTtlOutCaseBuilder().setCopyTtlOut(copyB.build()).build());
322 actions.add(actionItem++, actionBuilder.build());
324 CopyTtlInBuilder copyTtlInBuilder = new CopyTtlInBuilder();
326 ActionBuilder actionBuilder1 = new ActionBuilder();
327 actionBuilder1.setOrder(actionItem).setAction(new CopyTtlInCaseBuilder()
328 .setCopyTtlIn(copyTtlInBuilder.build()).build());
330 actions.add(actionItem++, actionBuilder1.build());
334 private void mplsTtlActionData() {
336 SetMplsTtlActionBuilder setMplsTtlActionB = new SetMplsTtlActionBuilder();
338 setMplsTtlActionB.setMplsTtl((short) 10);
339 ActionBuilder actionBuilder1 = new ActionBuilder();
340 actionBuilder1.setOrder(actionItem).setAction(new SetMplsTtlActionCaseBuilder()
341 .setSetMplsTtlAction(setMplsTtlActionB.build()).build());
344 actions.add(actionItem++, actionBuilder1.build());
346 DecMplsTtlBuilder decMplsTtlB = new DecMplsTtlBuilder();
348 ActionBuilder actionBuilder = new ActionBuilder();
349 actionBuilder.setOrder(actionItem).setAction(new DecMplsTtlCaseBuilder()
350 .setDecMplsTtl(decMplsTtlB.build()).build());
352 actions.add(actionItem++, actionBuilder.build());
355 private void vlanActionData() {
356 PushVlanActionBuilder pvB = new PushVlanActionBuilder();
358 pvB.setVlanId(new VlanId(10));
360 ActionBuilder actionBuilder1 = new ActionBuilder();
361 actionBuilder1.setOrder(actionItem).setAction(new PushVlanActionCaseBuilder()
362 .setPushVlanAction(pvB.build()).build());
364 actions.add(actionItem++, actionBuilder1.build());
366 PopVlanActionBuilder popVAB = new PopVlanActionBuilder();
368 ActionBuilder actionBuilder = new ActionBuilder();
369 actionBuilder.setOrder(actionItem).setAction(new PopVlanActionCaseBuilder()
370 .setPopVlanAction(popVAB.build()).build());
372 actions.add(actionItem++, actionBuilder.build());
376 private void mplsActionData() {
378 PushMplsActionBuilder pushMB = new PushMplsActionBuilder();
379 pushMB.setEthernetType(10);
381 ActionBuilder actionBuilder = new ActionBuilder();
382 actionBuilder.setOrder(actionItem).setAction(new PushMplsActionCaseBuilder()
383 .setPushMplsAction(pushMB.build()).build());
385 actions.add(actionItem++, actionBuilder.build());
387 PopMplsActionBuilder popMB = new PopMplsActionBuilder();
388 popMB.setEthernetType(10);
390 ActionBuilder actionBuilder1 = new ActionBuilder();
391 actionBuilder1.setOrder(actionItem).setAction(new PopMplsActionCaseBuilder()
392 .setPopMplsAction(popMB.build()).build());
394 actions.add(actionItem++, actionBuilder1.build());
397 private void setQueueActionData() {
399 SetQueueActionBuilder setQB = new SetQueueActionBuilder();
400 setQB.setQueue("99");
402 ActionBuilder actionBuilder1 = new ActionBuilder();
403 actionBuilder1.setOrder(actionItem).setAction(new SetQueueActionCaseBuilder()
404 .setSetQueueAction(setQB.build()).build());
406 actions.add(actionItem++, actionBuilder1.build());