Merge "openflow devices are getting disconnected from Controller, sending OFPBFC_BAD_...
[openflowplugin.git] / test-provider / src / main / java / org / opendaylight / openflowplugin / test / OpenflowpluginGroupTestCommandProvider.java
1 /*
2  * Copyright (c) 2013, 2015 IBM Corporation 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.test;
9
10 import com.google.common.base.Preconditions;
11 import com.google.common.util.concurrent.FutureCallback;
12 import com.google.common.util.concurrent.MoreExecutors;
13 import java.util.ArrayList;
14 import java.util.Collections;
15 import java.util.List;
16 import org.eclipse.osgi.framework.console.CommandInterpreter;
17 import org.eclipse.osgi.framework.console.CommandProvider;
18 import org.opendaylight.mdsal.binding.api.DataBroker;
19 import org.opendaylight.mdsal.binding.api.ReadWriteTransaction;
20 import org.opendaylight.mdsal.common.api.CommitInfo;
21 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
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.CopyTtlInCaseBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOutCaseBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtlCaseBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCaseBuilder;
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.SetMplsTtlActionCaseBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlActionCaseBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueActionCaseBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.in._case.CopyTtlInBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.out._case.CopyTtlOutBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.mpls.ttl._case.DecMplsTtlBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtlBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.group.action._case.GroupActionBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.mpls.action._case.PopMplsActionBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.pbb.action._case.PopPbbActionBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.vlan.action._case.PopVlanActionBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.mpls.action._case.PushMplsActionBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.pbb.action._case.PushPbbActionBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.vlan.action._case.PushVlanActionBuilder;
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.action.types.rev131112.action.list.ActionKey;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.BucketId;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketKey;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupKey;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
73 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
74 import org.opendaylight.yangtools.yang.common.Uint16;
75 import org.opendaylight.yangtools.yang.common.Uint32;
76 import org.opendaylight.yangtools.yang.common.Uint8;
77 import org.osgi.framework.BundleContext;
78
79 @SuppressWarnings("checkstyle:MethodName")
80 public class OpenflowpluginGroupTestCommandProvider implements CommandProvider {
81     private static final String ORIGINAL_GROUP_NAME = "Foo";
82
83     private final DataBroker dataBroker;
84     private final BundleContext ctx;
85     private Group testGroup;
86     private Node testNode;
87
88     public OpenflowpluginGroupTestCommandProvider(DataBroker dataBroker, BundleContext ctx) {
89         this.dataBroker = dataBroker;
90         this.ctx = ctx;
91     }
92
93     public void init() {
94         ctx.registerService(CommandProvider.class.getName(), this, null);
95         createTestNode();
96     }
97
98     private void createUserNode(String nodeRef) {
99         NodeBuilder builder = new NodeBuilder();
100         builder.setId(new NodeId(nodeRef));
101         builder.withKey(new NodeKey(builder.getId()));
102         testNode = builder.build();
103     }
104
105     private void createTestNode() {
106         NodeBuilder builder = new NodeBuilder();
107         builder.setId(new NodeId(OpenflowpluginTestActivator.NODE_ID));
108         builder.withKey(new NodeKey(builder.getId()));
109         testNode = builder.build();
110     }
111
112     private static InstanceIdentifier<Node> nodeToInstanceId(Node node) {
113         return InstanceIdentifier.create(Nodes.class).child(Node.class, node.key());
114     }
115
116     private GroupBuilder createTestGroup(String actionType, String groupType, String groupMod) {
117         // Sample data , committing to DataStore
118
119         GroupBuilder group = new GroupBuilder();
120         BucketBuilder bucket = new BucketBuilder().withKey(new BucketKey(new BucketId(Uint32.valueOf(12))));
121
122         if (groupType == null) {
123             groupType = "g1";
124         }
125         if (actionType == null) {
126             actionType = "a1";
127         }
128
129         switch (groupType) {
130             case "g1":
131                 group.setGroupType(GroupTypes.GroupSelect);
132                 break;
133             case "g2":
134                 group.setGroupType(GroupTypes.GroupAll);
135                 break;
136             case "g3":
137                 group.setGroupType(GroupTypes.GroupIndirect);
138                 break;
139             case "g4":
140                 group.setGroupType(GroupTypes.GroupFf);
141                 break;
142             default:
143                 break;
144         }
145
146         switch (actionType) {
147             case "a1":
148                 bucket.setAction(createPopVlanAction());
149                 break;
150             case "a2":
151                 bucket.setAction(createPushVlanAction());
152                 break;
153             case "a3":
154                 bucket.setAction(createPushMplsAction());
155                 break;
156             case "a4":
157                 bucket.setAction(createPopMplsAction());
158                 break;
159             case "a5":
160                 bucket.setAction(createPopPbbAction());
161                 break;
162             case "a6":
163             case "a7":
164                 bucket.setAction(createPushPbbAction());
165                 break;
166             case "a8":
167                 bucket.setAction(createCopyTtlInAction());
168                 break;
169             case "a9":
170                 bucket.setAction(createCopyTtlOutAction());
171                 break;
172             case "a10":
173                 bucket.setAction(createDecMplsTtlAction());
174                 break;
175             case "a11":
176                 bucket.setAction(createDecNwTtlAction());
177                 break;
178             case "a12":
179                 bucket.setAction(createSetQueueAction());
180                 break;
181             case "a13":
182                 bucket.setAction(createSetNwTtlAction());
183                 break;
184             case "a14":
185                 bucket.setAction(createGroupAction());
186                 break;
187             case "a15":
188                 bucket.setAction(createSetMplsTtlAction());
189                 break;
190             case "a16":
191                 bucket.setAction(createFloodOutputAction());
192                 break;
193             case "a17":
194                 bucket.setAction(createAllOutputAction());
195                 break;
196             case "a18":
197                 bucket.setAction(createNormalOutputAction());
198                 break;
199             case "a19":
200                 bucket.setAction(creatTableOutputAction());
201                 break;
202             case "a20":
203                 bucket.setAction(createControllerAction());
204                 break;
205             case "a21":
206                 bucket.setAction(createLocalOutputAction());
207                 break;
208             case "a22":
209                 bucket.setAction(createAnyOutputAction());
210                 break;
211             case "a23":
212                 bucket.setAction(createInportOutputAction());
213                 break;
214             case "a24":
215                 bucket.setAction(Collections.emptyList());
216                 break;
217             case "a25":
218                 bucket.setAction(createNonAppyOutputAction());
219                 break;
220             case "a26":
221                 bucket.setAction(createNonAppyPushMplsAction());
222                 break;
223             case "a27":
224                 bucket.setAction(createNonAppyPushPbbAction());
225                 break;
226             case "a28":
227                 bucket.setAction(createNonAppyPushVlanAction());
228                 break;
229             default:
230                 break;
231         }
232
233         if ("add".equals(groupMod)) {
234             bucket.setWatchGroup(Uint32.valueOf(14));
235             bucket.setWatchPort(Uint32.valueOf(1234));
236             bucket.setWeight(Uint16.valueOf(50));
237         } else {
238             bucket.setWatchGroup(Uint32.valueOf(13));
239             bucket.setWatchPort(Uint32.valueOf(134));
240             bucket.setWeight(Uint16.valueOf(30));
241         }
242
243         GroupKey key = new GroupKey(new GroupId(Uint32.ONE));
244         group.withKey(key);
245         // group.setInstall(false);
246         group.setGroupName(ORIGINAL_GROUP_NAME);
247         group.setBarrier(false);
248         BucketsBuilder value = new BucketsBuilder();
249         List<Bucket> value1 = new ArrayList<>();
250         value1.add(bucket.build());
251         value.setBucket(value1);
252         group.setBuckets(value.build());
253         testGroup = group.build();
254         return group;
255     }
256
257
258     private static List<Action> createPopVlanAction() {
259         PopVlanActionBuilder vlanAction = new PopVlanActionBuilder();
260         ActionBuilder action = new ActionBuilder();
261         action.setAction(new PopVlanActionCaseBuilder().setPopVlanAction(vlanAction.build()).build());
262         action.withKey(new ActionKey(0));
263         List<Action> actions = new ArrayList<>();
264         actions.add(action.build());
265         return actions;
266     }
267
268     private static List<Action> createPushVlanAction() {
269         PushVlanActionBuilder vlan = new PushVlanActionBuilder();
270         vlan.setEthernetType(Uint16.valueOf(0x8100));
271         ActionBuilder action = new ActionBuilder();
272         action.setAction(new PushVlanActionCaseBuilder().setPushVlanAction(vlan.build()).build());
273         List<Action> actions = new ArrayList<>();
274         actions.add(action.build());
275         return actions;
276     }
277
278     private static List<Action> createPushMplsAction() {
279         PushMplsActionBuilder push = new PushMplsActionBuilder();
280         push.setEthernetType(Uint16.valueOf(0x8847));
281         ActionBuilder action = new ActionBuilder();
282         action.setAction(new PushMplsActionCaseBuilder().setPushMplsAction(push.build()).build());
283         List<Action> actions = new ArrayList<>();
284         actions.add(action.build());
285         return actions;
286     }
287
288     private static List<Action> createPopMplsAction() {
289         PopMplsActionBuilder popMplsActionBuilder = new PopMplsActionBuilder();
290         popMplsActionBuilder.setEthernetType(Uint16.valueOf(0XB));
291         ActionBuilder action = new ActionBuilder();
292         action.setAction(new PopMplsActionCaseBuilder().setPopMplsAction(popMplsActionBuilder.build()).build());
293         List<Action> actions = new ArrayList<>();
294         actions.add(action.build());
295         return actions;
296     }
297
298     private static List<Action> createPopPbbAction() {
299         PopPbbActionBuilder popPbbActionBuilder = new PopPbbActionBuilder();
300         ActionBuilder action = new ActionBuilder();
301         action.setAction(new PopPbbActionCaseBuilder().setPopPbbAction(popPbbActionBuilder.build()).build());
302         List<Action> actions = new ArrayList<>();
303         actions.add(action.build());
304         return actions;
305     }
306
307     private static List<Action> createPushPbbAction() {
308         PushPbbActionBuilder pbb = new PushPbbActionBuilder();
309         pbb.setEthernetType(Uint16.valueOf(0x88E7));
310         ActionBuilder action = new ActionBuilder();
311         action.setAction(new PushPbbActionCaseBuilder().setPushPbbAction(pbb.build()).build());
312         List<Action> actions = new ArrayList<>();
313         actions.add(action.build());
314         return actions;
315     }
316
317     private static List<Action> createSetMplsTtlAction() {
318         SetMplsTtlActionBuilder setMplsTtlActionBuilder = new SetMplsTtlActionBuilder();
319         setMplsTtlActionBuilder.setMplsTtl(Uint8.ONE);
320         ActionBuilder action = new ActionBuilder();
321         action.setAction(new SetMplsTtlActionCaseBuilder().setSetMplsTtlAction(
322                 setMplsTtlActionBuilder.build()).build());
323         List<Action> actions = new ArrayList<>();
324         actions.add(action.build());
325         return actions;
326     }
327
328     private static List<Action> createSetNwTtlAction() {
329         SetNwTtlActionBuilder setNwTtlActionBuilder = new SetNwTtlActionBuilder();
330         setNwTtlActionBuilder.setNwTtl(Uint8.ONE);
331         ActionBuilder action = new ActionBuilder();
332         action.setAction(new SetNwTtlActionCaseBuilder().setSetNwTtlAction(setNwTtlActionBuilder.build()).build());
333         List<Action> actions = new ArrayList<>();
334         actions.add(action.build());
335         return actions;
336     }
337
338     private static List<Action> createSetQueueAction() {
339         SetQueueActionBuilder setQueueActionBuilder = new SetQueueActionBuilder();
340         setQueueActionBuilder.setQueueId(Uint32.ONE);
341         ActionBuilder action = new ActionBuilder();
342         action.setAction(new SetQueueActionCaseBuilder().setSetQueueAction(setQueueActionBuilder.build()).build());
343         action.withKey(new ActionKey(0));
344         List<Action> actions = new ArrayList<>();
345         actions.add(action.build());
346         return actions;
347     }
348
349
350     private static List<Action> createCopyTtlInAction() {
351         CopyTtlInBuilder ttlin = new CopyTtlInBuilder();
352         ActionBuilder action = new ActionBuilder();
353         action.setAction(new CopyTtlInCaseBuilder().setCopyTtlIn(ttlin.build()).build());
354         List<Action> actions = new ArrayList<>();
355         actions.add(action.build());
356         return actions;
357     }
358
359     private static List<Action> createCopyTtlOutAction() {
360         CopyTtlOutBuilder ttlout = new CopyTtlOutBuilder();
361         ActionBuilder action = new ActionBuilder();
362         action.setAction(new CopyTtlOutCaseBuilder().setCopyTtlOut(ttlout.build()).build());
363         List<Action> actions = new ArrayList<>();
364         actions.add(action.build());
365         return actions;
366     }
367
368     private static List<Action> createDecMplsTtlAction() {
369         DecMplsTtlBuilder mpls = new DecMplsTtlBuilder();
370         ActionBuilder action = new ActionBuilder();
371         action.setAction(new DecMplsTtlCaseBuilder().setDecMplsTtl(mpls.build()).build());
372         List<Action> actions = new ArrayList<>();
373         actions.add(action.build());
374         return actions;
375     }
376
377     private static List<Action> createDecNwTtlAction() {
378         DecNwTtlBuilder nwttl = new DecNwTtlBuilder();
379         ActionBuilder action = new ActionBuilder();
380         action.setAction(new DecNwTtlCaseBuilder().setDecNwTtl(nwttl.build()).build());
381
382         ActionBuilder ab = new ActionBuilder();
383         OutputActionBuilder output = new OutputActionBuilder();
384         //  output.setMaxLength(30);
385         Uri value = new Uri("2");
386         output.setOutputNodeConnector(value);
387         ab.setAction(new OutputActionCaseBuilder().setOutputAction(output.build()).build());
388         ab.withKey(new ActionKey(0));
389         ab.setOrder(0);
390
391         List<Action> actions = new ArrayList<>();
392         actions.add(ab.build());
393         actions.add(action.build());
394         return actions;
395     }
396
397     private static List<Action> createFloodOutputAction() {
398         ActionBuilder ab = new ActionBuilder();
399         OutputActionBuilder output = new OutputActionBuilder();
400         output.setMaxLength(Uint16.valueOf(30));
401         Uri value = new Uri(OutputPortValues.FLOOD.toString());
402         output.setOutputNodeConnector(value);
403         ab.setAction(new OutputActionCaseBuilder().setOutputAction(output.build()).build());
404         ab.withKey(new ActionKey(0));
405
406         List<Action> actions = new ArrayList<>();
407         actions.add(ab.build());
408         return actions;
409     }
410
411     private static List<Action> createAllOutputAction() {
412         ActionBuilder ab = new ActionBuilder();
413         OutputActionBuilder output = new OutputActionBuilder();
414         output.setMaxLength(Uint16.valueOf(30));
415         Uri value = new Uri(OutputPortValues.ALL.toString());
416         output.setOutputNodeConnector(value);
417         ab.setAction(new OutputActionCaseBuilder().setOutputAction(output.build()).build());
418         ab.withKey(new ActionKey(0));
419
420         List<Action> actions = new ArrayList<>();
421         actions.add(ab.build());
422         return actions;
423     }
424
425     private static List<Action> createAnyOutputAction() {
426         ActionBuilder ab = new ActionBuilder();
427         OutputActionBuilder output = new OutputActionBuilder();
428         output.setMaxLength(Uint16.valueOf(30));
429         Uri value = new Uri(OutputPortValues.ANY.toString());
430         output.setOutputNodeConnector(value);
431         ab.setAction(new OutputActionCaseBuilder().setOutputAction(output.build()).build());
432         ab.withKey(new ActionKey(0));
433
434         List<Action> actions = new ArrayList<>();
435         actions.add(ab.build());
436         return actions;
437     }
438
439     private static List<Action> createNormalOutputAction() {
440         ActionBuilder ab = new ActionBuilder();
441         OutputActionBuilder output = new OutputActionBuilder();
442         output.setMaxLength(Uint16.valueOf(30));
443         Uri value = new Uri(OutputPortValues.NORMAL.toString());
444         output.setOutputNodeConnector(value);
445         ab.setAction(new OutputActionCaseBuilder().setOutputAction(output.build()).build());
446         ab.withKey(new ActionKey(0));
447
448         List<Action> actions = new ArrayList<>();
449         actions.add(ab.build());
450         return actions;
451     }
452
453     private static List<Action> createInportOutputAction() {
454         ActionBuilder ab = new ActionBuilder();
455         OutputActionBuilder output = new OutputActionBuilder();
456         output.setMaxLength(Uint16.valueOf(30));
457         Uri value = new Uri(OutputPortValues.INPORT.toString());
458         output.setOutputNodeConnector(value);
459         ab.setAction(new OutputActionCaseBuilder().setOutputAction(output.build()).build());
460         ab.withKey(new ActionKey(0));
461
462         List<Action> actions = new ArrayList<>();
463         actions.add(ab.build());
464         return actions;
465     }
466
467     private static List<Action> creatTableOutputAction() {
468         ActionBuilder ab = new ActionBuilder();
469         OutputActionBuilder output = new OutputActionBuilder();
470         output.setMaxLength(Uint16.valueOf(30));
471         Uri value = new Uri(OutputPortValues.TABLE.toString());
472         output.setOutputNodeConnector(value);
473         ab.setAction(new OutputActionCaseBuilder().setOutputAction(output.build()).build());
474         ab.withKey(new ActionKey(0));
475
476         List<Action> actions = new ArrayList<>();
477         actions.add(ab.build());
478         return actions;
479     }
480
481     private static List<Action> createControllerAction() {
482         ActionBuilder ab = new ActionBuilder();
483         OutputActionBuilder output = new OutputActionBuilder();
484         output.setMaxLength(Uint16.valueOf(30));
485         Uri value = new Uri(OutputPortValues.CONTROLLER.toString());
486         output.setOutputNodeConnector(value);
487         ab.setAction(new OutputActionCaseBuilder().setOutputAction(output.build()).build());
488         ab.withKey(new ActionKey(0));
489
490         List<Action> actions = new ArrayList<>();
491         actions.add(ab.build());
492         return actions;
493     }
494
495     private static List<Action> createLocalOutputAction() {
496         ActionBuilder ab = new ActionBuilder();
497         OutputActionBuilder output = new OutputActionBuilder();
498         output.setMaxLength(Uint16.valueOf(30));
499         Uri value = new Uri(OutputPortValues.LOCAL.toString());
500         output.setOutputNodeConnector(value);
501         ab.setAction(new OutputActionCaseBuilder().setOutputAction(output.build()).build());
502         ab.withKey(new ActionKey(0));
503
504         List<Action> actions = new ArrayList<>();
505         actions.add(ab.build());
506         return actions;
507     }
508
509     private static List<Action> createGroupAction() {
510         GroupActionBuilder groupActionB = new GroupActionBuilder();
511         groupActionB.setGroupId(Uint32.ONE);
512         groupActionB.setGroup("0");
513         ActionBuilder action = new ActionBuilder();
514         action.setAction(new GroupActionCaseBuilder().setGroupAction(groupActionB.build()).build());
515         action.withKey(new ActionKey(0));
516         List<Action> actions = new ArrayList<>();
517         actions.add(action.build());
518         return actions;
519     }
520
521     private static List<Action> createNonAppyOutputAction() {
522         ActionBuilder ab = new ActionBuilder();
523         OutputActionBuilder output = new OutputActionBuilder();
524         Uri value = new Uri(OutputPortValues.CONTROLLER.toString());
525         output.setOutputNodeConnector(value);
526         //output.setMaxLength(null);
527         output.setMaxLength(Uint16.valueOf(66000));
528         ab.setAction(new OutputActionCaseBuilder().setOutputAction(output.build()).build());
529
530         List<Action> actionList = new ArrayList<>();
531         actionList.add(ab.build());
532         return actionList;
533     }
534
535     private static List<Action> createNonAppyPushMplsAction() {
536         List<Action> actionList = new ArrayList<>();
537         ActionBuilder ab = new ActionBuilder();
538         PushMplsActionBuilder push = new PushMplsActionBuilder();
539         push.setEthernetType(Uint16.valueOf(0x8849));
540         ab.setAction(new PushMplsActionCaseBuilder().setPushMplsAction(push.build()).build());
541         actionList.add(ab.build());
542         return actionList;
543     }
544
545     private static List<Action> createNonAppyPushPbbAction() {
546         List<Action> actionList = new ArrayList<>();
547         ActionBuilder ab = new ActionBuilder();
548         PushPbbActionBuilder pbb = new PushPbbActionBuilder();
549         pbb.setEthernetType(Uint16.valueOf(0x88E8));
550         ab.setAction(new PushPbbActionCaseBuilder().setPushPbbAction(pbb.build()).build());
551         actionList.add(ab.build());
552         return actionList;
553     }
554
555     private static List<Action> createNonAppyPushVlanAction() {
556         List<Action> actionList = new ArrayList<>();
557         ActionBuilder ab = new ActionBuilder();
558         PushVlanActionBuilder vlan = new PushVlanActionBuilder();
559         vlan.setEthernetType(Uint16.valueOf(0x8101));
560         ab.setAction(new PushVlanActionCaseBuilder().setPushVlanAction(vlan.build()).build());
561         actionList.add(ab.build());
562         return actionList;
563     }
564
565     public void _removeGroup(final CommandInterpreter ci) {
566         String nref = ci.nextArgument();
567
568         if (nref == null) {
569             ci.println("test node added");
570             createTestNode();
571         } else {
572             ci.println("User node added" + nref);
573             createUserNode(nref);
574         }
575         GroupBuilder gbuilder = createTestGroup(ci.nextArgument(), ci.nextArgument(), "add");
576         ReadWriteTransaction modification = Preconditions.checkNotNull(dataBroker).newReadWriteTransaction();
577         InstanceIdentifier<Group> path1 = InstanceIdentifier.create(Nodes.class).child(Node.class, testNode.key())
578                 .augmentation(FlowCapableNode.class).child(Group.class, new GroupKey(gbuilder.getGroupId()));
579         modification.delete(LogicalDatastoreType.CONFIGURATION, path1);
580         modification.commit().addCallback(new FutureCallback<CommitInfo>() {
581             @Override
582             public void onSuccess(CommitInfo notUsed) {
583                 ci.println("Status of Group Data Loaded Transaction: success.");
584             }
585
586             @Override
587             public void onFailure(Throwable throwable) {
588                 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
589             }
590         }, MoreExecutors.directExecutor());
591     }
592
593     public void _addGroup(CommandInterpreter ci) {
594         String nref = ci.nextArgument();
595
596         if (nref == null) {
597             ci.println("test node added");
598             createTestNode();
599         } else {
600             ci.println("User node added" + nref);
601             createUserNode(nref);
602         }
603         createTestGroup(ci.nextArgument(), ci.nextArgument(), "add");
604         writeGroup(ci, testGroup);
605     }
606
607     private void writeGroup(final CommandInterpreter ci, Group group) {
608         ReadWriteTransaction modification = Preconditions.checkNotNull(dataBroker).newReadWriteTransaction();
609         InstanceIdentifier<Group> path1 = InstanceIdentifier.create(Nodes.class)
610                 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
611                 .child(Group.class, new GroupKey(group.getGroupId()));
612         modification.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, nodeToInstanceId(testNode),
613                 testNode);
614         modification.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, path1, group);
615         modification.commit().addCallback(new FutureCallback<CommitInfo>() {
616             @Override
617             public void onSuccess(CommitInfo notUsed) {
618                 ci.println("Status of Group Data Loaded Transaction: success.");
619             }
620
621             @Override
622             public void onFailure(Throwable throwable) {
623                 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
624             }
625         }, MoreExecutors.directExecutor());
626     }
627
628     public void _modifyGroup(CommandInterpreter ci) {
629         String nref = ci.nextArgument();
630
631         if (nref == null) {
632             ci.println("test node added");
633             createTestNode();
634         } else {
635             ci.println("User node added" + nref);
636             createUserNode(nref);
637         }
638         GroupBuilder group = createTestGroup(ci.nextArgument(), ci.nextArgument(), "modify");
639         writeGroup(ci, group.build());
640
641         //     group.setGroupName(originalGroupName);
642         //   writeGroup(ci, group.build());
643     }
644
645     @Override
646     public String getHelp() {
647         StringBuilder help = new StringBuilder();
648         help.append("---FRM MD-SAL Group test module---\n");
649         help.append("\t addGroup <node id>        - node ref\n");
650         help.append("\t modifyGroup <node id>        - node ref\n");
651         help.append("\t removeGroup <node id>        - node ref\n");
652
653         return help.toString();
654     }
655 }