Add multipart reply deserializers
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / protocol / deserialization / multipart / MultipartReplyPortStatsDeserializer.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.protocol.deserialization.multipart;
10
11 import io.netty.buffer.ByteBuf;
12 import java.math.BigInteger;
13 import java.util.ArrayList;
14 import java.util.List;
15 import java.util.Objects;
16 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
17 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
18 import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.duration.DurationBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.node.connector.statistics.BytesBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.node.connector.statistics.PacketsBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.multipart.reply.MultipartReplyBody;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.multipart.reply.multipart.reply.body.MultipartReplyPortStatsBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMap;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMapBuilder;
28
29 public class MultipartReplyPortStatsDeserializer implements OFDeserializer<MultipartReplyBody> {
30
31     private static final byte PADDING_IN_PORT_STATS_HEADER = 4;
32
33     @Override
34     public MultipartReplyBody deserialize(ByteBuf message) {
35         final MultipartReplyPortStatsBuilder builder = new MultipartReplyPortStatsBuilder();
36         final List<NodeConnectorStatisticsAndPortNumberMap> items = new ArrayList<>();
37
38         while (message.readableBytes() > 0) {
39             final NodeConnectorStatisticsAndPortNumberMapBuilder itemBuilder =
40                 new NodeConnectorStatisticsAndPortNumberMapBuilder();
41
42             final long port = message.readUnsignedInt();
43             final String portName = OpenflowPortsUtil.getPortLogicalName(EncodeConstants.OF13_VERSION_ID, port);
44
45             // We do not assign datapath ID here, because we simply do not have it
46             itemBuilder.setNodeConnectorId(new NodeConnectorId(Objects.isNull(portName)
47                         ? String.valueOf(port)
48                         : portName));
49
50             message.skipBytes(PADDING_IN_PORT_STATS_HEADER);
51
52             items.add(itemBuilder
53                     .setPackets(new PacketsBuilder()
54                         .setReceived(BigInteger.valueOf(message.readLong()))
55                         .setTransmitted(BigInteger.valueOf(message.readLong()))
56                         .build())
57                     .setBytes(new BytesBuilder()
58                         .setReceived(BigInteger.valueOf(message.readLong()))
59                         .setTransmitted(BigInteger.valueOf(message.readLong()))
60                         .build())
61                     .setReceiveDrops(BigInteger.valueOf(message.readLong()))
62                     .setTransmitDrops(BigInteger.valueOf(message.readLong()))
63                     .setReceiveErrors(BigInteger.valueOf(message.readLong()))
64                     .setTransmitErrors(BigInteger.valueOf(message.readLong()))
65                     .setReceiveFrameError(BigInteger.valueOf(message.readLong()))
66                     .setReceiveOverRunError(BigInteger.valueOf((message.readLong())))
67                     .setReceiveCrcError(BigInteger.valueOf((message.readLong())))
68                     .setCollisionCount(BigInteger.valueOf(message.readLong()))
69                     .setDuration(new DurationBuilder()
70                         .setSecond(new Counter32(message.readUnsignedInt()))
71                         .setNanosecond(new Counter32(message.readUnsignedInt()))
72                         .build())
73                     .build());
74         }
75
76         return builder
77             .setNodeConnectorStatisticsAndPortNumberMap(items)
78             .build();
79     }
80
81 }