2 * Copyright IBM Corporation, 2013. 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 java.util.ArrayList;
11 import java.util.List;
12 import java.util.concurrent.ExecutionException;
13 import java.util.concurrent.Future;
15 import org.eclipse.osgi.framework.console.CommandInterpreter;
16 import org.eclipse.osgi.framework.console.CommandProvider;
17 import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
18 import org.opendaylight.controller.md.sal.common.api.data.DataModification;
19 import org.opendaylight.controller.sal.binding.api.NotificationService;
20 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
21 import org.opendaylight.controller.sal.binding.api.data.DataBrokerService;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.MeterBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.MeterKey;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.SalGroupListener;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
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.config.rev131024.Meters;
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.BandType;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandType;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterFlags;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DscpRemark;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DscpRemarkBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.MeterBandHeadersBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeader;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeaderBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.meter.band.header.MeterBandTypesBuilder;
49 import org.opendaylight.yangtools.concepts.Registration;
50 import org.opendaylight.yangtools.yang.binding.DataObject;
51 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
52 import org.opendaylight.yangtools.yang.common.RpcResult;
53 import org.osgi.framework.BundleContext;
54 import org.slf4j.Logger;
55 import org.slf4j.LoggerFactory;
57 public class OpenflowpluginMeterTestCommandProvider implements CommandProvider {
59 private static final Logger LOG = LoggerFactory.getLogger(OpenflowpluginMeterTestCommandProvider.class);
60 private DataBrokerService dataBrokerService;
61 private ProviderContext pc;
62 private final BundleContext ctx;
63 private Meter testMeter;
64 private Node testNode;
65 private final String originalMeterName = "Foo";
66 private final String updatedMeterName = "Bar";
67 private MeterEventListener meterEventListener = new MeterEventListener();
68 private static NotificationService notificationService;
69 private Registration<org.opendaylight.yangtools.yang.binding.NotificationListener> listener1Reg;
71 public OpenflowpluginMeterTestCommandProvider(BundleContext ctx) {
75 public void onSessionInitiated(ProviderContext session) {
77 dataBrokerService = session.getSALService(DataBrokerService.class);
78 ctx.registerService(CommandProvider.class.getName(), this, null);
79 notificationService = session.getSALService(NotificationService.class);
81 listener1Reg = notificationService.registerNotificationListener(meterEventListener);
87 private void createUserNode(String nodeRef) {
88 NodeBuilder builder = new NodeBuilder();
89 builder.setId(new NodeId(nodeRef));
90 builder.setKey(new NodeKey(builder.getId()));
91 testNode = builder.build();
94 private void createTestNode() {
95 NodeBuilder builder = new NodeBuilder();
96 builder.setId(new NodeId(OpenflowpluginTestActivator.NODE_ID));
97 builder.setKey(new NodeKey(builder.getId()));
98 testNode = builder.build();
101 private InstanceIdentifier<Node> nodeToInstanceId(Node node) {
102 return InstanceIdentifier.builder(Nodes.class).child(Node.class, node.getKey()).toInstance();
105 final class MeterEventListener implements SalMeterListener {
108 public void onMeterAdded(MeterAdded notification) {
109 LOG.info("Meter to be added.........................."+notification.toString());
110 LOG.info("Meter Xid........................."+notification.getTransactionId().getValue());
111 LOG.info("-----------------------------------------------------------------------------------");
115 public void onMeterRemoved(MeterRemoved notification) {
116 LOG.info("Meter to be removed.........................."+notification.toString());
117 LOG.info("Meter Xid........................."+notification.getTransactionId().getValue());
118 LOG.info("-----------------------------------------------------------------------------------");
122 public void onMeterUpdated(MeterUpdated notification) {
123 LOG.info("Meter to be updated.........................."+notification.toString());
124 LOG.info("Meter Xid........................."+notification.getTransactionId().getValue());
125 LOG.info("-----------------------------------------------------------------------------------");
130 private MeterBuilder createTestMeter() {
131 // Sample data , committing to DataStore
132 DataModification modification = dataBrokerService.beginTransaction();
135 MeterKey key = new MeterKey(new MeterId(id));
136 MeterBuilder meter = new MeterBuilder();
137 meter.setContainerName("abcd");
139 meter.setMeterId(new MeterId(9L));
140 meter.setMeterName(originalMeterName);
141 meter.setFlags(new MeterFlags(true, false, false, false));
142 MeterBandHeadersBuilder bandHeaders = new MeterBandHeadersBuilder();
143 List<MeterBandHeader> bandHdr = new ArrayList<MeterBandHeader>();
144 MeterBandHeaderBuilder bandHeader = new MeterBandHeaderBuilder();
145 bandHeader.setBandRate((long) 234);
146 bandHeader.setBandBurstSize((long) 444);
147 DscpRemarkBuilder dscpRemark = new DscpRemarkBuilder();
148 dscpRemark.setDscpRemarkBurstSize((long) 5);
149 dscpRemark.setPercLevel((short) 1);
150 dscpRemark.setDscpRemarkRate((long) 12);
151 bandHeader.setBandType(dscpRemark.build());
152 MeterBandTypesBuilder bandTypes = new MeterBandTypesBuilder();
153 MeterBandType bandType = new MeterBandType(false, true, false);
154 bandTypes.setFlags(bandType);
155 bandHeader.setMeterBandTypes(bandTypes.build());
156 bandHeader.setBandId(new BandId(0L));
157 bandHdr.add(bandHeader.build());
158 bandHeaders.setMeterBandHeader(bandHdr);
159 meter.setMeterBandHeaders(bandHeaders.build());
161 testMeter = meter.build();
165 public void _removeMeter(CommandInterpreter ci) {
166 String nref = ci.nextArgument();
169 ci.println("test node added");
172 ci.println("User node added" + nref);
173 createUserNode(nref);
175 MeterBuilder mBuilder = createTestMeter();
176 DataModification modification = dataBrokerService.beginTransaction();
177 InstanceIdentifier<Meter> path1 = InstanceIdentifier.builder(Nodes.class)
178 .child(Node.class, testNode.getKey()).augmentation(FlowCapableNode.class)
179 .child(Meter.class, new MeterKey(testMeter.getMeterId()))
181 modification.removeOperationalData(nodeToInstanceId(testNode));
182 modification.removeOperationalData(path1);
183 modification.removeConfigurationData(nodeToInstanceId(testNode));
184 modification.removeConfigurationData(path1);
185 Future<RpcResult<TransactionStatus>> commitFuture = modification.commit();
187 RpcResult<TransactionStatus> result = commitFuture.get();
188 TransactionStatus status = result.getResult();
189 ci.println("Status of Meter Data Loaded Transaction: " + status);
191 } catch (InterruptedException e) {
192 // TODO Auto-generated catch block
194 } catch (ExecutionException e) {
195 // TODO Auto-generated catch block
200 public void _addMeter(CommandInterpreter ci) {
201 String nref = ci.nextArgument();
204 ci.println("test node added");
207 ci.println("User node added" + nref);
208 createUserNode(nref);
211 writeMeter(ci, testMeter);
214 private void writeMeter(CommandInterpreter ci, Meter meter) {
215 DataModification modification = dataBrokerService.beginTransaction();
216 InstanceIdentifier<Meter> path1 = InstanceIdentifier.builder(Nodes.class)
217 .child(Node.class, testNode.getKey()).augmentation(FlowCapableNode.class)
218 .child(Meter.class, new MeterKey(meter.getMeterId()))
220 DataObject cls = (DataObject) modification.readConfigurationData(path1);
221 modification.putOperationalData(nodeToInstanceId(testNode), testNode);
222 modification.putOperationalData(path1, meter);
223 modification.putConfigurationData(nodeToInstanceId(testNode), testNode);
224 modification.putConfigurationData(path1, meter);
225 Future<RpcResult<TransactionStatus>> commitFuture = modification.commit();
227 RpcResult<TransactionStatus> result = commitFuture.get();
228 TransactionStatus status = result.getResult();
229 ci.println("Status of Meter Data Loaded Transaction: " + status);
231 } catch (InterruptedException e) {
232 // TODO Auto-generated catch block
234 } catch (ExecutionException e) {
235 // TODO Auto-generated catch block
240 public void _modifyMeter(CommandInterpreter ci) {
241 String nref = ci.nextArgument();
244 ci.println("test node added");
247 ci.println("User node added" + nref);
248 createUserNode(nref);
250 MeterBuilder meter = createTestMeter();
251 meter.setMeterName(updatedMeterName);
252 writeMeter(ci, meter.build());
253 meter.setMeterName(originalMeterName);
254 writeMeter(ci, meter.build());
258 public String getHelp() {
259 StringBuffer help = new StringBuffer();
260 help.append("---FRM MD-SAL Group test module---\n");
261 help.append("\t addMeter <node id> - node ref\n");
262 help.append("\t modifyMeter <node id> - node ref\n");
263 help.append("\t removeMeter <node id> - node ref\n");
265 return help.toString();