From: Tomas Slusny Date: Tue, 28 Jun 2016 13:59:50 +0000 (+0200) Subject: Bug 5540 - GroupConvertor, GroupStatsConvertor, GroupDescStatsConvertor X-Git-Tag: release/boron~61 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=7d761342e231f807eba43f50712cbff04489d0e0;p=openflowplugin.git Bug 5540 - GroupConvertor, GroupStatsConvertor, GroupDescStatsConvertor - Reworked GroupConvertor and GroupStatsConvertor to new ConvertorManager design - Added GroupDescStatsConvertor (moved some logic from GroupStatsConvertor) - Updated (and fixed) tests, and updated usages accordingly Change-Id: Iabae7191ceeefeb208487ab5cf0280e8f8186c3e Signed-off-by: Tomas Slusny --- diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/GroupService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/GroupService.java index 431fea1e23..b165d8bdb1 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/GroupService.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/GroupService.java @@ -7,10 +7,13 @@ */ package org.opendaylight.openflowplugin.impl.services; +import java.util.Optional; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; import org.opendaylight.openflowplugin.api.openflow.device.Xid; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupConvertor; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; @@ -23,9 +26,16 @@ final class GroupService extends Abstract @Override protected OfHeader buildRequest(final Xid xid, final I input) { - final GroupModInputBuilder ofGroupModInput = GroupConvertor.toGroupModInput(input, getVersion(), getDatapathId()); - ofGroupModInput.setXid(xid.getValue()); + final VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(getVersion()); + data.setDatapathId(getDatapathId()); + final Optional ofGroupModInput = ConvertorManager + .getInstance() + .convert(input, data); - return ofGroupModInput.build(); + final GroupModInputBuilder groupModInputBuilder = ofGroupModInput + .orElse(GroupConvertor.defaultResult(getVersion())) + .setXid(xid.getValue()); + + return groupModInputBuilder.build(); } } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/SinglePurposeMultipartReplyTranslator.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/SinglePurposeMultipartReplyTranslator.java index a4d5ed1cea..9447fe04f1 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/SinglePurposeMultipartReplyTranslator.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/SinglePurposeMultipartReplyTranslator.java @@ -15,7 +15,7 @@ import java.util.Optional; import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.FlowStatsResponseConvertor; -import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupStatsResponseConvertor; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData; import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter64; @@ -39,6 +39,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupType; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.SelectLiveness; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.SelectWeight; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStats; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStats; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterConfigStatsUpdatedBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterFeaturesUpdatedBuilder; @@ -109,8 +111,6 @@ public class SinglePurposeMultipartReplyTranslator { .getLogger(SinglePurposeMultipartReplyTranslator.class); private static FlowStatsResponseConvertor flowStatsConvertor = new FlowStatsResponseConvertor(); - private static GroupStatsResponseConvertor groupStatsConvertor = new GroupStatsResponseConvertor(); - public List translate(final BigInteger datapathId, final short version, final OfHeader msg) { @@ -120,12 +120,13 @@ public class SinglePurposeMultipartReplyTranslator { MultipartReplyMessage mpReply = (MultipartReplyMessage) msg; OpenflowVersion ofVersion = OpenflowVersion.get(version); NodeId node = nodeIdFromDatapathId(datapathId); + VersionConvertorData simpleConvertorData = new VersionConvertorData(version); translateFlow(listDataObject, mpReply, node, ofVersion, datapathId); translateAggregate(listDataObject, mpReply, node); translatePortStats(listDataObject, mpReply, node, ofVersion, datapathId); translateGroup(listDataObject, mpReply, node); - translateGroupDesc(listDataObject, mpReply, node, ofVersion); + translateGroupDesc(listDataObject, mpReply, node, simpleConvertorData); translateGroupFeatures(listDataObject, mpReply, node); translateMeter(listDataObject, mpReply, node); translateMeterConfig(listDataObject, mpReply, node); @@ -254,7 +255,10 @@ public class SinglePurposeMultipartReplyTranslator { message.setTransactionId(generateTransactionId(mpReply.getXid())); MultipartReplyGroupCase caseBody = (MultipartReplyGroupCase) mpReply.getMultipartReplyBody(); MultipartReplyGroup replyBody = caseBody.getMultipartReplyGroup(); - message.setGroupStats(groupStatsConvertor.toSALGroupStatsList(replyBody.getGroupStats())); + final Optional> groupStatsList = ConvertorManager.getInstance().convert( + replyBody.getGroupStats()); + + message.setGroupStats(groupStatsList.orElse(Collections.emptyList())); listDataObject.add(message.build()); } @@ -262,7 +266,7 @@ public class SinglePurposeMultipartReplyTranslator { private static void translateGroupDesc(final List listDataObject, final MultipartReplyMessage mpReply, final NodeId node, - final OpenflowVersion ofVersion) { + VersionConvertorData simpleConvertorData) { if (!MultipartType.OFPMPGROUPDESC.equals(mpReply.getType())) { return; } @@ -274,7 +278,10 @@ public class SinglePurposeMultipartReplyTranslator { MultipartReplyGroupDescCase caseBody = (MultipartReplyGroupDescCase) mpReply.getMultipartReplyBody(); MultipartReplyGroupDesc replyBody = caseBody.getMultipartReplyGroupDesc(); - message.setGroupDescStats(groupStatsConvertor.toSALGroupDescStatsList(replyBody.getGroupDesc(), ofVersion)); + final Optional> groupDescStatsList = ConvertorManager.getInstance().convert( + replyBody.getGroupDesc(), simpleConvertorData); + + message.setGroupDescStats(groupDescStatsList.orElse(Collections.emptyList())); listDataObject.add(message.build()); } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/GroupDescriptionService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/GroupDescriptionService.java index bb6c9f7b53..f52eb469f3 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/GroupDescriptionService.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/GroupDescriptionService.java @@ -9,13 +9,15 @@ package org.opendaylight.openflowplugin.impl.statistics.services; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.concurrent.atomic.AtomicLong; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; import org.opendaylight.openflowplugin.api.openflow.device.Xid; import org.opendaylight.openflowplugin.impl.services.RequestInputUtils; import org.opendaylight.openflowplugin.impl.statistics.services.compatibility.AbstractCompatibleStatService; -import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupStatsResponseConvertor; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.TransactionId; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionOutput; @@ -35,11 +37,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731 final class GroupDescriptionService extends AbstractCompatibleStatService { private static final MultipartRequestGroupDescCase GROUP_DESC_CASE = new MultipartRequestGroupDescCaseBuilder().build(); - private final GroupStatsResponseConvertor groupStatsResponseConvertor; public GroupDescriptionService(RequestContextStack requestContextStack, DeviceContext deviceContext, AtomicLong compatibilityXidSeed) { super(requestContextStack, deviceContext, compatibilityXidSeed); - groupStatsResponseConvertor = new GroupStatsResponseConvertor(); } @Override @@ -63,11 +63,17 @@ final class GroupDescriptionService notification.setTransactionId(emulatedTxId); notification.setGroupDescStats(new ArrayList()); + final VersionConvertorData data = new VersionConvertorData(getVersion()); + for (MultipartReply mpReply : result) { MultipartReplyGroupDescCase caseBody = (MultipartReplyGroupDescCase) mpReply.getMultipartReplyBody(); MultipartReplyGroupDesc replyBody = caseBody.getMultipartReplyGroupDesc(); - notification.getGroupDescStats().addAll( - groupStatsResponseConvertor.toSALGroupDescStatsList(replyBody.getGroupDesc(), getOfVersion())); + final Optional> groupDescStatsList = ConvertorManager.getInstance().convert( + replyBody.getGroupDesc(), data); + + if (groupDescStatsList.isPresent()) { + notification.getGroupDescStats().addAll(groupDescStatsList.get()); + } } return notification.build(); diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/compatibility/GroupStatisticsToNotificationTransformer.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/compatibility/GroupStatisticsToNotificationTransformer.java index 5df1440ec2..bf476ad659 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/compatibility/GroupStatisticsToNotificationTransformer.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/compatibility/GroupStatisticsToNotificationTransformer.java @@ -10,8 +10,9 @@ package org.opendaylight.openflowplugin.impl.statistics.services.compatibility; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo; -import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupStatsResponseConvertor; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.TransactionId; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupStatisticsUpdated; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupStatisticsUpdatedBuilder; @@ -24,9 +25,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731 * pulled out group stats to notification transformation */ public class GroupStatisticsToNotificationTransformer { - - private static GroupStatsResponseConvertor groupStatsConvertor = new GroupStatsResponseConvertor(); - /** * @param mpReplyList raw multipart response from device * @param deviceInfo device state @@ -47,7 +45,12 @@ public class GroupStatisticsToNotificationTransformer { for (MultipartReply mpReply : mpReplyList) { MultipartReplyGroupCase caseBody = (MultipartReplyGroupCase) mpReply.getMultipartReplyBody(); MultipartReplyGroup replyBody = caseBody.getMultipartReplyGroup(); - notification.getGroupStats().addAll(groupStatsConvertor.toSALGroupStatsList(replyBody.getGroupStats())); + final Optional> groupStatsList = ConvertorManager.getInstance().convert( + replyBody.getGroupStats()); + + if (groupStatsList.isPresent()) { + notification.getGroupStats().addAll(groupStatsList.get()); + } } return notification.build(); } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/GroupDirectStatisticsService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/GroupDirectStatisticsService.java index 75579a18c0..7037656e77 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/GroupDirectStatisticsService.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/GroupDirectStatisticsService.java @@ -10,11 +10,12 @@ package org.opendaylight.openflowplugin.impl.statistics.services.direct; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.openflowplugin.api.OFConstants; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack; -import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupStatsResponseConvertor; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager; import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetGroupStatisticsInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetGroupStatisticsOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetGroupStatisticsOutputBuilder; @@ -39,8 +40,6 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; * The Group direct statistics service. */ public class GroupDirectStatisticsService extends AbstractDirectStatisticsService { - private final GroupStatsResponseConvertor groupStatsConvertor = new GroupStatsResponseConvertor(); - /** * Instantiates a new Group direct statistics service. * @@ -74,7 +73,12 @@ public class GroupDirectStatisticsService extends AbstractDirectStatisticsServic for (final MultipartReply mpReply : input) { final MultipartReplyGroupCase caseBody = (MultipartReplyGroupCase) mpReply.getMultipartReplyBody(); final MultipartReplyGroup replyBody = caseBody.getMultipartReplyGroup(); - groupStats.addAll(groupStatsConvertor.toSALGroupStatsList(replyBody.getGroupStats())); + final Optional> groupStatsList = ConvertorManager.getInstance().convert( + replyBody.getGroupStats()); + + if (groupStatsList.isPresent()) { + groupStats.addAll(groupStatsList.get()); + } } } diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/OFRpcTaskFactory.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/OFRpcTaskFactory.java index ef7741a89c..a7446eca96 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/OFRpcTaskFactory.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/OFRpcTaskFactory.java @@ -34,6 +34,7 @@ import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupConve import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.MeterConvertor; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.PortConvertor; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor; import org.opendaylight.openflowplugin.openflow.md.util.FlowCreatorUtil; import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil; @@ -464,17 +465,18 @@ public abstract class OFRpcTaskFactory { @Override public ListenableFuture> call() { ListenableFuture> result = SettableFuture.create(); + final VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(getVersion()); + data.setDatapathId(getSession().getFeatures().getDatapathId()); // Convert the AddGroupInput to GroupModInput - GroupModInputBuilder ofGroupModInput = GroupConvertor.toGroupModInput(getInput(), - getVersion(), getSession().getFeatures().getDatapathId()); - final Long xId = getSession().getNextXid(); - ofGroupModInput.setXid(xId); + final java.util.Optional ofGroupModInput = ConvertorManager.getInstance().convert(getInput(), data); + final GroupModInputBuilder groupModInputBuilder = ofGroupModInput + .orElse(GroupConvertor.defaultResult(getVersion())) + .setXid(getSession().getNextXid()); Future> resultFromOFLib = getMessageService() - .groupMod(ofGroupModInput.build(), getCookie()); + .groupMod(groupModInputBuilder.build(), getCookie()); result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib); - result = OFRpcTaskUtil.chainFutureBarrier(this, result); OFRpcTaskUtil.hookFutureNotification(this, result, getRpcNotificationProviderService(), createGroupAddedNotification(getInput())); @@ -592,16 +594,19 @@ public abstract class OFRpcTaskFactory { @Override public ListenableFuture> call() { ListenableFuture> result = null; + final VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(getVersion()); + data.setDatapathId(getSession().getFeatures().getDatapathId()); // Convert the UpdateGroupInput to GroupModInput - GroupModInputBuilder ofGroupModInput = GroupConvertor.toGroupModInput( - getInput().getUpdatedGroup(), getVersion(), - getSession().getFeatures().getDatapathId()); - final Long xId = getSession().getNextXid(); - ofGroupModInput.setXid(xId); + final java.util.Optional ofGroupModInput = + ConvertorManager.getInstance().convert(getInput().getUpdatedGroup(), data); + + final GroupModInputBuilder groupModInputBuilder = ofGroupModInput + .orElse(GroupConvertor.defaultResult(getVersion())) + .setXid(getSession().getNextXid()); Future> resultFromOFLib = - getMessageService().groupMod(ofGroupModInput.build(), getCookie()); + getMessageService().groupMod(groupModInputBuilder.build(), getCookie()); result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib); result = OFRpcTaskUtil.chainFutureBarrier(this, result); @@ -781,17 +786,20 @@ public abstract class OFRpcTaskFactory { @Override public ListenableFuture> call() { ListenableFuture> result = SettableFuture.create(); + final VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(getVersion()); + data.setDatapathId(getSession().getFeatures().getDatapathId()); // Convert the AddGroupInput to GroupModInput - GroupModInputBuilder ofGroupModInput = GroupConvertor.toGroupModInput(getInput(), - getVersion(), getSession().getFeatures().getDatapathId()); - final Long xId = getSession().getNextXid(); - ofGroupModInput.setXid(xId); + final java.util.Optional ofGroupModInput = + ConvertorManager.getInstance().convert(getInput(), data); + + final GroupModInputBuilder groupModInputBuilder = ofGroupModInput + .orElse(GroupConvertor.defaultResult(getVersion())) + .setXid(getSession().getNextXid()); Future> resultFromOFLib = getMessageService() - .groupMod(ofGroupModInput.build(), getCookie()); + .groupMod(groupModInputBuilder.build(), getCookie()); result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib); - result = OFRpcTaskUtil.chainFutureBarrier(this, result); OFRpcTaskUtil.hookFutureNotification(this, result, getRpcNotificationProviderService(), createGroupRemovedNotification(getInput())); diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ConvertorManager.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ConvertorManager.java index 067566d1dc..3d26f331f1 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ConvertorManager.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ConvertorManager.java @@ -47,6 +47,9 @@ public class ConvertorManager { INSTANCE.registerConvertor(new MatchV10ResponseConvertor()); INSTANCE.registerConvertor(new ActionConvertor()); INSTANCE.registerConvertor(new ActionResponseConvertor()); + INSTANCE.registerConvertor(new GroupConvertor()); + INSTANCE.registerConvertor(new GroupDescStatsResponseConvertor()); + INSTANCE.registerConvertor(new GroupStatsResponseConvertor()); } // Actual convertor keys diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupConvertor.java index 8d2ee474ac..6250fa2ae2 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupConvertor.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupConvertor.java @@ -1,10 +1,11 @@ -/** +/* * Copyright (c) 2014 Ericsson India Global Services Pvt Ltd. and others. All rights reserved. * * This program and the accompanying materials are made available under the * 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.openflow.md.core.sal.convertor; import java.math.BigInteger; @@ -15,9 +16,12 @@ import java.util.List; import java.util.Optional; import org.opendaylight.openflowjava.protocol.api.util.BinContent; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.data.ActionConvertorData; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ParametrizedConvertor; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.UpdatedGroup; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket; @@ -33,84 +37,47 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * This Utility class decodes the SAL - Group Mod Message and encodes into a OF + * Decodes the SAL - Group Mod Message and encodes into a OF * Library for the OFPT_GROUP_MOD Message. Input:SAL Layer Group command data. - * Output:GroupModInput Message. - * * + * Example usage: + *
+ * {@code
+ * VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(version);
+ * data.setDatapathId(datapathId);
+ * Optional ofGroup = ConvertorManager.getInstance().convert(salGroup, data);
+ * }
+ * 
*/ -public final class GroupConvertor { +public class GroupConvertor implements ParametrizedConvertor { + /** + * Create default empty group mod input builder + * Use this method, if result from convertor is empty. + * + * @param version Openflow version + * @return default empty group mod input builder + */ + public static GroupModInputBuilder defaultResult(short version) { + return new GroupModInputBuilder() + .setVersion(version); + } private static final Logger LOG = LoggerFactory.getLogger(GroupConvertor.class); - private static final Integer DEFAULT_WEIGHT = 0; private static final Long OFPP_ANY = Long.parseLong("ffffffff", 16); private static final Long DEFAULT_WATCH_PORT = OFPP_ANY; private static final Long OFPG_ANY = Long.parseLong("ffffffff", 16); private static final Long DEFAULT_WATCH_GROUP = OFPG_ANY; - private static final Comparator comparator = new Comparator(){ - @Override - public int compare(Bucket bucket1, - Bucket bucket2) { - if(bucket1.getBucketId() == null || bucket2.getBucketId() == null) return 0; - return bucket1.getBucketId().getValue().compareTo(bucket2.getBucketId().getValue()); - } + private static final Comparator COMPARATOR = (bucket1, bucket2) -> { + if (bucket1.getBucketId() == null || bucket2.getBucketId() == null) return 0; + return bucket1.getBucketId().getValue().compareTo(bucket2.getBucketId().getValue()); }; - private GroupConvertor() { - - } - - public static GroupModInputBuilder toGroupModInput( - - org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group source, short version,BigInteger datapathid) { - List bucketLists = null; - GroupModInputBuilder groupModInputBuilder = new GroupModInputBuilder(); - if (source instanceof AddGroupInput) { - groupModInputBuilder.setCommand(GroupModCommand.OFPGCADD); - } else if (source instanceof RemoveGroupInput) { - groupModInputBuilder.setCommand(GroupModCommand.OFPGCDELETE); - } else if (source instanceof UpdatedGroup) { - groupModInputBuilder.setCommand(GroupModCommand.OFPGCMODIFY); - } - - if (GroupTypes.GroupAll.equals(source.getGroupType())) { - groupModInputBuilder.setType(GroupType.OFPGTALL); - } - - if (GroupTypes.GroupSelect.equals(source.getGroupType())) { - groupModInputBuilder.setType(GroupType.OFPGTSELECT); - } - - if (GroupTypes.GroupIndirect.equals(source.getGroupType())) { - groupModInputBuilder.setType(GroupType.OFPGTINDIRECT); - } - - if (GroupTypes.GroupFf.equals(source.getGroupType())) { - groupModInputBuilder.setType(GroupType.OFPGTFF); - } - - groupModInputBuilder.setGroupId(new GroupId(source.getGroupId().getValue())); - // Only if the bucket is configured for the group then add it - // During group deletion donot push the buckets - if(groupModInputBuilder.getCommand() != GroupModCommand.OFPGCDELETE) { - if ((source.getBuckets() != null) && (source.getBuckets().getBucket().size() != 0)) { - - Collections.sort(source.getBuckets().getBucket(), comparator); - - bucketLists = salToOFBucketList(source.getBuckets(), version, source.getGroupType().getIntValue(), datapathid); - groupModInputBuilder.setBucketsList(bucketLists); - } - } - groupModInputBuilder.setVersion(version); - return groupModInputBuilder; - - } - - private static List salToOFBucketList(Buckets buckets, short version, int groupType,BigInteger datapathid) { + private static List salToOFBucketList(Buckets buckets, short version, int groupType, BigInteger datapathid) { final List bucketLists = new ArrayList<>(); final ActionConvertorData data = new ActionConvertorData(version); data.setDatapathId(datapathid); + for (org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket groupBucket : buckets .getBucket()) { BucketsListBuilder bucketBuilder = new BucketsListBuilder(); @@ -126,6 +93,7 @@ public final class GroupConvertor { BucketsList bucket = bucketBuilder.build(); bucketLists.add(bucket); } + return bucketLists; } @@ -154,7 +122,7 @@ public final class GroupConvertor { private static void salToOFBucketListWeight(Bucket groupBucket, BucketsListBuilder bucketBuilder, int groupType) { if (null != groupBucket.getWeight()) { - bucketBuilder.setWeight(groupBucket.getWeight().intValue()); + bucketBuilder.setWeight(groupBucket.getWeight()); } else { bucketBuilder.setWeight(DEFAULT_WEIGHT); if (groupType == GroupType.OFPGTSELECT.getIntValue()) { @@ -163,4 +131,53 @@ public final class GroupConvertor { } } -} + @Override + public Class getType() { + return Group.class; + } + + @Override + public GroupModInputBuilder convert(Group source, VersionDatapathIdConvertorData data) { + GroupModInputBuilder groupModInputBuilder = new GroupModInputBuilder(); + if (source instanceof AddGroupInput) { + groupModInputBuilder.setCommand(GroupModCommand.OFPGCADD); + } else if (source instanceof RemoveGroupInput) { + groupModInputBuilder.setCommand(GroupModCommand.OFPGCDELETE); + } else if (source instanceof UpdatedGroup) { + groupModInputBuilder.setCommand(GroupModCommand.OFPGCMODIFY); + } + + if (GroupTypes.GroupAll.equals(source.getGroupType())) { + groupModInputBuilder.setType(GroupType.OFPGTALL); + } + + if (GroupTypes.GroupSelect.equals(source.getGroupType())) { + groupModInputBuilder.setType(GroupType.OFPGTSELECT); + } + + if (GroupTypes.GroupIndirect.equals(source.getGroupType())) { + groupModInputBuilder.setType(GroupType.OFPGTINDIRECT); + } + + if (GroupTypes.GroupFf.equals(source.getGroupType())) { + groupModInputBuilder.setType(GroupType.OFPGTFF); + } + + groupModInputBuilder.setGroupId(new GroupId(source.getGroupId().getValue())); + + // Only if the bucket is configured for the group then add it + // During group deletion do not push the buckets + if (groupModInputBuilder.getCommand() != GroupModCommand.OFPGCDELETE) { + if ((source.getBuckets() != null) && (source.getBuckets().getBucket().size() != 0)) { + + Collections.sort(source.getBuckets().getBucket(), COMPARATOR); + + List bucketLists = salToOFBucketList(source.getBuckets(), data.getVersion(), source.getGroupType().getIntValue(), data.getDatapathId()); + groupModInputBuilder.setBucketsList(bucketLists); + } + } + + groupModInputBuilder.setVersion(data.getVersion()); + return groupModInputBuilder; + } +} \ No newline at end of file diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupDescStatsResponseConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupDescStatsResponseConvertor.java new file mode 100644 index 0000000000..2556e8722e --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupDescStatsResponseConvertor.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * 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.openflow.md.core.sal.convertor; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import org.opendaylight.openflowplugin.extension.api.path.ActionPath; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.data.ActionResponseConvertorData; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ParametrizedConvertor; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.BucketId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStats; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStatsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStatsKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsList; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.multipart.reply.group.desc.GroupDesc; + +/** + * Converts GroupDesc message from library to MD SAL defined GroupDescStats + * + * Example usage: + *
+ * {@code
+ * VersionConvertorData data = new VersionConvertorData(version);
+ * Optional> salGroupStats = ConvertorManager.getInstance().convert(ofGroupStats, data);
+ * }
+ * 
+ */ +public class GroupDescStatsResponseConvertor implements ParametrizedConvertor, List, VersionConvertorData> { + + private org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets toSALBucketsDesc(List bucketDescStats, short version) { + final ActionResponseConvertorData data = new ActionResponseConvertorData(version); + data.setActionPath(ActionPath.GROUPDESCSTATSUPDATED_GROUPDESCSTATS_BUCKETS_BUCKET_ACTION); + + org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder salBucketsDesc = + new org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder(); + List allBuckets = new ArrayList<>(); + int bucketKey = 0; + + for (BucketsList bucketDetails : bucketDescStats) { + BucketBuilder bucketDesc = new BucketBuilder(); + final Optional> convertedSalActions = + ConvertorManager.getInstance().convert( + bucketDetails.getAction(), data); + + + if (convertedSalActions.isPresent()) { + List actions = new ArrayList<>(); + + int actionKey = 0; + + for (org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action : convertedSalActions.get()) { + ActionBuilder wrappedAction = new ActionBuilder(); + wrappedAction.setAction(action); + wrappedAction.setKey(new ActionKey(actionKey)); + wrappedAction.setOrder(actionKey); + actions.add(wrappedAction.build()); + actionKey++; + } + + bucketDesc.setAction(actions); + } else { + bucketDesc.setAction(Collections.emptyList()); + } + + bucketDesc.setWeight(bucketDetails.getWeight()); + bucketDesc.setWatchPort(bucketDetails.getWatchPort().getValue()); + bucketDesc.setWatchGroup(bucketDetails.getWatchGroup()); + BucketId bucketId = new BucketId((long) bucketKey); + bucketDesc.setBucketId(bucketId); + bucketDesc.setKey(new BucketKey(bucketId)); + bucketKey++; + allBuckets.add(bucketDesc.build()); + } + + salBucketsDesc.setBucket(allBuckets); + return salBucketsDesc.build(); + } + + @Override + public Class getType() { + return GroupDesc.class; + } + + @Override + public List convert(List source, VersionConvertorData data) { + List convertedSALGroupsDesc = new ArrayList<>(); + + for (GroupDesc groupDesc : source) { + GroupDescStatsBuilder salGroupDescStats = new GroupDescStatsBuilder(); + + salGroupDescStats.setBuckets(toSALBucketsDesc(groupDesc.getBucketsList(), data.getVersion())); + salGroupDescStats.setGroupId(new GroupId(groupDesc.getGroupId().getValue())); + salGroupDescStats.setGroupType(GroupTypes.forValue(groupDesc.getType().getIntValue())); + salGroupDescStats.setKey(new GroupDescStatsKey(salGroupDescStats.getGroupId())); + + convertedSALGroupsDesc.add(salGroupDescStats.build()); + } + + return convertedSALGroupsDesc; + } +} \ No newline at end of file diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertor.java index c3e385fc8f..7326adbcf4 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertor.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertor.java @@ -11,24 +11,11 @@ package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Optional; -import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter64; -import org.opendaylight.openflowplugin.extension.api.path.ActionPath; -import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.data.ActionResponseConvertorData; -import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action; -import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.BucketId; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes; -import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket; -import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStats; -import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStatsBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStatsKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.Buckets; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.BucketsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.DurationBuilder; @@ -38,148 +25,71 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStats; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStatsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStatsKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsList; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.group.stats.BucketStats; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.multipart.reply.group.desc.GroupDesc; /** - * Class is an utility class for converting group related statistics messages coming from switch to MD-SAL - * messages. - * @author avishnoi@in.ibm.com + * Converts group related statistics messages coming from switch to MD-SAL messages. * + * Example usage: + *
+ * {@code
+ * Optional> salGroupStats = ConvertorManager.getInstance().convert(ofGroupStats);
+ * }
+ * 
*/ -public class GroupStatsResponseConvertor { +public class GroupStatsResponseConvertor implements Convertor< + List, + List> { - public List toSALGroupStatsList( - List allGroupStats){ - List convertedSALGroups = new ArrayList<>(); - for(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply - .multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStats group: allGroupStats){ - convertedSALGroups.add(toSALGroupStats(group)); - } - return convertedSALGroups; - - } - /** - * Method convert GroupStats message from library to MD SAL defined GroupStats - * @param groupStats GroupStats from library - * @return GroupStats -- GroupStats defined in MD-SAL - */ - public GroupStats toSALGroupStats( - org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply. - multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStats groupStats){ - - GroupStatsBuilder salGroupStats = new GroupStatsBuilder(); - - salGroupStats.setBuckets(toSALBuckets(groupStats.getBucketStats())); - salGroupStats.setByteCount(new Counter64(groupStats.getByteCount())); - - DurationBuilder time = new DurationBuilder(); - time.setSecond(new Counter32(groupStats.getDurationSec())); - time.setNanosecond(new Counter32(groupStats.getDurationNsec())); - - salGroupStats.setDuration(time.build()); - salGroupStats.setGroupId(new GroupId(groupStats.getGroupId().getValue())); - salGroupStats.setPacketCount(new Counter64(groupStats.getPacketCount())); - salGroupStats.setRefCount(new Counter32(groupStats.getRefCount())); - salGroupStats.setKey(new GroupStatsKey(salGroupStats.getGroupId())); - - return salGroupStats.build(); - } - - public Buckets toSALBuckets( - List bucketStats ){ - - BucketsBuilder salBuckets = new BucketsBuilder(); + private Buckets toSALBuckets(List bucketStats) { + BucketsBuilder salBuckets = new BucketsBuilder(); List allBucketStats = new ArrayList<>(); int bucketKey = 0; - for(BucketStats bucketStat : bucketStats){ + + for (BucketStats bucketStat : bucketStats) { BucketCounterBuilder bucketCounter = new BucketCounterBuilder(); bucketCounter.setByteCount(new Counter64(bucketStat.getByteCount())); bucketCounter.setPacketCount(new Counter64(bucketStat.getPacketCount())); - BucketId bucketId = new BucketId((long)bucketKey); + BucketId bucketId = new BucketId((long) bucketKey); bucketCounter.setKey(new BucketCounterKey(bucketId)); bucketCounter.setBucketId(bucketId); bucketKey++; allBucketStats.add(bucketCounter.build()); } + salBuckets.setBucketCounter(allBucketStats); return salBuckets.build(); } - - public List toSALGroupDescStatsList( - List allGroupDescStats, OpenflowVersion ofVersion){ - - List convertedSALGroupsDesc = new ArrayList<>(); - for(GroupDesc groupDesc: allGroupDescStats){ - convertedSALGroupsDesc.add(toSALGroupDescStats(groupDesc, ofVersion)); - } - return convertedSALGroupsDesc; - - } - /** - * Method convert GroupStats message from library to MD SAL defined GroupStats - * @param groupDesc GroupStats from library - * @param ofVersion current ofp version - * @return GroupStats -- GroupStats defined in MD-SAL - */ - public GroupDescStats toSALGroupDescStats(GroupDesc groupDesc, OpenflowVersion ofVersion){ - - GroupDescStatsBuilder salGroupDescStats = new GroupDescStatsBuilder(); - - salGroupDescStats.setBuckets(toSALBucketsDesc(groupDesc.getBucketsList(), ofVersion)); - salGroupDescStats.setGroupId(new GroupId(groupDesc.getGroupId().getValue())); - salGroupDescStats.setGroupType(GroupTypes.forValue(groupDesc.getType().getIntValue())); - salGroupDescStats.setKey(new GroupDescStatsKey(salGroupDescStats.getGroupId())); - - return salGroupDescStats.build(); + @Override + public Class getType() { + return org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStats.class; } - public org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets toSALBucketsDesc( - List bucketDescStats, OpenflowVersion ofVersion ){ - final ActionResponseConvertorData data = new ActionResponseConvertorData(ofVersion.getVersion()); - data.setActionPath(ActionPath.GROUPDESCSTATSUPDATED_GROUPDESCSTATS_BUCKETS_BUCKET_ACTION); + @Override + public List convert(List source) { + List convertedSALGroups = new ArrayList<>(); - org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder salBucketsDesc = - new org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder(); - List allBuckets = new ArrayList<>(); - int bucketKey = 0; - for(BucketsList bucketDetails : bucketDescStats){ - BucketBuilder bucketDesc = new BucketBuilder(); - final Optional> convertedSalActions = - ConvertorManager.getInstance().convert(bucketDetails.getAction(), data); + for (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply + .multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStats groupStats : source) { + GroupStatsBuilder salGroupStats = new GroupStatsBuilder(); - if (convertedSalActions.isPresent()) { - List actions = new ArrayList<>(); - int actionKey = 0; - for (org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action : convertedSalActions.get()) { - ActionBuilder wrappedAction = new ActionBuilder(); - wrappedAction.setAction(action); - wrappedAction.setKey(new ActionKey(actionKey)); - wrappedAction.setOrder(actionKey); - actions.add(wrappedAction.build()); - actionKey++; - } + salGroupStats.setBuckets(toSALBuckets(groupStats.getBucketStats())); + salGroupStats.setByteCount(new Counter64(groupStats.getByteCount())); - bucketDesc.setAction(actions); - } else { - bucketDesc.setAction(Collections.emptyList()); - } + DurationBuilder time = new DurationBuilder(); + time.setSecond(new Counter32(groupStats.getDurationSec())); + time.setNanosecond(new Counter32(groupStats.getDurationNsec())); - bucketDesc.setWeight(bucketDetails.getWeight()); - bucketDesc.setWatchPort(bucketDetails.getWatchPort().getValue()); - bucketDesc.setWatchGroup(bucketDetails.getWatchGroup()); - BucketId bucketId = new BucketId((long)bucketKey); - bucketDesc.setBucketId(bucketId); - bucketDesc.setKey(new BucketKey(bucketId)); - bucketKey++; - allBuckets.add(bucketDesc.build()); + salGroupStats.setDuration(time.build()); + salGroupStats.setGroupId(new GroupId(groupStats.getGroupId().getValue())); + salGroupStats.setPacketCount(new Counter64(groupStats.getPacketCount())); + salGroupStats.setRefCount(new Counter32(groupStats.getRefCount())); + salGroupStats.setKey(new GroupStatsKey(salGroupStats.getGroupId())); + convertedSALGroups.add(salGroupStats.build()); } - salBucketsDesc.setBucket(allBuckets); - return salBucketsDesc.build(); - } + return convertedSALGroups; + } } diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultipartReplyTranslator.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultipartReplyTranslator.java index 98a0c5bec9..94295ca69c 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultipartReplyTranslator.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultipartReplyTranslator.java @@ -20,7 +20,7 @@ import org.opendaylight.openflowplugin.api.openflow.md.core.session.SessionConte import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.FlowStatsResponseConvertor; -import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupStatsResponseConvertor; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData; import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter64; @@ -44,6 +44,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupType; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.SelectLiveness; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.SelectWeight; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStats; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStats; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterConfigStatsUpdatedBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterFeaturesUpdatedBuilder; @@ -112,7 +114,6 @@ public class MultipartReplyTranslator implements IMDMessageTranslator> groupStatsList = ConvertorManager.getInstance().convert(replyBody.getGroupStats()); + message.setGroupStats(groupStatsList.orElse(Collections.emptyList())); logger.debug("Converted group statistics : {}",message.toString()); listDataObject.add(message.build()); return listDataObject; @@ -240,8 +241,9 @@ public class MultipartReplyTranslator implements IMDMessageTranslator> groupDescStatsList = ConvertorManager.getInstance().convert(replyBody.getGroupDesc(), data); + message.setGroupDescStats(groupDescStatsList.orElse(Collections.emptyList())); logger.debug("Converted group statistics : {}",message.toString()); listDataObject.add(message.build()); return listDataObject; diff --git a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupConvertorTest.java b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupConvertorTest.java index f0358c4dfb..73174ede70 100644 --- a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupConvertorTest.java +++ b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupConvertorTest.java @@ -11,8 +11,10 @@ import com.google.common.collect.ImmutableList; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import org.junit.Assert; import org.junit.Test; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData; import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInCaseBuilder; @@ -31,6 +33,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.acti import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.BucketId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets; @@ -46,7 +49,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731 public class GroupConvertorTest { /** - * test of {@link GroupConvertor#toGroupModInput(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, short, java.math.BigInteger)} + * test of {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} } */ @Test public void testGroupModConvertorwithallParameters() { @@ -126,7 +129,10 @@ public class GroupConvertorTest { addGroupBuilder.setBuckets(buckets); - final GroupModInputBuilder outAddGroupInput = GroupConvertor.toGroupModInput(addGroupBuilder.build(), (short) 0X4, BigInteger.valueOf(1)); + VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData((short) 0X4); + data.setDatapathId(BigInteger.valueOf(1)); + + final GroupModInputBuilder outAddGroupInput = convert(addGroupBuilder.build(), data); Assert.assertEquals(GroupModCommand.OFPGCADD, outAddGroupInput.getCommand()); Assert.assertEquals(GroupType.OFPGTALL, outAddGroupInput.getType()); @@ -166,7 +172,7 @@ public class GroupConvertorTest { } /** - * test of {@link GroupConvertor#toGroupModInput(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, short, java.math.BigInteger)} + * test of {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} } */ @Test public void testGroupModConvertorNoBucket() { @@ -176,14 +182,16 @@ public class GroupConvertorTest { addGroupBuilder.setGroupType(GroupTypes.GroupAll); - final GroupModInputBuilder outAddGroupInput = GroupConvertor.toGroupModInput(addGroupBuilder.build(), (short) 0X4, BigInteger.valueOf(1)); + VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData((short) 0X4); + data.setDatapathId(BigInteger.valueOf(1)); + final GroupModInputBuilder outAddGroupInput = convert(addGroupBuilder.build(), data); Assert.assertEquals(GroupModCommand.OFPGCADD, outAddGroupInput.getCommand()); Assert.assertEquals(GroupType.OFPGTALL, outAddGroupInput.getType()); } /** - * test of {@link GroupConvertor#toGroupModInput(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, short, java.math.BigInteger)} + * test of {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} } */ @Test public void testGroupModConvertorBucketwithNOWieghtValuesForGroupTypeFastFailure() { @@ -233,7 +241,10 @@ public class GroupConvertorTest { addGroupBuilder.setBuckets(buckets); - final GroupModInputBuilder outAddGroupInput = GroupConvertor.toGroupModInput(addGroupBuilder.build(), (short) 0X4, BigInteger.valueOf(1)); + VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData((short) 0X4); + data.setDatapathId(BigInteger.valueOf(1)); + + final GroupModInputBuilder outAddGroupInput = convert(addGroupBuilder.build(), data); Assert.assertEquals(GroupModCommand.OFPGCADD, outAddGroupInput.getCommand()); Assert.assertEquals(GroupType.OFPGTFF, outAddGroupInput.getType()); @@ -260,7 +271,7 @@ public class GroupConvertorTest { } /** - * test of {@link GroupConvertor#toGroupModInput(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, short, java.math.BigInteger)} + * test of {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} } */ @Test public void testGroupModConvertSortedBuckets() { @@ -270,88 +281,91 @@ public class GroupConvertorTest { final ArrayList bucket = new ArrayList(); bucket.add(new BucketBuilder() - .setBucketId(new BucketId((long) 4)) - .setWatchPort((long)2) - .setWatchGroup((long) 1) - .setAction(ImmutableList.of(new ActionBuilder() + .setBucketId(new BucketId((long) 4)) + .setWatchPort((long)2) + .setWatchGroup((long) 1) + .setAction(ImmutableList.of(new ActionBuilder() .setOrder(0) .setAction(new OutputActionCaseBuilder() - .setOutputAction(new OutputActionBuilder() - .setOutputNodeConnector(new Uri("openflow:1:2")) - .build()) + .setOutputAction(new OutputActionBuilder() + .setOutputNodeConnector(new Uri("openflow:1:2")) .build()) + .build()) .build())) - .build()); + .build()); bucket.add(new BucketBuilder() - .setBucketId(new BucketId((long) 3)) - .setWatchPort((long)6) - .setWatchGroup((long) 1) - .setAction(ImmutableList.of(new ActionBuilder() + .setBucketId(new BucketId((long) 3)) + .setWatchPort((long)6) + .setWatchGroup((long) 1) + .setAction(ImmutableList.of(new ActionBuilder() .setOrder(0) .setAction(new OutputActionCaseBuilder() - .setOutputAction(new OutputActionBuilder() - .setOutputNodeConnector(new Uri("openflow:1:6")) - .build()) + .setOutputAction(new OutputActionBuilder() + .setOutputNodeConnector(new Uri("openflow:1:6")) .build()) + .build()) .build())) .build()); bucket.add(new BucketBuilder() - .setBucketId(new BucketId((long) 2)) - .setWatchPort((long)5) - .setWatchGroup((long) 1) - .setAction(ImmutableList.of(new ActionBuilder() + .setBucketId(new BucketId((long) 2)) + .setWatchPort((long)5) + .setWatchGroup((long) 1) + .setAction(ImmutableList.of(new ActionBuilder() .setOrder(0) .setAction(new OutputActionCaseBuilder() - .setOutputAction(new OutputActionBuilder() - .setOutputNodeConnector(new Uri("openflow:1:5")) - .build()) + .setOutputAction(new OutputActionBuilder() + .setOutputNodeConnector(new Uri("openflow:1:5")) .build()) + .build()) .build())) .build()); bucket.add(new BucketBuilder() - .setBucketId(new BucketId((long) 1)) - .setWatchPort((long)4) - .setWatchGroup((long) 1) - .setAction(ImmutableList.of(new ActionBuilder() - .setOrder(0) - .setAction(new OutputActionCaseBuilder() - .setOutputAction(new OutputActionBuilder() - .setOutputNodeConnector(new Uri("openflow:1:4")) - .build()) - .build()) - .build())) - .build()); + .setBucketId(new BucketId((long) 1)) + .setWatchPort((long)4) + .setWatchGroup((long) 1) + .setAction(ImmutableList.of(new ActionBuilder() + .setOrder(0) + .setAction(new OutputActionCaseBuilder() + .setOutputAction(new OutputActionBuilder() + .setOutputNodeConnector(new Uri("openflow:1:4")) + .build()) + .build()) + .build())) + .build()); bucket.add(new BucketBuilder() - .setBucketId(new BucketId((long) 0)) - .setWatchPort((long)3) - .setWatchGroup((long) 1) - .setAction(ImmutableList.of(new ActionBuilder() - .setOrder(0) - .setAction(new OutputActionCaseBuilder() - .setOutputAction(new OutputActionBuilder() - .setOutputNodeConnector(new Uri("openflow:1:3")) - .build()) - .build()) - .build())) - .build()); + .setBucketId(new BucketId((long) 0)) + .setWatchPort((long)3) + .setWatchGroup((long) 1) + .setAction(ImmutableList.of(new ActionBuilder() + .setOrder(0) + .setAction(new OutputActionCaseBuilder() + .setOutputAction(new OutputActionBuilder() + .setOutputNodeConnector(new Uri("openflow:1:3")) + .build()) + .build()) + .build())) + .build()); final AddGroupInput input = new AddGroupInputBuilder() - .setGroupId(new GroupId((long) 1)) - .setGroupName("Foo") - .setGroupType(GroupTypes.GroupFf) - .setBuckets(new BucketsBuilder() - .setBucket(bucket) - .build()) - .build(); + .setGroupId(new GroupId((long) 1)) + .setGroupName("Foo") + .setGroupType(GroupTypes.GroupFf) + .setBuckets(new BucketsBuilder() + .setBucket(bucket) + .build()) + .build(); OpenflowPortsUtil.init(); - final GroupModInputBuilder outAddGroupInput = GroupConvertor.toGroupModInput(input, (short) 0X4, BigInteger.valueOf(1)); + VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData((short) 0X4); + data.setDatapathId(BigInteger.valueOf(1)); + + final GroupModInputBuilder outAddGroupInput = convert(input, data); final List bucketList = outAddGroupInput.getBucketsList(); Assert.assertEquals( Long.valueOf(1), bucketList.get(0).getWatchGroup()); @@ -412,7 +426,7 @@ public class GroupConvertorTest { } /** - * test of {@link GroupConvertor#toGroupModInput(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, short, java.math.BigInteger)} )} + * test of {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} } */ @Test public void testGroupModConvertorBucketwithNOWieghtValuesForGroupTypeAll() { @@ -460,7 +474,10 @@ public class GroupConvertorTest { addGroupBuilder.setBuckets(buckets); - final GroupModInputBuilder outAddGroupInput = GroupConvertor.toGroupModInput(addGroupBuilder.build(), (short) 0X4, BigInteger.valueOf(1)); + VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData((short) 0X4); + data.setDatapathId(BigInteger.valueOf(1)); + + final GroupModInputBuilder outAddGroupInput = convert(addGroupBuilder.build(), data); Assert.assertEquals(GroupModCommand.OFPGCADD, outAddGroupInput.getCommand()); Assert.assertEquals(GroupType.OFPGTALL, outAddGroupInput.getType()); @@ -491,4 +508,10 @@ public class GroupConvertorTest { } } + + private GroupModInputBuilder convert(Group group, VersionDatapathIdConvertorData data) { + final Optional outAddGroupInputOptional = ConvertorManager.getInstance().convert(group, data); + Assert.assertTrue("Group convertor not found", outAddGroupInputOptional.isPresent()); + return outAddGroupInputOptional.get(); + } } diff --git a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertorTest2.java b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupDescStatsResponseConvertorTest.java similarity index 70% rename from openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertorTest2.java rename to openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupDescStatsResponseConvertorTest.java index 29ed6b1ef8..79628fd2db 100644 --- a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertorTest2.java +++ b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupDescStatsResponseConvertorTest.java @@ -9,14 +9,20 @@ package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor; import java.util.ArrayList; +import java.util.Collections; import java.util.List; - +import java.util.Optional; import org.junit.Assert; import org.junit.Test; -import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStats; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.CopyTtlInCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.CopyTtlOutCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.DecNwTtlCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PopPbbCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.ActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId; @@ -31,9 +37,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731 * @author michal.polkorab * */ -public class GroupStatsResponseConvertorTest2 { - - GroupStatsResponseConvertor convertor = new GroupStatsResponseConvertor(); +public class GroupDescStatsResponseConvertorTest { /** * Test empty GroupDescStats conversion @@ -42,8 +46,8 @@ public class GroupStatsResponseConvertorTest2 { public void test() { List groupDescStats = new ArrayList<>(); - List statsList = convertor.toSALGroupDescStatsList(groupDescStats, OpenflowVersion.OF13); - + VersionConvertorData data = new VersionConvertorData(OFConstants.OFP_VERSION_1_3); + List statsList = convert(groupDescStats, data); Assert.assertEquals("Wrong groupDesc stats size", 0, statsList.size()); } @@ -56,10 +60,11 @@ public class GroupStatsResponseConvertorTest2 { GroupDescBuilder builder = new GroupDescBuilder(); builder.setType(GroupType.OFPGTALL); builder.setGroupId(new GroupId(42L)); - builder.setBucketsList(new ArrayList()); + builder.setBucketsList(new ArrayList<>()); groupDescStats.add(builder.build()); - List statsList = convertor.toSALGroupDescStatsList(groupDescStats, OpenflowVersion.OF13); + VersionConvertorData data = new VersionConvertorData(OFConstants.OFP_VERSION_1_3); + List statsList = convert(groupDescStats, data); Assert.assertEquals("Wrong groupDesc stats size", 1, statsList.size()); GroupDescStats stat = statsList.get(0); @@ -75,56 +80,100 @@ public class GroupStatsResponseConvertorTest2 { @Test public void testGroupDescStats() { List groupDescStats = new ArrayList<>(); + + // ********************************************** + // First group desc + // ********************************************** GroupDescBuilder builder = new GroupDescBuilder(); builder.setType(GroupType.OFPGTFF); builder.setGroupId(new GroupId(42L)); + + // Buckets for first group desc List bucketsList = new ArrayList<>(); BucketsListBuilder bucketsBuilder = new BucketsListBuilder(); bucketsBuilder.setWeight(16); bucketsBuilder.setWatchPort(new PortNumber(84L)); bucketsBuilder.setWatchGroup(168L); + + // Actions for buckets for first group desc List actions = new ArrayList<>(); ActionBuilder actionBuilder = new ActionBuilder(); + actionBuilder.setActionChoice(new CopyTtlInCaseBuilder().build()); actions.add(actionBuilder.build()); + + // Build bucket with actions bucketsBuilder.setAction(actions); bucketsList.add(bucketsBuilder.build()); + + // Build first group desc builder.setBucketsList(bucketsList); groupDescStats.add(builder.build()); + + // ********************************************** + // Second group desc + // ********************************************** builder = new GroupDescBuilder(); builder.setType(GroupType.OFPGTINDIRECT); builder.setGroupId(new GroupId(50L)); + + // First buckets for second group desc bucketsList = new ArrayList<>(); bucketsBuilder = new BucketsListBuilder(); bucketsBuilder.setWeight(100); bucketsBuilder.setWatchPort(new PortNumber(200L)); bucketsBuilder.setWatchGroup(400L); + + // Actions for first buckets for second group desc actions = new ArrayList<>(); + actionBuilder = new ActionBuilder(); + actionBuilder.setActionChoice(new CopyTtlOutCaseBuilder().build()); actions.add(actionBuilder.build()); + actionBuilder = new ActionBuilder(); + actionBuilder.setActionChoice(new DecNwTtlCaseBuilder().build()); actions.add(actionBuilder.build()); + actionBuilder = new ActionBuilder(); + actionBuilder.setActionChoice(new PopPbbCaseBuilder().build()); actions.add(actionBuilder.build()); + + // Build first bucket with actions bucketsBuilder.setAction(actions); bucketsList.add(bucketsBuilder.build()); + + // Second buckets for second group desc bucketsBuilder = new BucketsListBuilder(); bucketsBuilder.setWeight(5); bucketsBuilder.setWatchPort(new PortNumber(10L)); bucketsBuilder.setWatchGroup(15L); + + // Actions for second buckets for second group desc actions = new ArrayList<>(); + + // Build second bucket with actions bucketsBuilder.setAction(actions); bucketsList.add(bucketsBuilder.build()); + + // Build second group desc builder.setBucketsList(bucketsList); groupDescStats.add(builder.build()); - List statsList = convertor.toSALGroupDescStatsList(groupDescStats, OpenflowVersion.OF13); + VersionConvertorData data = new VersionConvertorData(OFConstants.OFP_VERSION_1_3); + List statsList = convert(groupDescStats, data); Assert.assertEquals("Wrong groupDesc stats size", 2, statsList.size()); + + // ********************************************** + // Test first group desc + // ********************************************** GroupDescStats stat = statsList.get(0); Assert.assertEquals("Wrong type", GroupTypes.GroupFf, stat.getGroupType()); Assert.assertEquals("Wrong group-id", 42, stat.getGroupId().getValue().intValue()); Assert.assertEquals("Wrong key", 42, stat.getKey().getGroupId().getValue().intValue()); Assert.assertEquals("Wrong buckets size", 1, stat.getBuckets().getBucket().size()); + + // Test first bucket for first group desc Bucket bucket = stat.getBuckets().getBucket().get(0); Assert.assertEquals("Wrong type", 0, bucket.getKey().getBucketId().getValue().intValue()); Assert.assertEquals("Wrong type", 0, bucket.getBucketId().getValue().intValue()); @@ -132,17 +181,24 @@ public class GroupStatsResponseConvertorTest2 { Assert.assertEquals("Wrong type", 168, bucket.getWatchGroup().intValue()); Assert.assertEquals("Wrong type", 84, bucket.getWatchPort().intValue()); Assert.assertEquals("Wrong type", 1, bucket.getAction().size()); + + // Test first action for first bucket for first group desc org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list - .Action action = bucket.getAction().get(0); + .Action action = bucket.getAction().get(0); Assert.assertEquals("Wrong type", 0, action.getOrder().intValue()); Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112" + ".action.action.CopyTtlInCase", action.getAction().getImplementedInterface().getName()); + // ********************************************** + // Test second group desc + // ********************************************** stat = statsList.get(1); Assert.assertEquals("Wrong type", GroupTypes.GroupIndirect, stat.getGroupType()); Assert.assertEquals("Wrong group-id", 50, stat.getGroupId().getValue().intValue()); Assert.assertEquals("Wrong key", 50, stat.getKey().getGroupId().getValue().intValue()); Assert.assertEquals("Wrong buckets size", 2, stat.getBuckets().getBucket().size()); + + // Test first bucket for second group desc bucket = stat.getBuckets().getBucket().get(0); Assert.assertEquals("Wrong type", 0, bucket.getKey().getBucketId().getValue().intValue()); Assert.assertEquals("Wrong type", 0, bucket.getBucketId().getValue().intValue()); @@ -150,18 +206,26 @@ public class GroupStatsResponseConvertorTest2 { Assert.assertEquals("Wrong type", 400, bucket.getWatchGroup().intValue()); Assert.assertEquals("Wrong type", 200, bucket.getWatchPort().intValue()); Assert.assertEquals("Wrong type", 3, bucket.getAction().size()); + + // Test first action for first bucket of second group desc action = bucket.getAction().get(0); Assert.assertEquals("Wrong type", 0, action.getOrder().intValue()); Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112" + ".action.action.CopyTtlOutCase", action.getAction().getImplementedInterface().getName()); + + // Test second action for first bucket of second group desc action = bucket.getAction().get(1); Assert.assertEquals("Wrong type", 1, action.getOrder().intValue()); Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112" + ".action.action.DecNwTtlCase", action.getAction().getImplementedInterface().getName()); + + // Test third action for first bucket of second group desc action = bucket.getAction().get(2); Assert.assertEquals("Wrong type", 2, action.getOrder().intValue()); Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112" + ".action.action.PopPbbActionCase", action.getAction().getImplementedInterface().getName()); + + // Test second bucket for second group desc bucket = stat.getBuckets().getBucket().get(1); Assert.assertEquals("Wrong type", 1, bucket.getKey().getBucketId().getValue().intValue()); Assert.assertEquals("Wrong type", 1, bucket.getBucketId().getValue().intValue()); @@ -170,4 +234,9 @@ public class GroupStatsResponseConvertorTest2 { Assert.assertEquals("Wrong type", 10, bucket.getWatchPort().intValue()); Assert.assertEquals("Wrong type", 0, bucket.getAction().size()); } -} \ No newline at end of file + + private List convert(List groupDescStats,VersionConvertorData data) { + Optional> statsListOptional = ConvertorManager.getInstance().convert(groupDescStats, data); + return statsListOptional.orElse(Collections.emptyList()); + } +} diff --git a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertorTest.java b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertorTest.java index df7a135460..64531a5320 100644 --- a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertorTest.java +++ b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertorTest.java @@ -12,6 +12,7 @@ import java.math.BigInteger; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import org.junit.Assert; import org.junit.Test; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.buckets.BucketCounter; @@ -27,8 +28,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731 */ public class GroupStatsResponseConvertorTest { - GroupStatsResponseConvertor convertor = new GroupStatsResponseConvertor(); - /** * Test empty GroupStats conversion */ @@ -36,10 +35,10 @@ public class GroupStatsResponseConvertorTest { public void testEmptyGroupStats() { List groupStats = new ArrayList<>(); - List salGroupStats = convertor.toSALGroupStatsList(groupStats); + Optional> salGroupStats = ConvertorManager.getInstance().convert(groupStats); - Assert.assertEquals("Wrong group stats size", 0, salGroupStats.size()); + Assert.assertFalse("Group stats response should be not present", salGroupStats.isPresent()); } /** @@ -58,12 +57,15 @@ public class GroupStatsResponseConvertorTest { statsBuilder.setBucketStats(new ArrayList()); groupStats.add(statsBuilder.build()); + Optional> salGroupStatsOptional = ConvertorManager.getInstance().convert(groupStats); + Assert.assertTrue("Group stats response convertor not found", salGroupStatsOptional.isPresent()); List salGroupStats = convertor.toSALGroupStatsList(groupStats); + .GroupStats> salGroupStats = salGroupStatsOptional.get(); Assert.assertEquals("Wrong group stats size", 1, salGroupStats.size()); org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply - .GroupStats stat = salGroupStats.get(0); + .GroupStats stat = salGroupStats.get(0); Assert.assertEquals("Wrong group-id", 42, stat.getGroupId().getValue().intValue()); Assert.assertEquals("Wrong ref-count", 24, stat.getRefCount().getValue().intValue()); Assert.assertEquals("Wrong packet count", 54321, stat.getPacketCount().getValue().intValue()); @@ -98,12 +100,15 @@ public class GroupStatsResponseConvertorTest { statsBuilder.setBucketStats(new ArrayList()); groupStats.add(statsBuilder.build()); + Optional> salGroupStatsOptional = ConvertorManager.getInstance().convert(groupStats); + Assert.assertTrue("Group stats response convertor not found", salGroupStatsOptional.isPresent()); List salGroupStats = convertor.toSALGroupStatsList(groupStats); + .GroupStats> salGroupStats = salGroupStatsOptional.get(); Assert.assertEquals("Wrong group stats size", 2, salGroupStats.size()); org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply - .GroupStats stat = salGroupStats.get(0); + .GroupStats stat = salGroupStats.get(0); Assert.assertEquals("Wrong group-id", 42, stat.getGroupId().getValue().intValue()); Assert.assertEquals("Wrong key", 42, stat.getKey().getGroupId().getValue().intValue()); Assert.assertEquals("Wrong ref-count", 24, stat.getRefCount().getValue().intValue()); @@ -148,12 +153,15 @@ public class GroupStatsResponseConvertorTest { statsBuilder.setBucketStats(bucketStats); groupStats.add(statsBuilder.build()); + Optional> salGroupStatsOptional = ConvertorManager.getInstance().convert(groupStats); + Assert.assertTrue("Group stats response convertor not found", salGroupStatsOptional.isPresent()); List salGroupStats = convertor.toSALGroupStatsList(groupStats); + .GroupStats> salGroupStats = salGroupStatsOptional.get(); Assert.assertEquals("Wrong group stats size", 1, salGroupStats.size()); org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply - .GroupStats stat = salGroupStats.get(0); + .GroupStats stat = salGroupStats.get(0); Assert.assertEquals("Wrong group-id", 42, stat.getGroupId().getValue().intValue()); Assert.assertEquals("Wrong ref-count", 24, stat.getRefCount().getValue().intValue()); Assert.assertEquals("Wrong packet count", 54321, stat.getPacketCount().getValue().intValue()); @@ -169,4 +177,4 @@ public class GroupStatsResponseConvertorTest { Assert.assertEquals("Wrong bucket packet count", 456, list.get(1).getPacketCount().getValue().intValue()); Assert.assertEquals("Wrong bucket byte count", 123, list.get(1).getByteCount().getValue().intValue()); } -} \ No newline at end of file +}