2 * Copyright (c) 2014, 2015 Ericsson, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.openflowplugin.test;
10 import com.google.common.util.concurrent.FutureCallback;
11 import com.google.common.util.concurrent.MoreExecutors;
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;
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;
111 public OpenflowPluginBulkGroupTransactionProvider(final DataBroker dataBroker,
112 final NotificationService notificationService, final BundleContext ctx) {
113 this.dataBroker = dataBroker;
114 this.notificationService = notificationService;
119 notificationService.registerNotificationListener(nodeErrorListener);
120 ctx.registerService(CommandProvider.class.getName(), this, null);
121 createTestFlow(createTestNode(null), null, null);
124 private static NodeBuilder createTestNode(String nodeId) {
125 if (nodeId == null) {
126 nodeId = OpenflowpluginTestActivator.NODE_ID;
128 return new NodeBuilder().setId(new NodeId(nodeId));
131 private void createTestNode() {
132 testNode12 = new NodeBuilder().setId(new NodeId(OpenflowpluginTestActivator.NODE_ID)).build();
136 public String getHelp() {
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);
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());
156 private static InstructionsBuilder createDecNwTtlInstructions() {
157 return new InstructionsBuilder()
158 .setInstruction(BindingMap.of(new InstructionBuilder()
160 .setInstruction(new ApplyActionsCaseBuilder()
161 .setApplyActions(new ApplyActionsBuilder()
162 .setAction(BindingMap.of(new ActionBuilder()
163 .setAction(new DecNwTtlCaseBuilder().setDecNwTtl(new DecNwTtlBuilder().build()).build())
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())
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())
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())
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"))
208 .setEthernetSource(new EthernetSourceBuilder()
209 .setAddress(new MacAddress("00:00:00:00:23:ae"))
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())
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))
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)))
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())
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))
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))
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())
316 private FlowBuilder createTestFlow(final NodeBuilder nodeBuilder, final String flowTypeArg, final String tableId) {
318 FlowBuilder flow = new FlowBuilder();
321 String flowType = flowTypeArg;
322 if (flowType == null) {
329 flow.setMatch(createMatch1().build());
330 flow.setInstructions(createDecNwTtlInstructions().build());
334 flow.setMatch(createMatch2().build());
335 flow.setInstructions(createDropInstructions().build());
339 flow.setMatch(createMatch3().build());
340 flow.setInstructions(createDropInstructions().build());
344 flow.setMatch(createEthernetMatch().build());
345 flow.setInstructions(createDropInstructions().build());
349 flow.setMatch(createMatch1().build());
350 flow.setInstructions(createDropInstructions().build());
354 flow.setMatch(createMatch1().build());
355 flow.setInstructions(createAppyActionInstruction().build());
359 flow.setMatch(createMatch1().build());
360 flow.setInstructions(createGotoTableInstructions().build());
364 flow.setMatch(createMatch1().build());
365 flow.setInstructions(createMeterInstructions().build());
369 flow.setMatch(createMatch1().build());
370 flow.setInstructions(createAppyActionInstruction7().build());
374 flow.setMatch(createMatch1().build());
375 flow.setInstructions(createAppyActionInstruction2().build());
379 flow.setMatch(createMatch1().build());
380 flow.setInstructions(createAppyActionInstruction3().build());
384 flow.setMatch(createMatch1().build());
385 flow.setInstructions(createAppyActionInstruction7().build());
389 flow.setMatch(createMatch1().build());
390 flow.setInstructions(createAppyActionInstruction21().build());
394 LOG.warn("flow type not understood: {}", flowType);
397 final FlowKey key = new FlowKey(new FlowId(Long.toString(id)));
398 if (null == flow.getBarrier()) {
399 flow.setBarrier(Boolean.FALSE);
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
415 flow.setOutPort(Uint64.valueOf(4294967295L));
418 flow.setPriority(Uint16.TWO);
419 flow.setFlowName(originalFlowName + "X" + flowType);
423 private static Uint8 getTableId(final String tableId) {
424 Uint8 table = Uint8.TWO;
425 if (tableId == null) {
430 table = Uint8.valueOf(tableId);
431 } catch (IllegalArgumentException ex) {
432 // ignore exception and continue with default value
439 @SuppressWarnings("checkstyle:MethodName")
440 public void _addGroups(final CommandInterpreter ci) {
441 String nref = ci.nextArgument();
444 ci.println("test node added");
447 ci.println("User node added" + nref);
448 createUserNode(nref);
450 int count = Integer.parseInt(ci.nextArgument());
453 GroupBuilder group = createTestGroup("a7", "g1", "add", "1");
454 GroupBuilder group1 = createTestGroup("a3", "g1", "add", "2");
455 writeGroup(ci, group.build(), group1.build());
458 GroupBuilder group2 = createTestGroup("a4", "g1", "add", "4");
459 GroupBuilder group3 = createTestGroup("a5", "g1", "add", "5");
460 writeGroup(ci, group2.build(), group3.build());
463 GroupBuilder group4 = createTestGroup("a6", "g1", "add", "6");
464 GroupBuilder group5 = createTestGroup("a7", "g1", "add", "7");
465 writeGroup(ci, group4.build(), group5.build());
469 GroupBuilder group6 = createTestGroup("a14", "g1", "add", "5");
470 GroupBuilder group7 = createTestGroup("a3", "g1", "add", "6");
471 writeGroup(ci, group6.build(), group7.build());
478 private void createUserNode(final String nodeRef) {
479 testNode12 = new NodeBuilder().setId(new NodeId(nodeRef)).build();
482 @SuppressWarnings("checkstyle:MethodName")
483 public void _modifyGroups(final CommandInterpreter ci) {
484 String nref = ci.nextArgument();
487 ci.println("test node added");
490 ci.println("User node added" + nref);
491 createUserNode(nref);
493 int count = Integer.parseInt(ci.nextArgument());
496 GroupBuilder group = createTestGroup("a4", "g1", "modify", "1");
497 GroupBuilder group1 = createTestGroup("a5", "g1", "modify", "2");
498 writeGroup(ci, group.build(), group1.build());
501 GroupBuilder group2 = createTestGroup("a1", "g1", "modify", "4");
502 GroupBuilder group3 = createTestGroup("a2", "g1", "modify", "5");
503 writeGroup(ci, group2.build(), group3.build());
506 GroupBuilder group4 = createTestGroup("a9", "g1", "modify", "6");
507 GroupBuilder group5 = createTestGroup("a10", "g1", "modify", "7");
508 writeGroup(ci, group4.build(), group5.build());
512 GroupBuilder group6 = createTestGroup("a6", "g1", "modify", "5");
513 GroupBuilder group7 = createTestGroup("a29", "g1", "modify", "6");
514 writeGroup(ci, group6.build(), group7.build());
521 private static InstanceIdentifier<Node> nodeToInstanceId(final Node node) {
522 return InstanceIdentifier.create(Nodes.class).child(Node.class, node.key());
525 @SuppressWarnings("checkstyle:MethodName")
526 public void _removeGroups(final CommandInterpreter ci) {
527 String nref = ci.nextArgument();
530 ci.println("test node added");
533 ci.println("User node added" + nref);
534 createUserNode(nref);
537 int count = Integer.parseInt(ci.nextArgument());
540 GroupBuilder group = createTestGroup("a2", "g1", "remove", "1");
541 GroupBuilder group1 = createTestGroup("a3", "g1", "remove", "2");
542 deleteGroup(ci, group.build(), group1.build());
545 GroupBuilder group2 = createTestGroup("a4", "g1", "remove", "4");
546 GroupBuilder group3 = createTestGroup("a5", "g1", "remove", "5");
547 deleteGroup(ci, group2.build(), group3.build());
550 GroupBuilder group4 = createTestGroup("a6", "g1", "remove", "6");
551 GroupBuilder group5 = createTestGroup("a7", "g1", "remove", "7");
552 deleteGroup(ci, group4.build(), group5.build());
555 GroupBuilder group6 = createTestGroup("a14", "g1", "remove", "5");
556 GroupBuilder group7 = createTestGroup("a3", "g1", "remove", "6");
557 deleteGroup(ci, group6.build(), group7.build());
560 GroupBuilder group8 = createTestGroup("a4", "g1", "modify", "1");
561 GroupBuilder group9 = createTestGroup("a5", "g1", "modify", "2");
562 writeGroup(ci, group8.build(), group9.build());
565 GroupBuilder group10 = createTestGroup("a1", "g1", "modify", "4");
566 GroupBuilder group11 = createTestGroup("a2", "g1", "modify", "5");
567 writeGroup(ci, group10.build(), group11.build());
570 GroupBuilder group12 = createTestGroup("a9", "g1", "modify", "6");
571 GroupBuilder group13 = createTestGroup("a10", "g1", "modify", "7");
572 writeGroup(ci, group12.build(), group13.build());
576 GroupBuilder group14 = createTestGroup("a6", "g1", "modify", "5");
577 GroupBuilder group15 = createTestGroup("a29", "g1", "modify", "6");
578 writeGroup(ci, group14.build(), group15.build());
585 private void writeGroup(final CommandInterpreter ci, final Group group, final Group group1) {
586 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
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),
593 modification.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, path1, group);
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),
600 modification.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, path2, group1);
601 modification.commit().addCallback(new FutureCallback<CommitInfo>() {
603 public void onSuccess(final CommitInfo notUsed) {
604 ci.println("Status of Group Data Loaded Transaction: success.");
608 public void onFailure(final Throwable throwable) {
609 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
611 }, MoreExecutors.directExecutor());
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>() {
628 public void onSuccess(final CommitInfo notUsed) {
629 ci.println("Status of Group Data Loaded Transaction: success.");
633 public void onFailure(final Throwable throwable) {
634 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
636 }, MoreExecutors.directExecutor());
639 private GroupBuilder createTestGroup(String actionType, String groupType, final String groupmod,
640 final String strId) {
641 // Sample data , committing to DataStore
643 GroupBuilder group = new GroupBuilder();
644 BucketBuilder bucket = new BucketBuilder();
645 bucket.withKey(new BucketKey(new BucketId(Uint32.valueOf(12))));
647 if (groupType == null) {
650 if (actionType == null) {
656 group.setGroupType(GroupTypes.GroupSelect);
659 group.setGroupType(GroupTypes.GroupAll);
662 group.setGroupType(GroupTypes.GroupIndirect);
665 group.setGroupType(GroupTypes.GroupFf);
671 switch (actionType) {
673 bucket.setAction(createPopVlanAction());
676 bucket.setAction(createPushVlanAction());
679 bucket.setAction(createPushMplsAction());
682 bucket.setAction(createPopMplsAction());
685 bucket.setAction(createPopPbbAction());
689 bucket.setAction(createPushPbbAction());
692 bucket.setAction(createCopyTtlInAction());
695 bucket.setAction(createCopyTtlOutAction());
698 bucket.setAction(createDecMplsTtlAction());
701 bucket.setAction(createGroupAction());
704 bucket.setAction(createNonAppyPushVlanAction());
710 if ("add".equals(groupmod)) {
711 bucket.setWatchGroup(Uint32.valueOf(14));
712 bucket.setWatchPort(Uint32.valueOf(1234));
713 bucket.setWeight(Uint16.valueOf(50));
715 bucket.setWatchGroup(Uint32.valueOf(13));
716 bucket.setWatchPort(Uint32.valueOf(134));
717 bucket.setWeight(Uint16.valueOf(30));
720 return group.withKey(new GroupKey(new GroupId(Uint32.valueOf(strId))))
721 // .group.setInstall(false)
722 .setGroupName(originalGroupName)
724 .setBuckets(new BucketsBuilder().setBucket(BindingMap.of(bucket.build())).build());
727 private static Map<ActionKey, Action> createPopVlanAction() {
728 return BindingMap.of(new ActionBuilder()
730 .setAction(new PopVlanActionCaseBuilder().setPopVlanAction(new PopVlanActionBuilder().build()).build())
734 private static Map<ActionKey, Action> createPushVlanAction() {
735 return BindingMap.of(new ActionBuilder()
737 .setAction(new PushVlanActionCaseBuilder()
738 .setPushVlanAction(new PushVlanActionBuilder()
739 .setEthernetType(Uint16.valueOf(0x8100))
740 .setVlanId(new VlanId(Uint16.TWO))
746 private static Map<ActionKey, Action> createPushMplsAction() {
747 return BindingMap.of(new ActionBuilder()
749 .setAction(new PushMplsActionCaseBuilder()
750 .setPushMplsAction(new PushMplsActionBuilder().setEthernetType(Uint16.valueOf(0x8847)).build())
755 private static Map<ActionKey, Action> createPopMplsAction() {
756 return BindingMap.of(new ActionBuilder()
758 .setAction(new PopMplsActionCaseBuilder()
759 .setPopMplsAction(new PopMplsActionBuilder().setEthernetType(Uint16.valueOf(0xB)).build())
764 private static Map<ActionKey, Action> createPopPbbAction() {
765 return BindingMap.of(new ActionBuilder()
767 .setAction(new PopPbbActionCaseBuilder().setPopPbbAction(new PopPbbActionBuilder().build()).build())
771 private static Map<ActionKey, Action> createPushPbbAction() {
772 return BindingMap.of(new ActionBuilder()
774 .setAction(new PushPbbActionCaseBuilder()
775 .setPushPbbAction(new PushPbbActionBuilder().setEthernetType(Uint16.valueOf(0x88E7)).build())
780 private static Map<ActionKey, Action> createCopyTtlInAction() {
781 return BindingMap.of(new ActionBuilder()
783 .setAction(new CopyTtlInCaseBuilder().setCopyTtlIn(new CopyTtlInBuilder().build()).build())
787 private static Map<ActionKey, Action> createCopyTtlOutAction() {
788 return BindingMap.of(new ActionBuilder()
790 .setAction(new CopyTtlOutCaseBuilder().setCopyTtlOut(new CopyTtlOutBuilder().build()).build())
794 private static Map<ActionKey, Action> createDecMplsTtlAction() {
795 return BindingMap.of(new ActionBuilder()
797 .setAction(new DecMplsTtlCaseBuilder().setDecMplsTtl(new DecMplsTtlBuilder().build()).build())
801 private static Map<ActionKey, Action> createGroupAction() {
802 return BindingMap.of(new ActionBuilder()
804 .setAction(new GroupActionCaseBuilder()
805 .setGroupAction(new GroupActionBuilder().setGroupId(Uint32.ONE).setGroup("0").build())
810 private static Map<ActionKey, Action> createNonAppyPushVlanAction() {
811 return BindingMap.of(new ActionBuilder()
813 .setAction(new GroupActionCaseBuilder()
814 .setGroupAction(new GroupActionBuilder().setGroupId(Uint32.ONE).setGroup("0").build())