Use ByteBuf.readRetainedSlice()
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / statistics / services / compatibility / NodeConnectorStatisticsToNotificationTransformer.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  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
9 package org.opendaylight.openflowplugin.impl.statistics.services.compatibility;
10
11 import com.google.common.annotations.VisibleForTesting;
12 import java.util.List;
13 import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo;
14 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
15 import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.TransactionId;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.duration.DurationBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.node.connector.statistics.BytesBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.node.connector.statistics.PacketsBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReply;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortStatsCase;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.MultipartReplyPortStats;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.multipart.reply.port.stats.PortStats;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.NodeConnectorStatisticsUpdate;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.NodeConnectorStatisticsUpdateBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMap;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMapBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMapKey;
30 import org.opendaylight.yangtools.yang.binding.util.BindingMap;
31
32 /**
33  * Pulled out port stats to notification transformation.
34  */
35 public final class NodeConnectorStatisticsToNotificationTransformer {
36
37     private NodeConnectorStatisticsToNotificationTransformer() {
38         // Hide implicit constructor
39     }
40
41     /**
42      * Transform statistics to notification.
43      *
44      * @param mpReplyList   raw multipart response from device
45      * @param deviceInfo    device basic info
46      * @param ofVersion     device version
47      * @param emulatedTxId  emulated transaction Id
48      * @return notification containing flow stats
49      */
50     public static NodeConnectorStatisticsUpdate transformToNotification(final List<MultipartReply> mpReplyList,
51                                                                         final DeviceInfo deviceInfo,
52                                                                         final OpenflowVersion ofVersion,
53                                                                         final TransactionId emulatedTxId) {
54         final var stats = BindingMap.<NodeConnectorStatisticsAndPortNumberMapKey,
55             NodeConnectorStatisticsAndPortNumberMap>orderedBuilder();
56         for (MultipartReply mpReply : mpReplyList) {
57             MultipartReplyPortStatsCase caseBody = (MultipartReplyPortStatsCase) mpReply.getMultipartReplyBody();
58
59             MultipartReplyPortStats replyBody = caseBody.getMultipartReplyPortStats();
60             for (PortStats portStats : replyBody.getPortStats()) {
61                 stats.add(processSingleNodeConnectorStats(deviceInfo, ofVersion, portStats).build());
62             }
63         }
64         return new NodeConnectorStatisticsUpdateBuilder()
65             .setId(deviceInfo.getNodeId())
66             .setMoreReplies(Boolean.FALSE)
67             .setTransactionId(emulatedTxId)
68             .setNodeConnectorStatisticsAndPortNumberMap(stats.build())
69             .build();
70     }
71
72     @VisibleForTesting
73     static NodeConnectorStatisticsAndPortNumberMapBuilder processSingleNodeConnectorStats(final DeviceInfo deviceInfo,
74             final OpenflowVersion ofVersion, final PortStats portStats) {
75         DurationBuilder durationBuilder = new DurationBuilder();
76         if (portStats.getDurationSec() != null) {
77             durationBuilder.setSecond(new Counter32(portStats.getDurationSec()));
78         }
79         if (portStats.getDurationNsec() != null) {
80             durationBuilder.setNanosecond(new Counter32(portStats.getDurationNsec()));
81         }
82
83         return new NodeConnectorStatisticsAndPortNumberMapBuilder()
84             .setNodeConnectorId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(deviceInfo.getDatapathId(),
85                 portStats.getPortNo(), ofVersion))
86             .setBytes(new BytesBuilder()
87                 .setReceived(portStats.getRxBytes())
88                 .setTransmitted(portStats.getTxBytes())
89                 .build())
90             .setPackets(new PacketsBuilder()
91                 .setReceived(portStats.getRxPackets())
92                 .setTransmitted(portStats.getTxPackets()).build())
93             .setDuration(durationBuilder.build())
94             .setCollisionCount(portStats.getCollisions())
95             .setReceiveCrcError(portStats.getRxCrcErr())
96             .setReceiveDrops(portStats.getRxDropped())
97             .setReceiveErrors(portStats.getRxErrors())
98             .setReceiveFrameError(portStats.getRxFrameErr())
99             .setReceiveOverRunError(portStats.getRxOverErr())
100             .setTransmitDrops(portStats.getTxDropped())
101             .setTransmitErrors(portStats.getTxErrors());
102     }
103 }