1 package org.opendaylight.openflowplugin.test;
3 import java.util.ArrayList;
5 import java.util.concurrent.ExecutionException;
6 import java.util.concurrent.Future;
8 import org.eclipse.osgi.framework.console.CommandInterpreter;
9 import org.eclipse.osgi.framework.console.CommandProvider;
10 import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
11 import org.opendaylight.controller.md.sal.common.api.data.DataModification;
12 import org.opendaylight.controller.sal.binding.api.NotificationService;
13 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
14 import org.opendaylight.controller.sal.binding.api.data.DataBrokerService;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.MeterBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.MeterKey;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.SalGroupListener;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.config.rev131024.Meters;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterAdded;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterRemoved;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterUpdated;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterListener;
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.BandType;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandType;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterFlags;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DscpRemark;
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.DataObject;
44 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
45 import org.opendaylight.yangtools.yang.common.RpcResult;
46 import org.osgi.framework.BundleContext;
47 import org.slf4j.Logger;
48 import org.slf4j.LoggerFactory;
50 public class OpenflowpluginMeterTestCommandProvider implements CommandProvider {
52 private static final Logger LOG = LoggerFactory.getLogger(OpenflowpluginMeterTestCommandProvider.class);
53 private DataBrokerService dataBrokerService;
54 private ProviderContext pc;
55 private final BundleContext ctx;
56 private Meter testMeter;
57 private Node testNode;
58 private final String originalMeterName = "Foo";
59 private final String updatedMeterName = "Bar";
60 private MeterEventListener meterEventListener = new MeterEventListener();
61 private static NotificationService notificationService;
62 private Registration<org.opendaylight.yangtools.yang.binding.NotificationListener> listener1Reg;
64 public OpenflowpluginMeterTestCommandProvider(BundleContext ctx) {
68 public void onSessionInitiated(ProviderContext session) {
70 dataBrokerService = session.getSALService(DataBrokerService.class);
71 ctx.registerService(CommandProvider.class.getName(), this, null);
72 notificationService = session.getSALService(NotificationService.class);
74 listener1Reg = notificationService.registerNotificationListener(meterEventListener);
80 private void createUserNode(String nodeRef) {
81 NodeBuilder builder = new NodeBuilder();
82 builder.setId(new NodeId(nodeRef));
83 builder.setKey(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.setKey(new NodeKey(builder.getId()));
91 testNode = builder.build();
94 private InstanceIdentifier<Node> nodeToInstanceId(Node node) {
95 return InstanceIdentifier.builder(Nodes.class).child(Node.class, node.getKey()).toInstance();
98 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());
104 LOG.info("-----------------------------------------------------------------------------------");
108 public void onMeterRemoved(MeterRemoved notification) {
109 LOG.info("Meter to be removed.........................."+notification.toString());
110 LOG.info("Meter Xid........................."+notification.getTransactionId().getValue());
111 LOG.info("-----------------------------------------------------------------------------------");
115 public void onMeterUpdated(MeterUpdated notification) {
116 LOG.info("Meter to be updated.........................."+notification.toString());
117 LOG.info("Meter Xid........................."+notification.getTransactionId().getValue());
118 LOG.info("-----------------------------------------------------------------------------------");
123 private MeterBuilder createTestMeter() {
124 // Sample data , committing to DataStore
125 DataModification modification = dataBrokerService.beginTransaction();
128 MeterKey key = new MeterKey(new MeterId(id));
129 MeterBuilder meter = new MeterBuilder();
130 meter.setContainerName("abcd");
132 meter.setMeterId(new MeterId(9L));
133 meter.setMeterName(originalMeterName);
134 meter.setFlags(new MeterFlags(true, false, false, false));
135 MeterBandHeadersBuilder bandHeaders = new MeterBandHeadersBuilder();
136 List<MeterBandHeader> bandHdr = new ArrayList<MeterBandHeader>();
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.setPercLevel((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));
150 bandHdr.add(bandHeader.build());
151 bandHeaders.setMeterBandHeader(bandHdr);
152 meter.setMeterBandHeaders(bandHeaders.build());
154 testMeter = meter.build();
158 public void _removeMeter(CommandInterpreter ci) {
159 String nref = ci.nextArgument();
162 ci.println("test node added");
165 ci.println("User node added" + nref);
166 createUserNode(nref);
168 MeterBuilder mBuilder = createTestMeter();
169 DataModification modification = dataBrokerService.beginTransaction();
170 InstanceIdentifier<Meter> path1 = InstanceIdentifier.builder(Nodes.class)
171 .child(Node.class, testNode.getKey()).augmentation(FlowCapableNode.class)
172 .child(Meter.class, new MeterKey(testMeter.getMeterId()))
174 modification.removeOperationalData(nodeToInstanceId(testNode));
175 modification.removeOperationalData(path1);
176 modification.removeConfigurationData(nodeToInstanceId(testNode));
177 modification.removeConfigurationData(path1);
178 Future<RpcResult<TransactionStatus>> commitFuture = modification.commit();
180 RpcResult<TransactionStatus> result = commitFuture.get();
181 TransactionStatus status = result.getResult();
182 ci.println("Status of Meter Data Loaded Transaction: " + status);
184 } catch (InterruptedException e) {
185 // TODO Auto-generated catch block
187 } catch (ExecutionException e) {
188 // TODO Auto-generated catch block
193 public void _addMeter(CommandInterpreter ci) {
194 String nref = ci.nextArgument();
197 ci.println("test node added");
200 ci.println("User node added" + nref);
201 createUserNode(nref);
204 writeMeter(ci, testMeter);
207 private void writeMeter(CommandInterpreter ci, Meter meter) {
208 DataModification modification = dataBrokerService.beginTransaction();
209 InstanceIdentifier<Meter> path1 = InstanceIdentifier.builder(Nodes.class)
210 .child(Node.class, testNode.getKey()).augmentation(FlowCapableNode.class)
211 .child(Meter.class, new MeterKey(meter.getMeterId()))
213 DataObject cls = (DataObject) modification.readConfigurationData(path1);
214 modification.putOperationalData(nodeToInstanceId(testNode), testNode);
215 modification.putOperationalData(path1, meter);
216 modification.putConfigurationData(nodeToInstanceId(testNode), testNode);
217 modification.putConfigurationData(path1, meter);
218 Future<RpcResult<TransactionStatus>> commitFuture = modification.commit();
220 RpcResult<TransactionStatus> result = commitFuture.get();
221 TransactionStatus status = result.getResult();
222 ci.println("Status of Meter Data Loaded Transaction: " + status);
224 } catch (InterruptedException e) {
225 // TODO Auto-generated catch block
227 } catch (ExecutionException e) {
228 // TODO Auto-generated catch block
233 public void _modifyMeter(CommandInterpreter ci) {
234 String nref = ci.nextArgument();
237 ci.println("test node added");
240 ci.println("User node added" + nref);
241 createUserNode(nref);
243 MeterBuilder meter = createTestMeter();
244 meter.setMeterName(updatedMeterName);
245 writeMeter(ci, meter.build());
246 meter.setMeterName(originalMeterName);
247 writeMeter(ci, meter.build());
251 public String getHelp() {
252 StringBuffer help = new StringBuffer();
253 help.append("---FRM MD-SAL Group test module---\n");
254 help.append("\t addMeter <node id> - node ref\n");
255 help.append("\t modifyMeter <node id> - node ref\n");
256 help.append("\t removeMeter <node id> - node ref\n");
258 return help.toString();