2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.openflowplugin.impl.statistics.services.compatibility;
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;
33 * Pulled out port stats to notification transformation.
35 public final class NodeConnectorStatisticsToNotificationTransformer {
37 private NodeConnectorStatisticsToNotificationTransformer() {
38 // Hide implicit constructor
42 * Transform statistics to notification.
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
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();
59 MultipartReplyPortStats replyBody = caseBody.getMultipartReplyPortStats();
60 for (PortStats portStats : replyBody.getPortStats()) {
61 stats.add(processSingleNodeConnectorStats(deviceInfo, ofVersion, portStats).build());
64 return new NodeConnectorStatisticsUpdateBuilder()
65 .setId(deviceInfo.getNodeId())
66 .setMoreReplies(Boolean.FALSE)
67 .setTransactionId(emulatedTxId)
68 .setNodeConnectorStatisticsAndPortNumberMap(stats.build())
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()));
79 if (portStats.getDurationNsec() != null) {
80 durationBuilder.setNanosecond(new Counter32(portStats.getDurationNsec()));
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())
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());