2 * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.common;
11 import java.math.BigInteger;
12 import java.util.ArrayList;
13 import java.util.Collections;
14 import java.util.List;
15 import java.util.Optional;
16 import java.util.stream.Collectors;
17 import javax.annotation.Nullable;
18 import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo;
19 import org.opendaylight.openflowplugin.api.openflow.device.MessageTranslator;
20 import org.opendaylight.openflowplugin.api.openflow.device.TranslatorLibrary;
21 import org.opendaylight.openflowplugin.api.openflow.md.core.TranslatorKey;
22 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
23 import org.opendaylight.openflowplugin.extension.api.path.MatchPath;
24 import org.opendaylight.openflowplugin.impl.util.GroupUtil;
25 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
26 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.FlowStatsResponseConvertorData;
27 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
28 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData;
29 import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter64;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.multipart.reply.multipart.reply.body.MultipartReplyDescBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.flow.and.statistics.map.list.FlowAndStatisticsMapList;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.multipart.reply.multipart.reply.body.MultipartReplyFlowAggregateStats;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.multipart.reply.multipart.reply.body.MultipartReplyFlowAggregateStatsBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.multipart.reply.multipart.reply.body.MultipartReplyFlowStats;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.multipart.reply.multipart.reply.body.MultipartReplyFlowStatsBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.and.statistics.map.FlowTableAndStatisticsMap;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.and.statistics.map.FlowTableAndStatisticsMapBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.multipart.reply.multipart.reply.body.MultipartReplyFlowTableStats;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.multipart.reply.multipart.reply.body.MultipartReplyFlowTableStatsBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.multipart.reply.multipart.reply.body.MultipartReplyPortDesc;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.multipart.reply.multipart.reply.body.MultipartReplyPortDescBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.multipart.reply.multipart.reply.body.multipart.reply.port.desc.PortsBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.queue.rev130925.QueueId;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.reply.multipart.reply.body.MultipartReplyGroupDescBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.reply.multipart.reply.body.MultipartReplyGroupFeaturesBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.reply.multipart.reply.body.MultipartReplyGroupStats;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.reply.multipart.reply.body.MultipartReplyGroupStatsBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Chaining;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.ChainingChecks;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupAll;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupCapability;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupFf;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupIndirect;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupSelect;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupType;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.SelectLiveness;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.SelectWeight;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStats;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStats;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.reply.multipart.reply.body.MultipartReplyMeterConfigBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.reply.multipart.reply.body.MultipartReplyMeterFeaturesBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.reply.multipart.reply.body.MultipartReplyMeterStats;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.reply.multipart.reply.body.MultipartReplyMeterStatsBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBand;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandDrop;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandDscpRemark;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBurst;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterCapability;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterKbps;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterPktps;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterStats;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.config.stats.reply.MeterConfigStats;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.duration.DurationBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.node.connector.statistics.BytesBuilder;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.node.connector.statistics.PacketsBuilder;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.multipart.reply.MultipartReplyBody;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReply;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortGrouping;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregateCase;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyDescCase;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyFlowCase;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupCase;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupDescCase;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupFeaturesCase;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterCase;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterConfigCase;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterFeaturesCase;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortDescCase;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortStatsCase;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyQueueCase;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableCase;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableFeaturesCase;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.aggregate._case.MultipartReplyAggregate;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.desc._case.MultipartReplyDesc;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.MultipartReplyFlow;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.MultipartReplyGroup;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.MultipartReplyGroupDesc;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.features._case.MultipartReplyGroupFeatures;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.MultipartReplyMeter;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config._case.MultipartReplyMeterConfig;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.features._case.MultipartReplyMeterFeatures;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.MultipartReplyPortStats;
107 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;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.MultipartReplyQueue;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.multipart.reply.queue.QueueStats;
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.MultipartReplyTable;
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.multipart.reply.table.TableStats;
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table.features._case.MultipartReplyTableFeatures;
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.multipart.reply.multipart.reply.body.MultipartReplyPortStatsBuilder;
114 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMap;
115 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMapBuilder;
116 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMapKey;
117 import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.multipart.reply.multipart.reply.body.MultipartReplyQueueStats;
118 import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.multipart.reply.multipart.reply.body.MultipartReplyQueueStatsBuilder;
119 import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.queue.id.and.statistics.map.QueueIdAndStatisticsMap;
120 import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.queue.id.and.statistics.map.QueueIdAndStatisticsMapBuilder;
121 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableId;
122 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.multipart.reply.multipart.reply.body.MultipartReplyTableFeaturesBuilder;
123 import org.slf4j.Logger;
124 import org.slf4j.LoggerFactory;
127 * Class converts multipart reply messages to the objects that can be then written to datastore using
130 public class MultipartReplyTranslatorUtil {
131 private static final Logger LOG = LoggerFactory.getLogger(MultipartReplyTranslatorUtil.class);
133 public static Optional<? extends MultipartReplyBody> translate(final OfHeader message,
134 final DeviceInfo deviceInfo,
135 @Nullable final ConvertorExecutor convertorExecutor,
136 @Nullable final TranslatorLibrary translatorLibrary) {
137 if (message instanceof MultipartReply) {
138 final Optional<ConvertorExecutor> convertor = Optional.ofNullable(convertorExecutor);
139 final Optional<TranslatorLibrary> translator = Optional.ofNullable(translatorLibrary);
140 final MultipartReply msg = MultipartReply.class.cast(message);
141 final OpenflowVersion ofVersion = OpenflowVersion.get(deviceInfo.getVersion());
142 final VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(deviceInfo.getVersion());
143 data.setDatapathId(deviceInfo.getDatapathId());
145 switch (msg.getType()) {
147 return convertor.flatMap(c -> Optional.of(translateFlow(msg, data, c)));
149 return Optional.of(translateAggregate(msg));
151 return Optional.of(translatePortStats(msg, ofVersion, deviceInfo.getDatapathId()));
153 return convertor.flatMap(c -> Optional.of(translateGroup(msg, data, c)));
155 return convertor.flatMap(c -> Optional.of(translateGroupDesc(msg, data, c)));
156 case OFPMPGROUPFEATURES:
157 return Optional.of(translateGroupFeatures(msg));
159 return convertor.flatMap(c -> Optional.of(translateMeter(msg, data, c)));
160 case OFPMPMETERCONFIG:
161 return convertor.flatMap(c -> Optional.of(translateMeterConfig(msg, data, c)));
162 case OFPMPMETERFEATURES:
163 return Optional.of(translateMeterFeatures(msg));
165 return Optional.of(translateTable(msg));
167 return Optional.of(translateQueue(msg, ofVersion, deviceInfo.getDatapathId()));
169 return Optional.of(translateDesc(msg));
170 case OFPMPTABLEFEATURES:
171 return convertor.flatMap(c -> Optional.of(translateTableFeatures(msg, deviceInfo.getVersion(), c)));
173 return translator.flatMap(t -> Optional.of(translatePortDesc(msg, deviceInfo, t)));
175 } else if (message instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112
177 return Optional.of(org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112
178 .MultipartReply.class.cast(message).getMultipartReplyBody());
181 LOG.debug("Failed to translate {} for node {}.", message.getImplementedInterface(), deviceInfo.getLOGValue());
182 return Optional.empty();
185 private static MultipartReplyPortDesc translatePortDesc(final MultipartReply msg,
186 final DeviceInfo deviceInfo,
187 final TranslatorLibrary translatorLibrary) {
188 return new MultipartReplyPortDescBuilder()
189 .setPorts(((MultipartReplyPortDescCase) msg.getMultipartReplyBody())
190 .getMultipartReplyPortDesc()
194 final TranslatorKey translatorKey = new TranslatorKey(
195 deviceInfo.getVersion(),
196 PortGrouping.class.getName());
198 final MessageTranslator<PortGrouping, FlowCapableNodeConnector> translator = translatorLibrary
199 .lookupTranslator(translatorKey);
201 return new PortsBuilder(translator
202 .translate(port, deviceInfo, null))
205 .collect(Collectors.toList()))
209 private static org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.multipart.reply.multipart.reply.body
210 .MultipartReplyTableFeatures translateTableFeatures(final MultipartReply msg,
212 final ConvertorExecutor convertorExecutor) {
213 MultipartReplyTableFeaturesCase caseBody = (MultipartReplyTableFeaturesCase) msg.getMultipartReplyBody();
214 final MultipartReplyTableFeatures multipartReplyTableFeatures = caseBody.getMultipartReplyTableFeatures();
215 final Optional<List<org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features
216 .TableFeatures>> tableFeaturesList = convertorExecutor
217 .convert(multipartReplyTableFeatures, new VersionConvertorData(version));
219 return new MultipartReplyTableFeaturesBuilder()
220 .setTableFeatures(tableFeaturesList.orElse(Collections.emptyList()))
224 private static org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.multipart.reply.multipart.reply.body
225 .MultipartReplyDesc translateDesc(final MultipartReply msg) {
226 final MultipartReplyDesc desc = ((MultipartReplyDescCase) msg.getMultipartReplyBody()).getMultipartReplyDesc();
228 return new MultipartReplyDescBuilder()
229 .setDescription(desc.getDpDesc())
230 .setHardware(desc.getHwDesc())
231 .setManufacturer(desc.getMfrDesc())
232 .setSoftware(desc.getSwDesc())
233 .setSerialNumber(desc.getSerialNum())
237 private static MultipartReplyFlowStats translateFlow(final MultipartReply msg,
238 final VersionDatapathIdConvertorData data,
239 final ConvertorExecutor convertorExecutor) {
240 FlowStatsResponseConvertorData flowData = new FlowStatsResponseConvertorData(data.getVersion());
241 flowData.setDatapathId(data.getDatapathId());
242 flowData.setMatchPath(MatchPath.FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_MATCH);
243 MultipartReplyFlowStatsBuilder message = new MultipartReplyFlowStatsBuilder();
244 MultipartReplyFlowCase caseBody = (MultipartReplyFlowCase) msg.getMultipartReplyBody();
245 MultipartReplyFlow replyBody = caseBody.getMultipartReplyFlow();
246 final Optional<List<FlowAndStatisticsMapList>> flowAndStatisticsMapLists =
247 convertorExecutor.convert(replyBody.getFlowStats(), flowData);
249 message.setFlowAndStatisticsMapList(flowAndStatisticsMapLists.orElse(Collections.emptyList()));
250 return message.build();
253 private static MultipartReplyFlowAggregateStats translateAggregate(final MultipartReply msg) {
254 MultipartReplyFlowAggregateStatsBuilder message = new MultipartReplyFlowAggregateStatsBuilder();
255 MultipartReplyAggregateCase caseBody = (MultipartReplyAggregateCase) msg.getMultipartReplyBody();
256 MultipartReplyAggregate replyBody = caseBody.getMultipartReplyAggregate();
257 message.setByteCount(new Counter64(replyBody.getByteCount()));
258 message.setPacketCount(new Counter64(replyBody.getPacketCount()));
259 message.setFlowCount(new Counter32(replyBody.getFlowCount()));
260 return message.build();
263 private static org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.multipart.reply.multipart.reply.body
264 .MultipartReplyPortStats translatePortStats(final MultipartReply msg,
265 final OpenflowVersion ofVersion,
266 final BigInteger datapathId) {
267 MultipartReplyPortStatsBuilder message = new MultipartReplyPortStatsBuilder();
268 MultipartReplyPortStatsCase caseBody = (MultipartReplyPortStatsCase) msg.getMultipartReplyBody();
269 MultipartReplyPortStats replyBody = caseBody.getMultipartReplyPortStats();
271 List<NodeConnectorStatisticsAndPortNumberMap> statsMap =
273 for (PortStats portStats : replyBody.getPortStats()) {
275 NodeConnectorStatisticsAndPortNumberMapBuilder statsBuilder =
276 new NodeConnectorStatisticsAndPortNumberMapBuilder();
277 statsBuilder.setNodeConnectorId(
278 InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,
279 portStats.getPortNo(), ofVersion));
281 BytesBuilder bytesBuilder = new BytesBuilder();
282 bytesBuilder.setReceived(portStats.getRxBytes());
283 bytesBuilder.setTransmitted(portStats.getTxBytes());
284 statsBuilder.setBytes(bytesBuilder.build());
286 PacketsBuilder packetsBuilder = new PacketsBuilder();
287 packetsBuilder.setReceived(portStats.getRxPackets());
288 packetsBuilder.setTransmitted(portStats.getTxPackets());
289 statsBuilder.setPackets(packetsBuilder.build());
291 DurationBuilder durationBuilder = new DurationBuilder();
292 if (portStats.getDurationSec() != null) {
293 durationBuilder.setSecond(new Counter32(portStats.getDurationSec()));
295 if (portStats.getDurationNsec() != null) {
296 durationBuilder.setNanosecond(new Counter32(portStats.getDurationNsec()));
298 statsBuilder.setDuration(durationBuilder.build());
299 statsBuilder.setCollisionCount(portStats.getCollisions());
300 statsBuilder.setKey(new NodeConnectorStatisticsAndPortNumberMapKey(statsBuilder.getNodeConnectorId()));
301 statsBuilder.setReceiveCrcError(portStats.getRxCrcErr());
302 statsBuilder.setReceiveDrops(portStats.getRxDropped());
303 statsBuilder.setReceiveErrors(portStats.getRxErrors());
304 statsBuilder.setReceiveFrameError(portStats.getRxFrameErr());
305 statsBuilder.setReceiveOverRunError(portStats.getRxOverErr());
306 statsBuilder.setTransmitDrops(portStats.getTxDropped());
307 statsBuilder.setTransmitErrors(portStats.getTxErrors());
309 statsMap.add(statsBuilder.build());
311 message.setNodeConnectorStatisticsAndPortNumberMap(statsMap);
314 return message.build();
317 private static MultipartReplyGroupStats translateGroup(final MultipartReply msg,
318 final VersionDatapathIdConvertorData data,
319 final ConvertorExecutor convertorExecutor) {
320 MultipartReplyGroupStatsBuilder message = new MultipartReplyGroupStatsBuilder();
321 MultipartReplyGroupCase caseBody = (MultipartReplyGroupCase) msg.getMultipartReplyBody();
322 MultipartReplyGroup replyBody = caseBody.getMultipartReplyGroup();
323 final Optional<List<GroupStats>> groupStatsList = convertorExecutor.convert(
324 replyBody.getGroupStats(), data);
326 message.setGroupStats(groupStatsList.orElse(Collections.emptyList()));
328 return message.build();
331 private static org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.reply.multipart.reply.body
332 .MultipartReplyGroupDesc translateGroupDesc(final MultipartReply msg,
333 final VersionDatapathIdConvertorData data,
334 final ConvertorExecutor convertorExecutor) {
335 MultipartReplyGroupDescBuilder message = new MultipartReplyGroupDescBuilder();
336 MultipartReplyGroupDescCase caseBody = (MultipartReplyGroupDescCase) msg.getMultipartReplyBody();
337 MultipartReplyGroupDesc replyBody = caseBody.getMultipartReplyGroupDesc();
339 final Optional<List<GroupDescStats>> groupDescStatsList = convertorExecutor.convert(
340 replyBody.getGroupDesc(), data);
342 message.setGroupDescStats(groupDescStatsList.orElse(Collections.emptyList()));
344 return message.build();
347 private static org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.reply.multipart.reply.body
348 .MultipartReplyGroupFeatures translateGroupFeatures(final MultipartReply msg) {
349 MultipartReplyGroupFeaturesBuilder message = new MultipartReplyGroupFeaturesBuilder();
350 MultipartReplyGroupFeaturesCase caseBody = (MultipartReplyGroupFeaturesCase) msg.getMultipartReplyBody();
351 MultipartReplyGroupFeatures replyBody = caseBody.getMultipartReplyGroupFeatures();
352 List<Class<? extends GroupType>> supportedGroups =
355 if (replyBody.getTypes().isOFPGTALL()) {
356 supportedGroups.add(GroupAll.class);
358 if (replyBody.getTypes().isOFPGTSELECT()) {
359 supportedGroups.add(GroupSelect.class);
361 if (replyBody.getTypes().isOFPGTINDIRECT()) {
362 supportedGroups.add(GroupIndirect.class);
364 if (replyBody.getTypes().isOFPGTFF()) {
365 supportedGroups.add(GroupFf.class);
367 message.setGroupTypesSupported(supportedGroups);
368 message.setMaxGroups(replyBody.getMaxGroups());
370 List<Class<? extends GroupCapability>> supportedCapabilities =
373 if (replyBody.getCapabilities().isOFPGFCCHAINING()) {
374 supportedCapabilities.add(Chaining.class);
376 if (replyBody.getCapabilities().isOFPGFCCHAININGCHECKS()) {
377 supportedCapabilities.add(ChainingChecks.class);
379 if (replyBody.getCapabilities().isOFPGFCSELECTLIVENESS()) {
380 supportedCapabilities.add(SelectLiveness.class);
382 if (replyBody.getCapabilities().isOFPGFCSELECTWEIGHT()) {
383 supportedCapabilities.add(SelectWeight.class);
386 message.setGroupCapabilitiesSupported(supportedCapabilities);
388 message.setActions(GroupUtil.extractGroupActionsSupportBitmap(replyBody.getActionsBitmap()));
389 return message.build();
392 private static MultipartReplyMeterStats translateMeter(final MultipartReply msg,
393 final VersionDatapathIdConvertorData data,
394 final ConvertorExecutor convertorExecutor) {
395 MultipartReplyMeterStatsBuilder message = new MultipartReplyMeterStatsBuilder();
396 MultipartReplyMeterCase caseBody = (MultipartReplyMeterCase) msg.getMultipartReplyBody();
397 MultipartReplyMeter replyBody = caseBody.getMultipartReplyMeter();
398 final Optional<List<org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.reply.MeterStats>> meterStatsList =
399 convertorExecutor.convert(replyBody.getMeterStats(), data);
401 message.setMeterStats(meterStatsList.orElse(Collections.emptyList()));
403 return message.build();
406 private static org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.reply.multipart.reply.body
407 .MultipartReplyMeterConfig translateMeterConfig(final MultipartReply msg,
408 final VersionDatapathIdConvertorData data,
409 final ConvertorExecutor convertorExecutor) {
410 MultipartReplyMeterConfigBuilder message = new MultipartReplyMeterConfigBuilder();
411 MultipartReplyMeterConfigCase caseBody = (MultipartReplyMeterConfigCase) msg.getMultipartReplyBody();
412 MultipartReplyMeterConfig replyBody = caseBody.getMultipartReplyMeterConfig();
413 final Optional<List<MeterConfigStats>> meterConfigStatsList = convertorExecutor.convert(replyBody.getMeterConfig(), data);
415 message.setMeterConfigStats(meterConfigStatsList.orElse(Collections.emptyList()));
417 return message.build();
420 private static org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.reply.multipart.reply.body
421 .MultipartReplyMeterFeatures translateMeterFeatures(final MultipartReply msg) {
422 MultipartReplyMeterFeaturesBuilder message = new MultipartReplyMeterFeaturesBuilder();
423 MultipartReplyMeterFeaturesCase caseBody = (MultipartReplyMeterFeaturesCase) msg.getMultipartReplyBody();
424 MultipartReplyMeterFeatures replyBody = caseBody.getMultipartReplyMeterFeatures();
425 message.setMaxBands(replyBody.getMaxBands());
426 message.setMaxColor(replyBody.getMaxColor());
427 message.setMaxMeter(new Counter32(replyBody.getMaxMeter()));
429 List<Class<? extends MeterCapability>> supportedCapabilities =
431 if (replyBody.getCapabilities().isOFPMFBURST()) {
432 supportedCapabilities.add(MeterBurst.class);
434 if (replyBody.getCapabilities().isOFPMFKBPS()) {
435 supportedCapabilities.add(MeterKbps.class);
438 if (replyBody.getCapabilities().isOFPMFPKTPS()) {
439 supportedCapabilities.add(MeterPktps.class);
442 if (replyBody.getCapabilities().isOFPMFSTATS()) {
443 supportedCapabilities.add(MeterStats.class);
446 message.setMeterCapabilitiesSupported(supportedCapabilities);
448 List<Class<? extends MeterBand>> supportedMeterBand =
450 if (replyBody.getBandTypes().isOFPMBTDROP()) {
451 supportedMeterBand.add(MeterBandDrop.class);
453 if (replyBody.getBandTypes().isOFPMBTDSCPREMARK()) {
454 supportedMeterBand.add(MeterBandDscpRemark.class);
456 message.setMeterBandSupported(supportedMeterBand);
457 return message.build();
460 private static MultipartReplyFlowTableStats translateTable(final MultipartReply msg) {
461 MultipartReplyFlowTableStatsBuilder message = new MultipartReplyFlowTableStatsBuilder();
462 MultipartReplyTableCase caseBody = (MultipartReplyTableCase) msg.getMultipartReplyBody();
463 MultipartReplyTable replyBody = caseBody.getMultipartReplyTable();
464 List<TableStats> swTablesStats = replyBody.getTableStats();
466 List<FlowTableAndStatisticsMap> salFlowStats = new ArrayList<FlowTableAndStatisticsMap>();
467 for (TableStats swTableStats : swTablesStats) {
468 FlowTableAndStatisticsMapBuilder statisticsBuilder = new FlowTableAndStatisticsMapBuilder();
470 statisticsBuilder.setActiveFlows(new Counter32(swTableStats.getActiveCount()));
471 statisticsBuilder.setPacketsLookedUp(new Counter64(swTableStats.getLookupCount()));
472 statisticsBuilder.setPacketsMatched(new Counter64(swTableStats.getMatchedCount()));
473 statisticsBuilder.setTableId(new TableId(swTableStats.getTableId()));
474 salFlowStats.add(statisticsBuilder.build());
477 message.setFlowTableAndStatisticsMap(salFlowStats);
478 return message.build();
481 private static MultipartReplyQueueStats translateQueue(final MultipartReply msg,
482 final OpenflowVersion ofVersion,
483 final BigInteger datapathId) {
484 MultipartReplyQueueStatsBuilder message = new MultipartReplyQueueStatsBuilder();
485 MultipartReplyQueueCase caseBody = (MultipartReplyQueueCase) msg.getMultipartReplyBody();
486 MultipartReplyQueue replyBody = caseBody.getMultipartReplyQueue();
488 List<QueueIdAndStatisticsMap> statsMap =
491 for (QueueStats queueStats : replyBody.getQueueStats()) {
493 QueueIdAndStatisticsMapBuilder statsBuilder =
494 new QueueIdAndStatisticsMapBuilder();
495 statsBuilder.setNodeConnectorId(
496 InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,
497 queueStats.getPortNo(), ofVersion));
498 statsBuilder.setTransmissionErrors(new Counter64(queueStats.getTxErrors()));
499 statsBuilder.setTransmittedBytes(new Counter64(queueStats.getTxBytes()));
500 statsBuilder.setTransmittedPackets(new Counter64(queueStats.getTxPackets()));
502 DurationBuilder durationBuilder = new DurationBuilder();
503 durationBuilder.setSecond(new Counter32(queueStats.getDurationSec()));
504 durationBuilder.setNanosecond(new Counter32(queueStats.getDurationNsec()));
505 statsBuilder.setDuration(durationBuilder.build());
507 statsBuilder.setQueueId(new QueueId(queueStats.getQueueId()));
508 statsBuilder.setNodeConnectorId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,
509 queueStats.getPortNo(), ofVersion));
511 statsMap.add(statsBuilder.build());
513 message.setQueueIdAndStatisticsMap(statsMap);
515 return message.build();