Further warning removal
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / common / MultipartReplyTranslatorUtil.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 package org.opendaylight.openflowplugin.impl.common;
9
10 import java.util.ArrayList;
11 import java.util.Collections;
12 import java.util.List;
13 import java.util.Optional;
14 import java.util.stream.Collectors;
15 import org.eclipse.jdt.annotation.Nullable;
16 import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo;
17 import org.opendaylight.openflowplugin.api.openflow.device.MessageTranslator;
18 import org.opendaylight.openflowplugin.api.openflow.device.TranslatorLibrary;
19 import org.opendaylight.openflowplugin.api.openflow.md.core.TranslatorKey;
20 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
21 import org.opendaylight.openflowplugin.extension.api.path.MatchPath;
22 import org.opendaylight.openflowplugin.impl.util.GroupUtil;
23 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
24 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.FlowStatsResponseConvertorData;
25 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
26 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData;
27 import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter64;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.multipart.reply.multipart.reply.body.MultipartReplyDescBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.flow.and.statistics.map.list.FlowAndStatisticsMapList;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.multipart.reply.multipart.reply.body.MultipartReplyFlowAggregateStats;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.multipart.reply.multipart.reply.body.MultipartReplyFlowAggregateStatsBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.multipart.reply.multipart.reply.body.MultipartReplyFlowStats;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.multipart.reply.multipart.reply.body.MultipartReplyFlowStatsBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.and.statistics.map.FlowTableAndStatisticsMap;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.and.statistics.map.FlowTableAndStatisticsMapBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.multipart.reply.multipart.reply.body.MultipartReplyFlowTableStats;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.multipart.reply.multipart.reply.body.MultipartReplyFlowTableStatsBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.multipart.reply.multipart.reply.body.MultipartReplyPortDesc;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.multipart.reply.multipart.reply.body.MultipartReplyPortDescBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.multipart.reply.multipart.reply.body.multipart.reply.port.desc.PortsBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.queue.rev130925.QueueId;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.reply.multipart.reply.body.MultipartReplyGroupDescBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.reply.multipart.reply.body.MultipartReplyGroupFeaturesBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.reply.multipart.reply.body.MultipartReplyGroupStats;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.reply.multipart.reply.body.MultipartReplyGroupStatsBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Chaining;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.ChainingChecks;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupAll;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupCapability;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupFf;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupIndirect;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupSelect;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupType;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.SelectLiveness;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.SelectWeight;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStats;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStats;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.reply.multipart.reply.body.MultipartReplyMeterConfigBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.reply.multipart.reply.body.MultipartReplyMeterFeaturesBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.reply.multipart.reply.body.MultipartReplyMeterStats;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.reply.multipart.reply.body.MultipartReplyMeterStatsBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBand;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandDrop;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandDscpRemark;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBurst;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterCapability;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterKbps;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterPktps;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterStats;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.config.stats.reply.MeterConfigStats;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.duration.DurationBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.node.connector.statistics.BytesBuilder;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.node.connector.statistics.PacketsBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.multipart.reply.MultipartReplyBody;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReply;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortGrouping;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregateCase;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyDescCase;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyFlowCase;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupCase;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupDescCase;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupFeaturesCase;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterCase;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterConfigCase;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterFeaturesCase;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortDescCase;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortStatsCase;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyQueueCase;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableCase;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableFeaturesCase;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.aggregate._case.MultipartReplyAggregate;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.desc._case.MultipartReplyDesc;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.MultipartReplyFlow;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.MultipartReplyGroup;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.MultipartReplyGroupDesc;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.features._case.MultipartReplyGroupFeatures;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.MultipartReplyMeter;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config._case.MultipartReplyMeterConfig;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.features._case.MultipartReplyMeterFeatures;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.MultipartReplyPortStats;
105 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;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.MultipartReplyQueue;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.multipart.reply.queue.QueueStats;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.MultipartReplyTable;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.multipart.reply.table.TableStats;
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table.features._case.MultipartReplyTableFeatures;
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.multipart.reply.multipart.reply.body.MultipartReplyPortStatsBuilder;
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMap;
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMapBuilder;
114 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMapKey;
115 import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.multipart.reply.multipart.reply.body.MultipartReplyQueueStats;
116 import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.multipart.reply.multipart.reply.body.MultipartReplyQueueStatsBuilder;
117 import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.queue.id.and.statistics.map.QueueIdAndStatisticsMap;
118 import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.queue.id.and.statistics.map.QueueIdAndStatisticsMapBuilder;
119 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableId;
120 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.multipart.reply.multipart.reply.body.MultipartReplyTableFeaturesBuilder;
121 import org.opendaylight.yangtools.yang.common.Uint64;
122 import org.slf4j.Logger;
123 import org.slf4j.LoggerFactory;
124
125 /**
126  * Class converts multipart reply messages to the objects that can be then written to datastore using
127  * multipart writers.
128  */
129 public final class MultipartReplyTranslatorUtil {
130     private static final Logger LOG = LoggerFactory.getLogger(MultipartReplyTranslatorUtil.class);
131
132     private MultipartReplyTranslatorUtil() {
133     }
134
135     public static Optional<? extends MultipartReplyBody> translate(
136             final OfHeader message,
137             final DeviceInfo deviceInfo,
138             @Nullable final ConvertorExecutor convertorExecutor,
139             @Nullable final TranslatorLibrary translatorLibrary) {
140
141         if (message instanceof MultipartReply) {
142             final Optional<ConvertorExecutor> convertor = Optional.ofNullable(convertorExecutor);
143             final Optional<TranslatorLibrary> translator = Optional.ofNullable(translatorLibrary);
144             final MultipartReply msg = (MultipartReply) message;
145             final OpenflowVersion ofVersion = OpenflowVersion.get(deviceInfo.getVersion());
146             final VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(deviceInfo.getVersion());
147             data.setDatapathId(deviceInfo.getDatapathId());
148
149             switch (msg.getType()) {
150                 case OFPMPFLOW:
151                     return convertor.flatMap(c -> Optional.of(translateFlow(msg, data, c)));
152                 case OFPMPAGGREGATE:
153                     return Optional.of(translateAggregate(msg));
154                 case OFPMPPORTSTATS:
155                     return Optional.of(translatePortStats(msg, ofVersion, deviceInfo.getDatapathId()));
156                 case OFPMPGROUP:
157                     return convertor.flatMap(c -> Optional.of(translateGroup(msg, data, c)));
158                 case OFPMPGROUPDESC:
159                     return convertor.flatMap(c -> Optional.of(translateGroupDesc(msg, data, c)));
160                 case OFPMPGROUPFEATURES:
161                     return Optional.of(translateGroupFeatures(msg));
162                 case OFPMPMETER:
163                     return convertor.flatMap(c -> Optional.of(translateMeter(msg, data, c)));
164                 case OFPMPMETERCONFIG:
165                     return convertor.flatMap(c -> Optional.of(translateMeterConfig(msg, data, c)));
166                 case OFPMPMETERFEATURES:
167                     return Optional.of(translateMeterFeatures(msg));
168                 case OFPMPTABLE:
169                     return Optional.of(translateTable(msg));
170                 case OFPMPQUEUE:
171                     return Optional.of(translateQueue(msg, ofVersion, deviceInfo.getDatapathId()));
172                 case OFPMPDESC:
173                     return Optional.of(translateDesc(msg));
174                 case OFPMPTABLEFEATURES:
175                     return convertor.flatMap(c -> Optional.of(translateTableFeatures(msg, deviceInfo.getVersion(), c)));
176                 case OFPMPPORTDESC:
177                     return translator.flatMap(t -> Optional.of(translatePortDesc(msg, deviceInfo, t)));
178                 default:
179             }
180         } else if (message instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112
181             .MultipartReply) {
182             return Optional.of(((org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112
183                 .MultipartReply) message).getMultipartReplyBody());
184         }
185
186         LOG.debug("Failed to translate {} for node {}.", message.implementedInterface(), deviceInfo);
187         return Optional.empty();
188     }
189
190     private static MultipartReplyPortDesc translatePortDesc(final MultipartReply msg,
191                                                             final DeviceInfo deviceInfo,
192                                                             final TranslatorLibrary translatorLibrary) {
193         return new MultipartReplyPortDescBuilder()
194             .setPorts(((MultipartReplyPortDescCase) msg.getMultipartReplyBody())
195                 .getMultipartReplyPortDesc()
196                 .getPorts()
197                 .stream()
198                 .map(port -> {
199                     final TranslatorKey translatorKey = new TranslatorKey(
200                         deviceInfo.getVersion(),
201                         PortGrouping.class.getName());
202
203                     final MessageTranslator<PortGrouping, FlowCapableNodeConnector> translator = translatorLibrary
204                         .lookupTranslator(translatorKey);
205
206                     return new PortsBuilder(translator
207                         .translate(port, deviceInfo, null))
208                         .build();
209                 })
210                 .collect(Collectors.toList()))
211             .build();
212     }
213
214     private static org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.multipart.reply.multipart
215             .reply.body.MultipartReplyTableFeatures translateTableFeatures(
216                     final MultipartReply msg,
217                     final short version,
218                     final ConvertorExecutor convertorExecutor) {
219         MultipartReplyTableFeaturesCase caseBody = (MultipartReplyTableFeaturesCase) msg.getMultipartReplyBody();
220         final MultipartReplyTableFeatures multipartReplyTableFeatures = caseBody.getMultipartReplyTableFeatures();
221         final Optional<List<org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features
222             .TableFeatures>> tableFeaturesList = convertorExecutor
223             .convert(multipartReplyTableFeatures, new VersionConvertorData(version));
224
225         return new MultipartReplyTableFeaturesBuilder()
226             .setTableFeatures(tableFeaturesList.orElse(Collections.emptyList()))
227             .build();
228     }
229
230     private static org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.multipart.reply.multipart
231             .reply.body.MultipartReplyDesc translateDesc(final MultipartReply msg) {
232         final MultipartReplyDesc desc = ((MultipartReplyDescCase) msg.getMultipartReplyBody()).getMultipartReplyDesc();
233
234         return new MultipartReplyDescBuilder()
235             .setDescription(desc.getDpDesc())
236             .setHardware(desc.getHwDesc())
237             .setManufacturer(desc.getMfrDesc())
238             .setSoftware(desc.getSwDesc())
239             .setSerialNumber(desc.getSerialNum())
240             .build();
241     }
242
243     private static MultipartReplyFlowStats translateFlow(final MultipartReply msg,
244                                                          final VersionDatapathIdConvertorData data,
245                                                          final ConvertorExecutor convertorExecutor) {
246         FlowStatsResponseConvertorData flowData = new FlowStatsResponseConvertorData(data.getVersion());
247         flowData.setDatapathId(data.getDatapathId());
248         flowData.setMatchPath(MatchPath.FLOWS_STATISTICS_UPDATE_MATCH);
249         MultipartReplyFlowStatsBuilder message = new MultipartReplyFlowStatsBuilder();
250         MultipartReplyFlowCase caseBody = (MultipartReplyFlowCase) msg.getMultipartReplyBody();
251         MultipartReplyFlow replyBody = caseBody.getMultipartReplyFlow();
252         final Optional<List<FlowAndStatisticsMapList>> flowAndStatisticsMapLists =
253             convertorExecutor.convert(replyBody.getFlowStats(), flowData);
254
255         message.setFlowAndStatisticsMapList(flowAndStatisticsMapLists.orElse(Collections.emptyList()));
256         return message.build();
257     }
258
259     private static MultipartReplyFlowAggregateStats translateAggregate(final MultipartReply msg) {
260         MultipartReplyFlowAggregateStatsBuilder message = new MultipartReplyFlowAggregateStatsBuilder();
261         MultipartReplyAggregateCase caseBody = (MultipartReplyAggregateCase) msg.getMultipartReplyBody();
262         MultipartReplyAggregate replyBody = caseBody.getMultipartReplyAggregate();
263         message.setByteCount(new Counter64(replyBody.getByteCount()));
264         message.setPacketCount(new Counter64(replyBody.getPacketCount()));
265         message.setFlowCount(new Counter32(replyBody.getFlowCount()));
266         return message.build();
267     }
268
269     private static org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.multipart.reply.multipart
270             .reply.body.MultipartReplyPortStats translatePortStats(
271                     final MultipartReply msg,
272                     final OpenflowVersion ofVersion,
273                     final Uint64 datapathId) {
274         MultipartReplyPortStatsBuilder message = new MultipartReplyPortStatsBuilder();
275         MultipartReplyPortStatsCase caseBody = (MultipartReplyPortStatsCase) msg.getMultipartReplyBody();
276         MultipartReplyPortStats replyBody = caseBody.getMultipartReplyPortStats();
277
278         List<NodeConnectorStatisticsAndPortNumberMap> statsMap =
279             new ArrayList<>();
280         for (PortStats portStats : replyBody.getPortStats()) {
281
282             NodeConnectorStatisticsAndPortNumberMapBuilder statsBuilder =
283                 new NodeConnectorStatisticsAndPortNumberMapBuilder();
284             statsBuilder.setNodeConnectorId(
285                 InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,
286                     portStats.getPortNo(), ofVersion));
287
288             BytesBuilder bytesBuilder = new BytesBuilder();
289             bytesBuilder.setReceived(portStats.getRxBytes());
290             bytesBuilder.setTransmitted(portStats.getTxBytes());
291             statsBuilder.setBytes(bytesBuilder.build());
292
293             PacketsBuilder packetsBuilder = new PacketsBuilder();
294             packetsBuilder.setReceived(portStats.getRxPackets());
295             packetsBuilder.setTransmitted(portStats.getTxPackets());
296             statsBuilder.setPackets(packetsBuilder.build());
297
298             DurationBuilder durationBuilder = new DurationBuilder();
299             if (portStats.getDurationSec() != null) {
300                 durationBuilder.setSecond(new Counter32(portStats.getDurationSec()));
301             }
302             if (portStats.getDurationNsec() != null) {
303                 durationBuilder.setNanosecond(new Counter32(portStats.getDurationNsec()));
304             }
305             statsBuilder.setDuration(durationBuilder.build());
306             statsBuilder.setCollisionCount(portStats.getCollisions());
307             statsBuilder.withKey(new NodeConnectorStatisticsAndPortNumberMapKey(statsBuilder.getNodeConnectorId()));
308             statsBuilder.setReceiveCrcError(portStats.getRxCrcErr());
309             statsBuilder.setReceiveDrops(portStats.getRxDropped());
310             statsBuilder.setReceiveErrors(portStats.getRxErrors());
311             statsBuilder.setReceiveFrameError(portStats.getRxFrameErr());
312             statsBuilder.setReceiveOverRunError(portStats.getRxOverErr());
313             statsBuilder.setTransmitDrops(portStats.getTxDropped());
314             statsBuilder.setTransmitErrors(portStats.getTxErrors());
315
316             statsMap.add(statsBuilder.build());
317         }
318         message.setNodeConnectorStatisticsAndPortNumberMap(statsMap);
319
320
321         return message.build();
322     }
323
324     private static MultipartReplyGroupStats translateGroup(final MultipartReply msg,
325                                                            final VersionDatapathIdConvertorData data,
326                                                            final ConvertorExecutor convertorExecutor) {
327         MultipartReplyGroupStatsBuilder message = new MultipartReplyGroupStatsBuilder();
328         MultipartReplyGroupCase caseBody = (MultipartReplyGroupCase) msg.getMultipartReplyBody();
329         MultipartReplyGroup replyBody = caseBody.getMultipartReplyGroup();
330         final Optional<List<GroupStats>> groupStatsList = convertorExecutor.convert(
331             replyBody.getGroupStats(), data);
332
333         message.setGroupStats(groupStatsList.orElse(Collections.emptyList()));
334
335         return message.build();
336     }
337
338     private static org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.reply.multipart
339             .reply.body.MultipartReplyGroupDesc translateGroupDesc(
340                     final MultipartReply msg,
341                     final VersionDatapathIdConvertorData data,
342                     final ConvertorExecutor convertorExecutor) {
343         MultipartReplyGroupDescBuilder message = new MultipartReplyGroupDescBuilder();
344         MultipartReplyGroupDescCase caseBody = (MultipartReplyGroupDescCase) msg.getMultipartReplyBody();
345         MultipartReplyGroupDesc replyBody = caseBody.getMultipartReplyGroupDesc();
346
347         final Optional<List<GroupDescStats>> groupDescStatsList = convertorExecutor.convert(
348             replyBody.getGroupDesc(), data);
349
350         message.setGroupDescStats(groupDescStatsList.orElse(Collections.emptyList()));
351
352         return message.build();
353     }
354
355     private static org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.reply.multipart
356             .reply.body.MultipartReplyGroupFeatures translateGroupFeatures(final MultipartReply msg) {
357         final MultipartReplyGroupFeaturesBuilder message = new MultipartReplyGroupFeaturesBuilder();
358         final MultipartReplyGroupFeaturesCase caseBody = (MultipartReplyGroupFeaturesCase) msg.getMultipartReplyBody();
359         final MultipartReplyGroupFeatures replyBody = caseBody.getMultipartReplyGroupFeatures();
360         List<Class<? extends GroupType>> supportedGroups =
361             new ArrayList<>();
362
363         if (replyBody.getTypes().getOFPGTALL()) {
364             supportedGroups.add(GroupAll.class);
365         }
366         if (replyBody.getTypes().getOFPGTSELECT()) {
367             supportedGroups.add(GroupSelect.class);
368         }
369         if (replyBody.getTypes().getOFPGTINDIRECT()) {
370             supportedGroups.add(GroupIndirect.class);
371         }
372         if (replyBody.getTypes().getOFPGTFF()) {
373             supportedGroups.add(GroupFf.class);
374         }
375         message.setGroupTypesSupported(supportedGroups);
376         message.setMaxGroups(replyBody.getMaxGroups());
377
378         List<Class<? extends GroupCapability>> supportedCapabilities =
379             new ArrayList<>();
380
381         if (replyBody.getCapabilities().getOFPGFCCHAINING()) {
382             supportedCapabilities.add(Chaining.class);
383         }
384         if (replyBody.getCapabilities().getOFPGFCCHAININGCHECKS()) {
385             supportedCapabilities.add(ChainingChecks.class);
386         }
387         if (replyBody.getCapabilities().getOFPGFCSELECTLIVENESS()) {
388             supportedCapabilities.add(SelectLiveness.class);
389         }
390         if (replyBody.getCapabilities().getOFPGFCSELECTWEIGHT()) {
391             supportedCapabilities.add(SelectWeight.class);
392         }
393
394         message.setGroupCapabilitiesSupported(supportedCapabilities);
395
396         message.setActions(GroupUtil.extractGroupActionsSupportBitmap(replyBody.getActionsBitmap()));
397         return message.build();
398     }
399
400     private static MultipartReplyMeterStats translateMeter(final MultipartReply msg,
401                                                            final VersionDatapathIdConvertorData data,
402                                                            final ConvertorExecutor convertorExecutor) {
403         MultipartReplyMeterStatsBuilder message = new MultipartReplyMeterStatsBuilder();
404         MultipartReplyMeterCase caseBody = (MultipartReplyMeterCase) msg.getMultipartReplyBody();
405         MultipartReplyMeter replyBody = caseBody.getMultipartReplyMeter();
406         final Optional<List<
407                 org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.reply.MeterStats
408                 >>
409                 meterStatsList = convertorExecutor.convert(replyBody.getMeterStats(), data);
410
411         message.setMeterStats(meterStatsList.orElse(Collections.emptyList()));
412
413         return message.build();
414     }
415
416     private static org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.reply.multipart
417             .reply.body.MultipartReplyMeterConfig translateMeterConfig(
418                     final MultipartReply msg,
419                     final VersionDatapathIdConvertorData data,
420                     final ConvertorExecutor convertorExecutor) {
421         MultipartReplyMeterConfigBuilder message = new MultipartReplyMeterConfigBuilder();
422         MultipartReplyMeterConfigCase caseBody = (MultipartReplyMeterConfigCase) msg.getMultipartReplyBody();
423         MultipartReplyMeterConfig replyBody = caseBody.getMultipartReplyMeterConfig();
424         final Optional<List<MeterConfigStats>> meterConfigStatsList
425                 = convertorExecutor.convert(replyBody.getMeterConfig(), data);
426
427         message.setMeterConfigStats(meterConfigStatsList.orElse(Collections.emptyList()));
428
429         return message.build();
430     }
431
432     private static org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.reply.multipart
433             .reply.body.MultipartReplyMeterFeatures translateMeterFeatures(final MultipartReply msg) {
434         MultipartReplyMeterFeaturesBuilder message = new MultipartReplyMeterFeaturesBuilder();
435         MultipartReplyMeterFeaturesCase caseBody = (MultipartReplyMeterFeaturesCase) msg.getMultipartReplyBody();
436         MultipartReplyMeterFeatures replyBody = caseBody.getMultipartReplyMeterFeatures();
437         message.setMaxBands(replyBody.getMaxBands());
438         message.setMaxColor(replyBody.getMaxColor());
439         message.setMaxMeter(new Counter32(replyBody.getMaxMeter()));
440
441         List<Class<? extends MeterCapability>> supportedCapabilities =
442             new ArrayList<>();
443         if (replyBody.getCapabilities().getOFPMFBURST()) {
444             supportedCapabilities.add(MeterBurst.class);
445         }
446         if (replyBody.getCapabilities().getOFPMFKBPS()) {
447             supportedCapabilities.add(MeterKbps.class);
448
449         }
450         if (replyBody.getCapabilities().getOFPMFPKTPS()) {
451             supportedCapabilities.add(MeterPktps.class);
452
453         }
454         if (replyBody.getCapabilities().getOFPMFSTATS()) {
455             supportedCapabilities.add(MeterStats.class);
456
457         }
458         message.setMeterCapabilitiesSupported(supportedCapabilities);
459
460         List<Class<? extends MeterBand>> supportedMeterBand = new ArrayList<>();
461         if (replyBody.getBandTypes().getOFPMBTDROP()) {
462             supportedMeterBand.add(MeterBandDrop.class);
463         }
464         if (replyBody.getBandTypes().getOFPMBTDSCPREMARK()) {
465             supportedMeterBand.add(MeterBandDscpRemark.class);
466         }
467         message.setMeterBandSupported(supportedMeterBand);
468         return message.build();
469     }
470
471     private static MultipartReplyFlowTableStats translateTable(final MultipartReply msg) {
472         MultipartReplyFlowTableStatsBuilder message = new MultipartReplyFlowTableStatsBuilder();
473         MultipartReplyTableCase caseBody = (MultipartReplyTableCase) msg.getMultipartReplyBody();
474         MultipartReplyTable replyBody = caseBody.getMultipartReplyTable();
475         List<TableStats> swTablesStats = replyBody.getTableStats();
476
477         List<FlowTableAndStatisticsMap> salFlowStats = new ArrayList<>();
478         //TODO: Duplicate code: look at OpendaylightFlowTableStatisticsServiceImpl method transformToNotification
479         for (TableStats swTableStats : swTablesStats) {
480             FlowTableAndStatisticsMapBuilder statisticsBuilder = new FlowTableAndStatisticsMapBuilder();
481
482             statisticsBuilder.setActiveFlows(new Counter32(swTableStats.getActiveCount()));
483             statisticsBuilder.setPacketsLookedUp(new Counter64(swTableStats.getLookupCount()));
484             statisticsBuilder.setPacketsMatched(new Counter64(swTableStats.getMatchedCount()));
485             statisticsBuilder.setTableId(new TableId(swTableStats.getTableId()));
486             salFlowStats.add(statisticsBuilder.build());
487         }
488
489         message.setFlowTableAndStatisticsMap(salFlowStats);
490         return message.build();
491     }
492
493     private static MultipartReplyQueueStats translateQueue(final MultipartReply msg,
494                                                            final OpenflowVersion ofVersion,
495                                                            final Uint64 datapathId) {
496         MultipartReplyQueueStatsBuilder message = new MultipartReplyQueueStatsBuilder();
497         MultipartReplyQueueCase caseBody = (MultipartReplyQueueCase) msg.getMultipartReplyBody();
498         MultipartReplyQueue replyBody = caseBody.getMultipartReplyQueue();
499
500         List<QueueIdAndStatisticsMap> statsMap = new ArrayList<>();
501
502         for (QueueStats queueStats : replyBody.nonnullQueueStats()) {
503
504             QueueIdAndStatisticsMapBuilder statsBuilder =
505                 new QueueIdAndStatisticsMapBuilder();
506             statsBuilder.setNodeConnectorId(
507                 InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,
508                     queueStats.getPortNo(), ofVersion));
509             statsBuilder.setTransmissionErrors(new Counter64(queueStats.getTxErrors()));
510             statsBuilder.setTransmittedBytes(new Counter64(queueStats.getTxBytes()));
511             statsBuilder.setTransmittedPackets(new Counter64(queueStats.getTxPackets()));
512
513             DurationBuilder durationBuilder = new DurationBuilder();
514             durationBuilder.setSecond(new Counter32(queueStats.getDurationSec()));
515             durationBuilder.setNanosecond(new Counter32(queueStats.getDurationNsec()));
516             statsBuilder.setDuration(durationBuilder.build());
517
518             statsBuilder.setQueueId(new QueueId(queueStats.getQueueId()));
519             statsBuilder.setNodeConnectorId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,
520                 queueStats.getPortNo(), ofVersion));
521
522             statsMap.add(statsBuilder.build());
523         }
524         message.setQueueIdAndStatisticsMap(statsMap);
525
526         return message.build();
527     }
528 }