CLI command to help debug the mapping of next-Objectives to the
groups that are created by device drivers.

Change-Id: Iff9e04e5e96b2cabbdb40e83215315d2e27791a6
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/CentecV350Pipeline.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/CentecV350Pipeline.java
index 9203a00..6cafdb4 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/pipeline/CentecV350Pipeline.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/CentecV350Pipeline.java
@@ -74,6 +74,7 @@
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.List;
 import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.Executors;
@@ -634,4 +635,10 @@
         }
 
     }
+
+    @Override
+    public List<String> getNextMappings(NextGroup nextGroup) {
+        // TODO Implementation deferred to vendor
+        return null;
+    }
 }
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/DefaultSingleTablePipeline.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/DefaultSingleTablePipeline.java
index a58aeff..8e37746 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/pipeline/DefaultSingleTablePipeline.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/DefaultSingleTablePipeline.java
@@ -17,6 +17,7 @@
 
 import org.onlab.osgi.ServiceDirectory;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.behaviour.NextGroup;
 import org.onosproject.net.behaviour.Pipeliner;
 import org.onosproject.net.behaviour.PipelinerContext;
 import org.onosproject.net.driver.AbstractHandlerBehaviour;
@@ -39,6 +40,8 @@
 
 import static org.slf4j.LoggerFactory.getLogger;
 
+import java.util.List;
+
 /**
  * Simple single table pipeline abstraction.
  */
@@ -167,4 +170,10 @@
     public void next(NextObjective nextObjective) {
     }
 
+    @Override
+    public List<String> getNextMappings(NextGroup nextGroup) {
+        // Default single table pipeline does not use nextObjectives or groups
+        return null;
+    }
+
 }
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/OFDPA2Pipeline.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/OFDPA2Pipeline.java
index 2b27f0e..72fe8aa 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/pipeline/OFDPA2Pipeline.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/OFDPA2Pipeline.java
@@ -1029,4 +1029,28 @@
     protected static void fail(Objective obj, ObjectiveError error) {
         obj.context().ifPresent(context -> context.onError(obj, error));
     }
+
+
+    @Override
+    public List<String> getNextMappings(NextGroup nextGroup) {
+        List<String> mappings = new ArrayList<>();
+        List<Deque<GroupKey>> gkeys = appKryo.deserialize(nextGroup.data());
+        for (Deque<GroupKey> gkd : gkeys) {
+            Group lastGroup = null;
+            String gchain = "";
+            for (GroupKey gk : gkd) {
+                Group g = groupService.getGroup(deviceId, gk);
+                gchain += "  0x" + Integer.toHexString(g.id().id()) + " -->";
+                lastGroup = g;
+            }
+            // add port information for last group in group-chain
+            for (Instruction i: lastGroup.buckets().buckets().get(0).treatment().allInstructions()) {
+                if (i instanceof OutputInstruction) {
+                    gchain += " port:" + ((OutputInstruction) i).port();
+                }
+            }
+            mappings.add(gchain);
+        }
+        return mappings;
+    }
 }
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/OVSCorsaPipeline.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/OVSCorsaPipeline.java
index 7e9dfec..b47012d 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/pipeline/OVSCorsaPipeline.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/OVSCorsaPipeline.java
@@ -72,6 +72,7 @@
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.List;
 import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.Executors;
@@ -857,4 +858,10 @@
         }
 
     }
+
+    @Override
+    public List<String> getNextMappings(NextGroup nextGroup) {
+        // TODO Implementation deferred to vendor
+        return null;
+    }
 }
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/OltPipeline.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/OltPipeline.java
index 8c1307a..0d78def 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/pipeline/OltPipeline.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/OltPipeline.java
@@ -702,4 +702,10 @@
         }
 
     }
+
+    @Override
+    public List<String> getNextMappings(NextGroup nextGroup) {
+        // TODO Implementation deferred to vendor
+        return null;
+    }
 }
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/PicaPipeline.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/PicaPipeline.java
index 14b729c..65c3b72 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/pipeline/PicaPipeline.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/PicaPipeline.java
@@ -537,4 +537,10 @@
             return appKryo.serialize(nextActions);
         }
     }
+
+    @Override
+    public List<String> getNextMappings(NextGroup nextGroup) {
+        // TODO Implementation deferred to vendor
+        return null;
+    }
 }
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/SoftRouterPipeline.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/SoftRouterPipeline.java
index 55e8bbf..0379c0e 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/pipeline/SoftRouterPipeline.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/SoftRouterPipeline.java
@@ -57,6 +57,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.List;
 import java.util.Objects;
 
 import static org.onlab.util.Tools.delay;
@@ -467,4 +468,10 @@
 
     }
 
+    @Override
+    public List<String> getNextMappings(NextGroup nextGroup) {
+        // nextObjectives converted to flow-actions not groups
+        return Collections.emptyList();
+    }
+
 }
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/SpringOpenTTP.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/SpringOpenTTP.java
index 50b439f..0d54239 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/pipeline/SpringOpenTTP.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/SpringOpenTTP.java
@@ -1126,4 +1126,10 @@
         }
 
     }
+
+    @Override
+    public List<String> getNextMappings(NextGroup nextGroup) {
+        // TODO Implementation deferred to vendor
+        return null;
+    }
 }