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=6250fa2ae205d4c5dffdd69953be701c46d23f40;hpb=7d761342e231f807eba43f50712cbff04489d0e0;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 6250fa2ae2..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,5 +1,5 @@ /* - * 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, @@ -8,15 +8,17 @@ 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.ParametrizedConvertor; +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; @@ -25,6 +27,7 @@ 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; @@ -33,6 +36,7 @@ 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; @@ -40,16 +44,20 @@ 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. * + *

* Example usage: *

  * {@code
  * VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(version);
  * data.setDatapathId(datapathId);
- * Optional ofGroup = ConvertorManager.getInstance().convert(salGroup, data);
+ * Optional ofGroup = convertorManager.convert(salGroup, data);
  * }
  * 
*/ -public class GroupConvertor implements ParametrizedConvertor { +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. @@ -57,7 +65,7 @@ public class GroupConvertor implements ParametrizedConvertor 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 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<>(); 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); salToOFBucketListWatchGroup(groupBucket, bucketBuilder, groupType); salToOFBucketListWatchPort(groupBucket, bucketBuilder, groupType); - Optional> bucketActionList = ConvertorManager.getInstance().convert( + Optional> bucketActionList = getConvertorExecutor().convert( groupBucket.getAction(), data); bucketBuilder.setAction(bucketActionList.orElse(Collections.emptyList())); @@ -98,7 +109,8 @@ public class GroupConvertor implements ParametrizedConvertor getType() { - return Group.class; + public Collection> getTypes() { + return TYPES; } @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); @@ -168,16 +182,22 @@ public class GroupConvertor implements ParametrizedConvertor bucketLists = salToOFBucketList(source.getBuckets(), data.getVersion(), source.getGroupType().getIntValue(), data.getDatapathId()); - groupModInputBuilder.setBucketsList(bucketLists); + 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; } -} \ No newline at end of file +}