1 package org.opendaylight.controller.sal.compatibility.adsal;
3 import java.math.BigInteger;
4 import java.util.ArrayList;
6 import java.util.concurrent.Future;
8 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
9 import org.opendaylight.controller.sal.common.util.Futures;
10 import org.opendaylight.controller.sal.common.util.Rpcs;
11 import org.opendaylight.controller.sal.compatibility.NodeMapping;
12 import org.opendaylight.controller.sal.compatibility.ToSalConversionsUtils;
13 import org.opendaylight.controller.sal.core.ConstructionException;
14 import org.opendaylight.controller.sal.core.Node;
15 import org.opendaylight.controller.sal.flowprogrammer.Flow;
16 import org.opendaylight.controller.sal.reader.FlowOnNode;
17 import org.opendaylight.controller.sal.reader.IReadService;
18 import org.opendaylight.controller.sal.reader.IReadServiceListener;
19 import org.opendaylight.controller.sal.reader.NodeConnectorStatistics;
20 import org.opendaylight.controller.sal.reader.NodeDescription;
21 import org.opendaylight.controller.sal.reader.NodeTableStatistics;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.Counter64;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.FlowStatisticsUpdatedBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowStatisticsFromFlowTableInput;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowStatisticsFromFlowTableOutput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowStatisticsInput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowStatisticsOutput;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowStatisticsOutputBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowsStatisticsFromAllFlowTablesInput;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowsStatisticsFromAllFlowTablesOutput;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllNodeConnectorStatisticsInput;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllNodeConnectorStatisticsOutput;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllNodeConnectorStatisticsOutputBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTableInput;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTableOutput;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsInput;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsOutput;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsOutputBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowTableStatisticsInput;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowTableStatisticsOutput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowTableStatisticsOutputBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetNodeConnectorStatisticsInput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetNodeConnectorStatisticsOutput;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetNodeConnectorStatisticsOutputBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.NodeConnectorStatisticsUpdatedBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.OpendaylightFlowStatisticsService;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.get.all.flow.statistics.output.FlowStatistics;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.get.all.flow.statistics.output.FlowStatisticsBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.get.all.node.connector.statistics.output.NodeConnectorStatisticsBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.statistics.Duration;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.statistics.DurationBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.node.connector.statistics.Bytes;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.node.connector.statistics.BytesBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.node.connector.statistics.Packets;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.node.connector.statistics.PacketsBuilder;
61 import org.opendaylight.yangtools.yang.common.RpcResult;
62 import org.slf4j.Logger;
63 import org.slf4j.LoggerFactory;
65 public class FlowStatisticsAdapter implements OpendaylightFlowStatisticsService, IReadServiceListener {
67 private static final Logger LOG = LoggerFactory.getLogger(FlowStatisticsAdapter.class);
68 private IReadService readDelegate;
69 private NotificationProviderService notifier;
72 public Future<RpcResult<GetAllFlowStatisticsOutput>> getAllFlowStatistics(GetAllFlowStatisticsInput input) {
73 GetAllFlowStatisticsOutput rpcResultType = null;
74 boolean rpcResultBool = false;
77 Node adNode = NodeMapping.toADNode(input.getNode());
78 List<FlowOnNode> flowsOnNode = readDelegate.readAllFlows(adNode);
79 List<FlowStatistics> flowsStatistics = toOdFlowsStatistics(flowsOnNode);
80 GetAllFlowStatisticsOutputBuilder builder = new GetAllFlowStatisticsOutputBuilder();
81 rpcResultType = builder.setFlowStatistics(flowsStatistics).build();
83 } catch (ConstructionException e) {
84 LOG.error(e.getMessage());
87 return Futures.immediateFuture(Rpcs.getRpcResult(rpcResultBool, rpcResultType, null));
91 public Future<RpcResult<GetAllNodeConnectorStatisticsOutput>> getAllNodeConnectorStatistics(
92 GetAllNodeConnectorStatisticsInput input) {
93 GetAllNodeConnectorStatisticsOutput rpcResultType = null;
94 boolean rpcResultBool = false;
97 Node adNode = NodeMapping.toADNode(input.getNode());
98 List<NodeConnectorStatistics> nodesConnectorStatistics = readDelegate.readNodeConnectors(adNode);
99 List<org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.get.all.node.connector.statistics.output.NodeConnectorStatistics> odNodesConnectorStatistics;
100 odNodesConnectorStatistics = toOdNodesConnectorStatistics(nodesConnectorStatistics);
101 GetAllNodeConnectorStatisticsOutputBuilder builder = new GetAllNodeConnectorStatisticsOutputBuilder();
102 rpcResultType = builder.setNodeConnectorStatistics(odNodesConnectorStatistics).build();
103 rpcResultBool = true;
104 } catch (ConstructionException e) {
105 LOG.error(e.getMessage());
108 return Futures.immediateFuture(Rpcs.getRpcResult(rpcResultBool, rpcResultType, null));
112 public Future<RpcResult<GetFlowStatisticsOutput>> getFlowStatistics(GetFlowStatisticsInput input) {
113 GetFlowStatisticsOutput rpcResultType = null;
114 boolean rpcResultBool = false;
117 Node node = NodeMapping.toADNode(input.getNode());
118 Flow flow = ToSalConversionsUtils.toFlow(input);
119 FlowOnNode readFlow = readDelegate.readFlow(node, flow);
120 FlowStatistics flowOnNodeToFlowStatistics = toOdFlowStatistics(readFlow);
121 rpcResultType = new GetFlowStatisticsOutputBuilder(flowOnNodeToFlowStatistics).build();
122 rpcResultBool = true;
123 } catch (ConstructionException e) {
124 LOG.error(e.getMessage());
127 return Futures.immediateFuture(Rpcs.getRpcResult(rpcResultBool, rpcResultType, null));
131 public Future<RpcResult<GetFlowTableStatisticsOutput>> getFlowTableStatistics(GetFlowTableStatisticsInput input) {
132 GetFlowTableStatisticsOutput rpcResultType = null;
133 boolean rpcResultBool = false;
136 Node node = NodeMapping.toADNode(input.getNode());
137 List<NodeTableStatistics> nodesTable = readDelegate.readNodeTable(node);
138 NodeTableStatistics nodeTable = null;
139 if (!nodesTable.isEmpty()) {
140 nodeTable = nodesTable.get(0);
141 rpcResultType = toOdTableStatistics(nodeTable);
142 rpcResultBool = true;
144 } catch (ConstructionException e) {
145 LOG.error(e.getMessage());
148 return Futures.immediateFuture(Rpcs.getRpcResult(rpcResultBool, rpcResultType, null));
152 public Future<RpcResult<GetNodeConnectorStatisticsOutput>> getNodeConnectorStatistics(
153 GetNodeConnectorStatisticsInput input) {
154 GetNodeConnectorStatisticsOutput rpcResultType = null;
155 boolean rpcResultBool = false;
157 NodeConnectorRef nodeConnector = input.getNodeConnector();
159 NodeConnectorStatistics nodeConnectorStats = readDelegate.readNodeConnector(NodeMapping
160 .toADNodeConnector(nodeConnector));
161 org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.get.all.node.connector.statistics.output.NodeConnectorStatistics odNodeConnectorStatistics = toOdNodeConnectorStatistics(nodeConnectorStats);
162 rpcResultType = new GetNodeConnectorStatisticsOutputBuilder(odNodeConnectorStatistics).build();
163 rpcResultBool = true;
164 } catch (ConstructionException e) {
165 LOG.error(e.getMessage());
168 return Futures.immediateFuture(Rpcs.getRpcResult(rpcResultBool, rpcResultType, null));
172 public void descriptionStatisticsUpdated(Node node, NodeDescription nodeDescription) {
174 // TODO which *StatisticsUpdated interface should be used?
179 public void nodeConnectorStatisticsUpdated(Node node, List<NodeConnectorStatistics> ncStatsList) {
180 for (NodeConnectorStatistics ndConStats : ncStatsList) {
181 org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.get.all.node.connector.statistics.output.NodeConnectorStatistics odNodeConnectorStatistics;
182 odNodeConnectorStatistics = toOdNodeConnectorStatistics(ndConStats);
183 NodeConnectorStatisticsUpdatedBuilder statisticsBuilder = new NodeConnectorStatisticsUpdatedBuilder(
184 odNodeConnectorStatistics);
185 notifier.publish(statisticsBuilder.build());
190 public void nodeFlowStatisticsUpdated(Node node, List<FlowOnNode> flowStatsList) {
191 for (FlowOnNode flowOnNode : flowStatsList) {
192 FlowStatistics flowStatistics = toOdFlowStatistics(flowOnNode);
193 FlowStatisticsUpdatedBuilder statisticsBuilder = new FlowStatisticsUpdatedBuilder(flowStatistics);
194 notifier.publish(statisticsBuilder.build());
199 public void nodeTableStatisticsUpdated(Node node, List<NodeTableStatistics> tableStatsList) {
200 // TODO : Not implemented by AD-SAL.
203 private List<FlowStatistics> toOdFlowsStatistics(List<FlowOnNode> flowsOnNode) {
204 List<FlowStatistics> flowsStatistics = new ArrayList<>();
205 for (FlowOnNode flowOnNode : flowsOnNode) {
206 flowsStatistics.add(toOdFlowStatistics(flowOnNode));
208 return flowsStatistics;
211 private FlowStatistics toOdFlowStatistics(FlowOnNode flowOnNode) {
212 FlowStatisticsBuilder builder = new FlowStatisticsBuilder();
214 builder.setByteCount(toCounter64(flowOnNode.getByteCount()));
215 builder.setPacketCount(toCounter64(flowOnNode.getPacketCount()));
216 builder.setDuration(extractDuration(flowOnNode));
218 return builder.build();
221 private Duration extractDuration(FlowOnNode flowOnNode) {
222 DurationBuilder builder = new DurationBuilder();
223 builder.setNanosecond(toCounter64(flowOnNode.getDurationNanoseconds()));
224 builder.setSecond(toCounter64(flowOnNode.getDurationSeconds()));
225 return builder.build();
228 private Counter64 toCounter64(long num) {
229 String byteCountStr = String.valueOf(num);
230 BigInteger byteCountBigInt = new BigInteger(byteCountStr);
231 return new Counter64(byteCountBigInt);
234 private Counter64 toCounter64(int num) {
235 String byteCountStr = String.valueOf(num);
236 BigInteger byteCountBigInt = new BigInteger(byteCountStr);
237 return new Counter64(byteCountBigInt);
240 private List<org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.get.all.node.connector.statistics.output.NodeConnectorStatistics> toOdNodesConnectorStatistics(
241 List<NodeConnectorStatistics> nodesConnectorStatistics) {
242 List<org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.get.all.node.connector.statistics.output.NodeConnectorStatistics> odNodesConnectorStatistics = new ArrayList<>();
243 for (NodeConnectorStatistics nodeConnectorStatistics : nodesConnectorStatistics) {
244 odNodesConnectorStatistics.add(toOdNodeConnectorStatistics(nodeConnectorStatistics));
246 return odNodesConnectorStatistics;
249 private org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.get.all.node.connector.statistics.output.NodeConnectorStatistics toOdNodeConnectorStatistics(
250 NodeConnectorStatistics ndConStats) {
251 NodeConnectorStatisticsBuilder builder = new NodeConnectorStatisticsBuilder();
253 builder.setBytes(extractBytes(ndConStats));
254 builder.setCollisionCount(toBI(ndConStats.getCollisionCount()));
255 builder.setDuration(null);
256 builder.setPackets(extractPackets(ndConStats));
257 builder.setReceiveCrcError(toBI(ndConStats.getReceiveCRCErrorCount()));
258 builder.setReceiveDrops(toBI(ndConStats.getReceiveDropCount()));
259 builder.setReceiveErrors(toBI(ndConStats.getReceiveErrorCount()));
260 builder.setReceiveFrameError(toBI(ndConStats.getReceiveFrameErrorCount()));
261 builder.setReceiveOverRunError(toBI(ndConStats.getReceiveOverRunErrorCount()));
262 builder.setTransmitDrops(toBI(ndConStats.getTransmitDropCount()));
263 builder.setTransmitErrors(toBI(ndConStats.getTransmitErrorCount()));
265 return builder.build();
268 private BigInteger toBI(long num) {
269 String numStr = String.valueOf(num);
270 return new BigInteger(numStr);
273 private Packets extractPackets(NodeConnectorStatistics nodeConnectorStatistics) {
274 long receivePacketCount = nodeConnectorStatistics.getReceivePacketCount();
275 long transmitPacketCount = nodeConnectorStatistics.getTransmitPacketCount();
277 PacketsBuilder builder = new PacketsBuilder();
278 builder.setReceived(toBI(receivePacketCount));
279 builder.setTransmitted(toBI(transmitPacketCount));
281 return builder.build();
284 private Bytes extractBytes(NodeConnectorStatistics nodeConnectorStatistics) {
285 long transmitByteCount = nodeConnectorStatistics.getTransmitByteCount();
286 long receiveByteCount = nodeConnectorStatistics.getReceiveByteCount();
288 BytesBuilder builder = new BytesBuilder();
289 builder.setReceived(toBI(receiveByteCount));
290 builder.setTransmitted(toBI(transmitByteCount));
292 return builder.build();
295 private GetFlowTableStatisticsOutput toOdTableStatistics(NodeTableStatistics nodeTable) {
296 GetFlowTableStatisticsOutputBuilder builder = new GetFlowTableStatisticsOutputBuilder();
298 builder.setActive(toCounter64(nodeTable.getActiveCount()));
299 builder.setLookup(toCounter64(nodeTable.getLookupCount()));
300 builder.setMatched(toCounter64(nodeTable.getMatchedCount()));
302 return builder.build();
306 public Future<RpcResult<GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput>> getAggregateFlowStatisticsFromFlowTableForAllFlows(
307 GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput input) {
308 // TODO Auto-generated method stub
313 public Future<RpcResult<GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput>> getAggregateFlowStatisticsFromFlowTableForGivenMatch(
314 GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput input) {
315 // TODO Auto-generated method stub
320 public Future<RpcResult<GetAllFlowStatisticsFromFlowTableOutput>> getAllFlowStatisticsFromFlowTable(
321 GetAllFlowStatisticsFromFlowTableInput input) {
322 // TODO Auto-generated method stub
327 public Future<RpcResult<GetAllFlowsStatisticsFromAllFlowTablesOutput>> getAllFlowsStatisticsFromAllFlowTables(
328 GetAllFlowsStatisticsFromAllFlowTablesInput input) {
329 // TODO Auto-generated method stub
334 public Future<RpcResult<GetFlowStatisticsFromFlowTableOutput>> getFlowStatisticsFromFlowTable(
335 GetFlowStatisticsFromFlowTableInput input) {
336 // TODO Auto-generated method stub