* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
-
package org.opendaylight.openflowplugin.impl.common;
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.Collections;
+import com.google.common.collect.ImmutableSet;
import java.util.List;
+import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
-import javax.annotation.Nullable;
+import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo;
import org.opendaylight.openflowplugin.api.openflow.device.MessageTranslator;
import org.opendaylight.openflowplugin.api.openflow.device.TranslatorLibrary;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.multipart.reply.multipart.reply.body.MultipartReplyFlowAggregateStatsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.multipart.reply.multipart.reply.body.MultipartReplyFlowStats;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.multipart.reply.multipart.reply.body.MultipartReplyFlowStatsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.and.statistics.map.FlowTableAndStatisticsMap;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.and.statistics.map.FlowTableAndStatisticsMapBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.multipart.reply.multipart.reply.body.MultipartReplyFlowTableStats;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.multipart.reply.multipart.reply.body.MultipartReplyFlowTableStatsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableFeaturesCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.aggregate._case.MultipartReplyAggregate;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.desc._case.MultipartReplyDesc;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.MultipartReplyFlow;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.MultipartReplyGroup;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.MultipartReplyGroupDesc;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.features._case.MultipartReplyGroupFeatures;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.features._case.MultipartReplyMeterFeatures;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.MultipartReplyPortStats;
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;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.MultipartReplyQueue;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.multipart.reply.queue.QueueStats;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.MultipartReplyTable;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.multipart.reply.table.TableStats;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table.features._case.MultipartReplyTableFeatures;
import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.multipart.reply.multipart.reply.body.MultipartReplyPortStatsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMap;
import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMapKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.multipart.reply.multipart.reply.body.MultipartReplyQueueStats;
import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.multipart.reply.multipart.reply.body.MultipartReplyQueueStatsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.queue.id.and.statistics.map.QueueIdAndStatisticsMap;
import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.queue.id.and.statistics.map.QueueIdAndStatisticsMapBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.multipart.reply.multipart.reply.body.MultipartReplyTableFeaturesBuilder;
+import org.opendaylight.yangtools.yang.binding.util.BindingMap;
+import org.opendaylight.yangtools.yang.common.Uint64;
+import org.opendaylight.yangtools.yang.common.Uint8;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger LOG = LoggerFactory.getLogger(MultipartReplyTranslatorUtil.class);
private MultipartReplyTranslatorUtil() {
+ // Hidden on purpose
}
- public static Optional<? extends MultipartReplyBody> translate(
- final OfHeader message,
- final DeviceInfo deviceInfo,
- @Nullable final ConvertorExecutor convertorExecutor,
- @Nullable final TranslatorLibrary translatorLibrary) {
+ public static Optional<? extends MultipartReplyBody> translate(final OfHeader message, final DeviceInfo deviceInfo,
+ final @Nullable ConvertorExecutor convertorExecutor, final @Nullable TranslatorLibrary translatorLibrary) {
if (message instanceof MultipartReply) {
- final Optional<ConvertorExecutor> convertor = Optional.ofNullable(convertorExecutor);
- final Optional<TranslatorLibrary> translator = Optional.ofNullable(translatorLibrary);
- final MultipartReply msg = MultipartReply.class.cast(message);
+ final MultipartReply msg = (MultipartReply) message;
final OpenflowVersion ofVersion = OpenflowVersion.get(deviceInfo.getVersion());
final VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(deviceInfo.getVersion());
data.setDatapathId(deviceInfo.getDatapathId());
switch (msg.getType()) {
case OFPMPFLOW:
- return convertor.flatMap(c -> Optional.of(translateFlow(msg, data, c)));
+ return translateFlow(msg, data, convertorExecutor);
case OFPMPAGGREGATE:
return Optional.of(translateAggregate(msg));
case OFPMPPORTSTATS:
return Optional.of(translatePortStats(msg, ofVersion, deviceInfo.getDatapathId()));
case OFPMPGROUP:
- return convertor.flatMap(c -> Optional.of(translateGroup(msg, data, c)));
+ return translateGroup(msg, data, convertorExecutor);
case OFPMPGROUPDESC:
- return convertor.flatMap(c -> Optional.of(translateGroupDesc(msg, data, c)));
+ return translateGroupDesc(msg, data, convertorExecutor);
case OFPMPGROUPFEATURES:
return Optional.of(translateGroupFeatures(msg));
case OFPMPMETER:
- return convertor.flatMap(c -> Optional.of(translateMeter(msg, data, c)));
+ return translateMeter(msg, data, convertorExecutor);
case OFPMPMETERCONFIG:
- return convertor.flatMap(c -> Optional.of(translateMeterConfig(msg, data, c)));
+ return translateMeterConfig(msg, data, convertorExecutor);
case OFPMPMETERFEATURES:
return Optional.of(translateMeterFeatures(msg));
case OFPMPTABLE:
case OFPMPDESC:
return Optional.of(translateDesc(msg));
case OFPMPTABLEFEATURES:
- return convertor.flatMap(c -> Optional.of(translateTableFeatures(msg, deviceInfo.getVersion(), c)));
+ return translateTableFeatures(msg, deviceInfo.getVersion(), convertorExecutor);
case OFPMPPORTDESC:
- return translator.flatMap(t -> Optional.of(translatePortDesc(msg, deviceInfo, t)));
+ return translatePortDesc(msg, deviceInfo, translatorLibrary);
default:
+ // TODO: log something?
+ break;
}
} else if (message instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112
.MultipartReply) {
- return Optional.of(org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112
- .MultipartReply.class.cast(message).getMultipartReplyBody());
+ return Optional.of(((org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112
+ .MultipartReply) message).getMultipartReplyBody());
}
- LOG.debug("Failed to translate {} for node {}.", message.getImplementedInterface(), deviceInfo);
+ LOG.debug("Failed to translate {} for node {}.", message.implementedInterface(), deviceInfo);
return Optional.empty();
}
- private static MultipartReplyPortDesc translatePortDesc(final MultipartReply msg,
- final DeviceInfo deviceInfo,
- final TranslatorLibrary translatorLibrary) {
- return new MultipartReplyPortDescBuilder()
+ private static Optional<MultipartReplyPortDesc> translatePortDesc(final MultipartReply msg,
+ final DeviceInfo deviceInfo, final TranslatorLibrary translatorLibrary) {
+ if (translatorLibrary == null) {
+ return Optional.empty();
+ }
+
+ return Optional.of(new MultipartReplyPortDescBuilder()
.setPorts(((MultipartReplyPortDescCase) msg.getMultipartReplyBody())
- .getMultipartReplyPortDesc()
- .getPorts()
- .stream()
+ .getMultipartReplyPortDesc().nonnullPorts().stream()
.map(port -> {
- final TranslatorKey translatorKey = new TranslatorKey(
- deviceInfo.getVersion(),
- PortGrouping.class.getName());
-
- final MessageTranslator<PortGrouping, FlowCapableNodeConnector> translator = translatorLibrary
- .lookupTranslator(translatorKey);
+ final MessageTranslator<PortGrouping, FlowCapableNodeConnector> translator =
+ translatorLibrary .lookupTranslator(new TranslatorKey(deviceInfo.getVersion(),
+ PortGrouping.class.getName()));
- return new PortsBuilder(translator
- .translate(port, deviceInfo, null))
- .build();
+ return new PortsBuilder(translator.translate(port, deviceInfo, null)).build();
})
.collect(Collectors.toList()))
- .build();
+ .build());
}
- private static org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.multipart.reply.multipart
- .reply.body.MultipartReplyTableFeatures translateTableFeatures(
- final MultipartReply msg,
- final short version,
- final ConvertorExecutor convertorExecutor) {
- MultipartReplyTableFeaturesCase caseBody = (MultipartReplyTableFeaturesCase) msg.getMultipartReplyBody();
- final MultipartReplyTableFeatures multipartReplyTableFeatures = caseBody.getMultipartReplyTableFeatures();
+ private static Optional<org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.multipart.reply
+ .multipart.reply.body.MultipartReplyTableFeatures> translateTableFeatures(final MultipartReply msg,
+ final Uint8 version, final ConvertorExecutor convertorExecutor) {
+ if (convertorExecutor == null) {
+ return Optional.empty();
+ }
+
+ final MultipartReplyTableFeatures multipartReplyTableFeatures =
+ ((MultipartReplyTableFeaturesCase) msg.getMultipartReplyBody()).getMultipartReplyTableFeatures();
final Optional<List<org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features
.TableFeatures>> tableFeaturesList = convertorExecutor
.convert(multipartReplyTableFeatures, new VersionConvertorData(version));
- return new MultipartReplyTableFeaturesBuilder()
- .setTableFeatures(tableFeaturesList.orElse(Collections.emptyList()))
- .build();
+ return Optional.of(new MultipartReplyTableFeaturesBuilder()
+ .setTableFeatures(tableFeaturesList.map(BindingMap::ordered).orElse(Map.of()))
+ .build());
}
private static org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.multipart.reply.multipart
.build();
}
- private static MultipartReplyFlowStats translateFlow(final MultipartReply msg,
- final VersionDatapathIdConvertorData data,
- final ConvertorExecutor convertorExecutor) {
- FlowStatsResponseConvertorData flowData = new FlowStatsResponseConvertorData(data.getVersion());
+ private static Optional<MultipartReplyFlowStats> translateFlow(final MultipartReply msg,
+ final VersionDatapathIdConvertorData data, final ConvertorExecutor convertor) {
+ if (convertor == null) {
+ return Optional.empty();
+ }
+
+ final FlowStatsResponseConvertorData flowData = new FlowStatsResponseConvertorData(data.getVersion());
flowData.setDatapathId(data.getDatapathId());
flowData.setMatchPath(MatchPath.FLOWS_STATISTICS_UPDATE_MATCH);
- MultipartReplyFlowStatsBuilder message = new MultipartReplyFlowStatsBuilder();
- MultipartReplyFlowCase caseBody = (MultipartReplyFlowCase) msg.getMultipartReplyBody();
- MultipartReplyFlow replyBody = caseBody.getMultipartReplyFlow();
+
+ final MultipartReplyFlowCase caseBody = (MultipartReplyFlowCase) msg.getMultipartReplyBody();
final Optional<List<FlowAndStatisticsMapList>> flowAndStatisticsMapLists =
- convertorExecutor.convert(replyBody.getFlowStats(), flowData);
+ convertor.convert(caseBody.getMultipartReplyFlow().getFlowStats(), flowData);
- message.setFlowAndStatisticsMapList(flowAndStatisticsMapLists.orElse(Collections.emptyList()));
- return message.build();
+ return Optional.of(new MultipartReplyFlowStatsBuilder()
+ .setFlowAndStatisticsMapList(flowAndStatisticsMapLists.orElse(List.of()))
+ .build());
}
private static MultipartReplyFlowAggregateStats translateAggregate(final MultipartReply msg) {
- MultipartReplyFlowAggregateStatsBuilder message = new MultipartReplyFlowAggregateStatsBuilder();
- MultipartReplyAggregateCase caseBody = (MultipartReplyAggregateCase) msg.getMultipartReplyBody();
- MultipartReplyAggregate replyBody = caseBody.getMultipartReplyAggregate();
- message.setByteCount(new Counter64(replyBody.getByteCount()));
- message.setPacketCount(new Counter64(replyBody.getPacketCount()));
- message.setFlowCount(new Counter32(replyBody.getFlowCount()));
- return message.build();
+ final MultipartReplyAggregate replyBody = ((MultipartReplyAggregateCase) msg.getMultipartReplyBody())
+ .getMultipartReplyAggregate();
+
+ return new MultipartReplyFlowAggregateStatsBuilder()
+ .setByteCount(new Counter64(replyBody.getByteCount()))
+ .setPacketCount(new Counter64(replyBody.getPacketCount()))
+ .setFlowCount(new Counter32(replyBody.getFlowCount()))
+ .build();
}
private static org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.multipart.reply.multipart
- .reply.body.MultipartReplyPortStats translatePortStats(
- final MultipartReply msg,
- final OpenflowVersion ofVersion,
- final BigInteger datapathId) {
- MultipartReplyPortStatsBuilder message = new MultipartReplyPortStatsBuilder();
+ .reply.body.MultipartReplyPortStats translatePortStats(final MultipartReply msg,
+ final OpenflowVersion ofVersion, final Uint64 datapathId) {
MultipartReplyPortStatsCase caseBody = (MultipartReplyPortStatsCase) msg.getMultipartReplyBody();
MultipartReplyPortStats replyBody = caseBody.getMultipartReplyPortStats();
- List<NodeConnectorStatisticsAndPortNumberMap> statsMap =
- new ArrayList<>();
- for (PortStats portStats : replyBody.getPortStats()) {
-
- NodeConnectorStatisticsAndPortNumberMapBuilder statsBuilder =
- new NodeConnectorStatisticsAndPortNumberMapBuilder();
- statsBuilder.setNodeConnectorId(
- InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,
- portStats.getPortNo(), ofVersion));
-
- BytesBuilder bytesBuilder = new BytesBuilder();
- bytesBuilder.setReceived(portStats.getRxBytes());
- bytesBuilder.setTransmitted(portStats.getTxBytes());
- statsBuilder.setBytes(bytesBuilder.build());
-
- PacketsBuilder packetsBuilder = new PacketsBuilder();
- packetsBuilder.setReceived(portStats.getRxPackets());
- packetsBuilder.setTransmitted(portStats.getTxPackets());
- statsBuilder.setPackets(packetsBuilder.build());
-
- DurationBuilder durationBuilder = new DurationBuilder();
+ final var statsMap = BindingMap.<NodeConnectorStatisticsAndPortNumberMapKey,
+ NodeConnectorStatisticsAndPortNumberMap>orderedBuilder();
+ for (PortStats portStats : replyBody.nonnullPortStats()) {
+ final DurationBuilder durationBuilder = new DurationBuilder();
if (portStats.getDurationSec() != null) {
durationBuilder.setSecond(new Counter32(portStats.getDurationSec()));
}
if (portStats.getDurationNsec() != null) {
durationBuilder.setNanosecond(new Counter32(portStats.getDurationNsec()));
}
- statsBuilder.setDuration(durationBuilder.build());
- statsBuilder.setCollisionCount(portStats.getCollisions());
- statsBuilder.withKey(new NodeConnectorStatisticsAndPortNumberMapKey(statsBuilder.getNodeConnectorId()));
- statsBuilder.setReceiveCrcError(portStats.getRxCrcErr());
- statsBuilder.setReceiveDrops(portStats.getRxDropped());
- statsBuilder.setReceiveErrors(portStats.getRxErrors());
- statsBuilder.setReceiveFrameError(portStats.getRxFrameErr());
- statsBuilder.setReceiveOverRunError(portStats.getRxOverErr());
- statsBuilder.setTransmitDrops(portStats.getTxDropped());
- statsBuilder.setTransmitErrors(portStats.getTxErrors());
-
- statsMap.add(statsBuilder.build());
- }
- message.setNodeConnectorStatisticsAndPortNumberMap(statsMap);
+ statsMap.add(new NodeConnectorStatisticsAndPortNumberMapBuilder()
+ .setNodeConnectorId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,
+ portStats.getPortNo(), ofVersion))
+ .setBytes(new BytesBuilder()
+ .setReceived(portStats.getRxBytes())
+ .setTransmitted(portStats.getTxBytes())
+ .build())
+ .setPackets(new PacketsBuilder()
+ .setReceived(portStats.getRxPackets())
+ .setTransmitted(portStats.getTxPackets())
+ .build())
+ .setDuration(durationBuilder.build())
+ .setCollisionCount(portStats.getCollisions())
+ .setReceiveCrcError(portStats.getRxCrcErr())
+ .setReceiveDrops(portStats.getRxDropped())
+ .setReceiveErrors(portStats.getRxErrors())
+ .setReceiveFrameError(portStats.getRxFrameErr())
+ .setReceiveOverRunError(portStats.getRxOverErr())
+ .setTransmitDrops(portStats.getTxDropped())
+ .setTransmitErrors(portStats.getTxErrors())
+ .build());
+ }
- return message.build();
+ return new MultipartReplyPortStatsBuilder()
+ .setNodeConnectorStatisticsAndPortNumberMap(statsMap.build())
+ .build();
}
- private static MultipartReplyGroupStats translateGroup(final MultipartReply msg,
- final VersionDatapathIdConvertorData data,
- final ConvertorExecutor convertorExecutor) {
- MultipartReplyGroupStatsBuilder message = new MultipartReplyGroupStatsBuilder();
- MultipartReplyGroupCase caseBody = (MultipartReplyGroupCase) msg.getMultipartReplyBody();
- MultipartReplyGroup replyBody = caseBody.getMultipartReplyGroup();
+ private static Optional<MultipartReplyGroupStats> translateGroup(final MultipartReply msg,
+ final VersionDatapathIdConvertorData data, final ConvertorExecutor convertorExecutor) {
+ if (convertorExecutor == null) {
+ return Optional.empty();
+ }
+
+ final MultipartReplyGroup replyBody = ((MultipartReplyGroupCase) msg.getMultipartReplyBody())
+ .getMultipartReplyGroup();
final Optional<List<GroupStats>> groupStatsList = convertorExecutor.convert(
replyBody.getGroupStats(), data);
- message.setGroupStats(groupStatsList.orElse(Collections.emptyList()));
-
- return message.build();
+ return Optional.of(new MultipartReplyGroupStatsBuilder()
+ .setGroupStats(groupStatsList.map(BindingMap::ordered).orElse(Map.of()))
+ .build());
}
- private static org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.reply.multipart
- .reply.body.MultipartReplyGroupDesc translateGroupDesc(
- final MultipartReply msg,
- final VersionDatapathIdConvertorData data,
- final ConvertorExecutor convertorExecutor) {
- MultipartReplyGroupDescBuilder message = new MultipartReplyGroupDescBuilder();
+ private static Optional<org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.reply
+ .multipart.reply.body.MultipartReplyGroupDesc> translateGroupDesc(final MultipartReply msg,
+ final VersionDatapathIdConvertorData data, final ConvertorExecutor convertorExecutor) {
+ if (convertorExecutor == null) {
+ return Optional.empty();
+ }
+
MultipartReplyGroupDescCase caseBody = (MultipartReplyGroupDescCase) msg.getMultipartReplyBody();
MultipartReplyGroupDesc replyBody = caseBody.getMultipartReplyGroupDesc();
final Optional<List<GroupDescStats>> groupDescStatsList = convertorExecutor.convert(
replyBody.getGroupDesc(), data);
- message.setGroupDescStats(groupDescStatsList.orElse(Collections.emptyList()));
-
- return message.build();
+ return Optional.of(new MultipartReplyGroupDescBuilder()
+ .setGroupDescStats(groupDescStatsList.map(BindingMap::ordered).orElse(Map.of()))
+ .build());
}
private static org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.reply.multipart
.reply.body.MultipartReplyGroupFeatures translateGroupFeatures(final MultipartReply msg) {
- final MultipartReplyGroupFeaturesBuilder message = new MultipartReplyGroupFeaturesBuilder();
- final MultipartReplyGroupFeaturesCase caseBody = (MultipartReplyGroupFeaturesCase) msg.getMultipartReplyBody();
- final MultipartReplyGroupFeatures replyBody = caseBody.getMultipartReplyGroupFeatures();
- List<Class<? extends GroupType>> supportedGroups =
- new ArrayList<>();
+ final MultipartReplyGroupFeatures replyBody = ((MultipartReplyGroupFeaturesCase) msg.getMultipartReplyBody())
+ .getMultipartReplyGroupFeatures();
- if (replyBody.getTypes().isOFPGTALL()) {
+ final var replyTypes = replyBody.getTypes();
+ final var supportedGroups = ImmutableSet.<Class<? extends GroupType>>builder();
+ if (replyTypes.getOFPGTALL()) {
supportedGroups.add(GroupAll.class);
}
- if (replyBody.getTypes().isOFPGTSELECT()) {
+ if (replyTypes.getOFPGTSELECT()) {
supportedGroups.add(GroupSelect.class);
}
- if (replyBody.getTypes().isOFPGTINDIRECT()) {
+ if (replyTypes.getOFPGTINDIRECT()) {
supportedGroups.add(GroupIndirect.class);
}
- if (replyBody.getTypes().isOFPGTFF()) {
+ if (replyTypes.getOFPGTFF()) {
supportedGroups.add(GroupFf.class);
}
- message.setGroupTypesSupported(supportedGroups);
- message.setMaxGroups(replyBody.getMaxGroups());
-
- List<Class<? extends GroupCapability>> supportedCapabilities =
- new ArrayList<>();
- if (replyBody.getCapabilities().isOFPGFCCHAINING()) {
+ final var replyCapabilities = replyBody.getCapabilities();
+ final var supportedCapabilities = ImmutableSet.<Class<? extends GroupCapability>>builder();
+ if (replyCapabilities.getOFPGFCCHAINING()) {
supportedCapabilities.add(Chaining.class);
}
- if (replyBody.getCapabilities().isOFPGFCCHAININGCHECKS()) {
+ if (replyCapabilities.getOFPGFCCHAININGCHECKS()) {
supportedCapabilities.add(ChainingChecks.class);
}
- if (replyBody.getCapabilities().isOFPGFCSELECTLIVENESS()) {
+ if (replyCapabilities.getOFPGFCSELECTLIVENESS()) {
supportedCapabilities.add(SelectLiveness.class);
}
- if (replyBody.getCapabilities().isOFPGFCSELECTWEIGHT()) {
+ if (replyCapabilities.getOFPGFCSELECTWEIGHT()) {
supportedCapabilities.add(SelectWeight.class);
}
- message.setGroupCapabilitiesSupported(supportedCapabilities);
-
- message.setActions(GroupUtil.extractGroupActionsSupportBitmap(replyBody.getActionsBitmap()));
- return message.build();
+ return new MultipartReplyGroupFeaturesBuilder()
+ .setGroupTypesSupported(supportedGroups.build())
+ .setMaxGroups(replyBody.getMaxGroups())
+ .setGroupCapabilitiesSupported(supportedCapabilities.build())
+ .setActions(GroupUtil.extractGroupActionsSupportBitmap(replyBody.getActionsBitmap()))
+ .build();
}
- private static MultipartReplyMeterStats translateMeter(final MultipartReply msg,
- final VersionDatapathIdConvertorData data,
- final ConvertorExecutor convertorExecutor) {
- MultipartReplyMeterStatsBuilder message = new MultipartReplyMeterStatsBuilder();
- MultipartReplyMeterCase caseBody = (MultipartReplyMeterCase) msg.getMultipartReplyBody();
- MultipartReplyMeter replyBody = caseBody.getMultipartReplyMeter();
+ private static Optional<MultipartReplyMeterStats> translateMeter(final MultipartReply msg,
+ final VersionDatapathIdConvertorData data, final ConvertorExecutor convertorExecutor) {
+ if (convertorExecutor == null) {
+ return Optional.empty();
+ }
+
+ final MultipartReplyMeter replyBody = ((MultipartReplyMeterCase) msg.getMultipartReplyBody())
+ .getMultipartReplyMeter();
final Optional<List<
- org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.reply.MeterStats
- >>
+ org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.reply.MeterStats>>
meterStatsList = convertorExecutor.convert(replyBody.getMeterStats(), data);
- message.setMeterStats(meterStatsList.orElse(Collections.emptyList()));
-
- return message.build();
+ return Optional.of(new MultipartReplyMeterStatsBuilder()
+ .setMeterStats(meterStatsList.map(BindingMap::ordered).orElse(Map.of()))
+ .build());
}
- private static org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.reply.multipart
- .reply.body.MultipartReplyMeterConfig translateMeterConfig(
- final MultipartReply msg,
- final VersionDatapathIdConvertorData data,
- final ConvertorExecutor convertorExecutor) {
- MultipartReplyMeterConfigBuilder message = new MultipartReplyMeterConfigBuilder();
+ private static Optional<org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.reply
+ .multipart.reply.body.MultipartReplyMeterConfig> translateMeterConfig(final MultipartReply msg,
+ final VersionDatapathIdConvertorData data, final ConvertorExecutor convertorExecutor) {
+ if (convertorExecutor == null) {
+ return Optional.empty();
+ }
+
MultipartReplyMeterConfigCase caseBody = (MultipartReplyMeterConfigCase) msg.getMultipartReplyBody();
MultipartReplyMeterConfig replyBody = caseBody.getMultipartReplyMeterConfig();
final Optional<List<MeterConfigStats>> meterConfigStatsList
= convertorExecutor.convert(replyBody.getMeterConfig(), data);
- message.setMeterConfigStats(meterConfigStatsList.orElse(Collections.emptyList()));
-
- return message.build();
+ return Optional.of(new MultipartReplyMeterConfigBuilder()
+ .setMeterConfigStats(meterConfigStatsList.map(BindingMap::ordered).orElse(Map.of()))
+ .build());
}
private static org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.reply.multipart
.reply.body.MultipartReplyMeterFeatures translateMeterFeatures(final MultipartReply msg) {
- MultipartReplyMeterFeaturesBuilder message = new MultipartReplyMeterFeaturesBuilder();
MultipartReplyMeterFeaturesCase caseBody = (MultipartReplyMeterFeaturesCase) msg.getMultipartReplyBody();
MultipartReplyMeterFeatures replyBody = caseBody.getMultipartReplyMeterFeatures();
- message.setMaxBands(replyBody.getMaxBands());
- message.setMaxColor(replyBody.getMaxColor());
- message.setMaxMeter(new Counter32(replyBody.getMaxMeter()));
- List<Class<? extends MeterCapability>> supportedCapabilities =
- new ArrayList<>();
- if (replyBody.getCapabilities().isOFPMFBURST()) {
+ final var replyCapabilities = replyBody.getCapabilities();
+ final var supportedCapabilities = ImmutableSet.<Class<? extends MeterCapability>>builder();
+ if (replyCapabilities.getOFPMFBURST()) {
supportedCapabilities.add(MeterBurst.class);
}
- if (replyBody.getCapabilities().isOFPMFKBPS()) {
+ if (replyCapabilities.getOFPMFKBPS()) {
supportedCapabilities.add(MeterKbps.class);
-
}
- if (replyBody.getCapabilities().isOFPMFPKTPS()) {
+ if (replyCapabilities.getOFPMFPKTPS()) {
supportedCapabilities.add(MeterPktps.class);
-
}
- if (replyBody.getCapabilities().isOFPMFSTATS()) {
+ if (replyCapabilities.getOFPMFSTATS()) {
supportedCapabilities.add(MeterStats.class);
-
}
- message.setMeterCapabilitiesSupported(supportedCapabilities);
- List<Class<? extends MeterBand>> supportedMeterBand =
- new ArrayList<>();
- if (replyBody.getBandTypes().isOFPMBTDROP()) {
+ final var replyMeterBand = replyBody.getBandTypes();
+ final var supportedMeterBand = ImmutableSet.<Class<? extends MeterBand>>builder();
+ if (replyMeterBand.getOFPMBTDROP()) {
supportedMeterBand.add(MeterBandDrop.class);
}
- if (replyBody.getBandTypes().isOFPMBTDSCPREMARK()) {
+ if (replyMeterBand.getOFPMBTDSCPREMARK()) {
supportedMeterBand.add(MeterBandDscpRemark.class);
}
- message.setMeterBandSupported(supportedMeterBand);
- return message.build();
+
+ return new MultipartReplyMeterFeaturesBuilder()
+ .setMaxBands(replyBody.getMaxBands())
+ .setMaxColor(replyBody.getMaxColor())
+ .setMaxMeter(new Counter32(replyBody.getMaxMeter()))
+ .setMeterCapabilitiesSupported(supportedCapabilities.build())
+ .setMeterBandSupported(supportedMeterBand.build())
+ .build();
}
private static MultipartReplyFlowTableStats translateTable(final MultipartReply msg) {
- MultipartReplyFlowTableStatsBuilder message = new MultipartReplyFlowTableStatsBuilder();
- MultipartReplyTableCase caseBody = (MultipartReplyTableCase) msg.getMultipartReplyBody();
- MultipartReplyTable replyBody = caseBody.getMultipartReplyTable();
- List<TableStats> swTablesStats = replyBody.getTableStats();
-
- List<FlowTableAndStatisticsMap> salFlowStats = new ArrayList<>();
- //TODO: Duplicate code: look at OpendaylightFlowTableStatisticsServiceImpl method transformToNotification
- for (TableStats swTableStats : swTablesStats) {
- FlowTableAndStatisticsMapBuilder statisticsBuilder = new FlowTableAndStatisticsMapBuilder();
-
- statisticsBuilder.setActiveFlows(new Counter32(swTableStats.getActiveCount()));
- statisticsBuilder.setPacketsLookedUp(new Counter64(swTableStats.getLookupCount()));
- statisticsBuilder.setPacketsMatched(new Counter64(swTableStats.getMatchedCount()));
- statisticsBuilder.setTableId(new TableId(swTableStats.getTableId()));
- salFlowStats.add(statisticsBuilder.build());
- }
-
- message.setFlowTableAndStatisticsMap(salFlowStats);
- return message.build();
+ final var salFlowStats = ((MultipartReplyTableCase) msg.getMultipartReplyBody()).getMultipartReplyTable()
+ .nonnullTableStats().stream()
+ //TODO: Duplicate code: look at OpendaylightFlowTableStatisticsServiceImpl method transformToNotification
+ .map(swTableStats -> new FlowTableAndStatisticsMapBuilder()
+ .setActiveFlows(new Counter32(swTableStats.getActiveCount()))
+ .setPacketsLookedUp(new Counter64(swTableStats.getLookupCount()))
+ .setPacketsMatched(new Counter64(swTableStats.getMatchedCount()))
+ .setTableId(new TableId(swTableStats.getTableId()))
+ .build())
+ .collect(BindingMap.toOrderedMap());
+
+ return new MultipartReplyFlowTableStatsBuilder()
+ .setFlowTableAndStatisticsMap(salFlowStats)
+ .build();
}
private static MultipartReplyQueueStats translateQueue(final MultipartReply msg,
final OpenflowVersion ofVersion,
- final BigInteger datapathId) {
- MultipartReplyQueueStatsBuilder message = new MultipartReplyQueueStatsBuilder();
- MultipartReplyQueueCase caseBody = (MultipartReplyQueueCase) msg.getMultipartReplyBody();
- MultipartReplyQueue replyBody = caseBody.getMultipartReplyQueue();
-
- List<QueueIdAndStatisticsMap> statsMap =
- new ArrayList<>();
-
- for (QueueStats queueStats : replyBody.getQueueStats()) {
-
- QueueIdAndStatisticsMapBuilder statsBuilder =
- new QueueIdAndStatisticsMapBuilder();
- statsBuilder.setNodeConnectorId(
- InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,
- queueStats.getPortNo(), ofVersion));
- statsBuilder.setTransmissionErrors(new Counter64(queueStats.getTxErrors()));
- statsBuilder.setTransmittedBytes(new Counter64(queueStats.getTxBytes()));
- statsBuilder.setTransmittedPackets(new Counter64(queueStats.getTxPackets()));
-
- DurationBuilder durationBuilder = new DurationBuilder();
- durationBuilder.setSecond(new Counter32(queueStats.getDurationSec()));
- durationBuilder.setNanosecond(new Counter32(queueStats.getDurationNsec()));
- statsBuilder.setDuration(durationBuilder.build());
-
- statsBuilder.setQueueId(new QueueId(queueStats.getQueueId()));
- statsBuilder.setNodeConnectorId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,
- queueStats.getPortNo(), ofVersion));
-
- statsMap.add(statsBuilder.build());
- }
- message.setQueueIdAndStatisticsMap(statsMap);
-
- return message.build();
+ final Uint64 datapathId) {
+ final var statsMap = ((MultipartReplyQueueCase) msg.getMultipartReplyBody()).getMultipartReplyQueue()
+ .nonnullQueueStats().stream()
+ .map(queueStats -> new QueueIdAndStatisticsMapBuilder()
+ .setNodeConnectorId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,
+ queueStats.getPortNo(), ofVersion))
+ .setQueueId(new QueueId(queueStats.getQueueId()))
+ .setTransmissionErrors(new Counter64(queueStats.getTxErrors()))
+ .setTransmittedBytes(new Counter64(queueStats.getTxBytes()))
+ .setTransmittedPackets(new Counter64(queueStats.getTxPackets()))
+ .setDuration(new DurationBuilder()
+ .setSecond(new Counter32(queueStats.getDurationSec()))
+ .setNanosecond(new Counter32(queueStats.getDurationNsec()))
+ .build())
+ .build())
+ .collect(BindingMap.toOrderedMap());
+
+ return new MultipartReplyQueueStatsBuilder()
+ .setQueueIdAndStatisticsMap(statsMap)
+ .build();
}
-
}