BUG-2664 - Buckets in groups are not ordered 44/27544/1
authordimgi <dimgi@intracom-telecom.com>
Mon, 28 Sep 2015 17:24:18 +0000 (20:24 +0300)
committerdimgi <dimgi@intracom-telecom.com>
Mon, 28 Sep 2015 17:24:18 +0000 (20:24 +0300)
Change-Id: I4e199e859656a76842937c6734b821a89ec3bd7c
Signed-off-by: dimgi <dimgi@intracom-telecom.com>
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupConvertor.java
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupConvertorTest.java

index f3d09e4687371f67205a805bab781a3b07cd07c2..5b8fc318b7f258881a882c7ebf4c71115513241c 100644 (file)
@@ -7,15 +7,19 @@
  */
 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
 
-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.GroupTypes;
 import java.math.BigInteger;
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
+
 import org.opendaylight.openflowjava.protocol.api.util.BinContent;
+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.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.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;
@@ -43,6 +47,14 @@ public final class GroupConvertor {
     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<Bucket> comparator = new Comparator<Bucket>(){
+        @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 GroupConvertor() {
 
@@ -53,9 +65,9 @@ public final class GroupConvertor {
     org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group source, short version,BigInteger datapathid) {
         List<BucketsList> bucketLists = null;
         GroupModInputBuilder groupModInputBuilder = new GroupModInputBuilder();
-        if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInput) {
+        if (source instanceof AddGroupInput) {
             groupModInputBuilder.setCommand(GroupModCommand.OFPGCADD);
-        } else if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInput) {
+        } else if (source instanceof RemoveGroupInput) {
             groupModInputBuilder.setCommand(GroupModCommand.OFPGCDELETE);
         } else if (source instanceof UpdatedGroup) {
             groupModInputBuilder.setCommand(GroupModCommand.OFPGCMODIFY);
@@ -81,6 +93,8 @@ public final class GroupConvertor {
         // 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);
         }
index 6e21e0bcc2873f50e232a08464d0d3fe1bc6ab53..47951e6e0dd0bcafa1e20b568ea474493d07487b 100644 (file)
@@ -9,20 +9,29 @@
  */
 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
 
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
 import org.junit.Assert;
 import org.junit.Test;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.in._case.CopyTtlIn;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.in._case.CopyTtlInBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.group.action._case.GroupAction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.group.action._case.GroupActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.mpls.ttl.action._case.SetMplsTtlAction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.mpls.ttl.action._case.SetMplsTtlActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
+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.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;
@@ -33,9 +42,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev1
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupModCommand;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInputBuilder;
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.List;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsList;
+
+import com.google.common.collect.ImmutableList;
 
 public class GroupConvertorTest {
 
@@ -253,6 +262,117 @@ public class GroupConvertorTest {
         }
     }
 
+    /**
+     * test of {@link GroupConvertor#toGroupModInput(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, short, java.math.BigInteger)}
+     */
+    @Test
+    public void testGroupModConvertSortedBuckets() {
+
+        int actionOrder = 0;
+
+        ArrayList<Bucket> bucket = new ArrayList<Bucket>();
+
+        bucket.add(new BucketBuilder()
+                        .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())
+                                        .build())
+                        .build()))
+        .build());
+
+        bucket.add(new BucketBuilder()
+                        .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())
+                                        .build())
+                        .build()))
+                .build());
+
+        bucket.add(new BucketBuilder()
+                        .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())
+                                        .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());
+
+        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());
+
+
+        AddGroupInput input = new AddGroupInputBuilder()
+                                    .setGroupId(new GroupId((long) 1))
+                                    .setGroupName("Foo")
+                                    .setGroupType(GroupTypes.GroupFf)
+                                    .setBuckets(new BucketsBuilder()
+                                                       .setBucket(bucket)
+                                                       .build())
+                                    .build();
+
+        GroupModInputBuilder outAddGroupInput = GroupConvertor.toGroupModInput(input, (short) 0X4, BigInteger.valueOf(1));
+
+        List<BucketsList> bucketList = outAddGroupInput.getBucketsList();
+        Assert.assertEquals( Long.valueOf(1), bucketList.get(0).getWatchGroup());
+        Assert.assertEquals( Long.valueOf(3), bucketList.get(0).getWatchPort().getValue());
+
+        Assert.assertEquals( Long.valueOf(1), bucketList.get(1).getWatchGroup());
+        Assert.assertEquals( Long.valueOf(4), bucketList.get(1).getWatchPort().getValue());
+
+        Assert.assertEquals( Long.valueOf(1), bucketList.get(2).getWatchGroup());
+        Assert.assertEquals( Long.valueOf(5), bucketList.get(2).getWatchPort().getValue());
+
+        Assert.assertEquals( Long.valueOf(1), bucketList.get(3).getWatchGroup());
+        Assert.assertEquals( Long.valueOf(6), bucketList.get(3).getWatchPort().getValue());
+
+        Assert.assertEquals( Long.valueOf(1), bucketList.get(4).getWatchGroup());
+        Assert.assertEquals( Long.valueOf(2), bucketList.get(4).getWatchPort().getValue());
+
+
+    }
+
     /**
      * @return
      */