2 * Copyright (c) 2013, 2015 IBM Corporation 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.util.ArrayList;
16 import java.util.List;
17 import org.eclipse.osgi.framework.console.CommandInterpreter;
18 import org.eclipse.osgi.framework.console.CommandProvider;
19 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
20 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
21 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
22 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
23 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
24 import org.opendaylight.controller.sal.binding.api.NotificationService;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.MeterBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.MeterKey;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterAdded;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterRemoved;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterUpdated;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterListener;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.BandId;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandType;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterFlags;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DscpRemarkBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.MeterBandHeadersBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeader;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeaderBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.meter.band.header.MeterBandTypesBuilder;
47 import org.opendaylight.yangtools.concepts.Registration;
48 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
49 import org.osgi.framework.BundleContext;
50 import org.slf4j.Logger;
51 import org.slf4j.LoggerFactory;
53 public class OpenflowpluginMeterTestCommandProvider implements CommandProvider {
55 private static final Logger LOG = LoggerFactory.getLogger(OpenflowpluginMeterTestCommandProvider.class);
56 private DataBroker dataBroker;
57 private ProviderContext pc;
58 private final BundleContext ctx;
59 private Meter testMeter;
60 private Meter testMeter1;
61 private Meter testMeter2;
62 private Node testNode;
63 private final String originalMeterName = "Foo";
64 private final String updatedMeterName = "Bar";
65 private final MeterEventListener meterEventListener = new MeterEventListener();
66 private static NotificationService notificationService;
67 private Registration listener1Reg;
69 public OpenflowpluginMeterTestCommandProvider(BundleContext ctx) {
73 public void onSessionInitiated(ProviderContext session) {
75 dataBroker = session.getSALService(DataBroker.class);
76 ctx.registerService(CommandProvider.class.getName(), this, null);
77 notificationService = session.getSALService(NotificationService.class);
79 listener1Reg = notificationService.registerNotificationListener(meterEventListener);
85 private void createUserNode(String nodeRef) {
86 NodeBuilder builder = new NodeBuilder();
87 builder.setId(new NodeId(nodeRef));
88 builder.setKey(new NodeKey(builder.getId()));
89 testNode = builder.build();
92 private void createTestNode() {
93 NodeBuilder builder = new NodeBuilder();
94 builder.setId(new NodeId(OpenflowpluginTestActivator.NODE_ID));
95 builder.setKey(new NodeKey(builder.getId()));
96 testNode = builder.build();
99 private InstanceIdentifier<Node> nodeToInstanceId(Node node) {
100 return InstanceIdentifier.create(Nodes.class).child(Node.class, node.getKey());
103 final class MeterEventListener implements SalMeterListener {
106 public void onMeterAdded(MeterAdded notification) {
107 LOG.info("Meter to be added.........................." + notification.toString());
108 LOG.info("Meter Xid........................." + notification.getTransactionId().getValue());
109 LOG.info("-----------------------------------------------------------------------------------");
113 public void onMeterRemoved(MeterRemoved notification) {
114 LOG.info("Meter to be removed.........................." + notification.toString());
115 LOG.info("Meter Xid........................." + notification.getTransactionId().getValue());
116 LOG.info("-----------------------------------------------------------------------------------");
120 public void onMeterUpdated(MeterUpdated notification) {
121 LOG.info("Meter to be updated.........................." + notification.toString());
122 LOG.info("Meter Xid........................." + notification.getTransactionId().getValue());
123 LOG.info("-----------------------------------------------------------------------------------");
128 private MeterBuilder createTestMeter() {
129 // Sample data , committing to DataStore
132 MeterKey key = new MeterKey(new MeterId(id));
133 MeterBuilder meter = new MeterBuilder();
134 meter.setContainerName("abcd");
136 meter.setMeterId(new MeterId(9L));
137 meter.setMeterName(originalMeterName);
138 meter.setFlags(new MeterFlags(true, false, false, false));
139 MeterBandHeadersBuilder bandHeaders = new MeterBandHeadersBuilder();
140 List<MeterBandHeader> bandHdr = new ArrayList<MeterBandHeader>();
141 MeterBandHeaderBuilder bandHeader = new MeterBandHeaderBuilder();
142 bandHeader.setBandRate((long) 234);
143 bandHeader.setBandBurstSize((long) 444);
144 DscpRemarkBuilder dscpRemark = new DscpRemarkBuilder();
145 dscpRemark.setDscpRemarkBurstSize((long) 5);
146 dscpRemark.setPrecLevel((short) 1);
147 dscpRemark.setDscpRemarkRate((long) 12);
148 bandHeader.setBandType(dscpRemark.build());
149 MeterBandTypesBuilder bandTypes = new MeterBandTypesBuilder();
150 MeterBandType bandType = new MeterBandType(false, true, false);
151 bandTypes.setFlags(bandType);
152 bandHeader.setMeterBandTypes(bandTypes.build());
153 bandHeader.setBandId(new BandId(0L));
154 bandHdr.add(bandHeader.build());
155 bandHeaders.setMeterBandHeader(bandHdr);
156 meter.setMeterBandHeaders(bandHeaders.build());
158 testMeter = meter.build();
162 private MeterBuilder createTestMeters(String s1, String s2) {
163 // Sample data , committing to DataStore
164 long id = Integer.parseInt(s1);
165 MeterKey key = new MeterKey(new MeterId(id));
166 MeterBuilder meter = new MeterBuilder();
167 meter.setContainerName("abcd");
169 meter.setMeterId(new MeterId(9L));
170 MeterBandHeaderBuilder bandHeader = new MeterBandHeaderBuilder();
171 if (s2.equalsIgnoreCase("modify")) {
172 meter.setMeterName(updatedMeterName);
173 bandHeader.setBandRate((long) 234);
175 meter.setMeterName(originalMeterName);
176 bandHeader.setBandRate((long) 123);
178 meter.setFlags(new MeterFlags(true, false, false, false));
179 MeterBandHeadersBuilder bandHeaders = new MeterBandHeadersBuilder();
180 List<MeterBandHeader> bandHdr = new ArrayList<MeterBandHeader>();
182 bandHeader.setBandBurstSize((long) 444);
183 DscpRemarkBuilder dscpRemark = new DscpRemarkBuilder();
184 dscpRemark.setDscpRemarkBurstSize((long) 5);
185 dscpRemark.setPrecLevel((short) 1);
186 dscpRemark.setDscpRemarkRate((long) 12);
187 bandHeader.setBandType(dscpRemark.build());
188 MeterBandTypesBuilder bandTypes = new MeterBandTypesBuilder();
189 MeterBandType bandType = new MeterBandType(false, true, false);
190 bandTypes.setFlags(bandType);
191 bandHeader.setMeterBandTypes(bandTypes.build());
192 bandHeader.setBandId(new BandId(0L));
193 bandHdr.add(bandHeader.build());
194 bandHeaders.setMeterBandHeader(bandHdr);
195 meter.setMeterBandHeaders(bandHeaders.build());
197 if (Integer.parseInt(s1) == 1) {
198 testMeter1 = meter.build();
199 } else if (Integer.parseInt(s1) == 2) {
200 testMeter2 = meter.build();
201 } else if (Integer.parseInt(s1) == 3) {
202 testMeter1 = meter.build();
203 } else if (Integer.parseInt(s1) == 4) {
204 testMeter2 = meter.build();
205 } else if (Integer.parseInt(s1) == 5) {
206 testMeter1 = meter.build();
207 } else if (Integer.parseInt(s1) == 6) {
208 testMeter2 = meter.build();
209 } else if (Integer.parseInt(s1) == 7) {
210 testMeter1 = meter.build();
211 } else if (Integer.parseInt(s1) == 8) {
212 testMeter2 = meter.build();
218 public void _removeMeter(final CommandInterpreter ci) {
219 String nref = ci.nextArgument();
222 ci.println("test node added");
225 ci.println("User node added" + nref);
226 createUserNode(nref);
228 MeterBuilder mBuilder = createTestMeter();
229 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
230 InstanceIdentifier<Meter> path1 = InstanceIdentifier.create(Nodes.class).child(Node.class, testNode.getKey())
231 .augmentation(FlowCapableNode.class).child(Meter.class, new MeterKey(testMeter.getMeterId()));
232 modification.delete(LogicalDatastoreType.CONFIGURATION, path1);
233 CheckedFuture<Void, TransactionCommitFailedException> commitFuture = modification.submit();
234 Futures.addCallback(commitFuture, new FutureCallback<Void>() {
236 public void onSuccess(Void aVoid) {
237 ci.println("Status of Group Data Loaded Transaction: success.");
241 public void onFailure(Throwable throwable) {
242 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
244 }, MoreExecutors.directExecutor());
247 public void _removeMeters(final CommandInterpreter ci) {
248 String nref = ci.nextArgument();
251 ci.println("test node added");
254 ci.println("User node added" + nref);
255 createUserNode(nref);
258 Integer count = Integer.parseInt(ci.nextArgument());
260 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
263 MeterBuilder mBuilder = createTestMeters("1", "remove");
264 InstanceIdentifier<Meter> path1 = InstanceIdentifier.create(Nodes.class)
265 .child(Node.class, testNode.getKey()).augmentation(FlowCapableNode.class)
266 .child(Meter.class, new MeterKey(testMeter1.getMeterId()));
267 modification.delete(LogicalDatastoreType.CONFIGURATION, path1);
268 MeterBuilder mBuilder1 = createTestMeters("2", "remove");
269 InstanceIdentifier<Meter> path2 = InstanceIdentifier.create(Nodes.class)
270 .child(Node.class, testNode.getKey()).augmentation(FlowCapableNode.class)
271 .child(Meter.class, new MeterKey(testMeter2.getMeterId()));
272 modification.delete(LogicalDatastoreType.CONFIGURATION, path2);
276 MeterBuilder mBuilder2 = createTestMeters("3", "remove");
277 InstanceIdentifier<Meter> path3 = InstanceIdentifier.create(Nodes.class)
278 .child(Node.class, testNode.getKey()).augmentation(FlowCapableNode.class)
279 .child(Meter.class, new MeterKey(testMeter1.getMeterId()));
280 modification.delete(LogicalDatastoreType.CONFIGURATION, path3);
281 MeterBuilder mBuilder22 = createTestMeters("4", "remove");
282 InstanceIdentifier<Meter> path4 = InstanceIdentifier.create(Nodes.class)
283 .child(Node.class, testNode.getKey()).augmentation(FlowCapableNode.class)
284 .child(Meter.class, new MeterKey(testMeter2.getMeterId()));
285 modification.delete(LogicalDatastoreType.CONFIGURATION, path4);
288 MeterBuilder mBuilder3 = createTestMeters("5", "remove");
289 InstanceIdentifier<Meter> path5 = InstanceIdentifier.create(Nodes.class)
290 .child(Node.class, testNode.getKey()).augmentation(FlowCapableNode.class)
291 .child(Meter.class, new MeterKey(testMeter1.getMeterId()));
292 modification.delete(LogicalDatastoreType.CONFIGURATION, path5);
293 MeterBuilder mBuilder4 = createTestMeters("6", "remove");
294 InstanceIdentifier<Meter> path6 = InstanceIdentifier.create(Nodes.class)
295 .child(Node.class, testNode.getKey()).augmentation(FlowCapableNode.class)
296 .child(Meter.class, new MeterKey(testMeter2.getMeterId()));
297 modification.delete(LogicalDatastoreType.CONFIGURATION, path6);
300 MeterBuilder mBuilder5 = createTestMeters("7", "remove");
301 InstanceIdentifier<Meter> path7 = InstanceIdentifier.create(Nodes.class)
302 .child(Node.class, testNode.getKey()).augmentation(FlowCapableNode.class)
303 .child(Meter.class, new MeterKey(testMeter1.getMeterId()));
304 modification.delete(LogicalDatastoreType.CONFIGURATION, path7);
305 MeterBuilder mBuilder6 = createTestMeters("8", "remove");
306 InstanceIdentifier<Meter> path8 = InstanceIdentifier.create(Nodes.class)
307 .child(Node.class, testNode.getKey()).augmentation(FlowCapableNode.class)
308 .child(Meter.class, new MeterKey(testMeter2.getMeterId()));
309 modification.delete(LogicalDatastoreType.CONFIGURATION, path8);
314 CheckedFuture<Void, TransactionCommitFailedException> commitFuture = modification.submit();
315 Futures.addCallback(commitFuture, new FutureCallback<Void>() {
317 public void onSuccess(Void aVoid) {
318 ci.println("Status of Group Data Loaded Transaction: success.");
322 public void onFailure(Throwable throwable) {
323 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
325 }, MoreExecutors.directExecutor());
328 public void _addMeter(CommandInterpreter ci) {
329 String nref = ci.nextArgument();
332 ci.println("test node added");
335 ci.println("User node added" + nref);
336 createUserNode(nref);
339 writeMeter(ci, testMeter);
342 public void _addMeters(CommandInterpreter ci) {
343 String nref = ci.nextArgument();
346 ci.println("test node added");
349 ci.println("User node added" + nref);
350 createUserNode(nref);
352 Integer count = Integer.parseInt(ci.nextArgument());
355 createTestMeters("1", "add");
356 createTestMeters("2", "add");
357 writeMeter(ci, testMeter1, testMeter2);
360 createTestMeters("3", "add");
361 createTestMeters("4", "add");
362 writeMeter(ci, testMeter1, testMeter2);
365 createTestMeters("5", "add");
366 createTestMeters("6", "add");
367 writeMeter(ci, testMeter1, testMeter2);
370 createTestMeters("7", "add");
371 createTestMeters("8", "add");
372 writeMeter(ci, testMeter1, testMeter2);
376 // createTestMeters();
377 // writeMeter(ci, testMeter);
380 private void writeMeter(final CommandInterpreter ci, Meter meter) {
381 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
382 InstanceIdentifier<Meter> path1 = InstanceIdentifier.create(Nodes.class).child(Node.class, testNode.getKey())
383 .augmentation(FlowCapableNode.class).child(Meter.class, new MeterKey(meter.getMeterId()));
384 modification.merge(LogicalDatastoreType.CONFIGURATION, nodeToInstanceId(testNode), testNode, true);
385 modification.merge(LogicalDatastoreType.CONFIGURATION, path1, meter, true);
386 CheckedFuture<Void, TransactionCommitFailedException> commitFuture = modification.submit();
387 Futures.addCallback(commitFuture, new FutureCallback<Void>() {
389 public void onSuccess(Void aVoid) {
390 ci.println("Status of Group Data Loaded Transaction: success.");
394 public void onFailure(Throwable throwable) {
395 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
397 }, MoreExecutors.directExecutor());
400 private void writeMeter(final CommandInterpreter ci, Meter meter, Meter meter1) {
401 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
402 InstanceIdentifier<Meter> path1 = InstanceIdentifier.create(Nodes.class).child(Node.class, testNode.getKey())
403 .augmentation(FlowCapableNode.class).child(Meter.class, new MeterKey(meter.getMeterId()));
404 modification.merge(LogicalDatastoreType.CONFIGURATION, nodeToInstanceId(testNode), testNode, true);
405 modification.merge(LogicalDatastoreType.CONFIGURATION, path1, meter, true);
406 InstanceIdentifier<Meter> path2 = InstanceIdentifier.create(Nodes.class).child(Node.class, testNode.getKey())
407 .augmentation(FlowCapableNode.class).child(Meter.class, new MeterKey(meter1.getMeterId()));
408 modification.merge(LogicalDatastoreType.CONFIGURATION, nodeToInstanceId(testNode), testNode, true);
409 modification.merge(LogicalDatastoreType.CONFIGURATION, path2, meter1, true);
411 CheckedFuture<Void, TransactionCommitFailedException> commitFuture = modification.submit();
412 Futures.addCallback(commitFuture, new FutureCallback<Void>() {
414 public void onSuccess(Void aVoid) {
415 ci.println("Status of Group Data Loaded Transaction: success.");
419 public void onFailure(Throwable throwable) {
420 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
422 }, MoreExecutors.directExecutor());
425 public void _modifyMeter(CommandInterpreter ci) {
426 String nref = ci.nextArgument();
429 ci.println("test node added");
432 ci.println("User node added" + nref);
433 createUserNode(nref);
435 MeterBuilder meter = createTestMeter();
436 meter.setMeterName(updatedMeterName);
437 writeMeter(ci, meter.build());
438 meter.setMeterName(originalMeterName);
439 writeMeter(ci, meter.build());
442 public void _modifyMeters(CommandInterpreter ci) {
443 String nref = ci.nextArgument();
446 ci.println("test node added");
449 ci.println("User node added" + nref);
450 createUserNode(nref);
453 Integer count = Integer.parseInt(ci.nextArgument());
456 createTestMeters("1", "modify");
457 createTestMeters("2", "modify");
458 writeMeter(ci, testMeter1, testMeter2);
461 createTestMeters("3", "modify");
462 createTestMeters("4", "modify");
463 writeMeter(ci, testMeter1, testMeter2);
469 public String getHelp() {
470 StringBuilder help = new StringBuilder();
471 help.append("---FRM MD-SAL Meter test module---\n");
472 help.append("\t addMeter <node id> - node ref\n");
473 help.append("\t modifyMeter <node id> - node ref\n");
474 help.append("\t removeMeter <node id> - node ref\n");
476 return help.toString();