[Bug:4069]Ordering chained-groups during reconc 80/27880/1
authorShuva Jyoti Kar <shuva.jyoti.kar@ericsson.com>
Sun, 4 Oct 2015 07:29:18 +0000 (12:59 +0530)
committerShuva Jyoti Kar <shuva.jyoti.kar@ericsson.com>
Sun, 4 Oct 2015 07:33:53 +0000 (13:03 +0530)
Change-Id: I4988d3b8b616a6bab60805cc00c9b04c8f1fea32
Signed-off-by: Shuva Jyoti Kar <shuva.jyoti.kar@ericsson.com>
applications/forwardingrules-manager/src/main/java/org/opendaylight/openflowplugin/applications/frm/impl/FlowNodeReconciliationImpl.java

index 13dfc2ec008454ab261c09be4074343a811bd700..d19281b59312b84b8f9c1aa5d0adc7fef7469690 100644 (file)
@@ -10,9 +10,7 @@ package org.opendaylight.openflowplugin.applications.frm.impl;
 
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.Callable;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
@@ -23,6 +21,8 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.openflowplugin.applications.frm.FlowNodeReconciliation;
 import org.opendaylight.openflowplugin.applications.frm.ForwardingRulesManager;
 import org.opendaylight.openflowplugin.common.wait.SimpleTaskRetryLooper;
+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.list.Action;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.MeterKey;
@@ -30,6 +30,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.ta
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
+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.groups.Group;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
@@ -168,13 +169,43 @@ public class FlowNodeReconciliationImpl implements FlowNodeReconciliation {
             }
 
             /* Groups - have to be first */
-            List<Group> groups = flowNode.get().getGroup() != null
-                    ? flowNode.get().getGroup() : Collections.<Group> emptyList();
-            for (Group group : groups) {
-                final KeyedInstanceIdentifier<Group, GroupKey> groupIdent =
-                        nodeIdent.child(Group.class, group.getKey());
-                this.provider.getGroupCommiter().add(groupIdent, group, nodeIdent);
-            }
+                List<Group> groups = flowNode.get().getGroup() != null
+                        ? flowNode.get().getGroup() : Collections.<Group>emptyList();
+                List<Group> toBeInstalledGroups = new ArrayList<>();
+                toBeInstalledGroups.addAll(groups);
+                List<Long> alreadyInstalledGroupids = new ArrayList<>();
+
+                while (!toBeInstalledGroups.isEmpty()) {
+                    ListIterator<Group> iterator = toBeInstalledGroups.listIterator();
+                    while (iterator.hasNext()) {
+                        Group group = iterator.next();
+                        boolean okToInstall = true;
+                        for (Bucket bucket : group.getBuckets().getBucket()) {
+                            for (Action action : bucket.getAction()) {
+                                if (action.getAction().getImplementedInterface().getName()
+                                        .equals("org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCase")) {
+                                    Long groupId = ((GroupActionCase) (action.getAction())).getGroupAction().getGroupId();
+                                    if (!alreadyInstalledGroupids.contains(groupId)) {
+                                        okToInstall = false;
+                                        break;
+                                    }
+                                }
+                            }
+                            if (!okToInstall){
+                                break;
+                            }
+                        }
+
+
+                        if (okToInstall) {
+                            final KeyedInstanceIdentifier<Group, GroupKey> groupIdent =
+                                    nodeIdent.child(Group.class, group.getKey());
+                            this.provider.getGroupCommiter().add(groupIdent, group, nodeIdent);
+                            alreadyInstalledGroupids.add(group.getGroupId().getValue());
+                            iterator.remove();
+                        }
+                    }
+                }
             /* Meters */
             List<Meter> meters = flowNode.get().getMeter() != null
                     ? flowNode.get().getMeter() : Collections.<Meter> emptyList();