Adding a grid topology simulator to the null provider.

Change-Id: Ie655840febc11d3986f1c8ec5c8ef2374014794c
diff --git a/providers/null/src/main/java/org/onosproject/provider/nil/NullProviders.java b/providers/null/src/main/java/org/onosproject/provider/nil/NullProviders.java
index 68c536b..fb1823d 100644
--- a/providers/null/src/main/java/org/onosproject/provider/nil/NullProviders.java
+++ b/providers/null/src/main/java/org/onosproject/provider/nil/NullProviders.java
@@ -54,6 +54,7 @@
 import org.slf4j.Logger;
 
 import java.util.Dictionary;
+import java.util.Objects;
 import java.util.Properties;
 
 import static com.google.common.base.Strings.isNullOrEmpty;
@@ -116,7 +117,6 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected PacketProviderRegistry packetProviderRegistry;
 
-
     private final NullDeviceProvider deviceProvider = new NullDeviceProvider();
     private final NullLinkProvider linkProvider = new NullLinkProvider();
     private final NullHostProvider hostProvider = new NullHostProvider();
@@ -138,7 +138,7 @@
 
     private static final String DEFAULT_TOPO_SHAPE = "configured";
     @Property(name = "topoShape", value = DEFAULT_TOPO_SHAPE,
-            label = "Topology shape: configured, linear, reroute, tree, spineleaf, mesh")
+            label = "Topology shape: configured, linear, reroute, tree, spineleaf, mesh, grid")
     private String topoShape = DEFAULT_TOPO_SHAPE;
 
     private static final int DEFAULT_DEVICE_COUNT = 10;
@@ -238,7 +238,7 @@
         }
 
         // Any change in the following parameters implies hard restart
-        if (newEnabled != enabled || !newTopoShape.equals(topoShape) ||
+        if (newEnabled != enabled || !Objects.equals(newTopoShape, topoShape) ||
                 newDeviceCount != deviceCount || newHostCount != hostCount) {
             enabled = newEnabled;
             topoShape = newTopoShape;
@@ -257,7 +257,7 @@
         }
 
         // Any change in mastership implies just reassignments.
-        if (!newMastership.equals(mastership)) {
+        if (!Objects.equals(newMastership, mastership)) {
             mastership = newMastership;
             reassignMastership();
         }
@@ -290,6 +290,29 @@
         }
     }
 
+    /**
+     * Fails the specified device.
+     *
+     * @param deviceId device identifier
+     */
+    public void failDevice(DeviceId deviceId) {
+        if (enabled) {
+            topologyMutationDriver.failDevice(deviceId);
+        }
+    }
+
+    /**
+     * Repairs the specified device.
+     *
+     * @param deviceId device identifier
+     */
+    public void repairDevice(DeviceId deviceId) {
+        if (enabled) {
+            topologyMutationDriver.repairDevice(deviceId);
+        }
+    }
+
+
     // Resets simulation based on the current configuration parameters.
     private void restartSimulation() {
         tearDown();
@@ -310,7 +333,8 @@
         packetProvider.start(packetRate, hostService, deviceService,
                              packetProviderService);
         topologyMutationDriver.start(mutationRate, linkService, deviceService,
-                                     linkProviderService);
+                                     linkProviderService, deviceProviderService,
+                                     simulator);
     }
 
     // Selects the simulator based on the specified name.
@@ -329,6 +353,8 @@
             return new SpineLeafTopologySimulator();
         } else if (topoShape.matches("mesh([,].*|$)")) {
             return new MeshTopologySimulator();
+        } else if (topoShape.matches("grid([,].*|$)")) {
+            return new GridTopologySimulator();
         } else {
             return new ConfiguredTopologySimulator();
         }
@@ -398,7 +424,8 @@
         @Override
         public boolean isReachable(DeviceId deviceId) {
             return topoShape.equals("configured") ||
-                    (simulator != null && simulator.contains(deviceId));
+                    (simulator != null && simulator.contains(deviceId) &&
+                            topologyMutationDriver.isReachable(deviceId));
         }
 
         @Override