Fixed null providers & custom topo simulator to work across stop/starts.

Change-Id: Id8eeca73c8fc021c351d365ef009b3a95562763a
diff --git a/providers/null/src/main/java/org/onosproject/provider/nil/cli/CreateNullEntity.java b/providers/null/src/main/java/org/onosproject/provider/nil/cli/CreateNullEntity.java
index ed68dfc..368fa3d 100644
--- a/providers/null/src/main/java/org/onosproject/provider/nil/cli/CreateNullEntity.java
+++ b/providers/null/src/main/java/org/onosproject/provider/nil/cli/CreateNullEntity.java
@@ -17,6 +17,7 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.primitives.Longs;
+import org.onlab.util.Tools;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
@@ -96,11 +97,19 @@
         EdgePortService eps = get(EdgePortService.class);
         HostService hs = get(HostService.class);
 
-        List<ConnectPoint> points = ImmutableList
-                .sortedCopyOf((l, r) -> Longs.compare(l.port().toLong(), r.port().toLong()),
-                              eps.getEdgePoints(deviceId));
-        return points.stream()
-                .filter(p -> !Objects.equals(p, otherPoint) && hs.getConnectedHosts(p).isEmpty())
-                .findFirst().orElse(null);
+        // As there may be a slight delay in edge service getting updated, retry a few times
+        for (int i = 0; i < 3; i++) {
+            List<ConnectPoint> points = ImmutableList
+                    .sortedCopyOf((l, r) -> Longs.compare(l.port().toLong(), r.port().toLong()),
+                                  eps.getEdgePoints(deviceId));
+            ConnectPoint point = points.stream()
+                    .filter(p -> !Objects.equals(p, otherPoint) && hs.getConnectedHosts(p).isEmpty())
+                    .findFirst().orElse(null);
+            if (point != null) {
+                return point;
+            }
+            Tools.delay(100);
+        }
+        return null;
     }
 }
diff --git a/providers/null/src/main/java/org/onosproject/provider/nil/cli/NullControlCommand.java b/providers/null/src/main/java/org/onosproject/provider/nil/cli/NullControlCommand.java
index bfca14e..0b3fbe3 100644
--- a/providers/null/src/main/java/org/onosproject/provider/nil/cli/NullControlCommand.java
+++ b/providers/null/src/main/java/org/onosproject/provider/nil/cli/NullControlCommand.java
@@ -19,7 +19,6 @@
 import org.apache.karaf.shell.commands.Command;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.provider.nil.CustomTopologySimulator;
 import org.onosproject.provider.nil.NullProviders;
 import org.onosproject.provider.nil.TopologySimulator;
 
@@ -32,38 +31,32 @@
         description = "Starts or stops topology simulation")
 public class NullControlCommand extends AbstractShellCommand {
 
-    private static final String CUSTOM = "custom";
-
     @Argument(index = 0, name = "cmd", description = "Control command: start/stop",
-            required = true, multiValued = false)
+            required = true)
     String cmd = null;
 
     @Argument(index = 1, name = "topoShape",
             description = "Topology shape: e.g. configured, linear, reroute, " +
-                    "centipede, tree, spineleaf, mesh, fattree, custom",
-            required = false, multiValued = false)
+                    "centipede, tree, spineleaf, mesh, fattree, custom")
     String topoShape = null;
 
     @Override
     protected void execute() {
         ComponentConfigService service = get(ComponentConfigService.class);
+        // If there is an existing topology; make sure it's stopped before restarting
+        if (cmd.equals(START)) {
+            NullProviders npService = get(NullProviders.class);
+            TopologySimulator simulator = npService.currentSimulator();
+            if (simulator != null) {
+                simulator.tearDownTopology();
+            }
+        }
+
         if (topoShape != null) {
             service.setProperty(NullProviders.class.getName(), "topoShape", topoShape);
         }
         service.setProperty(NullProviders.class.getName(), "enabled",
                             cmd.equals(START) ? "true" : "false");
-
-        // If we are re-starting the "custom" topology, reset the counts
-        //  on the auto-assigned IDs for null-devices and null-hosts, so that
-        //  scripts can rely on consistent assignment of IDs to nodes.
-        if (CUSTOM.equals(topoShape) && START.equals(cmd)) {
-            NullProviders npService = get(NullProviders.class);
-            TopologySimulator simulator = npService.currentSimulator();
-            if (simulator instanceof CustomTopologySimulator) {
-                CustomTopologySimulator sim = (CustomTopologySimulator) simulator;
-                sim.resetIdSeeds();
-            }
-        }
     }
 
 }