Remove node-errors.yang
[openflowplugin.git] / test-provider / src / main / java / org / opendaylight / openflowplugin / test / OpenflowPluginBulkGroupTransactionProvider.java
1 /*
2  * Copyright (c) 2014, 2015 Ericsson, 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 package org.opendaylight.openflowplugin.test;
9
10 import com.google.common.util.concurrent.FutureCallback;
11 import com.google.common.util.concurrent.MoreExecutors;
12 import java.util.Map;
13 import org.eclipse.osgi.framework.console.CommandInterpreter;
14 import org.eclipse.osgi.framework.console.CommandProvider;
15 import org.opendaylight.mdsal.binding.api.DataBroker;
16 import org.opendaylight.mdsal.binding.api.ReadWriteTransaction;
17 import org.opendaylight.mdsal.common.api.CommitInfo;
18 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.ControllerActionCaseBuilder;
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.PopMplsActionCaseBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionCaseBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCaseBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionCaseBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionCaseBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCaseBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdActionCaseBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.controller.action._case.ControllerActionBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.in._case.CopyTtlInBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.out._case.CopyTtlOutBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.mpls.ttl._case.DecMplsTtlBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtlBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropActionBuilder;
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.pop.mpls.action._case.PopMplsActionBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.pbb.action._case.PopPbbActionBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.vlan.action._case.PopVlanActionBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.mpls.action._case.PushMplsActionBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.pbb.action._case.PushPbbActionBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.vlan.action._case.PushVlanActionBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.id.action._case.SetVlanIdActionBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.GoToTableCaseBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.MeterCaseBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.go.to.table._case.GoToTableBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.meter._case.MeterBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.BucketId;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketKey;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupKey;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
89 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
90 import org.opendaylight.yangtools.yang.binding.util.BindingMap;
91 import org.opendaylight.yangtools.yang.common.Uint16;
92 import org.opendaylight.yangtools.yang.common.Uint32;
93 import org.opendaylight.yangtools.yang.common.Uint64;
94 import org.opendaylight.yangtools.yang.common.Uint8;
95 import org.osgi.framework.BundleContext;
96 import org.slf4j.Logger;
97 import org.slf4j.LoggerFactory;
98
99 public class OpenflowPluginBulkGroupTransactionProvider implements CommandProvider {
100     private static final Logger LOG = LoggerFactory.getLogger(OpenflowPluginBulkGroupTransactionProvider.class);
101     private final DataBroker dataBroker;
102     private final BundleContext ctx;
103     private final String originalFlowName = "Foo";
104     private Node testNode12;
105     private final String originalGroupName = "Foo";
106
107     public OpenflowPluginBulkGroupTransactionProvider(final DataBroker dataBroker, final BundleContext ctx) {
108         this.dataBroker = dataBroker;
109         this.ctx = ctx;
110     }
111
112     public void init() {
113         ctx.registerService(CommandProvider.class.getName(), this, null);
114         createTestFlow(createTestNode(null), null, null);
115     }
116
117     private static NodeBuilder createTestNode(String nodeId) {
118         if (nodeId == null) {
119             nodeId = OpenflowpluginTestActivator.NODE_ID;
120         }
121         return new NodeBuilder().setId(new NodeId(nodeId));
122     }
123
124     private void createTestNode() {
125         testNode12 = new NodeBuilder().setId(new NodeId(OpenflowpluginTestActivator.NODE_ID)).build();
126     }
127
128     @Override
129     public String getHelp() {
130         return "No help";
131     }
132
133     private static MatchBuilder createMatch1() {
134         MatchBuilder match = new MatchBuilder();
135         Ipv4MatchBuilder ipv4Match = new Ipv4MatchBuilder();
136         Ipv4Prefix prefix = new Ipv4Prefix("10.0.0.1/24");
137         ipv4Match.setIpv4Destination(prefix);
138         Ipv4Match i4m = ipv4Match.build();
139         match.setLayer3Match(i4m);
140
141         EthernetMatchBuilder eth = new EthernetMatchBuilder();
142         EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
143         ethTypeBuilder.setType(new EtherType(Uint32.valueOf(0x0800)));
144         eth.setEthernetType(ethTypeBuilder.build());
145         match.setEthernetMatch(eth.build());
146         return match;
147     }
148
149     private static InstructionsBuilder createDecNwTtlInstructions() {
150         return new InstructionsBuilder()
151             .setInstruction(BindingMap.of(new InstructionBuilder()
152                 .setOrder(0)
153                 .setInstruction(new ApplyActionsCaseBuilder()
154                     .setApplyActions(new ApplyActionsBuilder()
155                         .setAction(BindingMap.of(new ActionBuilder()
156                             .setAction(new DecNwTtlCaseBuilder().setDecNwTtl(new DecNwTtlBuilder().build()).build())
157                             .build()))
158                         .build())
159                     .build())
160                 .build()));
161     }
162
163     private static MatchBuilder createMatch2() {
164         return new MatchBuilder()
165             .setLayer3Match(new Ipv4MatchBuilder().setIpv4Source(new Ipv4Prefix("10.0.0.1")).build())
166             .setEthernetMatch(new EthernetMatchBuilder()
167                 .setEthernetType(new EthernetTypeBuilder().setType(new EtherType(Uint32.valueOf(0x0800))).build())
168                 .build());
169     }
170
171     private static MatchBuilder createMatch3() {
172         return new MatchBuilder()
173             .setEthernetMatch(new EthernetMatchBuilder()
174                 .setEthernetSource(new EthernetSourceBuilder().setAddress(new MacAddress("00:00:00:00:00:01")).build())
175                 .build());
176     }
177
178     private static InstructionsBuilder createDropInstructions() {
179         return new InstructionsBuilder()
180             .setInstruction(BindingMap.of(new InstructionBuilder()
181                 .setInstruction(new ApplyActionsCaseBuilder()
182                     .setApplyActions(new ApplyActionsBuilder()
183                         .setAction(BindingMap.of(new ActionBuilder()
184                             .setAction(new DropActionCaseBuilder()
185                                 .setDropAction(new DropActionBuilder().build())
186                                 .build())
187                             .build()))
188                         .build())
189                     .build())
190                 .build()));
191     }
192
193     private static MatchBuilder createEthernetMatch() {
194         return new MatchBuilder()
195             .setEthernetMatch(new EthernetMatchBuilder()
196                 .setEthernetType(new EthernetTypeBuilder().setType(new EtherType(Uint32.valueOf(0x0800))).build())
197                 .setEthernetDestination(new EthernetDestinationBuilder()
198                     .setAddress(new MacAddress("ff:ff:ff:ff:ff:ff"))
199                     // .setMask(mask1);
200                     .build())
201                 .setEthernetSource(new EthernetSourceBuilder()
202                     .setAddress(new MacAddress("00:00:00:00:23:ae"))
203                     // .setMask(mask2);
204                     .build())
205                 .build());
206     }
207
208     private static InstructionsBuilder createMeterInstructions() {
209         return new InstructionsBuilder()
210             .setInstruction(BindingMap.of(new InstructionBuilder()
211                 .setInstruction(new MeterCaseBuilder()
212                     .setMeter(new MeterBuilder().setMeterId(new MeterId(Uint32.ONE)).build())
213                     .build())
214                 .build()));
215     }
216
217     private static InstructionsBuilder createAppyActionInstruction() {
218         return new InstructionsBuilder()
219             .setInstruction(BindingMap.of(new InstructionBuilder()
220                 .setInstruction(new ApplyActionsCaseBuilder()
221                     .setApplyActions(new ApplyActionsBuilder()
222                         .setAction(BindingMap.of(new ActionBuilder()
223                             .setAction(new ControllerActionCaseBuilder()
224                                 .setControllerAction(new ControllerActionBuilder()
225                                     .setMaxLength(Uint16.valueOf(5))
226                                     .build())
227                                 .build())
228                             .build()))
229                         .build())
230                     .build())
231                 .build()));
232     }
233
234     private static InstructionsBuilder createAppyActionInstruction7() {
235         return new InstructionsBuilder()
236             .setInstruction(BindingMap.of(new InstructionBuilder()
237                 .setInstruction(new ApplyActionsCaseBuilder()
238                     .setApplyActions(new ApplyActionsBuilder()
239                         .setAction(BindingMap.of(new ActionBuilder()
240                             .setAction(new SetVlanIdActionCaseBuilder()
241                                 .setSetVlanIdAction(new SetVlanIdActionBuilder()
242                                     .setVlanId(new VlanId(Uint16.valueOf(4012)))
243                                     .build())
244                                 .build())
245                             .build()))
246                         .build())
247                     .build())
248                 .build()));
249     }
250
251     private static InstructionsBuilder createAppyActionInstruction21() {
252         return new InstructionsBuilder()
253             .setInstruction(BindingMap.of(new InstructionBuilder()
254                 .setInstruction(new ApplyActionsCaseBuilder()
255                     .setApplyActions(new ApplyActionsBuilder()
256                         .setAction(BindingMap.of(new ActionBuilder()
257                             .setAction(new PopVlanActionCaseBuilder()
258                                 .setPopVlanAction(new PopVlanActionBuilder().build())
259                                 .build())
260                             .build()))
261                         .build())
262                     .build())
263                 .build()));
264     }
265
266     private static InstructionsBuilder createAppyActionInstruction2() {
267         return new InstructionsBuilder()
268             .setInstruction(BindingMap.of(new InstructionBuilder()
269                 .setInstruction(new ApplyActionsCaseBuilder()
270                     .setApplyActions(new ApplyActionsBuilder()
271                         .setAction(BindingMap.of(new ActionBuilder()
272                             .setAction(new PushMplsActionCaseBuilder()
273                                 .setPushMplsAction(new PushMplsActionBuilder()
274                                     .setEthernetType(Uint16.valueOf(0x8847))
275                                     .build())
276                                 .build())
277                             .build()))
278                         .build())
279                     .build())
280                 .build()));
281     }
282
283     private static InstructionsBuilder createAppyActionInstruction3() {
284         return new InstructionsBuilder()
285             .setInstruction(BindingMap.of(new InstructionBuilder()
286                 .setInstruction(new ApplyActionsCaseBuilder()
287                     .setApplyActions(new ApplyActionsBuilder()
288                         .setAction(BindingMap.of(new ActionBuilder()
289                             .setAction(new PushPbbActionCaseBuilder()
290                                 .setPushPbbAction(new PushPbbActionBuilder()
291                                     .setEthernetType(Uint16.valueOf(0x88E7))
292                                     .build())
293                                 .build())
294                             .build()))
295                         .build())
296                     .build())
297                 .build()));
298     }
299
300     private static InstructionsBuilder createGotoTableInstructions() {
301         return new InstructionsBuilder()
302             .setInstruction(BindingMap.of(new InstructionBuilder()
303                 .setInstruction(new GoToTableCaseBuilder()
304                     .setGoToTable(new GoToTableBuilder().setTableId(Uint8.TWO).build())
305                     .build())
306                 .build()));
307     }
308
309     private FlowBuilder createTestFlow(final NodeBuilder nodeBuilder, final String flowTypeArg, final String tableId) {
310
311         FlowBuilder flow = new FlowBuilder();
312         long id = 123;
313
314         String flowType = flowTypeArg;
315         if (flowType == null) {
316             flowType = "f1";
317         }
318
319         switch (flowType) {
320             case "f1":
321                 id += 1;
322                 flow.setMatch(createMatch1().build());
323                 flow.setInstructions(createDecNwTtlInstructions().build());
324                 break;
325             case "f2":
326                 id += 2;
327                 flow.setMatch(createMatch2().build());
328                 flow.setInstructions(createDropInstructions().build());
329                 break;
330             case "f3":
331                 id += 3;
332                 flow.setMatch(createMatch3().build());
333                 flow.setInstructions(createDropInstructions().build());
334                 break;
335             case "f4":
336                 id += 4;
337                 flow.setMatch(createEthernetMatch().build());
338                 flow.setInstructions(createDropInstructions().build());
339                 break;
340             case "f82":
341                 id += 1;
342                 flow.setMatch(createMatch1().build());
343                 flow.setInstructions(createDropInstructions().build());
344                 break;
345             case "f5":
346                 id += 5;
347                 flow.setMatch(createMatch1().build());
348                 flow.setInstructions(createAppyActionInstruction().build());
349                 break;
350             case "f6":
351                 id += 6;
352                 flow.setMatch(createMatch1().build());
353                 flow.setInstructions(createGotoTableInstructions().build());
354                 break;
355             case "f7":
356                 id += 7;
357                 flow.setMatch(createMatch1().build());
358                 flow.setInstructions(createMeterInstructions().build());
359                 break;
360             case "f8":
361                 id += 8;
362                 flow.setMatch(createMatch1().build());
363                 flow.setInstructions(createAppyActionInstruction7().build());
364                 break;
365             case "f9":
366                 id += 9;
367                 flow.setMatch(createMatch1().build());
368                 flow.setInstructions(createAppyActionInstruction2().build());
369                 break;
370             case "f10":
371                 id += 10;
372                 flow.setMatch(createMatch1().build());
373                 flow.setInstructions(createAppyActionInstruction3().build());
374                 break;
375             case "f14":
376                 id += 14;
377                 flow.setMatch(createMatch1().build());
378                 flow.setInstructions(createAppyActionInstruction7().build());
379                 break;
380             case "f29":
381                 id += 29;
382                 flow.setMatch(createMatch1().build());
383                 flow.setInstructions(createAppyActionInstruction21().build());
384                 break;
385
386             default:
387                 LOG.warn("flow type not understood: {}", flowType);
388         }
389
390         final FlowKey key = new FlowKey(new FlowId(Long.toString(id)));
391         if (null == flow.getBarrier()) {
392             flow.setBarrier(Boolean.FALSE);
393         }
394         // flow.setBufferId(12L);
395         flow.setCookie(new FlowCookie(Uint64.TEN));
396         flow.setCookieMask(new FlowCookie(Uint64.TEN));
397         flow.setHardTimeout(Uint16.ZERO);
398         flow.setIdleTimeout(Uint16.ZERO);
399         flow.setInstallHw(false);
400         flow.setStrict(false);
401         flow.setContainerName(null);
402         flow.setFlags(new FlowModFlags(false, false, false, false, true));
403         flow.setId(new FlowId("12"));
404         flow.setTableId(getTableId(tableId));
405         flow.setOutGroup(Uint32.MAX_VALUE);
406         // set outport to OFPP_NONE (65535) to disable remove restriction for
407         // flow
408         flow.setOutPort(Uint64.valueOf(4294967295L));
409
410         flow.withKey(key);
411         flow.setPriority(Uint16.TWO);
412         flow.setFlowName(originalFlowName + "X" + flowType);
413         return flow;
414     }
415
416     private static Uint8 getTableId(final String tableId) {
417         Uint8 table = Uint8.TWO;
418         if (tableId == null) {
419             return table;
420         }
421
422         try {
423             table = Uint8.valueOf(tableId);
424         } catch (IllegalArgumentException ex) {
425             // ignore exception and continue with default value
426         }
427
428         return table;
429
430     }
431
432     @SuppressWarnings("checkstyle:MethodName")
433     public void _addGroups(final CommandInterpreter ci) {
434         String nref = ci.nextArgument();
435
436         if (nref == null) {
437             ci.println("test node added");
438             createTestNode();
439         } else {
440             ci.println("User node added" + nref);
441             createUserNode(nref);
442         }
443         int count = Integer.parseInt(ci.nextArgument());
444         switch (count) {
445             case 1:
446                 GroupBuilder group = createTestGroup("a7", "g1", "add", "1");
447                 GroupBuilder group1 = createTestGroup("a3", "g1", "add", "2");
448                 writeGroup(ci, group.build(), group1.build());
449                 break;
450             case 2:
451                 GroupBuilder group2 = createTestGroup("a4", "g1", "add", "4");
452                 GroupBuilder group3 = createTestGroup("a5", "g1", "add", "5");
453                 writeGroup(ci, group2.build(), group3.build());
454                 break;
455             case 3:
456                 GroupBuilder group4 = createTestGroup("a6", "g1", "add", "6");
457                 GroupBuilder group5 = createTestGroup("a7", "g1", "add", "7");
458                 writeGroup(ci, group4.build(), group5.build());
459                 break;
460             case 4:
461                 // -ve
462                 GroupBuilder group6 = createTestGroup("a14", "g1", "add", "5");
463                 GroupBuilder group7 = createTestGroup("a3", "g1", "add", "6");
464                 writeGroup(ci, group6.build(), group7.build());
465                 break;
466             default:
467                 break;
468         }
469     }
470
471     private void createUserNode(final String nodeRef) {
472         testNode12 = new NodeBuilder().setId(new NodeId(nodeRef)).build();
473     }
474
475     @SuppressWarnings("checkstyle:MethodName")
476     public void _modifyGroups(final CommandInterpreter ci) {
477         String nref = ci.nextArgument();
478
479         if (nref == null) {
480             ci.println("test node added");
481             createTestNode();
482         } else {
483             ci.println("User node added" + nref);
484             createUserNode(nref);
485         }
486         int count = Integer.parseInt(ci.nextArgument());
487         switch (count) {
488             case 1:
489                 GroupBuilder group = createTestGroup("a4", "g1", "modify", "1");
490                 GroupBuilder group1 = createTestGroup("a5", "g1", "modify", "2");
491                 writeGroup(ci, group.build(), group1.build());
492                 break;
493             case 2:
494                 GroupBuilder group2 = createTestGroup("a1", "g1", "modify", "4");
495                 GroupBuilder group3 = createTestGroup("a2", "g1", "modify", "5");
496                 writeGroup(ci, group2.build(), group3.build());
497                 break;
498             case 3:
499                 GroupBuilder group4 = createTestGroup("a9", "g1", "modify", "6");
500                 GroupBuilder group5 = createTestGroup("a10", "g1", "modify", "7");
501                 writeGroup(ci, group4.build(), group5.build());
502                 break;
503
504             case 4:
505                 GroupBuilder group6 = createTestGroup("a6", "g1", "modify", "5");
506                 GroupBuilder group7 = createTestGroup("a29", "g1", "modify", "6");
507                 writeGroup(ci, group6.build(), group7.build());
508                 break;
509             default:
510                 break;
511         }
512     }
513
514     private static InstanceIdentifier<Node> nodeToInstanceId(final Node node) {
515         return InstanceIdentifier.create(Nodes.class).child(Node.class, node.key());
516     }
517
518     @SuppressWarnings("checkstyle:MethodName")
519     public void _removeGroups(final CommandInterpreter ci) {
520         String nref = ci.nextArgument();
521
522         if (nref == null) {
523             ci.println("test node added");
524             createTestNode();
525         } else {
526             ci.println("User node added" + nref);
527             createUserNode(nref);
528         }
529
530         int count = Integer.parseInt(ci.nextArgument());
531         switch (count) {
532             case 1:
533                 GroupBuilder group = createTestGroup("a2", "g1", "remove", "1");
534                 GroupBuilder group1 = createTestGroup("a3", "g1", "remove", "2");
535                 deleteGroup(ci, group.build(), group1.build());
536                 break;
537             case 2:
538                 GroupBuilder group2 = createTestGroup("a4", "g1", "remove", "4");
539                 GroupBuilder group3 = createTestGroup("a5", "g1", "remove", "5");
540                 deleteGroup(ci, group2.build(), group3.build());
541                 break;
542             case 3:
543                 GroupBuilder group4 = createTestGroup("a6", "g1", "remove", "6");
544                 GroupBuilder group5 = createTestGroup("a7", "g1", "remove", "7");
545                 deleteGroup(ci, group4.build(), group5.build());
546                 break;
547             case 4:
548                 GroupBuilder group6 = createTestGroup("a14", "g1", "remove", "5");
549                 GroupBuilder group7 = createTestGroup("a3", "g1", "remove", "6");
550                 deleteGroup(ci, group6.build(), group7.build());
551                 break;
552             case 5:
553                 GroupBuilder group8 = createTestGroup("a4", "g1", "modify", "1");
554                 GroupBuilder group9 = createTestGroup("a5", "g1", "modify", "2");
555                 writeGroup(ci, group8.build(), group9.build());
556                 break;
557             case 6:
558                 GroupBuilder group10 = createTestGroup("a1", "g1", "modify", "4");
559                 GroupBuilder group11 = createTestGroup("a2", "g1", "modify", "5");
560                 writeGroup(ci, group10.build(), group11.build());
561                 break;
562             case 7:
563                 GroupBuilder group12 = createTestGroup("a9", "g1", "modify", "6");
564                 GroupBuilder group13 = createTestGroup("a10", "g1", "modify", "7");
565                 writeGroup(ci, group12.build(), group13.build());
566                 break;
567
568             case 8:
569                 GroupBuilder group14 = createTestGroup("a6", "g1", "modify", "5");
570                 GroupBuilder group15 = createTestGroup("a29", "g1", "modify", "6");
571                 writeGroup(ci, group14.build(), group15.build());
572                 break;
573             default:
574                 break;
575         }
576     }
577
578     private void writeGroup(final CommandInterpreter ci, final Group group, final Group group1) {
579         ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
580
581         InstanceIdentifier<Group> path1 = InstanceIdentifier.create(Nodes.class)
582                 .child(Node.class, testNode12.key()).augmentation(FlowCapableNode.class)
583                 .child(Group.class, new GroupKey(group.getGroupId()));
584         modification.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, nodeToInstanceId(testNode12),
585                 testNode12);
586         modification.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, path1, group);
587
588         InstanceIdentifier<Group> path2 = InstanceIdentifier.create(Nodes.class)
589                 .child(Node.class, testNode12.key()).augmentation(FlowCapableNode.class)
590                 .child(Group.class, new GroupKey(group1.getGroupId()));
591         modification.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, nodeToInstanceId(testNode12),
592                 testNode12);
593         modification.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, path2, group1);
594         modification.commit().addCallback(new FutureCallback<CommitInfo>() {
595             @Override
596             public void onSuccess(final CommitInfo notUsed) {
597                 ci.println("Status of Group Data Loaded Transaction: success.");
598             }
599
600             @Override
601             public void onFailure(final Throwable throwable) {
602                 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
603             }
604         }, MoreExecutors.directExecutor());
605     }
606
607     private void deleteGroup(final CommandInterpreter ci, final Group group, final Group group1) {
608         ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
609         InstanceIdentifier<Group> path1 = InstanceIdentifier.create(Nodes.class)
610                 .child(Node.class, testNode12.key()).augmentation(FlowCapableNode.class)
611                 .child(Group.class, new GroupKey(group.getGroupId()));
612         modification.delete(LogicalDatastoreType.OPERATIONAL, path1);
613         modification.delete(LogicalDatastoreType.CONFIGURATION, path1);
614         InstanceIdentifier<Group> path2 = InstanceIdentifier.create(Nodes.class)
615                 .child(Node.class, testNode12.key()).augmentation(FlowCapableNode.class)
616                 .child(Group.class, new GroupKey(group1.getGroupId()));
617         modification.delete(LogicalDatastoreType.OPERATIONAL, path2);
618         modification.delete(LogicalDatastoreType.CONFIGURATION, path2);
619         modification.commit().addCallback(new FutureCallback<CommitInfo>() {
620             @Override
621             public void onSuccess(final CommitInfo notUsed) {
622                 ci.println("Status of Group Data Loaded Transaction: success.");
623             }
624
625             @Override
626             public void onFailure(final Throwable throwable) {
627                 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
628             }
629         }, MoreExecutors.directExecutor());
630     }
631
632     private GroupBuilder createTestGroup(String actionType, String groupType, final String groupmod,
633             final String strId) {
634         // Sample data , committing to DataStore
635
636         GroupBuilder group = new GroupBuilder();
637         BucketBuilder bucket = new BucketBuilder();
638         bucket.withKey(new BucketKey(new BucketId(Uint32.valueOf(12))));
639
640         if (groupType == null) {
641             groupType = "g1";
642         }
643         if (actionType == null) {
644             actionType = "a1";
645         }
646
647         switch (groupType) {
648             case "g1":
649                 group.setGroupType(GroupTypes.GroupSelect);
650                 break;
651             case "g2":
652                 group.setGroupType(GroupTypes.GroupAll);
653                 break;
654             case "g3":
655                 group.setGroupType(GroupTypes.GroupIndirect);
656                 break;
657             case "g4":
658                 group.setGroupType(GroupTypes.GroupFf);
659                 break;
660             default:
661                 break;
662         }
663
664         switch (actionType) {
665             case "a1":
666                 bucket.setAction(createPopVlanAction());
667                 break;
668             case "a2":
669                 bucket.setAction(createPushVlanAction());
670                 break;
671             case "a3":
672                 bucket.setAction(createPushMplsAction());
673                 break;
674             case "a4":
675                 bucket.setAction(createPopMplsAction());
676                 break;
677             case "a5":
678                 bucket.setAction(createPopPbbAction());
679                 break;
680             case "a6":
681             case "a7":
682                 bucket.setAction(createPushPbbAction());
683                 break;
684             case "a8":
685                 bucket.setAction(createCopyTtlInAction());
686                 break;
687             case "a9":
688                 bucket.setAction(createCopyTtlOutAction());
689                 break;
690             case "a10":
691                 bucket.setAction(createDecMplsTtlAction());
692                 break;
693             case "a14":
694                 bucket.setAction(createGroupAction());
695                 break;
696             case "a29":
697                 bucket.setAction(createNonAppyPushVlanAction());
698                 break;
699             default:
700                 break;
701         }
702
703         if ("add".equals(groupmod)) {
704             bucket.setWatchGroup(Uint32.valueOf(14));
705             bucket.setWatchPort(Uint32.valueOf(1234));
706             bucket.setWeight(Uint16.valueOf(50));
707         } else {
708             bucket.setWatchGroup(Uint32.valueOf(13));
709             bucket.setWatchPort(Uint32.valueOf(134));
710             bucket.setWeight(Uint16.valueOf(30));
711         }
712
713         return group.withKey(new GroupKey(new GroupId(Uint32.valueOf(strId))))
714             // .group.setInstall(false)
715             .setGroupName(originalGroupName)
716             .setBarrier(false)
717             .setBuckets(new BucketsBuilder().setBucket(BindingMap.of(bucket.build())).build());
718     }
719
720     private static Map<ActionKey, Action> createPopVlanAction() {
721         return BindingMap.of(new ActionBuilder()
722             .setOrder(0)
723             .setAction(new PopVlanActionCaseBuilder().setPopVlanAction(new PopVlanActionBuilder().build()).build())
724             .build());
725     }
726
727     private static Map<ActionKey, Action> createPushVlanAction() {
728         return BindingMap.of(new ActionBuilder()
729             .setOrder(0)
730             .setAction(new PushVlanActionCaseBuilder()
731                 .setPushVlanAction(new PushVlanActionBuilder()
732                     .setEthernetType(Uint16.valueOf(0x8100))
733                     .setVlanId(new VlanId(Uint16.TWO))
734                     .build())
735                 .build())
736             .build());
737     }
738
739     private static Map<ActionKey, Action> createPushMplsAction() {
740         return BindingMap.of(new ActionBuilder()
741             .setOrder(0)
742             .setAction(new PushMplsActionCaseBuilder()
743                 .setPushMplsAction(new PushMplsActionBuilder().setEthernetType(Uint16.valueOf(0x8847)).build())
744                 .build())
745             .build());
746     }
747
748     private static Map<ActionKey, Action> createPopMplsAction() {
749         return BindingMap.of(new ActionBuilder()
750             .setOrder(0)
751             .setAction(new PopMplsActionCaseBuilder()
752                 .setPopMplsAction(new PopMplsActionBuilder().setEthernetType(Uint16.valueOf(0xB)).build())
753                 .build())
754             .build());
755     }
756
757     private static Map<ActionKey, Action> createPopPbbAction() {
758         return BindingMap.of(new ActionBuilder()
759             .setOrder(0)
760             .setAction(new PopPbbActionCaseBuilder().setPopPbbAction(new PopPbbActionBuilder().build()).build())
761             .build());
762     }
763
764     private static Map<ActionKey, Action> createPushPbbAction() {
765         return BindingMap.of(new ActionBuilder()
766             .setOrder(0)
767             .setAction(new PushPbbActionCaseBuilder()
768                 .setPushPbbAction(new PushPbbActionBuilder().setEthernetType(Uint16.valueOf(0x88E7)).build())
769                 .build())
770             .build());
771     }
772
773     private static Map<ActionKey, Action> createCopyTtlInAction() {
774         return BindingMap.of(new ActionBuilder()
775             .setOrder(0)
776             .setAction(new CopyTtlInCaseBuilder().setCopyTtlIn(new CopyTtlInBuilder().build()).build())
777             .build());
778     }
779
780     private static Map<ActionKey, Action> createCopyTtlOutAction() {
781         return BindingMap.of(new ActionBuilder()
782             .setOrder(0)
783             .setAction(new CopyTtlOutCaseBuilder().setCopyTtlOut(new CopyTtlOutBuilder().build()).build())
784             .build());
785     }
786
787     private static Map<ActionKey, Action> createDecMplsTtlAction() {
788         return BindingMap.of(new ActionBuilder()
789             .setOrder(0)
790             .setAction(new DecMplsTtlCaseBuilder().setDecMplsTtl(new DecMplsTtlBuilder().build()).build())
791             .build());
792     }
793
794     private static Map<ActionKey, Action> createGroupAction() {
795         return BindingMap.of(new ActionBuilder()
796             .setOrder(0)
797             .setAction(new GroupActionCaseBuilder()
798                 .setGroupAction(new GroupActionBuilder().setGroupId(Uint32.ONE).setGroup("0").build())
799                 .build())
800             .build());
801     }
802
803     private static Map<ActionKey, Action> createNonAppyPushVlanAction() {
804         return BindingMap.of(new ActionBuilder()
805             .setOrder(0)
806             .setAction(new GroupActionCaseBuilder()
807                 .setGroupAction(new GroupActionBuilder().setGroupId(Uint32.ONE).setGroup("0").build())
808                 .build())
809             .build());
810     }
811 }