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.FutureCallback;
12 import com.google.common.util.concurrent.Futures;
13 import com.google.common.util.concurrent.ListenableFuture;
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.sal.binding.api.BindingAwareBroker.ProviderContext;
23 import org.opendaylight.controller.sal.binding.api.NotificationService;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.MeterBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.MeterKey;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterAdded;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterRemoved;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterUpdated;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterListener;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.BandId;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandType;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterFlags;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DscpRemarkBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.MeterBandHeadersBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeader;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeaderBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.meter.band.header.MeterBandTypesBuilder;
46 import org.opendaylight.yangtools.concepts.Registration;
47 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
48 import org.osgi.framework.BundleContext;
49 import org.slf4j.Logger;
50 import org.slf4j.LoggerFactory;
52 @SuppressWarnings("checkstyle:MethodName")
53 public class OpenflowpluginMeterTestCommandProvider implements CommandProvider {
55 private static final Logger LOG = LoggerFactory.getLogger(OpenflowpluginMeterTestCommandProvider.class);
56 private DataBroker dataBroker;
57 private final BundleContext ctx;
58 private Meter testMeter;
59 private Meter testMeter1;
60 private Meter testMeter2;
61 private Node testNode;
62 private final String originalMeterName = "Foo";
63 private final String updatedMeterName = "Bar";
64 private final MeterEventListener meterEventListener = new MeterEventListener();
65 private NotificationService notificationService;
66 private Registration listener1Reg;
68 public OpenflowpluginMeterTestCommandProvider(BundleContext ctx) {
72 public void onSessionInitiated(ProviderContext session) {
73 dataBroker = session.getSALService(DataBroker.class);
74 ctx.registerService(CommandProvider.class.getName(), this, null);
75 notificationService = session.getSALService(NotificationService.class);
77 listener1Reg = notificationService.registerNotificationListener(meterEventListener);
83 private void createUserNode(String nodeRef) {
84 NodeBuilder builder = new NodeBuilder();
85 builder.setId(new NodeId(nodeRef));
86 builder.setKey(new NodeKey(builder.getId()));
87 testNode = builder.build();
90 private void createTestNode() {
91 NodeBuilder builder = new NodeBuilder();
92 builder.setId(new NodeId(OpenflowpluginTestActivator.NODE_ID));
93 builder.setKey(new NodeKey(builder.getId()));
94 testNode = builder.build();
97 private InstanceIdentifier<Node> nodeToInstanceId(Node node) {
98 return InstanceIdentifier.create(Nodes.class).child(Node.class, node.getKey());
101 private static final class MeterEventListener implements SalMeterListener {
104 public void onMeterAdded(MeterAdded notification) {
105 LOG.info("Meter to be added.........................." + notification.toString());
106 LOG.info("Meter Xid........................." + notification.getTransactionId().getValue());
107 LOG.info("-----------------------------------------------------------------------------------");
111 public void onMeterRemoved(MeterRemoved notification) {
112 LOG.info("Meter to be removed.........................." + notification.toString());
113 LOG.info("Meter Xid........................." + notification.getTransactionId().getValue());
114 LOG.info("-----------------------------------------------------------------------------------");
118 public void onMeterUpdated(MeterUpdated notification) {
119 LOG.info("Meter to be updated.........................." + notification.toString());
120 LOG.info("Meter Xid........................." + notification.getTransactionId().getValue());
121 LOG.info("-----------------------------------------------------------------------------------");
126 private MeterBuilder createTestMeter() {
127 // Sample data , committing to DataStore
130 MeterKey key = new MeterKey(new MeterId(id));
131 MeterBuilder meter = new MeterBuilder();
132 meter.setContainerName("abcd");
134 meter.setMeterId(new MeterId(9L));
135 meter.setMeterName(originalMeterName);
136 meter.setFlags(new MeterFlags(true, false, false, false));
137 MeterBandHeaderBuilder bandHeader = new MeterBandHeaderBuilder();
138 bandHeader.setBandRate((long) 234);
139 bandHeader.setBandBurstSize((long) 444);
140 DscpRemarkBuilder dscpRemark = new DscpRemarkBuilder();
141 dscpRemark.setDscpRemarkBurstSize((long) 5);
142 dscpRemark.setPrecLevel((short) 1);
143 dscpRemark.setDscpRemarkRate((long) 12);
144 bandHeader.setBandType(dscpRemark.build());
145 MeterBandTypesBuilder bandTypes = new MeterBandTypesBuilder();
146 MeterBandType bandType = new MeterBandType(false, true, false);
147 bandTypes.setFlags(bandType);
148 bandHeader.setMeterBandTypes(bandTypes.build());
149 bandHeader.setBandId(new BandId(0L));
151 List<MeterBandHeader> bandHdr = new ArrayList<>();
152 bandHdr.add(bandHeader.build());
154 MeterBandHeadersBuilder bandHeaders = new MeterBandHeadersBuilder();
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));
180 bandHeader.setBandBurstSize((long) 444);
181 DscpRemarkBuilder dscpRemark = new DscpRemarkBuilder();
182 dscpRemark.setDscpRemarkBurstSize((long) 5);
183 dscpRemark.setPrecLevel((short) 1);
184 dscpRemark.setDscpRemarkRate((long) 12);
185 bandHeader.setBandType(dscpRemark.build());
186 MeterBandTypesBuilder bandTypes = new MeterBandTypesBuilder();
187 MeterBandType bandType = new MeterBandType(false, true, false);
188 bandTypes.setFlags(bandType);
189 bandHeader.setMeterBandTypes(bandTypes.build());
190 bandHeader.setBandId(new BandId(0L));
192 List<MeterBandHeader> bandHdr = new ArrayList<>();
193 bandHdr.add(bandHeader.build());
195 MeterBandHeadersBuilder bandHeaders = new MeterBandHeadersBuilder();
196 bandHeaders.setMeterBandHeader(bandHdr);
197 meter.setMeterBandHeaders(bandHeaders.build());
199 if (Integer.parseInt(s1) == 1) {
200 testMeter1 = meter.build();
201 } else if (Integer.parseInt(s1) == 2) {
202 testMeter2 = meter.build();
203 } else if (Integer.parseInt(s1) == 3) {
204 testMeter1 = meter.build();
205 } else if (Integer.parseInt(s1) == 4) {
206 testMeter2 = meter.build();
207 } else if (Integer.parseInt(s1) == 5) {
208 testMeter1 = meter.build();
209 } else if (Integer.parseInt(s1) == 6) {
210 testMeter2 = meter.build();
211 } else if (Integer.parseInt(s1) == 7) {
212 testMeter1 = meter.build();
213 } else if (Integer.parseInt(s1) == 8) {
214 testMeter2 = meter.build();
220 public void _removeMeter(final CommandInterpreter ci) {
221 String nref = ci.nextArgument();
224 ci.println("test node added");
227 ci.println("User node added" + nref);
228 createUserNode(nref);
231 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
232 InstanceIdentifier<Meter> path1 = InstanceIdentifier.create(Nodes.class).child(Node.class, testNode.getKey())
233 .augmentation(FlowCapableNode.class).child(Meter.class, new MeterKey(testMeter.getMeterId()));
234 modification.delete(LogicalDatastoreType.CONFIGURATION, path1);
235 ListenableFuture<Void> commitFuture = modification.submit();
236 Futures.addCallback(commitFuture, new FutureCallback<Void>() {
238 public void onSuccess(Void notUsed) {
239 ci.println("Status of Group Data Loaded Transaction: success.");
243 public void onFailure(Throwable throwable) {
244 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
246 }, MoreExecutors.directExecutor());
249 public void _removeMeters(final CommandInterpreter ci) {
250 String nref = ci.nextArgument();
253 ci.println("test node added");
256 ci.println("User node added" + nref);
257 createUserNode(nref);
260 Integer count = Integer.parseInt(ci.nextArgument());
262 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
265 createTestMeters("1", "remove");
266 InstanceIdentifier<Meter> path1 = InstanceIdentifier.create(Nodes.class)
267 .child(Node.class, testNode.getKey()).augmentation(FlowCapableNode.class)
268 .child(Meter.class, new MeterKey(testMeter1.getMeterId()));
269 modification.delete(LogicalDatastoreType.CONFIGURATION, path1);
270 createTestMeters("2", "remove");
271 InstanceIdentifier<Meter> path2 = InstanceIdentifier.create(Nodes.class)
272 .child(Node.class, testNode.getKey()).augmentation(FlowCapableNode.class)
273 .child(Meter.class, new MeterKey(testMeter2.getMeterId()));
274 modification.delete(LogicalDatastoreType.CONFIGURATION, path2);
278 createTestMeters("3", "remove");
279 InstanceIdentifier<Meter> path3 = InstanceIdentifier.create(Nodes.class)
280 .child(Node.class, testNode.getKey()).augmentation(FlowCapableNode.class)
281 .child(Meter.class, new MeterKey(testMeter1.getMeterId()));
282 modification.delete(LogicalDatastoreType.CONFIGURATION, path3);
283 createTestMeters("4", "remove");
284 InstanceIdentifier<Meter> path4 = InstanceIdentifier.create(Nodes.class)
285 .child(Node.class, testNode.getKey()).augmentation(FlowCapableNode.class)
286 .child(Meter.class, new MeterKey(testMeter2.getMeterId()));
287 modification.delete(LogicalDatastoreType.CONFIGURATION, path4);
290 createTestMeters("5", "remove");
291 InstanceIdentifier<Meter> path5 = InstanceIdentifier.create(Nodes.class)
292 .child(Node.class, testNode.getKey()).augmentation(FlowCapableNode.class)
293 .child(Meter.class, new MeterKey(testMeter1.getMeterId()));
294 modification.delete(LogicalDatastoreType.CONFIGURATION, path5);
295 createTestMeters("6", "remove");
296 InstanceIdentifier<Meter> path6 = InstanceIdentifier.create(Nodes.class)
297 .child(Node.class, testNode.getKey()).augmentation(FlowCapableNode.class)
298 .child(Meter.class, new MeterKey(testMeter2.getMeterId()));
299 modification.delete(LogicalDatastoreType.CONFIGURATION, path6);
302 createTestMeters("7", "remove");
303 InstanceIdentifier<Meter> path7 = InstanceIdentifier.create(Nodes.class)
304 .child(Node.class, testNode.getKey()).augmentation(FlowCapableNode.class)
305 .child(Meter.class, new MeterKey(testMeter1.getMeterId()));
306 modification.delete(LogicalDatastoreType.CONFIGURATION, path7);
307 createTestMeters("8", "remove");
308 InstanceIdentifier<Meter> path8 = InstanceIdentifier.create(Nodes.class)
309 .child(Node.class, testNode.getKey()).augmentation(FlowCapableNode.class)
310 .child(Meter.class, new MeterKey(testMeter2.getMeterId()));
311 modification.delete(LogicalDatastoreType.CONFIGURATION, path8);
317 ListenableFuture<Void> commitFuture = modification.submit();
318 Futures.addCallback(commitFuture, new FutureCallback<Void>() {
320 public void onSuccess(Void notUsed) {
321 ci.println("Status of Group Data Loaded Transaction: success.");
325 public void onFailure(Throwable throwable) {
326 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
328 }, MoreExecutors.directExecutor());
331 public void _addMeter(CommandInterpreter ci) {
332 String nref = ci.nextArgument();
335 ci.println("test node added");
338 ci.println("User node added" + nref);
339 createUserNode(nref);
342 writeMeter(ci, testMeter);
345 public void _addMeters(CommandInterpreter ci) {
346 String nref = ci.nextArgument();
349 ci.println("test node added");
352 ci.println("User node added" + nref);
353 createUserNode(nref);
355 Integer count = Integer.parseInt(ci.nextArgument());
358 createTestMeters("1", "add");
359 createTestMeters("2", "add");
360 writeMeter(ci, testMeter1, testMeter2);
363 createTestMeters("3", "add");
364 createTestMeters("4", "add");
365 writeMeter(ci, testMeter1, testMeter2);
368 createTestMeters("5", "add");
369 createTestMeters("6", "add");
370 writeMeter(ci, testMeter1, testMeter2);
373 createTestMeters("7", "add");
374 createTestMeters("8", "add");
375 writeMeter(ci, testMeter1, testMeter2);
380 // createTestMeters();
381 // writeMeter(ci, testMeter);
384 private void writeMeter(final CommandInterpreter ci, Meter meter) {
385 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
386 InstanceIdentifier<Meter> path1 = InstanceIdentifier.create(Nodes.class).child(Node.class, testNode.getKey())
387 .augmentation(FlowCapableNode.class).child(Meter.class, new MeterKey(meter.getMeterId()));
388 modification.merge(LogicalDatastoreType.CONFIGURATION, nodeToInstanceId(testNode), testNode, true);
389 modification.merge(LogicalDatastoreType.CONFIGURATION, path1, meter, true);
390 ListenableFuture<Void> commitFuture = modification.submit();
391 Futures.addCallback(commitFuture, new FutureCallback<Void>() {
393 public void onSuccess(Void notUsed) {
394 ci.println("Status of Group Data Loaded Transaction: success.");
398 public void onFailure(Throwable throwable) {
399 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
401 }, MoreExecutors.directExecutor());
404 private void writeMeter(final CommandInterpreter ci, Meter meter, Meter meter1) {
405 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
406 InstanceIdentifier<Meter> path1 = InstanceIdentifier.create(Nodes.class).child(Node.class, testNode.getKey())
407 .augmentation(FlowCapableNode.class).child(Meter.class, new MeterKey(meter.getMeterId()));
408 modification.merge(LogicalDatastoreType.CONFIGURATION, nodeToInstanceId(testNode), testNode, true);
409 modification.merge(LogicalDatastoreType.CONFIGURATION, path1, meter, true);
410 InstanceIdentifier<Meter> path2 = InstanceIdentifier.create(Nodes.class).child(Node.class, testNode.getKey())
411 .augmentation(FlowCapableNode.class).child(Meter.class, new MeterKey(meter1.getMeterId()));
412 modification.merge(LogicalDatastoreType.CONFIGURATION, nodeToInstanceId(testNode), testNode, true);
413 modification.merge(LogicalDatastoreType.CONFIGURATION, path2, meter1, true);
415 ListenableFuture<Void> commitFuture = modification.submit();
416 Futures.addCallback(commitFuture, new FutureCallback<Void>() {
418 public void onSuccess(Void notUsed) {
419 ci.println("Status of Group Data Loaded Transaction: success.");
423 public void onFailure(Throwable throwable) {
424 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
426 }, MoreExecutors.directExecutor());
429 public void _modifyMeter(CommandInterpreter ci) {
430 String nref = ci.nextArgument();
433 ci.println("test node added");
436 ci.println("User node added" + nref);
437 createUserNode(nref);
439 MeterBuilder meter = createTestMeter();
440 meter.setMeterName(updatedMeterName);
441 writeMeter(ci, meter.build());
442 meter.setMeterName(originalMeterName);
443 writeMeter(ci, meter.build());
446 public void _modifyMeters(CommandInterpreter ci) {
447 String nref = ci.nextArgument();
450 ci.println("test node added");
453 ci.println("User node added" + nref);
454 createUserNode(nref);
457 Integer count = Integer.parseInt(ci.nextArgument());
460 createTestMeters("1", "modify");
461 createTestMeters("2", "modify");
462 writeMeter(ci, testMeter1, testMeter2);
465 createTestMeters("3", "modify");
466 createTestMeters("4", "modify");
467 writeMeter(ci, testMeter1, testMeter2);
475 public String getHelp() {
476 StringBuilder help = new StringBuilder();
477 help.append("---FRM MD-SAL Meter test module---\n");
478 help.append("\t addMeter <node id> - node ref\n");
479 help.append("\t modifyMeter <node id> - node ref\n");
480 help.append("\t removeMeter <node id> - node ref\n");
482 return help.toString();