Parallelize probing the E-W and N-S VMs reachability

Change-Id: Ib52fc905a0af167dc08aac8672f9e2e527af3055
diff --git a/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/OpenstackEastWestProbeCommand.java b/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/OpenstackEastWestProbeCommand.java
index 918bff6..53cfb31 100644
--- a/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/OpenstackEastWestProbeCommand.java
+++ b/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/OpenstackEastWestProbeCommand.java
@@ -33,8 +33,11 @@
 
 import java.util.Optional;
 import java.util.Set;
+import java.util.concurrent.ExecutorService;
 import java.util.stream.Collectors;
 
+import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
+import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.openstacknetworking.api.InstancePort.State.ACTIVE;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.COMPUTE;
 
@@ -59,6 +62,9 @@
             required = false, multiValued = true)
     private String[] vmIps = null;
 
+    private final ExecutorService probeExecutor = newSingleThreadScheduledExecutor(
+            groupedThreads(this.getClass().getSimpleName(), "probe-handler", log));
+
     @Override
     protected void execute() {
         OpenstackTroubleshootService tsService = get(OpenstackTroubleshootService.class);
@@ -142,7 +148,8 @@
             dstIps.stream()
                     .filter(ip -> instPort(instPortService, ip) != null)
                     .map(ip -> instPort(instPortService, ip))
-                    .forEach(port -> printReachability(tsService.probeEastWest(srcPort, port)));
+                    .forEach(port -> probeExecutor.execute(() ->
+                            printReachability(tsService.probeEastWest(srcPort, port))));
         }
     }
 
diff --git a/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/OpenstackNorthSouthProbeCommand.java b/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/OpenstackNorthSouthProbeCommand.java
index c409641..3088d82 100644
--- a/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/OpenstackNorthSouthProbeCommand.java
+++ b/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/OpenstackNorthSouthProbeCommand.java
@@ -31,7 +31,10 @@
 import org.onosproject.openstacktroubleshoot.api.Reachability;
 
 import java.util.Set;
+import java.util.concurrent.ExecutorService;
 
+import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
+import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.openstacknetworking.api.InstancePort.State.ACTIVE;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
 
@@ -56,6 +59,9 @@
             required = false, multiValued = true)
     private String[] vmIps = null;
 
+    private final ExecutorService probeExecutor = newSingleThreadScheduledExecutor(
+            groupedThreads(this.getClass().getSimpleName(), "probe-handler", log));
+
     @Override
     protected void execute() {
         OpenstackTroubleshootService tsService = get(OpenstackTroubleshootService.class);
@@ -106,7 +112,8 @@
             }
 
             printHeader();
-            ports.forEach(port -> printReachability(tsService.probeNorthSouth(port)));
+            ports.forEach(port -> probeExecutor.execute(() ->
+                    printReachability(tsService.probeNorthSouth(port))));
         }
     }