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 static java.util.Objects.requireNonNull;
12 import com.google.common.util.concurrent.FutureCallback;
13 import com.google.common.util.concurrent.MoreExecutors;
14 import javax.inject.Inject;
15 import javax.inject.Singleton;
16 import org.eclipse.jdt.annotation.NonNull;
17 import org.eclipse.osgi.framework.console.CommandInterpreter;
18 import org.eclipse.osgi.framework.console.CommandProvider;
19 import org.opendaylight.mdsal.binding.api.DataBroker;
20 import org.opendaylight.mdsal.binding.api.ReadWriteTransaction;
21 import org.opendaylight.mdsal.common.api.CommitInfo;
22 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.MeterBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.MeterKey;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.BandId;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandType;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterFlags;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DscpRemarkBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.MeterBandHeadersBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeaderBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.meter.band.header.MeterBandTypesBuilder;
39 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
40 import org.opendaylight.yangtools.yang.binding.util.BindingMap;
41 import org.opendaylight.yangtools.yang.common.Uint32;
42 import org.opendaylight.yangtools.yang.common.Uint8;
43 import org.osgi.service.component.annotations.Activate;
44 import org.osgi.service.component.annotations.Component;
45 import org.osgi.service.component.annotations.Reference;
48 @Component(service = CommandProvider.class, immediate = true)
49 public final class OpenflowpluginMeterTestCommandProvider implements CommandProvider {
50 private static final String ORIGINAL_METER_NAME = "Foo";
51 private static final String UPDATED_METER_NAME = "Bar";
53 private final DataBroker dataBroker;
54 private Meter testMeter;
55 private Meter testMeter1;
56 private Meter testMeter2;
57 private Node testNode;
61 public OpenflowpluginMeterTestCommandProvider(@Reference final DataBroker dataBroker) {
62 this.dataBroker = requireNonNull(dataBroker);
67 private void createUserNode(final String nodeRef) {
68 testNode = new NodeBuilder().setId(new NodeId(nodeRef)).build();
71 private void createTestNode() {
72 testNode = new NodeBuilder().setId(new NodeId(OpenflowpluginTestActivator.NODE_ID)).build();
75 private static @NonNull InstanceIdentifier<Node> nodeToInstanceId(final Node node) {
76 return InstanceIdentifier.create(Nodes.class).child(Node.class, node.key());
79 private MeterBuilder createTestMeter() {
80 // Sample data , committing to DataStore
81 final MeterBuilder meter = new MeterBuilder()
82 .setContainerName("abcd")
83 .withKey(new MeterKey(new MeterId(Uint32.valueOf(12))))
84 .setMeterId(new MeterId(Uint32.valueOf(9)))
85 .setMeterName(ORIGINAL_METER_NAME)
86 .setFlags(new MeterFlags(true, false, false, false))
87 .setMeterBandHeaders(new MeterBandHeadersBuilder()
88 .setMeterBandHeader(BindingMap.of(new MeterBandHeaderBuilder()
89 .setBandRate(Uint32.valueOf(234))
90 .setBandBurstSize(Uint32.valueOf(444))
91 .setBandType(new DscpRemarkBuilder()
92 .setDscpRemarkBurstSize(Uint32.valueOf(5))
93 .setPrecLevel(Uint8.ONE)
94 .setDscpRemarkRate(Uint32.valueOf(12))
96 .setMeterBandTypes(new MeterBandTypesBuilder()
97 .setFlags(new MeterBandType(false, true, false))
99 .setBandId(new BandId(Uint32.ZERO))
103 testMeter = meter.build();
107 private MeterBuilder createTestMeters(final String s1, final String s2) {
108 // Sample data , committing to DataStore
109 final MeterBuilder meter = new MeterBuilder()
110 .setContainerName("abcd")
111 .withKey(new MeterKey(new MeterId(Uint32.valueOf(s1))))
112 .setMeterId(new MeterId(Uint32.valueOf(9)))
113 .setFlags(new MeterFlags(true, false, false, false));
114 final MeterBandHeaderBuilder bandHeader = new MeterBandHeaderBuilder()
115 .setBandBurstSize(Uint32.valueOf(444))
116 .setBandType(new DscpRemarkBuilder()
117 .setDscpRemarkBurstSize(Uint32.valueOf(5)).setPrecLevel(Uint8.ONE).setDscpRemarkRate(Uint32.valueOf(12))
119 .setMeterBandTypes(new MeterBandTypesBuilder().setFlags(new MeterBandType(false, true, false)).build())
120 .setBandId(new BandId(Uint32.ZERO));
122 if (s2.equalsIgnoreCase("modify")) {
123 meter.setMeterName(UPDATED_METER_NAME);
124 bandHeader.setBandRate(Uint32.valueOf(234));
126 meter.setMeterName(ORIGINAL_METER_NAME);
127 bandHeader.setBandRate(Uint32.valueOf(123));
130 meter.setMeterBandHeaders(new MeterBandHeadersBuilder()
131 .setMeterBandHeader(BindingMap.of(bandHeader.build()))
134 int firstInt = Integer.parseInt(s1);
140 testMeter1 = meter.build();
146 testMeter2 = meter.build();
155 @SuppressWarnings("checkstyle:MethodName")
156 public void _removeMeter(final CommandInterpreter ci) {
157 String nref = ci.nextArgument();
160 ci.println("test node added");
163 ci.println("User node added" + nref);
164 createUserNode(nref);
167 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
168 InstanceIdentifier<Meter> path1 = InstanceIdentifier.create(Nodes.class).child(Node.class, testNode.key())
169 .augmentation(FlowCapableNode.class).child(Meter.class, new MeterKey(testMeter.getMeterId()));
170 modification.delete(LogicalDatastoreType.CONFIGURATION, path1);
171 modification.commit().addCallback(new FutureCallback<CommitInfo>() {
173 public void onSuccess(final CommitInfo notUsed) {
174 ci.println("Status of Group Data Loaded Transaction: success.");
178 public void onFailure(final Throwable throwable) {
179 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
181 }, MoreExecutors.directExecutor());
184 @SuppressWarnings("checkstyle:MethodName")
185 public void _removeMeters(final CommandInterpreter ci) {
186 String nref = ci.nextArgument();
189 ci.println("test node added");
192 ci.println("User node added" + nref);
193 createUserNode(nref);
196 int count = Integer.parseInt(ci.nextArgument());
198 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
201 createTestMeters("1", "remove");
202 InstanceIdentifier<Meter> path1 = InstanceIdentifier.create(Nodes.class)
203 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
204 .child(Meter.class, new MeterKey(testMeter1.getMeterId()));
205 modification.delete(LogicalDatastoreType.CONFIGURATION, path1);
206 createTestMeters("2", "remove");
207 InstanceIdentifier<Meter> path2 = InstanceIdentifier.create(Nodes.class)
208 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
209 .child(Meter.class, new MeterKey(testMeter2.getMeterId()));
210 modification.delete(LogicalDatastoreType.CONFIGURATION, path2);
214 createTestMeters("3", "remove");
215 InstanceIdentifier<Meter> path3 = InstanceIdentifier.create(Nodes.class)
216 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
217 .child(Meter.class, new MeterKey(testMeter1.getMeterId()));
218 modification.delete(LogicalDatastoreType.CONFIGURATION, path3);
219 createTestMeters("4", "remove");
220 InstanceIdentifier<Meter> path4 = InstanceIdentifier.create(Nodes.class)
221 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
222 .child(Meter.class, new MeterKey(testMeter2.getMeterId()));
223 modification.delete(LogicalDatastoreType.CONFIGURATION, path4);
226 createTestMeters("5", "remove");
227 InstanceIdentifier<Meter> path5 = InstanceIdentifier.create(Nodes.class)
228 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
229 .child(Meter.class, new MeterKey(testMeter1.getMeterId()));
230 modification.delete(LogicalDatastoreType.CONFIGURATION, path5);
231 createTestMeters("6", "remove");
232 InstanceIdentifier<Meter> path6 = InstanceIdentifier.create(Nodes.class)
233 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
234 .child(Meter.class, new MeterKey(testMeter2.getMeterId()));
235 modification.delete(LogicalDatastoreType.CONFIGURATION, path6);
238 createTestMeters("7", "remove");
239 InstanceIdentifier<Meter> path7 = InstanceIdentifier.create(Nodes.class)
240 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
241 .child(Meter.class, new MeterKey(testMeter1.getMeterId()));
242 modification.delete(LogicalDatastoreType.CONFIGURATION, path7);
243 createTestMeters("8", "remove");
244 InstanceIdentifier<Meter> path8 = InstanceIdentifier.create(Nodes.class)
245 .child(Node.class, testNode.key()).augmentation(FlowCapableNode.class)
246 .child(Meter.class, new MeterKey(testMeter2.getMeterId()));
247 modification.delete(LogicalDatastoreType.CONFIGURATION, path8);
253 modification.commit().addCallback(new FutureCallback<CommitInfo>() {
255 public void onSuccess(final CommitInfo notUsed) {
256 ci.println("Status of Group Data Loaded Transaction: success.");
260 public void onFailure(final Throwable throwable) {
261 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
263 }, MoreExecutors.directExecutor());
266 @SuppressWarnings("checkstyle:MethodName")
267 public void _addMeter(final CommandInterpreter ci) {
268 String nref = ci.nextArgument();
271 ci.println("test node added");
274 ci.println("User node added" + nref);
275 createUserNode(nref);
278 writeMeter(ci, testMeter);
281 @SuppressWarnings("checkstyle:MethodName")
282 public void _addMeters(final CommandInterpreter ci) {
283 String nref = ci.nextArgument();
286 ci.println("test node added");
289 ci.println("User node added" + nref);
290 createUserNode(nref);
292 int count = Integer.parseInt(ci.nextArgument());
295 createTestMeters("1", "add");
296 createTestMeters("2", "add");
297 writeMeter(ci, testMeter1, testMeter2);
300 createTestMeters("3", "add");
301 createTestMeters("4", "add");
302 writeMeter(ci, testMeter1, testMeter2);
305 createTestMeters("5", "add");
306 createTestMeters("6", "add");
307 writeMeter(ci, testMeter1, testMeter2);
310 createTestMeters("7", "add");
311 createTestMeters("8", "add");
312 writeMeter(ci, testMeter1, testMeter2);
317 // createTestMeters();
318 // writeMeter(ci, testMeter);
321 private void writeMeter(final CommandInterpreter ci, final Meter meter) {
322 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
323 InstanceIdentifier<Meter> path1 = InstanceIdentifier.create(Nodes.class).child(Node.class, testNode.key())
324 .augmentation(FlowCapableNode.class).child(Meter.class, new MeterKey(meter.getMeterId()));
325 modification.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, nodeToInstanceId(testNode),
327 modification.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, path1, meter);
328 modification.commit().addCallback(new FutureCallback<CommitInfo>() {
330 public void onSuccess(final CommitInfo notUsed) {
331 ci.println("Status of Group Data Loaded Transaction: success.");
335 public void onFailure(final Throwable throwable) {
336 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
338 }, MoreExecutors.directExecutor());
341 private void writeMeter(final CommandInterpreter ci, final Meter meter, final Meter meter1) {
342 ReadWriteTransaction modification = dataBroker.newReadWriteTransaction();
343 InstanceIdentifier<Meter> path1 = InstanceIdentifier.create(Nodes.class).child(Node.class, testNode.key())
344 .augmentation(FlowCapableNode.class).child(Meter.class, new MeterKey(meter.getMeterId()));
345 modification.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, nodeToInstanceId(testNode),
347 modification.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, path1, meter);
348 InstanceIdentifier<Meter> path2 = InstanceIdentifier.create(Nodes.class).child(Node.class, testNode.key())
349 .augmentation(FlowCapableNode.class).child(Meter.class, new MeterKey(meter1.getMeterId()));
350 modification.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, nodeToInstanceId(testNode),
352 modification.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, path2, meter1);
354 modification.commit().addCallback(new FutureCallback<CommitInfo>() {
356 public void onSuccess(final CommitInfo notUsed) {
357 ci.println("Status of Group Data Loaded Transaction: success.");
361 public void onFailure(final Throwable throwable) {
362 ci.println(String.format("Status of Group Data Loaded Transaction : failure. Reason : %s", throwable));
364 }, MoreExecutors.directExecutor());
367 @SuppressWarnings("checkstyle:MethodName")
368 public void _modifyMeter(final CommandInterpreter ci) {
369 String nref = ci.nextArgument();
372 ci.println("test node added");
375 ci.println("User node added" + nref);
376 createUserNode(nref);
378 MeterBuilder meter = createTestMeter();
379 meter.setMeterName(UPDATED_METER_NAME);
380 writeMeter(ci, meter.build());
381 meter.setMeterName(ORIGINAL_METER_NAME);
382 writeMeter(ci, meter.build());
385 @SuppressWarnings("checkstyle:MethodName")
386 public void _modifyMeters(final CommandInterpreter ci) {
387 String nref = ci.nextArgument();
390 ci.println("test node added");
393 ci.println("User node added" + nref);
394 createUserNode(nref);
397 int count = Integer.parseInt(ci.nextArgument());
400 createTestMeters("1", "modify");
401 createTestMeters("2", "modify");
402 writeMeter(ci, testMeter1, testMeter2);
405 createTestMeters("3", "modify");
406 createTestMeters("4", "modify");
407 writeMeter(ci, testMeter1, testMeter2);
415 public String getHelp() {
416 StringBuilder help = new StringBuilder();
417 help.append("---FRM MD-SAL Meter test module---\n");
418 help.append("\t addMeter <node id> - node ref\n");
419 help.append("\t modifyMeter <node id> - node ref\n");
420 help.append("\t removeMeter <node id> - node ref\n");
422 return help.toString();