copyright header added
[openflowplugin.git] / test-provider / src / main / java / org / opendaylight / openflowplugin / test / OpenflowpluginMeterTestCommandProvider.java
1 /**
2  * Copyright IBM Corporation, 2013.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.openflowplugin.test;
9
10 import java.util.ArrayList;
11 import java.util.List;
12 import java.util.concurrent.ExecutionException;
13 import java.util.concurrent.Future;
14
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;
56
57 public class OpenflowpluginMeterTestCommandProvider implements CommandProvider {
58
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;
70
71     public OpenflowpluginMeterTestCommandProvider(BundleContext ctx) {
72         this.ctx = ctx;
73     }
74
75     public void onSessionInitiated(ProviderContext session) {
76         pc = session;
77         dataBrokerService = session.getSALService(DataBrokerService.class);
78         ctx.registerService(CommandProvider.class.getName(), this, null);
79         notificationService = session.getSALService(NotificationService.class);
80         // For switch events
81         listener1Reg = notificationService.registerNotificationListener(meterEventListener);
82         
83         createTestNode();
84         createTestMeter();
85     }
86
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();
92     }
93
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();
99     }
100
101     private InstanceIdentifier<Node> nodeToInstanceId(Node node) {
102         return InstanceIdentifier.builder(Nodes.class).child(Node.class, node.getKey()).toInstance();
103     }
104
105     final class MeterEventListener implements SalMeterListener {
106
107         @Override
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("-----------------------------------------------------------------------------------");            
112         }
113
114         @Override
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("-----------------------------------------------------------------------------------");            
119         }
120
121         @Override
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("-----------------------------------------------------------------------------------");            
126         }
127         
128     }
129     
130     private MeterBuilder createTestMeter() {
131         // Sample data , committing to DataStore
132         DataModification modification = dataBrokerService.beginTransaction();
133
134         long id = 12;
135         MeterKey key = new MeterKey(new MeterId(id));
136         MeterBuilder meter = new MeterBuilder();
137         meter.setContainerName("abcd");     
138         meter.setKey(key);       
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());
160
161         testMeter = meter.build();
162         return meter;
163     }
164
165     public void _removeMeter(CommandInterpreter ci) {
166         String nref = ci.nextArgument();
167
168         if (nref == null) {
169             ci.println("test node added");
170             createTestNode();
171         } else {
172             ci.println("User node added" + nref);
173             createUserNode(nref);
174         }
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()))
180                 .build();
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();
186         try {
187             RpcResult<TransactionStatus> result = commitFuture.get();
188             TransactionStatus status = result.getResult();
189             ci.println("Status of Meter Data Loaded Transaction: " + status);
190
191         } catch (InterruptedException e) {
192             // TODO Auto-generated catch block
193             e.printStackTrace();
194         } catch (ExecutionException e) {
195             // TODO Auto-generated catch block
196             e.printStackTrace();
197         }
198     }
199
200     public void _addMeter(CommandInterpreter ci) {
201         String nref = ci.nextArgument();
202
203         if (nref == null) {
204             ci.println("test node added");
205             createTestNode();
206         } else {
207             ci.println("User node added" + nref);
208             createUserNode(nref);
209         }
210         createTestMeter();
211         writeMeter(ci, testMeter);
212     }
213
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()))
219                 .build();
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();
226         try {
227             RpcResult<TransactionStatus> result = commitFuture.get();
228             TransactionStatus status = result.getResult();
229             ci.println("Status of Meter Data Loaded Transaction: " + status);
230
231         } catch (InterruptedException e) {
232             // TODO Auto-generated catch block
233             e.printStackTrace();
234         } catch (ExecutionException e) {
235             // TODO Auto-generated catch block
236             e.printStackTrace();
237         }
238     }
239
240     public void _modifyMeter(CommandInterpreter ci) {
241         String nref = ci.nextArgument();
242
243         if (nref == null) {
244             ci.println("test node added");
245             createTestNode();
246         } else {
247             ci.println("User node added" + nref);
248             createUserNode(nref);
249         }
250         MeterBuilder meter = createTestMeter();
251         meter.setMeterName(updatedMeterName);
252         writeMeter(ci, meter.build());
253         meter.setMeterName(originalMeterName);
254         writeMeter(ci, meter.build());
255     }
256
257     @Override
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");
264
265         return help.toString();
266     }
267
268 }