Bug 5540 - PortConvertor, MatchConvertor
[openflowplugin.git] / openflowplugin / src / test / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / action / ActionConvertorTest.java
1 /**
2  * Copyright (c) 2014 Ericsson India Global Services Pvt Ltd. 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 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action;
9
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;
76
77 /**
78  * test for {@link ActionConvertor}
79  */
80 public class ActionConvertorTest {
81
82     List<Action> actions = new ArrayList<>();
83     static Integer actionItem = 0;
84
85     /**
86      * prepare OpenflowPortsUtil util class
87      */
88     @Before
89     public void setUp() {
90         OpenflowPortsUtil.init();
91     }
92
93     @Test
94     public void testActionConvertorwithallParameters() {
95         OutputActionData();
96         CopyTtlData();
97         MplsTtlActionData();
98         vlanActionData();
99         mplsActionData();
100         setQueueActionData();
101         setGroupAction();
102         NwTtlAction();
103         pbbActionData();
104         setFieldData();
105         setExperimenterData();
106         dropActionData();
107
108         ActionConvertorData data = new ActionConvertorData((short) 0X4);
109         data.setDatapathId(BigInteger.ONE);
110
111         Optional<List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action>> OFActionsList =
112                 ConvertorManager.getInstance().convert(actions, data);
113
114         outputActions(OFActionsList.orElse(Collections.emptyList()));
115
116     }
117
118     private void setExperimenterData() {
119
120         // TODO:SAL API Missing
121
122     }
123
124     private void dropActionData() {
125         ActionBuilder AB = new ActionBuilder();
126         AB.setOrder(actionItem).setAction(new DropActionCaseBuilder().build());
127
128         actions.add(actionItem++, AB.build());
129
130     }
131
132     private void setFieldData() {
133
134         SetFieldBuilder matchBuilder = new SetFieldBuilder();
135
136         matchBuilder.setInPort(new NodeConnectorId("openflow:1:2125"));
137
138         SetFieldBuilder setFB = new SetFieldBuilder();
139
140         ActionBuilder AB = new ActionBuilder();
141         AB.setOrder(actionItem).setAction(new SetFieldCaseBuilder().setSetField(setFB.build()).build());
142
143         actions.add(actionItem++, AB.build());
144
145     }
146
147     private void pbbActionData() {
148         PushPbbActionBuilder pushpbb = new PushPbbActionBuilder();
149         pushpbb.setEthernetType(10);
150
151         ActionBuilder AB = new ActionBuilder();
152         AB.setOrder(actionItem).setAction(new PushPbbActionCaseBuilder().setPushPbbAction(pushpbb.build()).build());
153
154         actions.add(actionItem++, AB.build());
155
156         PopPbbActionBuilder popPBB = new PopPbbActionBuilder();
157
158         ActionBuilder AB1 = new ActionBuilder();
159         AB1.setOrder(actionItem).setAction(new PopPbbActionCaseBuilder().setPopPbbAction(popPBB.build()).build());
160
161         actions.add(actionItem++, AB1.build());
162
163     }
164
165     private void NwTtlAction() {
166         SetNwTtlActionBuilder setNwTtlActionBuilder = new SetNwTtlActionBuilder();
167
168         setNwTtlActionBuilder.setNwTtl((short) 1);
169         ActionBuilder AB = new ActionBuilder();
170         AB.setOrder(actionItem).setAction(new SetNwTtlActionCaseBuilder().setSetNwTtlAction(setNwTtlActionBuilder.build()).build());
171
172         actions.add(actionItem++, AB.build());
173
174         DecNwTtlBuilder necNwTtlBuilder = new DecNwTtlBuilder();
175
176
177         ActionBuilder AB1 = new ActionBuilder();
178         AB1.setOrder(actionItem).setAction(new DecNwTtlCaseBuilder().setDecNwTtl(necNwTtlBuilder.build()).build());
179
180         actions.add(actionItem++, AB1.build());
181
182     }
183
184     private void setGroupAction() {
185
186         GroupActionBuilder grpIdAB = new GroupActionBuilder();
187         grpIdAB.setGroup("98");
188
189         ActionBuilder AB = new ActionBuilder();
190         AB.setOrder(actionItem).setAction(new GroupActionCaseBuilder().setGroupAction(grpIdAB.build()).build());
191
192         actions.add(actionItem++, AB.build());
193
194     }
195
196     // TODO - check if this method is needed (private and never used locally) - see line 94
197
198     private static void outputActions(final List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action> oFActionsList) {
199
200         for (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action action : oFActionsList) {
201
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()));
207
208
209             }
210             if (action.getActionChoice() instanceof CopyTtlInCase) {
211                 CopyTtlInCase copyTtlInCase = (CopyTtlInCase) action.getActionChoice();
212                 Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), CopyTtlInCase.class.getName());
213
214             }
215             if (action.getActionChoice() instanceof CopyTtlOutCase) {
216                 Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), CopyTtlOutCase.class.getName());
217             }
218
219             if (action.getActionChoice() instanceof
220                     // TODO:getMplsTtl is missing.
221                     SetMplsTtlCase) {
222                 Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), SetMplsTtlCase.class.getName());
223
224             }
225             if (action.getActionChoice() instanceof DecMplsTtlCase) {
226                 Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(),
227                         DecMplsTtlCase.class.getName());
228             }
229
230             if (action.getActionChoice() instanceof PushMplsCase) {
231                 PushMplsCase pushMplsCase = (PushMplsCase) action.getActionChoice();
232                 EtherType etherType = pushMplsCase.getPushMplsAction().getEthertype();
233
234                 if (etherType != null) {
235                     Assert.assertEquals((Integer) 10, etherType.getValue());
236                 }
237             }
238
239             if (action.getActionChoice() instanceof PopMplsCase) {
240                 PopMplsCase popMplsCase = (PopMplsCase) action.getActionChoice();
241                 Assert.assertEquals((Integer) 10, (popMplsCase.getPopMplsAction().getEthertype().getValue()));
242             }
243
244             if (action.getActionChoice() instanceof
245
246                     // TODO:SetQueue,I dont have getQueueId
247                     SetQueueCase) {
248                 Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), SetQueueCase.class.getName());
249             }
250
251             if (action.getActionChoice() instanceof GroupCase) {
252                 GroupCase groupCase = (GroupCase) action.getActionChoice();
253                 Assert.assertEquals(98, (long) (groupCase.getGroupAction().getGroupId()));
254             }
255
256             if (action.getActionChoice() instanceof PushVlanCase) {
257                 Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), PushVlanCase.class.getName());
258             }
259
260             if (action.getActionChoice() instanceof PopVlanCase) {
261                 Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), PopVlanCase.class.getName());
262             }
263
264             if (action.getActionChoice() instanceof SetNwTtlCase) {
265                 Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), SetNwTtlCase.class.getName());
266             }
267             if (action.getActionChoice() instanceof DecNwTtlCase) {
268                 Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), DecNwTtlCase.class.getName());
269             }
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());
274                 }
275             }
276
277             if (action.getActionChoice() instanceof PopMplsCase) {
278                 Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), PopMplsCase.class.getName());
279             }
280             if (action.getActionChoice() instanceof SetFieldCase) {
281                 SetFieldCase setFieldCase = (SetFieldCase) action.getActionChoice();
282                 Assert.assertNotNull(setFieldCase.getSetFieldAction());
283
284 /*
285                 Assert.assertEquals(OpenflowBasicClass.class, sf.getMatchEntry().get(0).getOxmClass());
286
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());
290
291                 }
292 */
293
294             }
295
296
297         }
298
299     }
300
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);
306
307         ActionBuilder AB = new ActionBuilder();
308         AB.setOrder(actionItem).setAction(new OutputActionCaseBuilder().setOutputAction(outputB.build()).build());
309
310         actions.add(actionItem++, AB.build());
311
312     }
313
314     private void CopyTtlData() {
315         CopyTtlOutBuilder copyB = new CopyTtlOutBuilder();
316
317         ActionBuilder AB = new ActionBuilder();
318         AB.setOrder(actionItem).setAction(new CopyTtlOutCaseBuilder().setCopyTtlOut(copyB.build()).build());
319
320         actions.add(actionItem++, AB.build());
321
322         CopyTtlInBuilder copyTtlInBuilder = new CopyTtlInBuilder();
323
324         ActionBuilder AB1 = new ActionBuilder();
325         AB1.setOrder(actionItem).setAction(new CopyTtlInCaseBuilder().setCopyTtlIn(copyTtlInBuilder.build()).build());
326
327         actions.add(actionItem++, AB1.build());
328
329     }
330
331     private void MplsTtlActionData() {
332
333         SetMplsTtlActionBuilder setMplsTtlActionB = new SetMplsTtlActionBuilder();
334
335         setMplsTtlActionB.setMplsTtl((short) 10);
336         ActionBuilder AB1 = new ActionBuilder();
337         AB1.setOrder(actionItem).setAction(new SetMplsTtlActionCaseBuilder().setSetMplsTtlAction(setMplsTtlActionB.build()).build());
338
339
340         actions.add(actionItem++, AB1.build());
341
342         DecMplsTtlBuilder decMplsTtlB = new DecMplsTtlBuilder();
343
344         ActionBuilder AB = new ActionBuilder();
345         AB.setOrder(actionItem).setAction(new DecMplsTtlCaseBuilder().setDecMplsTtl(decMplsTtlB.build()).build());
346
347         actions.add(actionItem++, AB.build());
348     }
349
350     private void vlanActionData() {
351         PushVlanActionBuilder pvB = new PushVlanActionBuilder();
352
353         pvB.setVlanId(new VlanId(10));
354
355         ActionBuilder AB1 = new ActionBuilder();
356         AB1.setOrder(actionItem).setAction(new PushVlanActionCaseBuilder().setPushVlanAction(pvB.build()).build());
357
358         actions.add(actionItem++, AB1.build());
359
360         PopVlanActionBuilder popVAB = new PopVlanActionBuilder();
361
362         ActionBuilder AB = new ActionBuilder();
363         AB.setOrder(actionItem).setAction(new PopVlanActionCaseBuilder().setPopVlanAction(popVAB.build()).build());
364
365         actions.add(actionItem++, AB.build());
366
367     }
368
369     private void mplsActionData() {
370
371         PushMplsActionBuilder pushMB = new PushMplsActionBuilder();
372         pushMB.setEthernetType(10);
373
374         ActionBuilder AB = new ActionBuilder();
375         AB.setOrder(actionItem).setAction(new PushMplsActionCaseBuilder().setPushMplsAction(pushMB.build()).build());
376
377         actions.add(actionItem++, AB.build());
378
379         PopMplsActionBuilder popMB = new PopMplsActionBuilder();
380         popMB.setEthernetType(10);
381
382         ActionBuilder AB1 = new ActionBuilder();
383         AB1.setOrder(actionItem).setAction(new PopMplsActionCaseBuilder().setPopMplsAction(popMB.build()).build());
384
385         actions.add(actionItem++, AB1.build());
386     }
387
388     private void setQueueActionData() {
389
390         SetQueueActionBuilder setQB = new SetQueueActionBuilder();
391         setQB.setQueue("99");
392
393         ActionBuilder AB1 = new ActionBuilder();
394         AB1.setOrder(actionItem).setAction(new SetQueueActionCaseBuilder().setSetQueueAction(setQB.build()).build());
395
396         actions.add(actionItem++, AB1.build());
397
398     }
399
400 }