1 package org.opendaylight.controller.md.statistics.manager;
3 import java.util.ArrayList;
5 import java.util.concurrent.ConcurrentHashMap;
6 import java.util.concurrent.ConcurrentMap;
7 import java.util.concurrent.Future;
9 import org.eclipse.xtext.xbase.lib.Exceptions;
10 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
11 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
12 import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatisticsInputBuilder;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatisticsOutput;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionInputBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionOutput;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesInputBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesOutput;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.OpendaylightGroupStatisticsService;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatisticsInputBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatisticsOutput;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsInputBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsOutput;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesInputBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesOutput;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.OpendaylightMeterStatisticsService;
30 import org.opendaylight.yangtools.concepts.Registration;
31 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
32 import org.opendaylight.yangtools.yang.binding.NotificationListener;
33 import org.opendaylight.yangtools.yang.common.RpcResult;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
37 public class StatisticsProvider implements AutoCloseable {
39 public final static Logger spLogger = LoggerFactory.getLogger(StatisticsProvider.class);
41 private DataProviderService dps;
43 private NotificationProviderService nps;
45 private OpendaylightGroupStatisticsService groupStatsService;
47 private OpendaylightMeterStatisticsService meterStatsService;
49 private Thread statisticsRequesterThread;
51 private final InstanceIdentifier<Nodes> nodesIdentifier = InstanceIdentifier.builder().node(Nodes.class).toInstance();
53 //Local caching of stats
55 private final ConcurrentMap<NodeRef,NodeStatistics> statisticsCache =
56 new ConcurrentHashMap<NodeRef,NodeStatistics>();
58 public DataProviderService getDataService() {
62 public void setDataService(final DataProviderService dataService) {
63 this.dps = dataService;
66 public NotificationProviderService getNotificationService() {
70 public void setNotificationService(final NotificationProviderService notificationService) {
71 this.nps = notificationService;
74 private final StatisticsUpdateCommiter updateCommiter = new StatisticsUpdateCommiter(StatisticsProvider.this);
76 private Registration<NotificationListener> listenerRegistration;
80 NotificationProviderService nps = this.getNotificationService();
81 Registration<NotificationListener> registerNotificationListener = nps.registerNotificationListener(this.updateCommiter);
82 this.listenerRegistration = registerNotificationListener;
84 // Get Group/Meter statistics service instance
85 groupStatsService = StatisticsManagerActivator.getProviderContext().
86 getRpcService(OpendaylightGroupStatisticsService.class);
88 meterStatsService = StatisticsManagerActivator.getProviderContext().
89 getRpcService(OpendaylightMeterStatisticsService.class);
91 statisticsRequesterThread = new Thread( new Runnable(){
100 }catch (Exception e){
101 spLogger.error("Exception occurred while sending stats request : {}",e.getMessage());
107 spLogger.info("Statistics Provider started.");
110 protected DataModificationTransaction startChange() {
112 DataProviderService dps = this.getDataService();
113 return dps.beginTransaction();
116 private void statsRequestSender(){
118 //Need to call API to receive all the nodes connected to controller.
120 List<NodeRef> targetNodes = new ArrayList<NodeRef>();
122 for (NodeRef targetNode : targetNodes){
124 sendAllGroupStatisticsRequest(targetNode);
126 sendAllMeterStatisticsRequest(targetNode);
128 //We need to add check, so see if groups/meters are supported
129 //by the target node.
130 sendGroupDescriptionRequest(targetNode);
132 sendGroupFeaturesRequest(targetNode);
134 sendMeterConfigStatisticsRequest(targetNode);
136 sendMeterFeaturesRequest(targetNode);
140 private void sendAllGroupStatisticsRequest(NodeRef targetNode){
142 GetAllGroupStatisticsInputBuilder input = new GetAllGroupStatisticsInputBuilder();
144 input.setNode(targetNode);
146 Future<RpcResult<GetAllGroupStatisticsOutput>> response =
147 groupStatsService.getAllGroupStatistics(input.build());
150 private void sendGroupDescriptionRequest(NodeRef targetNode){
151 GetGroupDescriptionInputBuilder input = new GetGroupDescriptionInputBuilder();
153 input.setNode(targetNode);
155 Future<RpcResult<GetGroupDescriptionOutput>> response =
156 groupStatsService.getGroupDescription(input.build());
159 private void sendGroupFeaturesRequest(NodeRef targetNode){
161 GetGroupFeaturesInputBuilder input = new GetGroupFeaturesInputBuilder();
163 input.setNode(targetNode);
165 Future<RpcResult<GetGroupFeaturesOutput>> response =
166 groupStatsService.getGroupFeatures(input.build());
169 private void sendAllMeterStatisticsRequest(NodeRef targenetNode){
171 GetAllMeterStatisticsInputBuilder input = new GetAllMeterStatisticsInputBuilder();
173 input.setNode(targenetNode);
175 Future<RpcResult<GetAllMeterStatisticsOutput>> response =
176 meterStatsService.getAllMeterStatistics(input.build());
179 private void sendMeterConfigStatisticsRequest(NodeRef targetNode){
181 GetAllMeterConfigStatisticsInputBuilder input = new GetAllMeterConfigStatisticsInputBuilder();
183 input.setNode(targetNode);
185 Future<RpcResult<GetAllMeterConfigStatisticsOutput>> response =
186 meterStatsService.getAllMeterConfigStatistics(input.build());
189 private void sendMeterFeaturesRequest(NodeRef targetNode){
191 GetMeterFeaturesInputBuilder input = new GetMeterFeaturesInputBuilder();
193 input.setNode(targetNode);
195 Future<RpcResult<GetMeterFeaturesOutput>> response =
196 meterStatsService.getMeterFeatures(input.build());
199 public ConcurrentMap<NodeRef, NodeStatistics> getStatisticsCache() {
200 return statisticsCache;
203 private List<Node> getAllConnectedNodes(){
205 Nodes nodes = (Nodes) dps.readOperationalData(nodesIdentifier);
206 return nodes.getNode();
209 @SuppressWarnings("deprecation")
214 spLogger.info("Statistics Provider stopped.");
215 if (this.listenerRegistration != null) {
217 this.listenerRegistration.close();
219 this.statisticsRequesterThread.destroy();
222 } catch (Throwable e) {
223 throw Exceptions.sneakyThrow(e);