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;
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;
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;
}
/* 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();