X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fopenflow%2Fmd%2Fcore%2Fsal%2Fconvertor%2FGroupConvertor.java;h=3432d6964dbc2e39f974ebb9106a1f4cbe1766bc;hb=05f8db12159673d0e0a95642fe86e62c14b7dc7b;hp=5b8fc318b7f258881a882c7ebf4c71115513241c;hpb=7eb8bc68860c4ae8624ab671d2f920194a318654;p=openflowplugin.git 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 5b8fc318b7..3432d6964d 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,25 +1,33 @@ -/** - * Copyright (c) 2014 Ericsson India Global Services Pvt Ltd. and others. All rights reserved. +/* + * 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.math.BigInteger; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.List; - +import java.util.Map; +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.Convertor; +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; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketKey; 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.types.rev130731.GroupId; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupModCommand; @@ -28,101 +36,81 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev13 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInputBuilder; 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.buckets.grouping.BucketsListBuilder; +import org.opendaylight.yangtools.yang.common.Uint64; 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.convert(salGroup, data);
+ * }
+ * 
*/ -public final class GroupConvertor { +public class GroupConvertor extends Convertor { + private static final List> TYPES = Arrays.asList(Group.class, AddGroupInput.class, + RemoveGroupInput.class, UpdatedGroup.class); + + /** + * 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(final 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 - 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 List salToOFBucketList(final List buckets, final short version, final int groupType, + final Uint64 datapathid) { final List bucketLists = new ArrayList<>(); - for (org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket groupBucket : buckets - .getBucket()) { + 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) { BucketsListBuilder bucketBuilder = new BucketsListBuilder(); salToOFBucketListWeight(groupBucket, bucketBuilder, groupType); salToOFBucketListWatchGroup(groupBucket, bucketBuilder, groupType); salToOFBucketListWatchPort(groupBucket, bucketBuilder, groupType); - List bucketActionList = ActionConvertor.getActions(groupBucket.getAction(), version, datapathid, null); - bucketBuilder.setAction(bucketActionList); + Optional> bucketActionList = getConvertorExecutor().convert( + groupBucket.getAction(), data); + + bucketBuilder.setAction(bucketActionList.orElse(Collections.emptyList())); BucketsList bucket = bucketBuilder.build(); bucketLists.add(bucket); } + return bucketLists; } - private static void salToOFBucketListWatchPort(Bucket groupBucket, BucketsListBuilder bucketBuilder, int groupType) { + private static void salToOFBucketListWatchPort(final Bucket groupBucket, final BucketsListBuilder bucketBuilder, + final int groupType) { if (null != groupBucket.getWatchPort()) { bucketBuilder.setWatchPort(new PortNumber(groupBucket.getWatchPort())); } else { @@ -133,7 +121,8 @@ public final class GroupConvertor { } } - private static void salToOFBucketListWatchGroup(Bucket groupBucket, BucketsListBuilder bucketBuilder, int groupType) { + private static void salToOFBucketListWatchGroup(final Bucket groupBucket, final BucketsListBuilder bucketBuilder, + final int groupType) { if (null != groupBucket.getWatchGroup()) { bucketBuilder.setWatchGroup(groupBucket.getWatchGroup()); } else { @@ -144,9 +133,10 @@ public final class GroupConvertor { } } - private static void salToOFBucketListWeight(Bucket groupBucket, BucketsListBuilder bucketBuilder, int groupType) { + private static void salToOFBucketListWeight(final Bucket groupBucket, final BucketsListBuilder bucketBuilder, + final 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()) { @@ -155,4 +145,59 @@ public final class GroupConvertor { } } + @Override + public Collection> getTypes() { + return TYPES; + } + + @Override + public GroupModInputBuilder convert(final Group source, final 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) { + final Buckets buckets = source.getBuckets(); + if (buckets != null) { + final Map bucket = buckets.nonnullBucket(); + if (!bucket.isEmpty()) { + // TODO: we should be able to just sort the resulting the resulting list and not go through + // two copies + List bucketList = new ArrayList<>(bucket.values()); + Collections.sort(bucketList, COMPARATOR); + List bucketLists = salToOFBucketList(bucketList, data.getVersion(), + source.getGroupType().getIntValue(), data.getDatapathId()); + groupModInputBuilder.setBucketsList(bucketLists); + } + } + } + + groupModInputBuilder.setVersion(data.getVersion()); + return groupModInputBuilder; + } }