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.CommitInfo;
20 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.MeterBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.MeterKey;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterAdded;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterRemoved;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterUpdated;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterListener;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.BandId;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandType;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterFlags;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DscpRemarkBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.MeterBandHeadersBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeader;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeaderBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.meter.band.header.MeterBandTypesBuilder;
43 import org.opendaylight.yangtools.concepts.Registration;
44 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
45 import org.opendaylight.yangtools.yang.common.Uint32;
46 import org.opendaylight.yangtools.yang.common.Uint8;
47 import org.osgi.framework.BundleContext;
48 import org.slf4j.Logger;
49 import org.slf4j.LoggerFactory;
51 @SuppressWarnings("checkstyle:MethodName")
52 public class OpenflowpluginMeterTestCommandProvider implements CommandProvider {
54 private static final Logger LOG = LoggerFactory.getLogger(OpenflowpluginMeterTestCommandProvider.class);
55 private final DataBroker dataBroker;
56 private final BundleContext ctx;
57 private Meter testMeter;
58 private Meter testMeter1;
59 private Meter testMeter2;
60 private Node testNode;
61 private final String originalMeterName = "Foo";
62 private final String updatedMeterName = "Bar";
63 private final MeterEventListener meterEventListener = new MeterEventListener();
64 private final NotificationService notificationService;
65 private Registration listener1Reg;
67 public OpenflowpluginMeterTestCommandProvider(DataBroker dataBroker, NotificationService notificationService,
69 this.dataBroker = dataBroker;
70 this.notificationService = notificationService;
75 ctx.registerService(CommandProvider.class.getName(), this, null);
77 listener1Reg = notificationService.registerNotificationListener(meterEventListener);
83 private void createUserNode(String nodeRef) {
84 NodeBuilder builder = new NodeBuilder();
85 builder.setId(new NodeId(nodeRef));
86 builder.withKey(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.withKey(new NodeKey(builder.getId()));
94 testNode = builder.build();
97 private static InstanceIdentifier<Node> nodeToInstanceId(Node node) {
98 return InstanceIdentifier.create(Nodes.class).child(Node.class, node.key());
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());
110 public void onMeterRemoved(MeterRemoved notification) {
111 LOG.info("Meter to be removed {}", notification.toString());
112 LOG.info("Meter Xid {}", notification.getTransactionId().getValue());
116 public void onMeterUpdated(MeterUpdated notification) {
117 LOG.info("Meter to be updated {}", notification.toString());
118 LOG.info("Meter Xid {}", notification.getTransactionId().getValue());
123 private MeterBuilder createTestMeter() {
124 // Sample data , committing to DataStore
126 MeterKey key = new MeterKey(new MeterId(Uint32.valueOf(12)));
127 MeterBuilder meter = new MeterBuilder();
128 meter.setContainerName("abcd");
130 meter.setMeterId(new MeterId(Uint32.valueOf(9)));
131 meter.setMeterName(originalMeterName);
132 meter.setFlags(new MeterFlags(true, false, false, false));
133 MeterBandHeaderBuilder bandHeader = new MeterBandHeaderBuilder();
134 bandHeader.setBandRate(Uint32.valueOf(234));
135 bandHeader.setBandBurstSize(Uint32.valueOf(444));
136 DscpRemarkBuilder dscpRemark = new DscpRemarkBuilder();
137 dscpRemark.setDscpRemarkBurstSize(Uint32.valueOf(5));
138 dscpRemark.setPrecLevel(Uint8.ONE);
139 dscpRemark.setDscpRemarkRate(Uint32.valueOf(12));
140 bandHeader.setBandType(dscpRemark.build());
141 MeterBandTypesBuilder bandTypes = new MeterBandTypesBuilder();
142 MeterBandType bandType = new MeterBandType(false, true, false);
143 bandTypes.setFlags(bandType);
144 bandHeader.setMeterBandTypes(bandTypes.build());
145 bandHeader.setBandId(new BandId(Uint32.ZERO));
147 List<MeterBandHeader> bandHdr = new ArrayList<>();
148 bandHdr.add(bandHeader.build());
150 MeterBandHeadersBuilder bandHeaders = new MeterBandHeadersBuilder();
151 bandHeaders.setMeterBandHeader(bandHdr);
152 meter.setMeterBandHeaders(bandHeaders.build());
154 testMeter = meter.build();
158 private MeterBuilder createTestMeters(String s1, String s2) {
159 // Sample data , committing to DataStore
160 MeterKey key = new MeterKey(new MeterId(Uint32.valueOf(s1)));
161 MeterBuilder meter = new MeterBuilder();
162 meter.setContainerName("abcd");
164 meter.setMeterId(new MeterId(Uint32.valueOf(9)));
165 MeterBandHeaderBuilder bandHeader = new MeterBandHeaderBuilder();
166 if (s2.equalsIgnoreCase("modify")) {
167 meter.setMeterName(updatedMeterName);
168 bandHeader.setBandRate(Uint32.valueOf(234));
170 meter.setMeterName(originalMeterName);
171 bandHeader.setBandRate(Uint32.valueOf(123));
173 meter.setFlags(new MeterFlags(true, false, false, false));
175 bandHeader.setBandBurstSize(Uint32.valueOf(444));
176 DscpRemarkBuilder dscpRemark = new DscpRemarkBuilder();
177 dscpRemark.setDscpRemarkBurstSize(Uint32.valueOf(5));
178 dscpRemark.setPrecLevel(Uint8.ONE);
179 dscpRemark.setDscpRemarkRate(Uint32.valueOf(12));
180 bandHeader.setBandType(dscpRemark.build());
181 MeterBandTypesBuilder bandTypes = new MeterBandTypesBuilder();
182 MeterBandType bandType = new MeterBandType(false, true, false);
183 bandTypes.setFlags(bandType);
184 bandHeader.setMeterBandTypes(bandTypes.build());
185 bandHeader.setBandId(new BandId(Uint32.ZERO));
187 List<MeterBandHeader> bandHdr = new ArrayList<>();
188 bandHdr.add(bandHeader.build());
190 MeterBandHeadersBuilder bandHeaders = new MeterBandHeadersBuilder();
191 bandHeaders.setMeterBandHeader(bandHdr);
192 meter.setMeterBandHeaders(bandHeaders.build());
194 int firstInt = Integer.parseInt(s1);
200 testMeter1 = meter.build();
206 testMeter2 = meter.build();
215 public void _removeMeter(final CommandInterpreter ci) {
216 String nref = ci.nextArgument();
219 ci.println("test node added");
222 ci.println("User node added" + nref);
223 createUserNode(nref);
226 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
227 InstanceIdentifier<Meter> path1 = InstanceIdentifier.create(Nodes.class).child(Node.class, testNode.key())
228 .augmentation(FlowCapableNode.class).child(Meter.class, new MeterKey(testMeter.getMeterId()));
229 modification.delete(LogicalDatastoreType.CONFIGURATION, path1);
230 modification.commit().addCallback(new FutureCallback<CommitInfo>() {
232 public void onSuccess(CommitInfo notUsed) {
233 ci.println("Status of Group Data Loaded Transaction: success.");
237 public void onFailure(Throwable throwable) {
238 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
240 }, MoreExecutors.directExecutor());
243 public void _removeMeters(final CommandInterpreter ci) {
244 String nref = ci.nextArgument();
247 ci.println("test node added");
250 ci.println("User node added" + nref);
251 createUserNode(nref);
254 int count = Integer.parseInt(ci.nextArgument());
256 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
259 createTestMeters("1", "remove");
260 InstanceIdentifier<Meter> path1 = InstanceIdentifier.create(Nodes.class)
261 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
262 .child(Meter.class, new MeterKey(testMeter1.getMeterId()));
263 modification.delete(LogicalDatastoreType.CONFIGURATION, path1);
264 createTestMeters("2", "remove");
265 InstanceIdentifier<Meter> path2 = InstanceIdentifier.create(Nodes.class)
266 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
267 .child(Meter.class, new MeterKey(testMeter2.getMeterId()));
268 modification.delete(LogicalDatastoreType.CONFIGURATION, path2);
272 createTestMeters("3", "remove");
273 InstanceIdentifier<Meter> path3 = InstanceIdentifier.create(Nodes.class)
274 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
275 .child(Meter.class, new MeterKey(testMeter1.getMeterId()));
276 modification.delete(LogicalDatastoreType.CONFIGURATION, path3);
277 createTestMeters("4", "remove");
278 InstanceIdentifier<Meter> path4 = InstanceIdentifier.create(Nodes.class)
279 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
280 .child(Meter.class, new MeterKey(testMeter2.getMeterId()));
281 modification.delete(LogicalDatastoreType.CONFIGURATION, path4);
284 createTestMeters("5", "remove");
285 InstanceIdentifier<Meter> path5 = InstanceIdentifier.create(Nodes.class)
286 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
287 .child(Meter.class, new MeterKey(testMeter1.getMeterId()));
288 modification.delete(LogicalDatastoreType.CONFIGURATION, path5);
289 createTestMeters("6", "remove");
290 InstanceIdentifier<Meter> path6 = InstanceIdentifier.create(Nodes.class)
291 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
292 .child(Meter.class, new MeterKey(testMeter2.getMeterId()));
293 modification.delete(LogicalDatastoreType.CONFIGURATION, path6);
296 createTestMeters("7", "remove");
297 InstanceIdentifier<Meter> path7 = InstanceIdentifier.create(Nodes.class)
298 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
299 .child(Meter.class, new MeterKey(testMeter1.getMeterId()));
300 modification.delete(LogicalDatastoreType.CONFIGURATION, path7);
301 createTestMeters("8", "remove");
302 InstanceIdentifier<Meter> path8 = InstanceIdentifier.create(Nodes.class)
303 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
304 .child(Meter.class, new MeterKey(testMeter2.getMeterId()));
305 modification.delete(LogicalDatastoreType.CONFIGURATION, path8);
311 modification.commit().addCallback(new FutureCallback<CommitInfo>() {
313 public void onSuccess(CommitInfo notUsed) {
314 ci.println("Status of Group Data Loaded Transaction: success.");
318 public void onFailure(Throwable throwable) {
319 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
321 }, MoreExecutors.directExecutor());
324 public void _addMeter(CommandInterpreter ci) {
325 String nref = ci.nextArgument();
328 ci.println("test node added");
331 ci.println("User node added" + nref);
332 createUserNode(nref);
335 writeMeter(ci, testMeter);
338 public void _addMeters(CommandInterpreter ci) {
339 String nref = ci.nextArgument();
342 ci.println("test node added");
345 ci.println("User node added" + nref);
346 createUserNode(nref);
348 int count = Integer.parseInt(ci.nextArgument());
351 createTestMeters("1", "add");
352 createTestMeters("2", "add");
353 writeMeter(ci, testMeter1, testMeter2);
356 createTestMeters("3", "add");
357 createTestMeters("4", "add");
358 writeMeter(ci, testMeter1, testMeter2);
361 createTestMeters("5", "add");
362 createTestMeters("6", "add");
363 writeMeter(ci, testMeter1, testMeter2);
366 createTestMeters("7", "add");
367 createTestMeters("8", "add");
368 writeMeter(ci, testMeter1, testMeter2);
373 // createTestMeters();
374 // writeMeter(ci, testMeter);
377 private void writeMeter(final CommandInterpreter ci, Meter meter) {
378 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
379 InstanceIdentifier<Meter> path1 = InstanceIdentifier.create(Nodes.class).child(Node.class, testNode.key())
380 .augmentation(FlowCapableNode.class).child(Meter.class, new MeterKey(meter.getMeterId()));
381 modification.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, nodeToInstanceId(testNode),
383 modification.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, path1, meter);
384 modification.commit().addCallback(new FutureCallback<CommitInfo>() {
386 public void onSuccess(CommitInfo notUsed) {
387 ci.println("Status of Group Data Loaded Transaction: success.");
391 public void onFailure(Throwable throwable) {
392 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
394 }, MoreExecutors.directExecutor());
397 private void writeMeter(final CommandInterpreter ci, Meter meter, Meter meter1) {
398 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
399 InstanceIdentifier<Meter> path1 = InstanceIdentifier.create(Nodes.class).child(Node.class, testNode.key())
400 .augmentation(FlowCapableNode.class).child(Meter.class, new MeterKey(meter.getMeterId()));
401 modification.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, nodeToInstanceId(testNode),
403 modification.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, path1, meter);
404 InstanceIdentifier<Meter> path2 = InstanceIdentifier.create(Nodes.class).child(Node.class, testNode.key())
405 .augmentation(FlowCapableNode.class).child(Meter.class, new MeterKey(meter1.getMeterId()));
406 modification.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, nodeToInstanceId(testNode),
408 modification.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, path2, meter1);
410 modification.commit().addCallback(new FutureCallback<CommitInfo>() {
412 public void onSuccess(CommitInfo notUsed) {
413 ci.println("Status of Group Data Loaded Transaction: success.");
417 public void onFailure(Throwable throwable) {
418 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
420 }, MoreExecutors.directExecutor());
423 public void _modifyMeter(CommandInterpreter ci) {
424 String nref = ci.nextArgument();
427 ci.println("test node added");
430 ci.println("User node added" + nref);
431 createUserNode(nref);
433 MeterBuilder meter = createTestMeter();
434 meter.setMeterName(updatedMeterName);
435 writeMeter(ci, meter.build());
436 meter.setMeterName(originalMeterName);
437 writeMeter(ci, meter.build());
440 public void _modifyMeters(CommandInterpreter ci) {
441 String nref = ci.nextArgument();
444 ci.println("test node added");
447 ci.println("User node added" + nref);
448 createUserNode(nref);
451 int count = Integer.parseInt(ci.nextArgument());
454 createTestMeters("1", "modify");
455 createTestMeters("2", "modify");
456 writeMeter(ci, testMeter1, testMeter2);
459 createTestMeters("3", "modify");
460 createTestMeters("4", "modify");
461 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();