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