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.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;
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;
* Decodes the SAL - Group Mod Message and encodes into a OF
* Library for the OFPT_GROUP_MOD Message. Input:SAL Layer Group command data.
*
+ * <p>
* Example usage:
* <pre>
* {@code
* </pre>
*/
public class GroupConvertor extends Convertor<Group, GroupModInputBuilder, VersionDatapathIdConvertorData> {
- private static final List<Class<?>> TYPES = Arrays.asList(Group.class, AddGroupInput.class, RemoveGroupInput.class, UpdatedGroup.class);
+ private static final List<Class<?>> 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(short version) {
+ public static GroupModInputBuilder defaultResult(final short version) {
return new GroupModInputBuilder()
.setVersion(version);
}
private static final Long OFPG_ANY = Long.parseLong("ffffffff", 16);
private static final Long DEFAULT_WATCH_GROUP = OFPG_ANY;
private static final Comparator<Bucket> COMPARATOR = (bucket1, bucket2) -> {
- if (bucket1.getBucketId() == null || bucket2.getBucketId() == null) return 0;
+ if (bucket1.getBucketId() == null || bucket2.getBucketId() == null) {
+ return 0;
+ }
return bucket1.getBucketId().getValue().compareTo(bucket2.getBucketId().getValue());
};
- private List<BucketsList> salToOFBucketList(Buckets buckets, short version, int groupType, BigInteger datapathid) {
+ private List<BucketsList> salToOFBucketList(final List<Bucket> buckets, final short version, final int groupType,
+ final Uint64 datapathid) {
final List<BucketsList> 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()) {
+ for (org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket groupBucket :
+ buckets) {
BucketsListBuilder bucketBuilder = new BucketsListBuilder();
salToOFBucketListWeight(groupBucket, bucketBuilder, groupType);
}
- 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 {
}
}
- 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 {
}
}
- 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());
} else {
}
@Override
- public GroupModInputBuilder convert(Group source, VersionDatapathIdConvertorData data) {
+ public GroupModInputBuilder convert(final Group source, final VersionDatapathIdConvertorData data) {
GroupModInputBuilder groupModInputBuilder = new GroupModInputBuilder();
if (source instanceof AddGroupInput) {
groupModInputBuilder.setCommand(GroupModCommand.OFPGCADD);
// 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<BucketsList> bucketLists = salToOFBucketList(source.getBuckets(), data.getVersion(), source.getGroupType().getIntValue(), data.getDatapathId());
- groupModInputBuilder.setBucketsList(bucketLists);
+ final Buckets buckets = source.getBuckets();
+ if (buckets != null) {
+ final Map<BucketKey, Bucket> 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<Bucket> bucketList = new ArrayList<>(bucket.values());
+ Collections.sort(bucketList, COMPARATOR);
+ List<BucketsList> bucketLists = salToOFBucketList(bucketList, data.getVersion(),
+ source.getGroupType().getIntValue(), data.getDatapathId());
+ groupModInputBuilder.setBucketsList(bucketLists);
+ }
}
}
groupModInputBuilder.setVersion(data.getVersion());
return groupModInputBuilder;
}
-}
\ No newline at end of file
+}