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
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.util.ArrayList;
13 import java.util.List;
14 import org.eclipse.osgi.framework.console.CommandInterpreter;
15 import org.eclipse.osgi.framework.console.CommandProvider;
16 import org.opendaylight.mdsal.binding.api.DataBroker;
17 import org.opendaylight.mdsal.binding.api.NotificationService;
18 import org.opendaylight.mdsal.binding.api.ReadWriteTransaction;
19 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.MeterBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.MeterKey;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterAdded;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterRemoved;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterUpdated;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterListener;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.BandId;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandType;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterFlags;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DscpRemarkBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.MeterBandHeadersBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeader;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeaderBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.meter.band.header.MeterBandTypesBuilder;
42 import org.opendaylight.yangtools.concepts.Registration;
43 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
44 import org.osgi.framework.BundleContext;
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
48 @SuppressWarnings("checkstyle:MethodName")
49 public class OpenflowpluginMeterTestCommandProvider implements CommandProvider {
51 private static final Logger LOG = LoggerFactory.getLogger(OpenflowpluginMeterTestCommandProvider.class);
52 private final DataBroker dataBroker;
53 private final BundleContext ctx;
54 private Meter testMeter;
55 private Meter testMeter1;
56 private Meter testMeter2;
57 private Node testNode;
58 private final String originalMeterName = "Foo";
59 private final String updatedMeterName = "Bar";
60 private final MeterEventListener meterEventListener = new MeterEventListener();
61 private final NotificationService notificationService;
62 private Registration listener1Reg;
64 public OpenflowpluginMeterTestCommandProvider(DataBroker dataBroker, NotificationService notificationService,
66 this.dataBroker = dataBroker;
67 this.notificationService = notificationService;
72 ctx.registerService(CommandProvider.class.getName(), this, null);
74 listener1Reg = notificationService.registerNotificationListener(meterEventListener);
80 private void createUserNode(String nodeRef) {
81 NodeBuilder builder = new NodeBuilder();
82 builder.setId(new NodeId(nodeRef));
83 builder.withKey(new NodeKey(builder.getId()));
84 testNode = builder.build();
87 private void createTestNode() {
88 NodeBuilder builder = new NodeBuilder();
89 builder.setId(new NodeId(OpenflowpluginTestActivator.NODE_ID));
90 builder.withKey(new NodeKey(builder.getId()));
91 testNode = builder.build();
94 private InstanceIdentifier<Node> nodeToInstanceId(Node node) {
95 return InstanceIdentifier.create(Nodes.class).child(Node.class, node.key());
98 private static final class MeterEventListener implements SalMeterListener {
101 public void onMeterAdded(MeterAdded notification) {
102 LOG.info("Meter to be added {}", notification.toString());
103 LOG.info("Meter Xid {}", notification.getTransactionId().getValue());
107 public void onMeterRemoved(MeterRemoved notification) {
108 LOG.info("Meter to be removed {}", notification.toString());
109 LOG.info("Meter Xid {}", notification.getTransactionId().getValue());
113 public void onMeterUpdated(MeterUpdated notification) {
114 LOG.info("Meter to be updated {}", notification.toString());
115 LOG.info("Meter Xid {}", notification.getTransactionId().getValue());
120 private MeterBuilder createTestMeter() {
121 // Sample data , committing to DataStore
124 MeterKey key = new MeterKey(new MeterId(id));
125 MeterBuilder meter = new MeterBuilder();
126 meter.setContainerName("abcd");
128 meter.setMeterId(new MeterId(9L));
129 meter.setMeterName(originalMeterName);
130 meter.setFlags(new MeterFlags(true, false, false, false));
131 MeterBandHeaderBuilder bandHeader = new MeterBandHeaderBuilder();
132 bandHeader.setBandRate((long) 234);
133 bandHeader.setBandBurstSize((long) 444);
134 DscpRemarkBuilder dscpRemark = new DscpRemarkBuilder();
135 dscpRemark.setDscpRemarkBurstSize((long) 5);
136 dscpRemark.setPrecLevel((short) 1);
137 dscpRemark.setDscpRemarkRate((long) 12);
138 bandHeader.setBandType(dscpRemark.build());
139 MeterBandTypesBuilder bandTypes = new MeterBandTypesBuilder();
140 MeterBandType bandType = new MeterBandType(false, true, false);
141 bandTypes.setFlags(bandType);
142 bandHeader.setMeterBandTypes(bandTypes.build());
143 bandHeader.setBandId(new BandId(0L));
145 List<MeterBandHeader> bandHdr = new ArrayList<>();
146 bandHdr.add(bandHeader.build());
148 MeterBandHeadersBuilder bandHeaders = new MeterBandHeadersBuilder();
149 bandHeaders.setMeterBandHeader(bandHdr);
150 meter.setMeterBandHeaders(bandHeaders.build());
152 testMeter = meter.build();
156 private MeterBuilder createTestMeters(String s1, String s2) {
157 // Sample data , committing to DataStore
158 long id = Integer.parseInt(s1);
159 MeterKey key = new MeterKey(new MeterId(id));
160 MeterBuilder meter = new MeterBuilder();
161 meter.setContainerName("abcd");
163 meter.setMeterId(new MeterId(9L));
164 MeterBandHeaderBuilder bandHeader = new MeterBandHeaderBuilder();
165 if (s2.equalsIgnoreCase("modify")) {
166 meter.setMeterName(updatedMeterName);
167 bandHeader.setBandRate((long) 234);
169 meter.setMeterName(originalMeterName);
170 bandHeader.setBandRate((long) 123);
172 meter.setFlags(new MeterFlags(true, false, false, false));
174 bandHeader.setBandBurstSize((long) 444);
175 DscpRemarkBuilder dscpRemark = new DscpRemarkBuilder();
176 dscpRemark.setDscpRemarkBurstSize((long) 5);
177 dscpRemark.setPrecLevel((short) 1);
178 dscpRemark.setDscpRemarkRate((long) 12);
179 bandHeader.setBandType(dscpRemark.build());
180 MeterBandTypesBuilder bandTypes = new MeterBandTypesBuilder();
181 MeterBandType bandType = new MeterBandType(false, true, false);
182 bandTypes.setFlags(bandType);
183 bandHeader.setMeterBandTypes(bandTypes.build());
184 bandHeader.setBandId(new BandId(0L));
186 List<MeterBandHeader> bandHdr = new ArrayList<>();
187 bandHdr.add(bandHeader.build());
189 MeterBandHeadersBuilder bandHeaders = new MeterBandHeadersBuilder();
190 bandHeaders.setMeterBandHeader(bandHdr);
191 meter.setMeterBandHeaders(bandHeaders.build());
193 if (Integer.parseInt(s1) == 1) {
194 testMeter1 = meter.build();
195 } else if (Integer.parseInt(s1) == 2) {
196 testMeter2 = meter.build();
197 } else if (Integer.parseInt(s1) == 3) {
198 testMeter1 = meter.build();
199 } else if (Integer.parseInt(s1) == 4) {
200 testMeter2 = meter.build();
201 } else if (Integer.parseInt(s1) == 5) {
202 testMeter1 = meter.build();
203 } else if (Integer.parseInt(s1) == 6) {
204 testMeter2 = meter.build();
205 } else if (Integer.parseInt(s1) == 7) {
206 testMeter1 = meter.build();
207 } else if (Integer.parseInt(s1) == 8) {
208 testMeter2 = meter.build();
214 public void _removeMeter(final CommandInterpreter ci) {
215 String nref = ci.nextArgument();
218 ci.println("test node added");
221 ci.println("User node added" + nref);
222 createUserNode(nref);
225 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
226 InstanceIdentifier<Meter> path1 = InstanceIdentifier.create(Nodes.class).child(Node.class, testNode.key())
227 .augmentation(FlowCapableNode.class).child(Meter.class, new MeterKey(testMeter.getMeterId()));
228 modification.delete(LogicalDatastoreType.CONFIGURATION, path1);
229 modification.commit().addCallback(new FutureCallback<Object>() {
231 public void onSuccess(Object notUsed) {
232 ci.println("Status of Group Data Loaded Transaction: success.");
236 public void onFailure(Throwable throwable) {
237 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
239 }, MoreExecutors.directExecutor());
242 public void _removeMeters(final CommandInterpreter ci) {
243 String nref = ci.nextArgument();
246 ci.println("test node added");
249 ci.println("User node added" + nref);
250 createUserNode(nref);
253 Integer count = Integer.parseInt(ci.nextArgument());
255 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
258 createTestMeters("1", "remove");
259 InstanceIdentifier<Meter> path1 = InstanceIdentifier.create(Nodes.class)
260 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
261 .child(Meter.class, new MeterKey(testMeter1.getMeterId()));
262 modification.delete(LogicalDatastoreType.CONFIGURATION, path1);
263 createTestMeters("2", "remove");
264 InstanceIdentifier<Meter> path2 = InstanceIdentifier.create(Nodes.class)
265 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
266 .child(Meter.class, new MeterKey(testMeter2.getMeterId()));
267 modification.delete(LogicalDatastoreType.CONFIGURATION, path2);
271 createTestMeters("3", "remove");
272 InstanceIdentifier<Meter> path3 = InstanceIdentifier.create(Nodes.class)
273 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
274 .child(Meter.class, new MeterKey(testMeter1.getMeterId()));
275 modification.delete(LogicalDatastoreType.CONFIGURATION, path3);
276 createTestMeters("4", "remove");
277 InstanceIdentifier<Meter> path4 = InstanceIdentifier.create(Nodes.class)
278 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
279 .child(Meter.class, new MeterKey(testMeter2.getMeterId()));
280 modification.delete(LogicalDatastoreType.CONFIGURATION, path4);
283 createTestMeters("5", "remove");
284 InstanceIdentifier<Meter> path5 = InstanceIdentifier.create(Nodes.class)
285 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
286 .child(Meter.class, new MeterKey(testMeter1.getMeterId()));
287 modification.delete(LogicalDatastoreType.CONFIGURATION, path5);
288 createTestMeters("6", "remove");
289 InstanceIdentifier<Meter> path6 = InstanceIdentifier.create(Nodes.class)
290 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
291 .child(Meter.class, new MeterKey(testMeter2.getMeterId()));
292 modification.delete(LogicalDatastoreType.CONFIGURATION, path6);
295 createTestMeters("7", "remove");
296 InstanceIdentifier<Meter> path7 = InstanceIdentifier.create(Nodes.class)
297 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
298 .child(Meter.class, new MeterKey(testMeter1.getMeterId()));
299 modification.delete(LogicalDatastoreType.CONFIGURATION, path7);
300 createTestMeters("8", "remove");
301 InstanceIdentifier<Meter> path8 = InstanceIdentifier.create(Nodes.class)
302 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
303 .child(Meter.class, new MeterKey(testMeter2.getMeterId()));
304 modification.delete(LogicalDatastoreType.CONFIGURATION, path8);
310 modification.commit().addCallback(new FutureCallback<Object>() {
312 public void onSuccess(Object notUsed) {
313 ci.println("Status of Group Data Loaded Transaction: success.");
317 public void onFailure(Throwable throwable) {
318 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
320 }, MoreExecutors.directExecutor());
323 public void _addMeter(CommandInterpreter ci) {
324 String nref = ci.nextArgument();
327 ci.println("test node added");
330 ci.println("User node added" + nref);
331 createUserNode(nref);
334 writeMeter(ci, testMeter);
337 public void _addMeters(CommandInterpreter ci) {
338 String nref = ci.nextArgument();
341 ci.println("test node added");
344 ci.println("User node added" + nref);
345 createUserNode(nref);
347 Integer count = Integer.parseInt(ci.nextArgument());
350 createTestMeters("1", "add");
351 createTestMeters("2", "add");
352 writeMeter(ci, testMeter1, testMeter2);
355 createTestMeters("3", "add");
356 createTestMeters("4", "add");
357 writeMeter(ci, testMeter1, testMeter2);
360 createTestMeters("5", "add");
361 createTestMeters("6", "add");
362 writeMeter(ci, testMeter1, testMeter2);
365 createTestMeters("7", "add");
366 createTestMeters("8", "add");
367 writeMeter(ci, testMeter1, testMeter2);
372 // createTestMeters();
373 // writeMeter(ci, testMeter);
376 private void writeMeter(final CommandInterpreter ci, Meter meter) {
377 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
378 InstanceIdentifier<Meter> path1 = InstanceIdentifier.create(Nodes.class).child(Node.class, testNode.key())
379 .augmentation(FlowCapableNode.class).child(Meter.class, new MeterKey(meter.getMeterId()));
380 modification.merge(LogicalDatastoreType.CONFIGURATION, nodeToInstanceId(testNode), testNode, true);
381 modification.merge(LogicalDatastoreType.CONFIGURATION, path1, meter, true);
382 modification.commit().addCallback(new FutureCallback<Object>() {
384 public void onSuccess(Object notUsed) {
385 ci.println("Status of Group Data Loaded Transaction: success.");
389 public void onFailure(Throwable throwable) {
390 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
392 }, MoreExecutors.directExecutor());
395 private void writeMeter(final CommandInterpreter ci, Meter meter, Meter meter1) {
396 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
397 InstanceIdentifier<Meter> path1 = InstanceIdentifier.create(Nodes.class).child(Node.class, testNode.key())
398 .augmentation(FlowCapableNode.class).child(Meter.class, new MeterKey(meter.getMeterId()));
399 modification.merge(LogicalDatastoreType.CONFIGURATION, nodeToInstanceId(testNode), testNode, true);
400 modification.merge(LogicalDatastoreType.CONFIGURATION, path1, meter, true);
401 InstanceIdentifier<Meter> path2 = InstanceIdentifier.create(Nodes.class).child(Node.class, testNode.key())
402 .augmentation(FlowCapableNode.class).child(Meter.class, new MeterKey(meter1.getMeterId()));
403 modification.merge(LogicalDatastoreType.CONFIGURATION, nodeToInstanceId(testNode), testNode, true);
404 modification.merge(LogicalDatastoreType.CONFIGURATION, path2, meter1, true);
406 modification.commit().addCallback(new FutureCallback<Object>() {
408 public void onSuccess(Object notUsed) {
409 ci.println("Status of Group Data Loaded Transaction: success.");
413 public void onFailure(Throwable throwable) {
414 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
416 }, MoreExecutors.directExecutor());
419 public void _modifyMeter(CommandInterpreter ci) {
420 String nref = ci.nextArgument();
423 ci.println("test node added");
426 ci.println("User node added" + nref);
427 createUserNode(nref);
429 MeterBuilder meter = createTestMeter();
430 meter.setMeterName(updatedMeterName);
431 writeMeter(ci, meter.build());
432 meter.setMeterName(originalMeterName);
433 writeMeter(ci, meter.build());
436 public void _modifyMeters(CommandInterpreter ci) {
437 String nref = ci.nextArgument();
440 ci.println("test node added");
443 ci.println("User node added" + nref);
444 createUserNode(nref);
447 Integer count = Integer.parseInt(ci.nextArgument());
450 createTestMeters("1", "modify");
451 createTestMeters("2", "modify");
452 writeMeter(ci, testMeter1, testMeter2);
455 createTestMeters("3", "modify");
456 createTestMeters("4", "modify");
457 writeMeter(ci, testMeter1, testMeter2);
465 public String getHelp() {
466 StringBuilder help = new StringBuilder();
467 help.append("---FRM MD-SAL Meter test module---\n");
468 help.append("\t addMeter <node id> - node ref\n");
469 help.append("\t modifyMeter <node id> - node ref\n");
470 help.append("\t removeMeter <node id> - node ref\n");
472 return help.toString();