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.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;
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";
107 public OpenflowPluginBulkGroupTransactionProvider(final DataBroker dataBroker, final BundleContext ctx) {
108 this.dataBroker = dataBroker;
113 ctx.registerService(CommandProvider.class.getName(), this, null);
114 createTestFlow(createTestNode(null), null, null);
117 private static NodeBuilder createTestNode(String nodeId) {
118 if (nodeId == null) {
119 nodeId = OpenflowpluginTestActivator.NODE_ID;
121 return new NodeBuilder().setId(new NodeId(nodeId));
124 private void createTestNode() {
125 testNode12 = new NodeBuilder().setId(new NodeId(OpenflowpluginTestActivator.NODE_ID)).build();
129 public String getHelp() {
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);
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());
149 private static InstructionsBuilder createDecNwTtlInstructions() {
150 return new InstructionsBuilder()
151 .setInstruction(BindingMap.of(new InstructionBuilder()
153 .setInstruction(new ApplyActionsCaseBuilder()
154 .setApplyActions(new ApplyActionsBuilder()
155 .setAction(BindingMap.of(new ActionBuilder()
156 .setAction(new DecNwTtlCaseBuilder().setDecNwTtl(new DecNwTtlBuilder().build()).build())
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())
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())
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())
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"))
201 .setEthernetSource(new EthernetSourceBuilder()
202 .setAddress(new MacAddress("00:00:00:00:23:ae"))
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())
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))
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)))
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())
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))
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))
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())
309 private FlowBuilder createTestFlow(final NodeBuilder nodeBuilder, final String flowTypeArg, final String tableId) {
311 FlowBuilder flow = new FlowBuilder();
314 String flowType = flowTypeArg;
315 if (flowType == null) {
322 flow.setMatch(createMatch1().build());
323 flow.setInstructions(createDecNwTtlInstructions().build());
327 flow.setMatch(createMatch2().build());
328 flow.setInstructions(createDropInstructions().build());
332 flow.setMatch(createMatch3().build());
333 flow.setInstructions(createDropInstructions().build());
337 flow.setMatch(createEthernetMatch().build());
338 flow.setInstructions(createDropInstructions().build());
342 flow.setMatch(createMatch1().build());
343 flow.setInstructions(createDropInstructions().build());
347 flow.setMatch(createMatch1().build());
348 flow.setInstructions(createAppyActionInstruction().build());
352 flow.setMatch(createMatch1().build());
353 flow.setInstructions(createGotoTableInstructions().build());
357 flow.setMatch(createMatch1().build());
358 flow.setInstructions(createMeterInstructions().build());
362 flow.setMatch(createMatch1().build());
363 flow.setInstructions(createAppyActionInstruction7().build());
367 flow.setMatch(createMatch1().build());
368 flow.setInstructions(createAppyActionInstruction2().build());
372 flow.setMatch(createMatch1().build());
373 flow.setInstructions(createAppyActionInstruction3().build());
377 flow.setMatch(createMatch1().build());
378 flow.setInstructions(createAppyActionInstruction7().build());
382 flow.setMatch(createMatch1().build());
383 flow.setInstructions(createAppyActionInstruction21().build());
387 LOG.warn("flow type not understood: {}", flowType);
390 final FlowKey key = new FlowKey(new FlowId(Long.toString(id)));
391 if (null == flow.getBarrier()) {
392 flow.setBarrier(Boolean.FALSE);
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
408 flow.setOutPort(Uint64.valueOf(4294967295L));
411 flow.setPriority(Uint16.TWO);
412 flow.setFlowName(originalFlowName + "X" + flowType);
416 private static Uint8 getTableId(final String tableId) {
417 Uint8 table = Uint8.TWO;
418 if (tableId == null) {
423 table = Uint8.valueOf(tableId);
424 } catch (IllegalArgumentException ex) {
425 // ignore exception and continue with default value
432 @SuppressWarnings("checkstyle:MethodName")
433 public void _addGroups(final CommandInterpreter ci) {
434 String nref = ci.nextArgument();
437 ci.println("test node added");
440 ci.println("User node added" + nref);
441 createUserNode(nref);
443 int count = Integer.parseInt(ci.nextArgument());
446 GroupBuilder group = createTestGroup("a7", "g1", "add", "1");
447 GroupBuilder group1 = createTestGroup("a3", "g1", "add", "2");
448 writeGroup(ci, group.build(), group1.build());
451 GroupBuilder group2 = createTestGroup("a4", "g1", "add", "4");
452 GroupBuilder group3 = createTestGroup("a5", "g1", "add", "5");
453 writeGroup(ci, group2.build(), group3.build());
456 GroupBuilder group4 = createTestGroup("a6", "g1", "add", "6");
457 GroupBuilder group5 = createTestGroup("a7", "g1", "add", "7");
458 writeGroup(ci, group4.build(), group5.build());
462 GroupBuilder group6 = createTestGroup("a14", "g1", "add", "5");
463 GroupBuilder group7 = createTestGroup("a3", "g1", "add", "6");
464 writeGroup(ci, group6.build(), group7.build());
471 private void createUserNode(final String nodeRef) {
472 testNode12 = new NodeBuilder().setId(new NodeId(nodeRef)).build();
475 @SuppressWarnings("checkstyle:MethodName")
476 public void _modifyGroups(final CommandInterpreter ci) {
477 String nref = ci.nextArgument();
480 ci.println("test node added");
483 ci.println("User node added" + nref);
484 createUserNode(nref);
486 int count = Integer.parseInt(ci.nextArgument());
489 GroupBuilder group = createTestGroup("a4", "g1", "modify", "1");
490 GroupBuilder group1 = createTestGroup("a5", "g1", "modify", "2");
491 writeGroup(ci, group.build(), group1.build());
494 GroupBuilder group2 = createTestGroup("a1", "g1", "modify", "4");
495 GroupBuilder group3 = createTestGroup("a2", "g1", "modify", "5");
496 writeGroup(ci, group2.build(), group3.build());
499 GroupBuilder group4 = createTestGroup("a9", "g1", "modify", "6");
500 GroupBuilder group5 = createTestGroup("a10", "g1", "modify", "7");
501 writeGroup(ci, group4.build(), group5.build());
505 GroupBuilder group6 = createTestGroup("a6", "g1", "modify", "5");
506 GroupBuilder group7 = createTestGroup("a29", "g1", "modify", "6");
507 writeGroup(ci, group6.build(), group7.build());
514 private static InstanceIdentifier<Node> nodeToInstanceId(final Node node) {
515 return InstanceIdentifier.create(Nodes.class).child(Node.class, node.key());
518 @SuppressWarnings("checkstyle:MethodName")
519 public void _removeGroups(final CommandInterpreter ci) {
520 String nref = ci.nextArgument();
523 ci.println("test node added");
526 ci.println("User node added" + nref);
527 createUserNode(nref);
530 int count = Integer.parseInt(ci.nextArgument());
533 GroupBuilder group = createTestGroup("a2", "g1", "remove", "1");
534 GroupBuilder group1 = createTestGroup("a3", "g1", "remove", "2");
535 deleteGroup(ci, group.build(), group1.build());
538 GroupBuilder group2 = createTestGroup("a4", "g1", "remove", "4");
539 GroupBuilder group3 = createTestGroup("a5", "g1", "remove", "5");
540 deleteGroup(ci, group2.build(), group3.build());
543 GroupBuilder group4 = createTestGroup("a6", "g1", "remove", "6");
544 GroupBuilder group5 = createTestGroup("a7", "g1", "remove", "7");
545 deleteGroup(ci, group4.build(), group5.build());
548 GroupBuilder group6 = createTestGroup("a14", "g1", "remove", "5");
549 GroupBuilder group7 = createTestGroup("a3", "g1", "remove", "6");
550 deleteGroup(ci, group6.build(), group7.build());
553 GroupBuilder group8 = createTestGroup("a4", "g1", "modify", "1");
554 GroupBuilder group9 = createTestGroup("a5", "g1", "modify", "2");
555 writeGroup(ci, group8.build(), group9.build());
558 GroupBuilder group10 = createTestGroup("a1", "g1", "modify", "4");
559 GroupBuilder group11 = createTestGroup("a2", "g1", "modify", "5");
560 writeGroup(ci, group10.build(), group11.build());
563 GroupBuilder group12 = createTestGroup("a9", "g1", "modify", "6");
564 GroupBuilder group13 = createTestGroup("a10", "g1", "modify", "7");
565 writeGroup(ci, group12.build(), group13.build());
569 GroupBuilder group14 = createTestGroup("a6", "g1", "modify", "5");
570 GroupBuilder group15 = createTestGroup("a29", "g1", "modify", "6");
571 writeGroup(ci, group14.build(), group15.build());
578 private void writeGroup(final CommandInterpreter ci, final Group group, final Group group1) {
579 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
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),
586 modification.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, path1, group);
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),
593 modification.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, path2, group1);
594 modification.commit().addCallback(new FutureCallback<CommitInfo>() {
596 public void onSuccess(final CommitInfo notUsed) {
597 ci.println("Status of Group Data Loaded Transaction: success.");
601 public void onFailure(final Throwable throwable) {
602 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
604 }, MoreExecutors.directExecutor());
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>() {
621 public void onSuccess(final CommitInfo notUsed) {
622 ci.println("Status of Group Data Loaded Transaction: success.");
626 public void onFailure(final Throwable throwable) {
627 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
629 }, MoreExecutors.directExecutor());
632 private GroupBuilder createTestGroup(String actionType, String groupType, final String groupmod,
633 final String strId) {
634 // Sample data , committing to DataStore
636 GroupBuilder group = new GroupBuilder();
637 BucketBuilder bucket = new BucketBuilder();
638 bucket.withKey(new BucketKey(new BucketId(Uint32.valueOf(12))));
640 if (groupType == null) {
643 if (actionType == null) {
649 group.setGroupType(GroupTypes.GroupSelect);
652 group.setGroupType(GroupTypes.GroupAll);
655 group.setGroupType(GroupTypes.GroupIndirect);
658 group.setGroupType(GroupTypes.GroupFf);
664 switch (actionType) {
666 bucket.setAction(createPopVlanAction());
669 bucket.setAction(createPushVlanAction());
672 bucket.setAction(createPushMplsAction());
675 bucket.setAction(createPopMplsAction());
678 bucket.setAction(createPopPbbAction());
682 bucket.setAction(createPushPbbAction());
685 bucket.setAction(createCopyTtlInAction());
688 bucket.setAction(createCopyTtlOutAction());
691 bucket.setAction(createDecMplsTtlAction());
694 bucket.setAction(createGroupAction());
697 bucket.setAction(createNonAppyPushVlanAction());
703 if ("add".equals(groupmod)) {
704 bucket.setWatchGroup(Uint32.valueOf(14));
705 bucket.setWatchPort(Uint32.valueOf(1234));
706 bucket.setWeight(Uint16.valueOf(50));
708 bucket.setWatchGroup(Uint32.valueOf(13));
709 bucket.setWatchPort(Uint32.valueOf(134));
710 bucket.setWeight(Uint16.valueOf(30));
713 return group.withKey(new GroupKey(new GroupId(Uint32.valueOf(strId))))
714 // .group.setInstall(false)
715 .setGroupName(originalGroupName)
717 .setBuckets(new BucketsBuilder().setBucket(BindingMap.of(bucket.build())).build());
720 private static Map<ActionKey, Action> createPopVlanAction() {
721 return BindingMap.of(new ActionBuilder()
723 .setAction(new PopVlanActionCaseBuilder().setPopVlanAction(new PopVlanActionBuilder().build()).build())
727 private static Map<ActionKey, Action> createPushVlanAction() {
728 return BindingMap.of(new ActionBuilder()
730 .setAction(new PushVlanActionCaseBuilder()
731 .setPushVlanAction(new PushVlanActionBuilder()
732 .setEthernetType(Uint16.valueOf(0x8100))
733 .setVlanId(new VlanId(Uint16.TWO))
739 private static Map<ActionKey, Action> createPushMplsAction() {
740 return BindingMap.of(new ActionBuilder()
742 .setAction(new PushMplsActionCaseBuilder()
743 .setPushMplsAction(new PushMplsActionBuilder().setEthernetType(Uint16.valueOf(0x8847)).build())
748 private static Map<ActionKey, Action> createPopMplsAction() {
749 return BindingMap.of(new ActionBuilder()
751 .setAction(new PopMplsActionCaseBuilder()
752 .setPopMplsAction(new PopMplsActionBuilder().setEthernetType(Uint16.valueOf(0xB)).build())
757 private static Map<ActionKey, Action> createPopPbbAction() {
758 return BindingMap.of(new ActionBuilder()
760 .setAction(new PopPbbActionCaseBuilder().setPopPbbAction(new PopPbbActionBuilder().build()).build())
764 private static Map<ActionKey, Action> createPushPbbAction() {
765 return BindingMap.of(new ActionBuilder()
767 .setAction(new PushPbbActionCaseBuilder()
768 .setPushPbbAction(new PushPbbActionBuilder().setEthernetType(Uint16.valueOf(0x88E7)).build())
773 private static Map<ActionKey, Action> createCopyTtlInAction() {
774 return BindingMap.of(new ActionBuilder()
776 .setAction(new CopyTtlInCaseBuilder().setCopyTtlIn(new CopyTtlInBuilder().build()).build())
780 private static Map<ActionKey, Action> createCopyTtlOutAction() {
781 return BindingMap.of(new ActionBuilder()
783 .setAction(new CopyTtlOutCaseBuilder().setCopyTtlOut(new CopyTtlOutBuilder().build()).build())
787 private static Map<ActionKey, Action> createDecMplsTtlAction() {
788 return BindingMap.of(new ActionBuilder()
790 .setAction(new DecMplsTtlCaseBuilder().setDecMplsTtl(new DecMplsTtlBuilder().build()).build())
794 private static Map<ActionKey, Action> createGroupAction() {
795 return BindingMap.of(new ActionBuilder()
797 .setAction(new GroupActionCaseBuilder()
798 .setGroupAction(new GroupActionBuilder().setGroupId(Uint32.ONE).setGroup("0").build())
803 private static Map<ActionKey, Action> createNonAppyPushVlanAction() {
804 return BindingMap.of(new ActionBuilder()
806 .setAction(new GroupActionCaseBuilder()
807 .setGroupAction(new GroupActionBuilder().setGroupId(Uint32.ONE).setGroup("0").build())