FlowStatisticsAdapter was added.
[controller.git] / opendaylight / md-sal / sal-compability / src / main / java / org / opendaylight / controller / sal / compability / adsal / FlowStatisticsAdapter.java
diff --git a/opendaylight/md-sal/sal-compability/src/main/java/org/opendaylight/controller/sal/compability/adsal/FlowStatisticsAdapter.java b/opendaylight/md-sal/sal-compability/src/main/java/org/opendaylight/controller/sal/compability/adsal/FlowStatisticsAdapter.java
new file mode 100644 (file)
index 0000000..3fb6b6e
--- /dev/null
@@ -0,0 +1,273 @@
+package org.opendaylight.controller.sal.compability.adsal;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Future;
+
+import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
+import org.opendaylight.controller.sal.common.util.Futures;
+import org.opendaylight.controller.sal.common.util.Rpcs;
+import org.opendaylight.controller.sal.compability.NodeMapping;
+import org.opendaylight.controller.sal.compability.ToSalConversionsUtils;
+import org.opendaylight.controller.sal.core.ConstructionException;
+import org.opendaylight.controller.sal.core.Node;
+import org.opendaylight.controller.sal.flowprogrammer.Flow;
+import org.opendaylight.controller.sal.reader.*;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.Counter64;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.*;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.get.all.flow.statistics.output.FlowStatistics;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.get.all.flow.statistics.output.FlowStatisticsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.get.all.node.connector.statistics.output.NodeConnectorStatisticsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.statistics.Duration;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.statistics.DurationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.node.connector.statistics.Bytes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.node.connector.statistics.BytesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.node.connector.statistics.Packets;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.node.connector.statistics.PacketsBuilder;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class FlowStatisticsAdapter implements OpendaylightFlowStatisticsService, IReadServiceListener {
+
+    private static final Logger LOG = LoggerFactory.getLogger(FlowStatisticsAdapter.class);
+    private IReadService readDelegate;
+    private NotificationProviderService notifier;
+
+    @Override
+    public Future<RpcResult<GetAllFlowStatisticsOutput>> getAllFlowStatistics(GetAllFlowStatisticsInput input) {
+        GetAllFlowStatisticsOutput rpcResultType = null;
+        boolean rpcResultBool = false;
+
+        try {
+            Node adNode = NodeMapping.toADNode(input.getNode());
+            List<FlowOnNode> flowsOnNode = readDelegate.readAllFlows(adNode);
+            List<FlowStatistics> flowsStatistics = toOdFlowsStatistics(flowsOnNode);
+            GetAllFlowStatisticsOutputBuilder builder = new GetAllFlowStatisticsOutputBuilder();
+            rpcResultType = builder.setFlowStatistics(flowsStatistics).build();
+            rpcResultBool = true;
+        } catch (ConstructionException e) {
+            LOG.error(e.getMessage());
+        }
+
+        return Futures.immediateFuture(Rpcs.getRpcResult(rpcResultBool, rpcResultType, null));
+    }
+
+    @Override
+    public Future<RpcResult<GetAllNodeConnectorStatisticsOutput>> getAllNodeConnectorStatistics(
+            GetAllNodeConnectorStatisticsInput input) {
+        GetAllNodeConnectorStatisticsOutput rpcResultType = null;
+        boolean rpcResultBool = false;
+
+        try {
+            Node adNode = NodeMapping.toADNode(input.getNode());
+            List<NodeConnectorStatistics> nodesConnectorStatistics = readDelegate.readNodeConnectors(adNode);
+            List<org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.get.all.node.connector.statistics.output.NodeConnectorStatistics> odNodesConnectorStatistics;
+            odNodesConnectorStatistics = toOdNodesConnectorStatistics(nodesConnectorStatistics);
+            GetAllNodeConnectorStatisticsOutputBuilder builder = new GetAllNodeConnectorStatisticsOutputBuilder();
+            rpcResultType = builder.setNodeConnectorStatistics(odNodesConnectorStatistics).build();
+            rpcResultBool = true;
+        } catch (ConstructionException e) {
+            LOG.error(e.getMessage());
+        }
+
+        return Futures.immediateFuture(Rpcs.getRpcResult(rpcResultBool, rpcResultType, null));
+    }
+
+    @Override
+    public Future<RpcResult<GetFlowStatisticsOutput>> getFlowStatistics(GetFlowStatisticsInput input) {
+        GetFlowStatisticsOutput rpcResultType = null;
+        boolean rpcResultBool = false;
+
+        try {
+            Node node = NodeMapping.toADNode(input.getNode());
+            Flow flow = ToSalConversionsUtils.toFlow(input);
+            FlowOnNode readFlow = readDelegate.readFlow(node, flow);
+            FlowStatistics flowOnNodeToFlowStatistics = toOdFlowStatistics(readFlow);
+            rpcResultType = new GetFlowStatisticsOutputBuilder(flowOnNodeToFlowStatistics).build();
+            rpcResultBool = true;
+        } catch (ConstructionException e) {
+            LOG.error(e.getMessage());
+        }
+
+        return Futures.immediateFuture(Rpcs.getRpcResult(rpcResultBool, rpcResultType, null));
+    }
+
+    @Override
+    public Future<RpcResult<GetFlowTableStatisticsOutput>> getFlowTableStatistics(GetFlowTableStatisticsInput input) {
+        GetFlowTableStatisticsOutput rpcResultType = null;
+        boolean rpcResultBool = false;
+
+        try {
+            Node node = NodeMapping.toADNode(input.getNode());
+            List<NodeTableStatistics> nodesTable = readDelegate.readNodeTable(node);
+            NodeTableStatistics nodeTable = null;
+            if (!nodesTable.isEmpty()) {
+                nodeTable = nodesTable.get(0);
+                rpcResultType = toOdTableStatistics(nodeTable);
+                rpcResultBool = true;
+            }
+        } catch (ConstructionException e) {
+            LOG.error(e.getMessage());
+        }
+
+        return Futures.immediateFuture(Rpcs.getRpcResult(rpcResultBool, rpcResultType, null));
+    }
+
+    @Override
+    public Future<RpcResult<GetNodeConnectorStatisticsOutput>> getNodeConnectorStatistics(
+            GetNodeConnectorStatisticsInput input) {
+        GetNodeConnectorStatisticsOutput rpcResultType = null;
+        boolean rpcResultBool = false;
+
+        NodeConnectorRef nodeConnector = input.getNodeConnector();
+        try {
+            NodeConnectorStatistics nodeConnectorStats = readDelegate.readNodeConnector(NodeMapping
+                    .toADNodeConnector(nodeConnector));
+            org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.get.all.node.connector.statistics.output.NodeConnectorStatistics odNodeConnectorStatistics = toOdNodeConnectorStatistics(nodeConnectorStats);
+            rpcResultType = new GetNodeConnectorStatisticsOutputBuilder(odNodeConnectorStatistics).build();
+            rpcResultBool = true;
+        } catch (ConstructionException e) {
+            LOG.error(e.getMessage());
+        }
+
+        return Futures.immediateFuture(Rpcs.getRpcResult(rpcResultBool, rpcResultType, null));
+    }
+
+    @Override
+    public void descriptionStatisticsUpdated(Node node, NodeDescription nodeDescription) {
+
+        // TODO which *StatisticsUpdated interface should be used?
+
+    }
+
+    @Override
+    public void nodeConnectorStatisticsUpdated(Node node, List<NodeConnectorStatistics> ncStatsList) {
+        for (NodeConnectorStatistics ndConStats : ncStatsList) {
+            org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.get.all.node.connector.statistics.output.NodeConnectorStatistics odNodeConnectorStatistics;
+            odNodeConnectorStatistics = toOdNodeConnectorStatistics(ndConStats);
+            NodeConnectorStatisticsUpdatedBuilder statisticsBuilder = new NodeConnectorStatisticsUpdatedBuilder(
+                    odNodeConnectorStatistics);
+            notifier.publish(statisticsBuilder.build());
+        }
+    }
+
+    @Override
+    public void nodeFlowStatisticsUpdated(Node node, List<FlowOnNode> flowStatsList) {
+        for (FlowOnNode flowOnNode : flowStatsList) {
+            FlowStatistics flowStatistics = toOdFlowStatistics(flowOnNode);
+            FlowStatisticsUpdatedBuilder statisticsBuilder = new FlowStatisticsUpdatedBuilder(flowStatistics);
+            notifier.publish(statisticsBuilder.build());
+        }
+    }
+
+    @Override
+    public void nodeTableStatisticsUpdated(Node node, List<NodeTableStatistics> tableStatsList) {
+        // TODO : Not implemented by AD-SAL.
+    }
+
+    private List<FlowStatistics> toOdFlowsStatistics(List<FlowOnNode> flowsOnNode) {
+        List<FlowStatistics> flowsStatistics = new ArrayList<>();
+        for (FlowOnNode flowOnNode : flowsOnNode) {
+            flowsStatistics.add(toOdFlowStatistics(flowOnNode));
+        }
+        return flowsStatistics;
+    }
+
+    private FlowStatistics toOdFlowStatistics(FlowOnNode flowOnNode) {
+        FlowStatisticsBuilder builder = new FlowStatisticsBuilder();
+
+        builder.setByteCount(toCounter64(flowOnNode.getByteCount()));
+        builder.setPacketCount(toCounter64(flowOnNode.getPacketCount()));
+        builder.setDuration(extractDuration(flowOnNode));
+
+        return builder.build();
+    }
+
+    private Duration extractDuration(FlowOnNode flowOnNode) {
+        DurationBuilder builder = new DurationBuilder();
+        builder.setNanosecond(toCounter64(flowOnNode.getDurationNanoseconds()));
+        builder.setSecond(toCounter64(flowOnNode.getDurationSeconds()));
+        return builder.build();
+    }
+
+    private Counter64 toCounter64(long num) {
+        String byteCountStr = String.valueOf(num);
+        BigInteger byteCountBigInt = new BigInteger(byteCountStr);
+        return new Counter64(byteCountBigInt);
+    }
+
+    private Counter64 toCounter64(int num) {
+        String byteCountStr = String.valueOf(num);
+        BigInteger byteCountBigInt = new BigInteger(byteCountStr);
+        return new Counter64(byteCountBigInt);
+    }
+
+    private List<org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.get.all.node.connector.statistics.output.NodeConnectorStatistics> toOdNodesConnectorStatistics(
+            List<NodeConnectorStatistics> nodesConnectorStatistics) {
+        List<org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.get.all.node.connector.statistics.output.NodeConnectorStatistics> odNodesConnectorStatistics = new ArrayList<>();
+        for (NodeConnectorStatistics nodeConnectorStatistics : nodesConnectorStatistics) {
+            odNodesConnectorStatistics.add(toOdNodeConnectorStatistics(nodeConnectorStatistics));
+        }
+        return odNodesConnectorStatistics;
+    }
+
+    private org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.get.all.node.connector.statistics.output.NodeConnectorStatistics toOdNodeConnectorStatistics(
+            NodeConnectorStatistics ndConStats) {
+        NodeConnectorStatisticsBuilder builder = new NodeConnectorStatisticsBuilder();
+
+        builder.setBytes(extractBytes(ndConStats));
+        builder.setCollisionCount(toBI(ndConStats.getCollisionCount()));
+        builder.setDuration(null);
+        builder.setPackets(extractPackets(ndConStats));
+        builder.setReceiveCrcError(toBI(ndConStats.getReceiveCRCErrorCount()));
+        builder.setReceiveDrops(toBI(ndConStats.getReceiveDropCount()));
+        builder.setReceiveErrors(toBI(ndConStats.getReceiveErrorCount()));
+        builder.setReceiveFrameError(toBI(ndConStats.getReceiveFrameErrorCount()));
+        builder.setReceiveOverRunError(toBI(ndConStats.getReceiveOverRunErrorCount()));
+        builder.setTransmitDrops(toBI(ndConStats.getTransmitDropCount()));
+        builder.setTransmitErrors(toBI(ndConStats.getTransmitErrorCount()));
+
+        return builder.build();
+    }
+
+    private BigInteger toBI(long num) {
+        String numStr = String.valueOf(num);
+        return new BigInteger(numStr);
+    }
+
+    private Packets extractPackets(NodeConnectorStatistics nodeConnectorStatistics) {
+        long receivePacketCount = nodeConnectorStatistics.getReceivePacketCount();
+        long transmitPacketCount = nodeConnectorStatistics.getTransmitPacketCount();
+
+        PacketsBuilder builder = new PacketsBuilder();
+        builder.setReceived(toBI(receivePacketCount));
+        builder.setTransmitted(toBI(transmitPacketCount));
+
+        return builder.build();
+    }
+
+    private Bytes extractBytes(NodeConnectorStatistics nodeConnectorStatistics) {
+        long transmitByteCount = nodeConnectorStatistics.getTransmitByteCount();
+        long receiveByteCount = nodeConnectorStatistics.getReceiveByteCount();
+
+        BytesBuilder builder = new BytesBuilder();
+        builder.setReceived(toBI(receiveByteCount));
+        builder.setTransmitted(toBI(transmitByteCount));
+
+        return builder.build();
+    }
+
+    private GetFlowTableStatisticsOutput toOdTableStatistics(NodeTableStatistics nodeTable) {
+        GetFlowTableStatisticsOutputBuilder builder = new GetFlowTableStatisticsOutputBuilder();
+
+        builder.setActive(toCounter64(nodeTable.getActiveCount()));
+        builder.setLookup(toCounter64(nodeTable.getLookupCount()));
+        builder.setMatched(toCounter64(nodeTable.getMatchedCount()));
+
+        return builder.build();
+    }
+
+}