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;
12 import java.math.BigInteger;
13 import java.util.ArrayList;
14 import java.util.List;
15 import org.eclipse.osgi.framework.console.CommandInterpreter;
16 import org.eclipse.osgi.framework.console.CommandProvider;
17 import org.opendaylight.mdsal.binding.api.DataBroker;
18 import org.opendaylight.mdsal.binding.api.NotificationService;
19 import org.opendaylight.mdsal.binding.api.ReadWriteTransaction;
20 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.ControllerActionCaseBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInCaseBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOutCaseBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtlCaseBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCaseBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionCaseBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCaseBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionCaseBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionCaseBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCaseBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionCaseBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionCaseBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCaseBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdActionCaseBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.controller.action._case.ControllerActionBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.in._case.CopyTtlInBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.out._case.CopyTtlOutBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.mpls.ttl._case.DecMplsTtlBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtl;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtlBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropAction;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropActionBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.group.action._case.GroupActionBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.mpls.action._case.PopMplsActionBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.pbb.action._case.PopPbbActionBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.vlan.action._case.PopVlanActionBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.mpls.action._case.PushMplsActionBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.pbb.action._case.PushPbbActionBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.vlan.action._case.PushVlanActionBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.id.action._case.SetVlanIdActionBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.GoToTableCaseBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.MeterCaseBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.go.to.table._case.GoToTableBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.meter._case.MeterBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.BucketId;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketBuilder;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketKey;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupBuilder;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupKey;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.NodeErrorListener;
98 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
99 import org.osgi.framework.BundleContext;
100 import org.slf4j.Logger;
101 import org.slf4j.LoggerFactory;
103 @SuppressWarnings("checkstyle:MethodName")
104 public class OpenflowPluginBulkGroupTransactionProvider implements CommandProvider {
105 private static final Logger LOG = LoggerFactory.getLogger(OpenflowPluginBulkGroupTransactionProvider.class);
106 private final DataBroker dataBroker;
107 private final BundleContext ctx;
108 private final String originalFlowName = "Foo";
109 private final NodeErrorListener nodeErrorListener = new NodeErrorListenerLoggingImpl();
110 private Node testNode12;
111 private final String originalGroupName = "Foo";
112 private final NotificationService notificationService;
114 public OpenflowPluginBulkGroupTransactionProvider(DataBroker dataBroker, NotificationService notificationService,
116 this.dataBroker = dataBroker;
117 this.notificationService = notificationService;
122 notificationService.registerNotificationListener(nodeErrorListener);
123 ctx.registerService(CommandProvider.class.getName(), this, null);
124 createTestFlow(createTestNode(null), null, null);
127 private NodeBuilder createTestNode(String nodeId) {
128 if (nodeId == null) {
129 nodeId = OpenflowpluginTestActivator.NODE_ID;
131 NodeBuilder builder = new NodeBuilder();
132 builder.setId(new NodeId(nodeId));
133 builder.withKey(new NodeKey(builder.getId()));
137 private void createTestNode() {
138 NodeBuilder builder = new NodeBuilder();
139 builder.setId(new NodeId(OpenflowpluginTestActivator.NODE_ID));
140 builder.withKey(new NodeKey(builder.getId()));
141 testNode12 = builder.build();
145 public String getHelp() {
149 private static MatchBuilder createMatch1() {
150 MatchBuilder match = new MatchBuilder();
151 Ipv4MatchBuilder ipv4Match = new Ipv4MatchBuilder();
152 Ipv4Prefix prefix = new Ipv4Prefix("10.0.0.1/24");
153 ipv4Match.setIpv4Destination(prefix);
154 Ipv4Match i4m = ipv4Match.build();
155 match.setLayer3Match(i4m);
157 EthernetMatchBuilder eth = new EthernetMatchBuilder();
158 EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
159 ethTypeBuilder.setType(new EtherType(0x0800L));
160 eth.setEthernetType(ethTypeBuilder.build());
161 match.setEthernetMatch(eth.build());
165 private static InstructionsBuilder createDecNwTtlInstructions() {
166 DecNwTtlBuilder ta = new DecNwTtlBuilder();
167 DecNwTtl decNwTtl = ta.build();
168 ActionBuilder ab = new ActionBuilder();
169 ab.setAction(new DecNwTtlCaseBuilder().setDecNwTtl(decNwTtl).build());
171 // Add our drop action to a list
172 List<Action> actionList = new ArrayList<>();
173 actionList.add(ab.build());
175 // Create an Apply Action
176 ApplyActionsBuilder aab = new ApplyActionsBuilder();
177 aab.setAction(actionList);
179 // Wrap our Apply Action in an Instruction
180 InstructionBuilder ib = new InstructionBuilder();
181 ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build());
182 ib.withKey(new InstructionKey(0));
185 // Put our Instruction in a list of Instructions
186 InstructionsBuilder isb = new InstructionsBuilder();
187 List<Instruction> instructions = new ArrayList<>();
188 instructions.add(ib.build());
189 isb.setInstruction(instructions);
193 private static MatchBuilder createMatch2() {
194 MatchBuilder match = new MatchBuilder();
195 Ipv4MatchBuilder ipv4Match = new Ipv4MatchBuilder();
196 Ipv4Prefix prefix = new Ipv4Prefix("10.0.0.1");
197 ipv4Match.setIpv4Source(prefix);
198 Ipv4Match i4m = ipv4Match.build();
199 match.setLayer3Match(i4m);
201 EthernetMatchBuilder eth = new EthernetMatchBuilder();
202 EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
203 ethTypeBuilder.setType(new EtherType(0x0800L));
204 eth.setEthernetType(ethTypeBuilder.build());
205 match.setEthernetMatch(eth.build());
209 private static MatchBuilder createMatch3() {
210 MatchBuilder match = new MatchBuilder();
211 EthernetMatchBuilder ethernetMatch = new EthernetMatchBuilder();
212 EthernetSourceBuilder ethSourceBuilder = new EthernetSourceBuilder();
213 ethSourceBuilder.setAddress(new MacAddress("00:00:00:00:00:01"));
214 ethernetMatch.setEthernetSource(ethSourceBuilder.build());
215 match.setEthernetMatch(ethernetMatch.build());
220 private static InstructionsBuilder createDropInstructions() {
221 DropActionBuilder dab = new DropActionBuilder();
222 DropAction dropAction = dab.build();
223 ActionBuilder ab = new ActionBuilder();
224 ab.setAction(new DropActionCaseBuilder().setDropAction(dropAction).build());
226 // Add our drop action to a list
227 List<Action> actionList = new ArrayList<>();
228 actionList.add(ab.build());
230 // Create an Apply Action
231 ApplyActionsBuilder aab = new ApplyActionsBuilder();
232 aab.setAction(actionList);
234 // Wrap our Apply Action in an Instruction
235 InstructionBuilder ib = new InstructionBuilder();
236 ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build());
238 // Put our Instruction in a list of Instructions
239 InstructionsBuilder isb = new InstructionsBuilder();
240 List<Instruction> instructions = new ArrayList<>();
241 instructions.add(ib.build());
242 isb.setInstruction(instructions);
246 private static MatchBuilder createEthernetMatch() {
247 EthernetMatchBuilder ethmatch = new EthernetMatchBuilder(); // ethernettype
249 EthernetTypeBuilder ethtype = new EthernetTypeBuilder();
250 EtherType type = new EtherType(0x0800L);
251 ethmatch.setEthernetType(ethtype.setType(type).build());
253 EthernetDestinationBuilder ethdest = new EthernetDestinationBuilder(); // ethernet
256 MacAddress macdest = new MacAddress("ff:ff:ff:ff:ff:ff");
257 ethdest.setAddress(macdest);
258 // ethdest.setMask(mask1);
260 ethmatch.setEthernetDestination(ethdest.build());
262 EthernetSourceBuilder ethsrc = new EthernetSourceBuilder();
263 MacAddress macsrc = new MacAddress("00:00:00:00:23:ae");
264 ethsrc.setAddress(macsrc);
265 // ethsrc.setMask(mask2);
267 ethmatch.setEthernetSource(ethsrc.build());
268 MatchBuilder match = new MatchBuilder();
269 match.setEthernetMatch(ethmatch.build());
274 private static InstructionsBuilder createMeterInstructions() {
276 MeterBuilder aab = new MeterBuilder();
277 aab.setMeterId(new MeterId(1L));
279 InstructionBuilder ib = new InstructionBuilder();
280 ib.setInstruction(new MeterCaseBuilder().setMeter(aab.build()).build());
282 // Put our Instruction in a list of Instructions
283 InstructionsBuilder isb = new InstructionsBuilder();
284 List<Instruction> instructions = new ArrayList<>();
285 instructions.add(ib.build());
286 isb.setInstruction(instructions);
290 private static InstructionsBuilder createAppyActionInstruction() {
292 List<Action> actionList = new ArrayList<>();
293 ActionBuilder ab = new ActionBuilder();
294 ControllerActionBuilder controller = new ControllerActionBuilder();
295 controller.setMaxLength(5);
296 ab.setAction(new ControllerActionCaseBuilder().setControllerAction(controller.build()).build());
297 actionList.add(ab.build());
298 // Create an Apply Action
299 ApplyActionsBuilder aab = new ApplyActionsBuilder();
300 aab.setAction(actionList);
302 // Wrap our Apply Action in an Instruction
303 InstructionBuilder ib = new InstructionBuilder();
304 ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build());
306 // Put our Instruction in a list of Instructions
307 InstructionsBuilder isb = new InstructionsBuilder();
308 List<Instruction> instructions = new ArrayList<>();
309 instructions.add(ib.build());
310 isb.setInstruction(instructions);
314 private static InstructionsBuilder createAppyActionInstruction7() {
316 List<Action> actionList = new ArrayList<>();
317 ActionBuilder ab = new ActionBuilder();
319 SetVlanIdActionBuilder vl = new SetVlanIdActionBuilder();
320 VlanId vlanId = new VlanId(4012);
321 vl.setVlanId(vlanId);
322 ab.setAction(new SetVlanIdActionCaseBuilder().setSetVlanIdAction(vl.build()).build());
323 actionList.add(ab.build());
324 // Create an Apply Action
325 ApplyActionsBuilder aab = new ApplyActionsBuilder();
326 aab.setAction(actionList);
328 // Wrap our Apply Action in an Instruction
329 InstructionBuilder ib = new InstructionBuilder();
330 ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build());
332 // Put our Instruction in a list of Instructions
333 InstructionsBuilder isb = new InstructionsBuilder();
334 List<Instruction> instructions = new ArrayList<>();
335 instructions.add(ib.build());
336 isb.setInstruction(instructions);
340 private static InstructionsBuilder createAppyActionInstruction21() {
342 List<Action> actionList = new ArrayList<>();
343 ActionBuilder ab = new ActionBuilder();
345 PopVlanActionBuilder popVlanActionBuilder = new PopVlanActionBuilder();
346 ab.setAction(new PopVlanActionCaseBuilder().setPopVlanAction(popVlanActionBuilder.build()).build());
347 actionList.add(ab.build());
349 // Create an Apply Action
350 ApplyActionsBuilder aab = new ApplyActionsBuilder();
351 aab.setAction(actionList);
353 // Wrap our Apply Action in an Instruction
354 InstructionBuilder ib = new InstructionBuilder();
355 ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build());
357 // Put our Instruction in a list of Instructions
358 InstructionsBuilder isb = new InstructionsBuilder();
359 List<Instruction> instructions = new ArrayList<>();
360 instructions.add(ib.build());
361 isb.setInstruction(instructions);
365 private static InstructionsBuilder createAppyActionInstruction2() {
367 List<Action> actionList = new ArrayList<>();
368 ActionBuilder ab = new ActionBuilder();
370 PushMplsActionBuilder push = new PushMplsActionBuilder();
371 push.setEthernetType(0x8847);
372 ab.setAction(new PushMplsActionCaseBuilder().setPushMplsAction(push.build()).build());
373 actionList.add(ab.build());
374 // Create an Apply Action
375 ApplyActionsBuilder aab = new ApplyActionsBuilder();
376 aab.setAction(actionList);
378 // Wrap our Apply Action in an Instruction
379 InstructionBuilder ib = new InstructionBuilder();
380 ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build());
382 // Put our Instruction in a list of Instructions
383 InstructionsBuilder isb = new InstructionsBuilder();
384 List<Instruction> instructions = new ArrayList<>();
385 instructions.add(ib.build());
386 isb.setInstruction(instructions);
390 private static InstructionsBuilder createAppyActionInstruction3() {
392 List<Action> actionList = new ArrayList<>();
393 ActionBuilder ab = new ActionBuilder();
395 PushPbbActionBuilder pbb = new PushPbbActionBuilder();
396 pbb.setEthernetType(0x88E7);
397 ab.setAction(new PushPbbActionCaseBuilder().setPushPbbAction(pbb.build()).build());
398 actionList.add(ab.build());
399 // Create an Apply Action
400 ApplyActionsBuilder aab = new ApplyActionsBuilder();
401 aab.setAction(actionList);
403 // Wrap our Apply Action in an Instruction
404 InstructionBuilder ib = new InstructionBuilder();
405 ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build());
407 // Put our Instruction in a list of Instructions
408 InstructionsBuilder isb = new InstructionsBuilder();
409 List<Instruction> instructions = new ArrayList<>();
410 instructions.add(ib.build());
411 isb.setInstruction(instructions);
415 private static InstructionsBuilder createGotoTableInstructions() {
417 GoToTableBuilder aab = new GoToTableBuilder();
418 aab.setTableId((short) 2);
420 InstructionBuilder ib = new InstructionBuilder();
421 ib.setInstruction(new GoToTableCaseBuilder().setGoToTable(aab.build()).build());
423 // Put our Instruction in a list of Instructions
424 InstructionsBuilder isb = new InstructionsBuilder();
425 List<Instruction> instructions = new ArrayList<>();
426 instructions.add(ib.build());
427 isb.setInstruction(instructions);
431 private FlowBuilder createTestFlow(NodeBuilder nodeBuilder, String flowTypeArg, String tableId) {
433 FlowBuilder flow = new FlowBuilder();
436 String flowType = flowTypeArg;
437 if (flowType == null) {
444 flow.setMatch(createMatch1().build());
445 flow.setInstructions(createDecNwTtlInstructions().build());
449 flow.setMatch(createMatch2().build());
450 flow.setInstructions(createDropInstructions().build());
454 flow.setMatch(createMatch3().build());
455 flow.setInstructions(createDropInstructions().build());
459 flow.setMatch(createEthernetMatch().build());
460 flow.setInstructions(createDropInstructions().build());
464 flow.setMatch(createMatch1().build());
465 flow.setInstructions(createDropInstructions().build());
469 flow.setMatch(createMatch1().build());
470 flow.setInstructions(createAppyActionInstruction().build());
474 flow.setMatch(createMatch1().build());
475 flow.setInstructions(createGotoTableInstructions().build());
479 flow.setMatch(createMatch1().build());
480 flow.setInstructions(createMeterInstructions().build());
484 flow.setMatch(createMatch1().build());
485 flow.setInstructions(createAppyActionInstruction7().build());
489 flow.setMatch(createMatch1().build());
490 flow.setInstructions(createAppyActionInstruction2().build());
494 flow.setMatch(createMatch1().build());
495 flow.setInstructions(createAppyActionInstruction3().build());
499 flow.setMatch(createMatch1().build());
500 flow.setInstructions(createAppyActionInstruction7().build());
504 flow.setMatch(createMatch1().build());
505 flow.setInstructions(createAppyActionInstruction21().build());
509 LOG.warn("flow type not understood: {}", flowType);
512 final FlowKey key = new FlowKey(new FlowId(Long.toString(id)));
513 if (null == flow.isBarrier()) {
514 flow.setBarrier(Boolean.FALSE);
516 // flow.setBufferId(12L);
517 BigInteger value = BigInteger.valueOf(10);
518 BigInteger outputPort = BigInteger.valueOf(4294967295L);
519 flow.setCookie(new FlowCookie(value));
520 flow.setCookieMask(new FlowCookie(value));
521 flow.setHardTimeout(0);
522 flow.setIdleTimeout(0);
523 flow.setInstallHw(false);
524 flow.setStrict(false);
525 flow.setContainerName(null);
526 flow.setFlags(new FlowModFlags(false, false, false, false, true));
527 flow.setId(new FlowId("12"));
528 flow.setTableId(getTableId(tableId));
529 flow.setOutGroup(4294967295L);
530 // set outport to OFPP_NONE (65535) to disable remove restriction for
532 flow.setOutPort(outputPort);
536 flow.setFlowName(originalFlowName + "X" + flowType);
540 private short getTableId(String tableId) {
542 if (tableId == null) {
547 table = Short.parseShort(tableId);
548 } catch (NumberFormatException ex) {
549 // ignore exception and continue with default value
556 public void _addGroups(CommandInterpreter ci) {
557 String nref = ci.nextArgument();
560 ci.println("test node added");
563 ci.println("User node added" + nref);
564 createUserNode(nref);
566 Integer count = Integer.parseInt(ci.nextArgument());
569 GroupBuilder group = createTestGroup("a7", "g1", "add", "1");
570 GroupBuilder group1 = createTestGroup("a3", "g1", "add", "2");
571 writeGroup(ci, group.build(), group1.build());
574 GroupBuilder group2 = createTestGroup("a4", "g1", "add", "4");
575 GroupBuilder group3 = createTestGroup("a5", "g1", "add", "5");
576 writeGroup(ci, group2.build(), group3.build());
579 GroupBuilder group4 = createTestGroup("a6", "g1", "add", "6");
580 GroupBuilder group5 = createTestGroup("a7", "g1", "add", "7");
581 writeGroup(ci, group4.build(), group5.build());
585 GroupBuilder group6 = createTestGroup("a14", "g1", "add", "5");
586 GroupBuilder group7 = createTestGroup("a3", "g1", "add", "6");
587 writeGroup(ci, group6.build(), group7.build());
594 private void createUserNode(String nodeRef) {
595 NodeBuilder builder = new NodeBuilder();
596 builder.setId(new NodeId(nodeRef));
597 builder.withKey(new NodeKey(builder.getId()));
598 testNode12 = builder.build();
601 public void _modifyGroups(CommandInterpreter ci) {
602 String nref = ci.nextArgument();
605 ci.println("test node added");
608 ci.println("User node added" + nref);
609 createUserNode(nref);
611 Integer count = Integer.parseInt(ci.nextArgument());
614 GroupBuilder group = createTestGroup("a4", "g1", "modify", "1");
615 GroupBuilder group1 = createTestGroup("a5", "g1", "modify", "2");
616 writeGroup(ci, group.build(), group1.build());
619 GroupBuilder group2 = createTestGroup("a1", "g1", "modify", "4");
620 GroupBuilder group3 = createTestGroup("a2", "g1", "modify", "5");
621 writeGroup(ci, group2.build(), group3.build());
624 GroupBuilder group4 = createTestGroup("a9", "g1", "modify", "6");
625 GroupBuilder group5 = createTestGroup("a10", "g1", "modify", "7");
626 writeGroup(ci, group4.build(), group5.build());
630 GroupBuilder group6 = createTestGroup("a6", "g1", "modify", "5");
631 GroupBuilder group7 = createTestGroup("a29", "g1", "modify", "6");
632 writeGroup(ci, group6.build(), group7.build());
639 private InstanceIdentifier<Node> nodeToInstanceId(Node node) {
640 return InstanceIdentifier.create(Nodes.class).child(Node.class, node.key());
643 public void _removeGroups(CommandInterpreter ci) {
644 String nref = ci.nextArgument();
647 ci.println("test node added");
650 ci.println("User node added" + nref);
651 createUserNode(nref);
654 Integer count = Integer.parseInt(ci.nextArgument());
657 GroupBuilder group = createTestGroup("a2", "g1", "remove", "1");
658 GroupBuilder group1 = createTestGroup("a3", "g1", "remove", "2");
659 deleteGroup(ci, group.build(), group1.build());
662 GroupBuilder group2 = createTestGroup("a4", "g1", "remove", "4");
663 GroupBuilder group3 = createTestGroup("a5", "g1", "remove", "5");
664 deleteGroup(ci, group2.build(), group3.build());
667 GroupBuilder group4 = createTestGroup("a6", "g1", "remove", "6");
668 GroupBuilder group5 = createTestGroup("a7", "g1", "remove", "7");
669 deleteGroup(ci, group4.build(), group5.build());
672 GroupBuilder group6 = createTestGroup("a14", "g1", "remove", "5");
673 GroupBuilder group7 = createTestGroup("a3", "g1", "remove", "6");
674 deleteGroup(ci, group6.build(), group7.build());
677 GroupBuilder group8 = createTestGroup("a4", "g1", "modify", "1");
678 GroupBuilder group9 = createTestGroup("a5", "g1", "modify", "2");
679 writeGroup(ci, group8.build(), group9.build());
682 GroupBuilder group10 = createTestGroup("a1", "g1", "modify", "4");
683 GroupBuilder group11 = createTestGroup("a2", "g1", "modify", "5");
684 writeGroup(ci, group10.build(), group11.build());
687 GroupBuilder group12 = createTestGroup("a9", "g1", "modify", "6");
688 GroupBuilder group13 = createTestGroup("a10", "g1", "modify", "7");
689 writeGroup(ci, group12.build(), group13.build());
693 GroupBuilder group14 = createTestGroup("a6", "g1", "modify", "5");
694 GroupBuilder group15 = createTestGroup("a29", "g1", "modify", "6");
695 writeGroup(ci, group14.build(), group15.build());
702 private void writeGroup(final CommandInterpreter ci, Group group, Group group1) {
703 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
705 InstanceIdentifier<Group> path1 = InstanceIdentifier.create(Nodes.class)
706 .child(Node.class, testNode12.key()).augmentation(FlowCapableNode.class)
707 .child(Group.class, new GroupKey(group.getGroupId()));
708 modification.merge(LogicalDatastoreType.CONFIGURATION, nodeToInstanceId(testNode12), testNode12, true);
709 modification.merge(LogicalDatastoreType.CONFIGURATION, path1, group, true);
711 InstanceIdentifier<Group> path2 = InstanceIdentifier.create(Nodes.class)
712 .child(Node.class, testNode12.key()).augmentation(FlowCapableNode.class)
713 .child(Group.class, new GroupKey(group1.getGroupId()));
714 modification.merge(LogicalDatastoreType.CONFIGURATION, nodeToInstanceId(testNode12), testNode12, true);
715 modification.merge(LogicalDatastoreType.CONFIGURATION, path2, group1, true);
716 modification.commit().addCallback(new FutureCallback<Object>() {
718 public void onSuccess(Object notUsed) {
719 ci.println("Status of Group Data Loaded Transaction: success.");
723 public void onFailure(Throwable throwable) {
724 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
726 }, MoreExecutors.directExecutor());
729 private void deleteGroup(final CommandInterpreter ci, Group group, Group group1) {
730 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
731 InstanceIdentifier<Group> path1 = InstanceIdentifier.create(Nodes.class)
732 .child(Node.class, testNode12.key()).augmentation(FlowCapableNode.class)
733 .child(Group.class, new GroupKey(group.getGroupId()));
734 modification.delete(LogicalDatastoreType.OPERATIONAL, path1);
735 modification.delete(LogicalDatastoreType.CONFIGURATION, path1);
736 InstanceIdentifier<Group> path2 = InstanceIdentifier.create(Nodes.class)
737 .child(Node.class, testNode12.key()).augmentation(FlowCapableNode.class)
738 .child(Group.class, new GroupKey(group1.getGroupId()));
739 modification.delete(LogicalDatastoreType.OPERATIONAL, path2);
740 modification.delete(LogicalDatastoreType.CONFIGURATION, path2);
741 modification.commit().addCallback(new FutureCallback<Object>() {
743 public void onSuccess(Object notUsed) {
744 ci.println("Status of Group Data Loaded Transaction: success.");
748 public void onFailure(Throwable throwable) {
749 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
751 }, MoreExecutors.directExecutor());
754 private GroupBuilder createTestGroup(String actionType, String groupType, String groupmod, String strId) {
755 // Sample data , committing to DataStore
757 GroupBuilder group = new GroupBuilder();
758 BucketBuilder bucket = new BucketBuilder();
759 bucket.setBucketId(new BucketId((long) 12));
760 bucket.withKey(new BucketKey(new BucketId((long) 12)));
762 if (groupType == null) {
765 if (actionType == null) {
771 group.setGroupType(GroupTypes.GroupSelect);
774 group.setGroupType(GroupTypes.GroupAll);
777 group.setGroupType(GroupTypes.GroupIndirect);
780 group.setGroupType(GroupTypes.GroupFf);
786 switch (actionType) {
788 bucket.setAction(createPopVlanAction());
791 bucket.setAction(createPushVlanAction());
794 bucket.setAction(createPushMplsAction());
797 bucket.setAction(createPopMplsAction());
800 bucket.setAction(createPopPbbAction());
804 bucket.setAction(createPushPbbAction());
807 bucket.setAction(createCopyTtlInAction());
810 bucket.setAction(createCopyTtlOutAction());
813 bucket.setAction(createDecMplsTtlAction());
816 bucket.setAction(createGroupAction());
819 bucket.setAction(createNonAppyPushVlanAction());
825 if ("add".equals(groupmod)) {
826 bucket.setWatchGroup((long) 14);
827 bucket.setWatchPort((long) 1234);
828 bucket.setWeight(50);
830 bucket.setWatchGroup((long) 13);
831 bucket.setWatchPort((long) 134);
832 bucket.setWeight(30);
835 long id = Long.parseLong(strId);
836 GroupKey key = new GroupKey(new GroupId(id));
838 // group.setInstall(false);
839 group.setGroupId(new GroupId(id));
840 group.setGroupName(originalGroupName);
841 group.setBarrier(false);
842 BucketsBuilder value = new BucketsBuilder();
843 List<Bucket> value1 = new ArrayList<>();
844 value1.add(bucket.build());
845 value.setBucket(value1);
846 group.setBuckets(value.build());
850 private List<Action> createPopVlanAction() {
851 PopVlanActionBuilder vlanAction = new PopVlanActionBuilder();
852 ActionBuilder action = new ActionBuilder();
853 action.setAction(new PopVlanActionCaseBuilder().setPopVlanAction(vlanAction.build()).build());
854 action.withKey(new ActionKey(0));
855 List<Action> actions = new ArrayList<>();
856 actions.add(action.build());
860 private List<Action> createPushVlanAction() {
861 PushVlanActionBuilder vlan = new PushVlanActionBuilder();
862 vlan.setEthernetType(0x8100);
863 VlanId vlanId = new VlanId(2);
864 vlan.setVlanId(vlanId);
865 ActionBuilder action = new ActionBuilder();
866 action.setAction(new PushVlanActionCaseBuilder().setPushVlanAction(vlan.build()).build());
867 List<Action> actions = new ArrayList<>();
868 actions.add(action.build());
872 private List<Action> createPushMplsAction() {
873 PushMplsActionBuilder push = new PushMplsActionBuilder();
874 push.setEthernetType(0x8847);
875 ActionBuilder action = new ActionBuilder();
876 action.setAction(new PushMplsActionCaseBuilder().setPushMplsAction(push.build()).build());
877 List<Action> actions = new ArrayList<>();
878 actions.add(action.build());
882 private List<Action> createPopMplsAction() {
883 PopMplsActionBuilder popMplsActionBuilder = new PopMplsActionBuilder();
884 popMplsActionBuilder.setEthernetType(0XB);
885 ActionBuilder action = new ActionBuilder();
886 action.setAction(new PopMplsActionCaseBuilder().setPopMplsAction(popMplsActionBuilder.build()).build());
887 List<Action> actions = new ArrayList<>();
888 actions.add(action.build());
892 private List<Action> createPopPbbAction() {
893 PopPbbActionBuilder popPbbActionBuilder = new PopPbbActionBuilder();
894 ActionBuilder action = new ActionBuilder();
895 action.setAction(new PopPbbActionCaseBuilder().setPopPbbAction(popPbbActionBuilder.build()).build());
896 List<Action> actions = new ArrayList<>();
897 actions.add(action.build());
901 private List<Action> createPushPbbAction() {
902 PushPbbActionBuilder pbb = new PushPbbActionBuilder();
903 pbb.setEthernetType(0x88E7);
904 ActionBuilder action = new ActionBuilder();
905 action.setAction(new PushPbbActionCaseBuilder().setPushPbbAction(pbb.build()).build());
906 List<Action> actions = new ArrayList<>();
907 actions.add(action.build());
911 private List<Action> createCopyTtlInAction() {
912 CopyTtlInBuilder ttlin = new CopyTtlInBuilder();
913 ActionBuilder action = new ActionBuilder();
914 action.setAction(new CopyTtlInCaseBuilder().setCopyTtlIn(ttlin.build()).build());
915 List<Action> actions = new ArrayList<>();
916 actions.add(action.build());
920 private List<Action> createCopyTtlOutAction() {
921 CopyTtlOutBuilder ttlout = new CopyTtlOutBuilder();
922 ActionBuilder action = new ActionBuilder();
923 action.setAction(new CopyTtlOutCaseBuilder().setCopyTtlOut(ttlout.build()).build());
924 List<Action> actions = new ArrayList<>();
925 actions.add(action.build());
929 private List<Action> createDecMplsTtlAction() {
930 DecMplsTtlBuilder mpls = new DecMplsTtlBuilder();
931 ActionBuilder action = new ActionBuilder();
932 action.setAction(new DecMplsTtlCaseBuilder().setDecMplsTtl(mpls.build()).build());
933 List<Action> actions = new ArrayList<>();
934 actions.add(action.build());
938 private List<Action> createGroupAction() {
940 GroupActionBuilder groupActionB = new GroupActionBuilder();
941 groupActionB.setGroupId(1L);
942 groupActionB.setGroup("0");
943 ActionBuilder action = new ActionBuilder();
944 action.setAction(new GroupActionCaseBuilder().setGroupAction(groupActionB.build()).build());
945 action.withKey(new ActionKey(0));
946 List<Action> actions = new ArrayList<>();
947 actions.add(action.build());
951 private static List<Action> createNonAppyPushVlanAction() {
953 ActionBuilder ab = new ActionBuilder();
955 GroupActionBuilder groupActionB = new GroupActionBuilder();
956 groupActionB.setGroupId(1L);
957 groupActionB.setGroup("0");
958 ab.setAction(new GroupActionCaseBuilder().setGroupAction(groupActionB.build()).build());
960 List<Action> actionList = new ArrayList<>();
961 actionList.add(ab.build());