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
9 package org.opendaylight.openflowplugin.test;
11 import com.google.common.util.concurrent.CheckedFuture;
12 import com.google.common.util.concurrent.FutureCallback;
13 import com.google.common.util.concurrent.Futures;
14 import com.google.common.util.concurrent.MoreExecutors;
15 import java.math.BigInteger;
16 import java.util.ArrayList;
17 import java.util.List;
18 import org.eclipse.osgi.framework.console.CommandInterpreter;
19 import org.eclipse.osgi.framework.console.CommandProvider;
20 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
21 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
22 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
23 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
24 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
25 import org.opendaylight.controller.sal.binding.api.NotificationService;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.ControllerActionCaseBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInCaseBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOutCaseBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtlCaseBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCaseBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionCaseBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCaseBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionCaseBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionCaseBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCaseBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionCaseBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionCaseBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCaseBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdActionCaseBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.controller.action._case.ControllerActionBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.in._case.CopyTtlInBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.out._case.CopyTtlOutBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.mpls.ttl._case.DecMplsTtlBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtl;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtlBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropAction;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropActionBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.group.action._case.GroupActionBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.mpls.action._case.PopMplsActionBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.pbb.action._case.PopPbbActionBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.vlan.action._case.PopVlanActionBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.mpls.action._case.PushMplsActionBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.pbb.action._case.PushPbbActionBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.vlan.action._case.PushVlanActionBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.id.action._case.SetVlanIdActionBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.GoToTableCaseBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.MeterCaseBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.go.to.table._case.GoToTableBuilder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.meter._case.MeterBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.BucketId;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketBuilder;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketKey;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupBuilder;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupKey;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.NodeErrorListener;
104 import org.opendaylight.yangtools.concepts.Registration;
105 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
106 import org.osgi.framework.BundleContext;
107 import org.slf4j.Logger;
108 import org.slf4j.LoggerFactory;
110 public class OpenflowPluginBulkGroupTransactionProvider implements CommandProvider {
111 private static final Logger LOG = LoggerFactory.getLogger(OpenflowPluginBulkGroupTransactionProvider.class);
112 private NodeBuilder testNode;
113 private DataBroker dataBroker;
114 private final BundleContext ctx;
115 private ProviderContext pc;
116 private FlowBuilder testFlow;
117 private final String originalFlowName = "Foo";
118 private final NodeErrorListener nodeErrorListener = new NodeErrorListenerLoggingImpl();
119 private Registration listener1Reg;
120 private Registration listener2Reg;
121 private Group testGroup;
122 private Group testGroup2;
123 private Node testNode12;
124 private final String originalGroupName = "Foo";
125 private static NotificationService notificationService;
127 public OpenflowPluginBulkGroupTransactionProvider(BundleContext ctx) {
131 public void onSessionInitiated(ProviderContext session) {
133 notificationService = session.getSALService(NotificationService.class);
134 listener2Reg = notificationService.registerNotificationListener(nodeErrorListener);
135 dataBroker = session.getSALService(DataBroker.class);
136 ctx.registerService(CommandProvider.class.getName(), this, null);
137 createTestFlow(createTestNode(null), null, null);
140 private NodeBuilder createTestNode(String nodeId) {
141 if (nodeId == null) {
142 nodeId = OpenflowpluginTestActivator.NODE_ID;
144 NodeRef nodeOne = createNodeRef(nodeId);
145 NodeBuilder builder = new NodeBuilder();
146 builder.setId(new NodeId(nodeId));
147 builder.setKey(new NodeKey(builder.getId()));
152 private static NodeRef createNodeRef(String string) {
153 NodeKey key = new NodeKey(new NodeId(string));
154 InstanceIdentifier<Node> path = InstanceIdentifier.create(Nodes.class).child(Node.class, key);
155 return new NodeRef(path);
159 public String getHelp() {
166 private static MatchBuilder createMatch1() {
167 MatchBuilder match = new MatchBuilder();
168 Ipv4MatchBuilder ipv4Match = new Ipv4MatchBuilder();
169 Ipv4Prefix prefix = new Ipv4Prefix("10.0.0.1/24");
170 ipv4Match.setIpv4Destination(prefix);
171 Ipv4Match i4m = ipv4Match.build();
172 match.setLayer3Match(i4m);
174 EthernetMatchBuilder eth = new EthernetMatchBuilder();
175 EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
176 ethTypeBuilder.setType(new EtherType(0x0800L));
177 eth.setEthernetType(ethTypeBuilder.build());
178 match.setEthernetMatch(eth.build());
185 private static InstructionsBuilder createDecNwTtlInstructions() {
186 DecNwTtlBuilder ta = new DecNwTtlBuilder();
187 DecNwTtl decNwTtl = ta.build();
188 ActionBuilder ab = new ActionBuilder();
189 ab.setAction(new DecNwTtlCaseBuilder().setDecNwTtl(decNwTtl).build());
191 // Add our drop action to a list
192 List<Action> actionList = new ArrayList<Action>();
193 actionList.add(ab.build());
195 // Create an Apply Action
196 ApplyActionsBuilder aab = new ApplyActionsBuilder();
197 aab.setAction(actionList);
199 // Wrap our Apply Action in an Instruction
200 InstructionBuilder ib = new InstructionBuilder();
201 ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build());
202 ib.setKey(new InstructionKey(0));
205 // Put our Instruction in a list of Instructions
206 InstructionsBuilder isb = new InstructionsBuilder();
207 List<Instruction> instructions = new ArrayList<Instruction>();
208 instructions.add(ib.build());
209 isb.setInstruction(instructions);
216 private static MatchBuilder createMatch2() {
217 MatchBuilder match = new MatchBuilder();
218 Ipv4MatchBuilder ipv4Match = new Ipv4MatchBuilder();
219 Ipv4Prefix prefix = new Ipv4Prefix("10.0.0.1");
220 ipv4Match.setIpv4Source(prefix);
221 Ipv4Match i4m = ipv4Match.build();
222 match.setLayer3Match(i4m);
224 EthernetMatchBuilder eth = new EthernetMatchBuilder();
225 EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
226 ethTypeBuilder.setType(new EtherType(0x0800L));
227 eth.setEthernetType(ethTypeBuilder.build());
228 match.setEthernetMatch(eth.build());
235 private static MatchBuilder createMatch3() {
236 MatchBuilder match = new MatchBuilder();
237 EthernetMatchBuilder ethernetMatch = new EthernetMatchBuilder();
238 EthernetSourceBuilder ethSourceBuilder = new EthernetSourceBuilder();
239 ethSourceBuilder.setAddress(new MacAddress("00:00:00:00:00:01"));
240 ethernetMatch.setEthernetSource(ethSourceBuilder.build());
241 match.setEthernetMatch(ethernetMatch.build());
246 private static InstructionsBuilder createDropInstructions() {
247 DropActionBuilder dab = new DropActionBuilder();
248 DropAction dropAction = dab.build();
249 ActionBuilder ab = new ActionBuilder();
250 ab.setAction(new DropActionCaseBuilder().setDropAction(dropAction).build());
252 // Add our drop action to a list
253 List<Action> actionList = new ArrayList<Action>();
254 actionList.add(ab.build());
256 // Create an Apply Action
257 ApplyActionsBuilder aab = new ApplyActionsBuilder();
258 aab.setAction(actionList);
260 // Wrap our Apply Action in an Instruction
261 InstructionBuilder ib = new InstructionBuilder();
262 ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build());
264 // Put our Instruction in a list of Instructions
265 InstructionsBuilder isb = new InstructionsBuilder();
266 List<Instruction> instructions = new ArrayList<Instruction>();
267 instructions.add(ib.build());
268 isb.setInstruction(instructions);
272 private static MatchBuilder createEthernetMatch() {
273 MatchBuilder match = new MatchBuilder();
275 byte[] mask1 = new byte[]{(byte) -1, (byte) -1, 0, 0, 0, 0};
276 byte[] mask2 = new byte[]{(byte) -1, (byte) -1, (byte) -1, 0, 0, 0};
278 EthernetMatchBuilder ethmatch = new EthernetMatchBuilder(); // ethernettype
280 EthernetTypeBuilder ethtype = new EthernetTypeBuilder();
281 EtherType type = new EtherType(0x0800L);
282 ethmatch.setEthernetType(ethtype.setType(type).build());
284 EthernetDestinationBuilder ethdest = new EthernetDestinationBuilder(); // ethernet
287 MacAddress macdest = new MacAddress("ff:ff:ff:ff:ff:ff");
288 ethdest.setAddress(macdest);
289 // ethdest.setMask(mask1);
291 ethmatch.setEthernetDestination(ethdest.build());
293 EthernetSourceBuilder ethsrc = new EthernetSourceBuilder();
294 MacAddress macsrc = new MacAddress("00:00:00:00:23:ae");
295 ethsrc.setAddress(macsrc);
296 // ethsrc.setMask(mask2);
298 ethmatch.setEthernetSource(ethsrc.build());
299 match.setEthernetMatch(ethmatch.build());
307 private static InstructionsBuilder createMeterInstructions() {
309 MeterBuilder aab = new MeterBuilder();
310 aab.setMeterId(new MeterId(1L));
312 InstructionBuilder ib = new InstructionBuilder();
313 ib.setInstruction(new MeterCaseBuilder().setMeter(aab.build()).build());
315 // Put our Instruction in a list of Instructions
316 InstructionsBuilder isb = new InstructionsBuilder();
317 List<Instruction> instructions = new ArrayList<Instruction>();
318 instructions.add(ib.build());
319 isb.setInstruction(instructions);
323 private static InstructionsBuilder createAppyActionInstruction() {
325 List<Action> actionList = new ArrayList<Action>();
326 ActionBuilder ab = new ActionBuilder();
327 ControllerActionBuilder controller = new ControllerActionBuilder();
328 controller.setMaxLength(5);
329 ab.setAction(new ControllerActionCaseBuilder().setControllerAction(controller.build()).build());
330 actionList.add(ab.build());
331 // Create an Apply Action
332 ApplyActionsBuilder aab = new ApplyActionsBuilder();
333 aab.setAction(actionList);
335 // Wrap our Apply Action in an Instruction
336 InstructionBuilder ib = new InstructionBuilder();
337 ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build());
339 // Put our Instruction in a list of Instructions
340 InstructionsBuilder isb = new InstructionsBuilder();
341 List<Instruction> instructions = new ArrayList<Instruction>();
342 instructions.add(ib.build());
343 isb.setInstruction(instructions);
347 private static InstructionsBuilder createAppyActionInstruction7() {
349 List<Action> actionList = new ArrayList<Action>();
350 ActionBuilder ab = new ActionBuilder();
352 SetVlanIdActionBuilder vl = new SetVlanIdActionBuilder();
353 VlanId a = new VlanId(4012);
355 ab.setAction(new SetVlanIdActionCaseBuilder().setSetVlanIdAction(vl.build()).build());
356 actionList.add(ab.build());
357 // Create an Apply Action
358 ApplyActionsBuilder aab = new ApplyActionsBuilder();
359 aab.setAction(actionList);
361 // Wrap our Apply Action in an Instruction
362 InstructionBuilder ib = new InstructionBuilder();
363 ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build());
365 // Put our Instruction in a list of Instructions
366 InstructionsBuilder isb = new InstructionsBuilder();
367 List<Instruction> instructions = new ArrayList<Instruction>();
368 instructions.add(ib.build());
369 isb.setInstruction(instructions);
373 private static InstructionsBuilder createAppyActionInstruction21() {
375 List<Action> actionList = new ArrayList<Action>();
376 ActionBuilder ab = new ActionBuilder();
378 PopVlanActionBuilder popVlanActionBuilder = new PopVlanActionBuilder();
379 ab.setAction(new PopVlanActionCaseBuilder().setPopVlanAction(popVlanActionBuilder.build()).build());
380 actionList.add(ab.build());
382 // Create an Apply Action
383 ApplyActionsBuilder aab = new ApplyActionsBuilder();
384 aab.setAction(actionList);
386 // Wrap our Apply Action in an Instruction
387 InstructionBuilder ib = new InstructionBuilder();
388 ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build());
390 // Put our Instruction in a list of Instructions
391 InstructionsBuilder isb = new InstructionsBuilder();
392 List<Instruction> instructions = new ArrayList<Instruction>();
393 instructions.add(ib.build());
394 isb.setInstruction(instructions);
398 private static InstructionsBuilder createAppyActionInstruction2() {
400 List<Action> actionList = new ArrayList<Action>();
401 ActionBuilder ab = new ActionBuilder();
403 PushMplsActionBuilder push = new PushMplsActionBuilder();
404 push.setEthernetType(0x8847);
405 ab.setAction(new PushMplsActionCaseBuilder().setPushMplsAction(push.build()).build());
406 actionList.add(ab.build());
407 // Create an Apply Action
408 ApplyActionsBuilder aab = new ApplyActionsBuilder();
409 aab.setAction(actionList);
411 // Wrap our Apply Action in an Instruction
412 InstructionBuilder ib = new InstructionBuilder();
413 ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build());
415 // Put our Instruction in a list of Instructions
416 InstructionsBuilder isb = new InstructionsBuilder();
417 List<Instruction> instructions = new ArrayList<Instruction>();
418 instructions.add(ib.build());
419 isb.setInstruction(instructions);
423 private static InstructionsBuilder createAppyActionInstruction3() {
425 List<Action> actionList = new ArrayList<Action>();
426 ActionBuilder ab = new ActionBuilder();
428 PushPbbActionBuilder pbb = new PushPbbActionBuilder();
429 pbb.setEthernetType(0x88E7);
430 ab.setAction(new PushPbbActionCaseBuilder().setPushPbbAction(pbb.build()).build());
431 actionList.add(ab.build());
432 // Create an Apply Action
433 ApplyActionsBuilder aab = new ApplyActionsBuilder();
434 aab.setAction(actionList);
436 // Wrap our Apply Action in an Instruction
437 InstructionBuilder ib = new InstructionBuilder();
438 ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build());
440 // Put our Instruction in a list of Instructions
441 InstructionsBuilder isb = new InstructionsBuilder();
442 List<Instruction> instructions = new ArrayList<Instruction>();
443 instructions.add(ib.build());
444 isb.setInstruction(instructions);
448 private static InstructionsBuilder createGotoTableInstructions() {
450 GoToTableBuilder aab = new GoToTableBuilder();
451 aab.setTableId((short) 2);
453 InstructionBuilder ib = new InstructionBuilder();
454 ib.setInstruction(new GoToTableCaseBuilder().setGoToTable(aab.build()).build());
456 // Put our Instruction in a list of Instructions
457 InstructionsBuilder isb = new InstructionsBuilder();
458 List<Instruction> instructions = new ArrayList<Instruction>();
459 instructions.add(ib.build());
460 isb.setInstruction(instructions);
464 private FlowBuilder createTestFlow(NodeBuilder nodeBuilder, String flowTypeArg, String tableId) {
466 FlowBuilder flow = new FlowBuilder();
469 String flowType = flowTypeArg;
470 if (flowType == null) {
477 flow.setMatch(createMatch1().build());
478 flow.setInstructions(createDecNwTtlInstructions().build());
482 flow.setMatch(createMatch2().build());
483 flow.setInstructions(createDropInstructions().build());
487 flow.setMatch(createMatch3().build());
488 flow.setInstructions(createDropInstructions().build());
492 flow.setMatch(createEthernetMatch().build());
493 flow.setInstructions(createDropInstructions().build());
497 flow.setMatch(createMatch1().build());
498 flow.setInstructions(createDropInstructions().build());
502 flow.setMatch(createMatch1().build());
503 flow.setInstructions(createAppyActionInstruction().build());
507 flow.setMatch(createMatch1().build());
508 flow.setInstructions(createGotoTableInstructions().build());
512 flow.setMatch(createMatch1().build());
513 flow.setInstructions(createMeterInstructions().build());
517 flow.setMatch(createMatch1().build());
518 flow.setInstructions(createAppyActionInstruction7().build());
522 flow.setMatch(createMatch1().build());
523 flow.setInstructions(createAppyActionInstruction2().build());
527 flow.setMatch(createMatch1().build());
528 flow.setInstructions(createAppyActionInstruction3().build());
532 flow.setMatch(createMatch1().build());
533 flow.setInstructions(createAppyActionInstruction7().build());
537 flow.setMatch(createMatch1().build());
538 flow.setInstructions(createAppyActionInstruction21().build());
542 LOG.warn("flow type not understood: {}", flowType);
545 FlowKey key = new FlowKey(new FlowId(Long.toString(id)));
546 if (null == flow.isBarrier()) {
547 flow.setBarrier(Boolean.FALSE);
549 // flow.setBufferId(12L);
550 BigInteger value = BigInteger.valueOf(10);
551 BigInteger outputPort = BigInteger.valueOf(4294967295L);
552 flow.setCookie(new FlowCookie(value));
553 flow.setCookieMask(new FlowCookie(value));
554 flow.setHardTimeout(0);
555 flow.setIdleTimeout(0);
556 flow.setInstallHw(false);
557 flow.setStrict(false);
558 flow.setContainerName(null);
559 flow.setFlags(new FlowModFlags(false, false, false, false, true));
560 flow.setId(new FlowId("12"));
561 flow.setTableId(getTableId(tableId));
562 flow.setOutGroup(4294967295L);
563 // set outport to OFPP_NONE (65535) to disable remove restriction for
565 flow.setOutPort(outputPort);
569 flow.setFlowName(originalFlowName + "X" + flowType);
574 private short getTableId(String tableId) {
577 table = Short.parseShort(tableId);
578 } catch (Exception ex) {
579 // ignore exception and continue with default value
586 public void _addGroups(CommandInterpreter ci) {
587 String nref = ci.nextArgument();
590 ci.println("test node added");
593 ci.println("User node added" + nref);
594 createUserNode(nref);
596 Integer count = Integer.parseInt(ci.nextArgument());
599 GroupBuilder group = createTestGroup("a7", "g1", "add", "1");
600 GroupBuilder group1 = createTestGroup("a3", "g1", "add", "2");
601 writeGroup(ci, group.build(), group1.build());
604 GroupBuilder group2 = createTestGroup("a4", "g1", "add", "4");
605 GroupBuilder group3 = createTestGroup("a5", "g1", "add", "5");
606 writeGroup(ci, group2.build(), group3.build());
609 GroupBuilder group4 = createTestGroup("a6", "g1", "add", "6");
610 GroupBuilder group5 = createTestGroup("a7", "g1", "add", "7");
611 writeGroup(ci, group4.build(), group5.build());
615 GroupBuilder group6 = createTestGroup("a14", "g1", "add", "5");
616 GroupBuilder group7 = createTestGroup("a3", "g1", "add", "6");
617 writeGroup(ci, group6.build(), group7.build());
624 private void createUserNode(String nodeRef) {
625 NodeRef nodeOne = createNodeRef(nodeRef);
626 NodeBuilder builder = new NodeBuilder();
627 builder.setId(new NodeId(nodeRef));
628 builder.setKey(new NodeKey(builder.getId()));
629 testNode12 = builder.build();
632 public void _modifyGroups(CommandInterpreter ci) {
633 String nref = ci.nextArgument();
636 ci.println("test node added");
639 ci.println("User node added" + nref);
640 createUserNode(nref);
642 Integer count = Integer.parseInt(ci.nextArgument());
645 GroupBuilder group = createTestGroup("a4", "g1", "modify", "1");
646 GroupBuilder group1 = createTestGroup("a5", "g1", "modify", "2");
647 writeGroup(ci, group.build(), group1.build());
650 GroupBuilder group2 = createTestGroup("a1", "g1", "modify", "4");
651 GroupBuilder group3 = createTestGroup("a2", "g1", "modify", "5");
652 writeGroup(ci, group2.build(), group3.build());
655 GroupBuilder group4 = createTestGroup("a9", "g1", "modify", "6");
656 GroupBuilder group5 = createTestGroup("a10", "g1", "modify", "7");
657 writeGroup(ci, group4.build(), group5.build());
661 GroupBuilder group6 = createTestGroup("a6", "g1", "modify", "5");
662 GroupBuilder group7 = createTestGroup("a29", "g1", "modify", "6");
663 writeGroup(ci, group6.build(), group7.build());
668 private InstanceIdentifier<Node> nodeToInstanceId(Node node) {
669 return InstanceIdentifier.create(Nodes.class).child(Node.class, node.getKey());
672 private void createTestNode() {
673 NodeRef nodeOne = createNodeRef(OpenflowpluginTestActivator.NODE_ID);
674 NodeBuilder builder = new NodeBuilder();
675 builder.setId(new NodeId(OpenflowpluginTestActivator.NODE_ID));
676 builder.setKey(new NodeKey(builder.getId()));
677 testNode12 = builder.build();
680 public void _removeGroups(CommandInterpreter ci) {
681 String nref = ci.nextArgument();
684 ci.println("test node added");
687 ci.println("User node added" + nref);
688 createUserNode(nref);
691 Integer count = Integer.parseInt(ci.nextArgument());
694 GroupBuilder group = createTestGroup("a2", "g1", "remove", "1");
695 GroupBuilder group1 = createTestGroup("a3", "g1", "remove", "2");
696 deleteGroup(ci, group.build(), group1.build());
699 GroupBuilder group2 = createTestGroup("a4", "g1", "remove", "4");
700 GroupBuilder group3 = createTestGroup("a5", "g1", "remove", "5");
701 deleteGroup(ci, group2.build(), group3.build());
704 GroupBuilder group4 = createTestGroup("a6", "g1", "remove", "6");
705 GroupBuilder group5 = createTestGroup("a7", "g1", "remove", "7");
706 deleteGroup(ci, group4.build(), group5.build());
709 GroupBuilder group6 = createTestGroup("a14", "g1", "remove", "5");
710 GroupBuilder group7 = createTestGroup("a3", "g1", "remove", "6");
711 deleteGroup(ci, group6.build(), group7.build());
714 GroupBuilder group8 = createTestGroup("a4", "g1", "modify", "1");
715 GroupBuilder group9 = createTestGroup("a5", "g1", "modify", "2");
716 writeGroup(ci, group8.build(), group9.build());
719 GroupBuilder group10 = createTestGroup("a1", "g1", "modify", "4");
720 GroupBuilder group11 = createTestGroup("a2", "g1", "modify", "5");
721 writeGroup(ci, group10.build(), group11.build());
724 GroupBuilder group12 = createTestGroup("a9", "g1", "modify", "6");
725 GroupBuilder group13 = createTestGroup("a10", "g1", "modify", "7");
726 writeGroup(ci, group12.build(), group13.build());
730 GroupBuilder group14 = createTestGroup("a6", "g1", "modify", "5");
731 GroupBuilder group15 = createTestGroup("a29", "g1", "modify", "6");
732 writeGroup(ci, group14.build(), group15.build());
739 private void writeGroup(final CommandInterpreter ci, Group group, Group group1) {
740 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
742 InstanceIdentifier<Group> path1 = InstanceIdentifier.create(Nodes.class)
743 .child(Node.class, testNode12.getKey()).augmentation(FlowCapableNode.class)
744 .child(Group.class, new GroupKey(group.getGroupId()));
745 modification.merge(LogicalDatastoreType.CONFIGURATION, nodeToInstanceId(testNode12), testNode12, true);
746 modification.merge(LogicalDatastoreType.CONFIGURATION, path1, group, true);
748 InstanceIdentifier<Group> path2 = InstanceIdentifier.create(Nodes.class)
749 .child(Node.class, testNode12.getKey()).augmentation(FlowCapableNode.class)
750 .child(Group.class, new GroupKey(group1.getGroupId()));
751 modification.merge(LogicalDatastoreType.CONFIGURATION, nodeToInstanceId(testNode12), testNode12, true);
752 modification.merge(LogicalDatastoreType.CONFIGURATION, path2, group1, true);
753 CheckedFuture<Void, TransactionCommitFailedException> commitFuture = modification.submit();
754 Futures.addCallback(commitFuture, new FutureCallback<Void>() {
756 public void onSuccess(Void aVoid) {
757 ci.println("Status of Group Data Loaded Transaction: success.");
761 public void onFailure(Throwable throwable) {
762 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
764 }, MoreExecutors.directExecutor());
767 private void deleteGroup(final CommandInterpreter ci, Group group, Group group1) {
768 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
769 InstanceIdentifier<Group> path1 = InstanceIdentifier.create(Nodes.class)
770 .child(Node.class, testNode12.getKey()).augmentation(FlowCapableNode.class)
771 .child(Group.class, new GroupKey(group.getGroupId()));
772 modification.delete(LogicalDatastoreType.OPERATIONAL, path1);
773 modification.delete(LogicalDatastoreType.CONFIGURATION, path1);
774 InstanceIdentifier<Group> path2 = InstanceIdentifier.create(Nodes.class)
775 .child(Node.class, testNode12.getKey()).augmentation(FlowCapableNode.class)
776 .child(Group.class, new GroupKey(group1.getGroupId()));
777 modification.delete(LogicalDatastoreType.OPERATIONAL, path2);
778 modification.delete(LogicalDatastoreType.CONFIGURATION, path2);
779 CheckedFuture<Void, TransactionCommitFailedException> commitFuture = modification.submit();
780 Futures.addCallback(commitFuture, new FutureCallback<Void>() {
782 public void onSuccess(Void aVoid) {
783 ci.println("Status of Group Data Loaded Transaction: success.");
787 public void onFailure(Throwable throwable) {
788 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
790 }, MoreExecutors.directExecutor());
793 private GroupBuilder createTestGroup(String actiontype, String type, String mod, String iD) {
794 // Sample data , committing to DataStore
796 String GroupType = type;
797 String ActionType = actiontype;
798 String Groupmod = mod;
800 long id = Long.parseLong(iD);
801 GroupKey key = new GroupKey(new GroupId(id));
802 GroupBuilder group = new GroupBuilder();
803 BucketBuilder bucket = new BucketBuilder();
804 bucket.setBucketId(new BucketId((long) 12));
805 bucket.setKey(new BucketKey(new BucketId((long) 12)));
807 if (GroupType == null) {
810 if (ActionType == null) {
816 group.setGroupType(GroupTypes.GroupSelect);
819 group.setGroupType(GroupTypes.GroupAll);
822 group.setGroupType(GroupTypes.GroupIndirect);
825 group.setGroupType(GroupTypes.GroupFf);
829 switch (ActionType) {
831 bucket.setAction(createPopVlanAction());
834 bucket.setAction(createPushVlanAction());
837 bucket.setAction(createPushMplsAction());
840 bucket.setAction(createPopMplsAction());
843 bucket.setAction(createPopPbbAction());
846 bucket.setAction(createPushPbbAction());
849 bucket.setAction(createPushPbbAction());
852 bucket.setAction(createCopyTtlInAction());
855 bucket.setAction(createCopyTtlOutAction());
858 bucket.setAction(createDecMplsTtlAction());
861 bucket.setAction(createGroupAction());
864 bucket.setAction(createNonAppyPushVlanAction());
869 if (Groupmod == "add") {
870 bucket.setWatchGroup((long) 14);
871 bucket.setWatchPort((long) 1234);
872 bucket.setWeight(50);
874 bucket.setWatchGroup((long) 13);
875 bucket.setWatchPort((long) 134);
876 bucket.setWeight(30);
879 // group.setInstall(false);
880 group.setGroupId(new GroupId(id));
881 group.setGroupName(originalGroupName);
882 group.setBarrier(false);
883 BucketsBuilder value = new BucketsBuilder();
884 List<Bucket> value1 = new ArrayList<Bucket>();
885 value1.add(bucket.build());
886 value.setBucket(value1);
887 group.setBuckets(value.build());
888 testGroup = group.build();
892 private List<Action> createPopVlanAction() {
893 PopVlanActionBuilder vlanAction = new PopVlanActionBuilder();
894 ActionBuilder action = new ActionBuilder();
895 action.setAction(new PopVlanActionCaseBuilder().setPopVlanAction(vlanAction.build()).build());
896 action.setKey(new ActionKey(0));
897 List<Action> actions = new ArrayList<Action>();
898 actions.add(action.build());
902 private List<Action> createPushVlanAction() {
903 PushVlanActionBuilder vlan = new PushVlanActionBuilder();
904 vlan.setEthernetType(0x8100);
905 VlanId v = new VlanId(2);
907 ActionBuilder action = new ActionBuilder();
908 action.setAction(new PushVlanActionCaseBuilder().setPushVlanAction(vlan.build()).build());
909 List<Action> actions = new ArrayList<Action>();
910 actions.add(action.build());
914 private List<Action> createPushMplsAction() {
915 PushMplsActionBuilder push = new PushMplsActionBuilder();
916 push.setEthernetType(0x8847);
917 ActionBuilder action = new ActionBuilder();
918 action.setAction(new PushMplsActionCaseBuilder().setPushMplsAction(push.build()).build());
919 List<Action> actions = new ArrayList<Action>();
920 actions.add(action.build());
924 private List<Action> createPopMplsAction() {
925 PopMplsActionBuilder popMplsActionBuilder = new PopMplsActionBuilder();
926 popMplsActionBuilder.setEthernetType(0XB);
927 ActionBuilder action = new ActionBuilder();
928 action.setAction(new PopMplsActionCaseBuilder().setPopMplsAction(popMplsActionBuilder.build()).build());
929 List<Action> actions = new ArrayList<Action>();
930 actions.add(action.build());
934 private List<Action> createPopPbbAction() {
935 PopPbbActionBuilder popPbbActionBuilder = new PopPbbActionBuilder();
936 ActionBuilder action = new ActionBuilder();
937 action.setAction(new PopPbbActionCaseBuilder().setPopPbbAction(popPbbActionBuilder.build()).build());
938 List<Action> actions = new ArrayList<Action>();
939 actions.add(action.build());
943 private List<Action> createPushPbbAction() {
944 PushPbbActionBuilder pbb = new PushPbbActionBuilder();
945 pbb.setEthernetType(0x88E7);
946 ActionBuilder action = new ActionBuilder();
947 action.setAction(new PushPbbActionCaseBuilder().setPushPbbAction(pbb.build()).build());
948 List<Action> actions = new ArrayList<Action>();
949 actions.add(action.build());
953 private List<Action> createCopyTtlInAction() {
954 CopyTtlInBuilder ttlin = new CopyTtlInBuilder();
955 ActionBuilder action = new ActionBuilder();
956 action.setAction(new CopyTtlInCaseBuilder().setCopyTtlIn(ttlin.build()).build());
957 List<Action> actions = new ArrayList<Action>();
958 actions.add(action.build());
962 private List<Action> createCopyTtlOutAction() {
963 CopyTtlOutBuilder ttlout = new CopyTtlOutBuilder();
964 ActionBuilder action = new ActionBuilder();
965 action.setAction(new CopyTtlOutCaseBuilder().setCopyTtlOut(ttlout.build()).build());
966 List<Action> actions = new ArrayList<Action>();
967 actions.add(action.build());
971 private List<Action> createDecMplsTtlAction() {
972 DecMplsTtlBuilder mpls = new DecMplsTtlBuilder();
973 ActionBuilder action = new ActionBuilder();
974 action.setAction(new DecMplsTtlCaseBuilder().setDecMplsTtl(mpls.build()).build());
975 List<Action> actions = new ArrayList<Action>();
976 actions.add(action.build());
980 private List<Action> createGroupAction() {
982 GroupActionBuilder groupActionB = new GroupActionBuilder();
983 groupActionB.setGroupId(1L);
984 groupActionB.setGroup("0");
985 ActionBuilder action = new ActionBuilder();
986 action.setAction(new GroupActionCaseBuilder().setGroupAction(groupActionB.build()).build());
987 action.setKey(new ActionKey(0));
988 List<Action> actions = new ArrayList<Action>();
989 actions.add(action.build());
993 private static List<Action> createNonAppyPushVlanAction() {
995 List<Action> actionList = new ArrayList<Action>();
996 ActionBuilder ab = new ActionBuilder();
998 GroupActionBuilder groupActionB = new GroupActionBuilder();
999 groupActionB.setGroupId(1L);
1000 groupActionB.setGroup("0");
1001 ab.setAction(new GroupActionCaseBuilder().setGroupAction(groupActionB.build()).build());
1002 actionList.add(ab.build());