Fixes setFakeGatewayArpRule called with in case of openstack node event.

Change-Id: I5b3177b8d41342e1adef4b700f02fc8555039fb1
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java
index d089ae6..45928ba 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java
@@ -17,6 +17,7 @@
 
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -217,7 +218,7 @@
         VlanId vlanId = externalPeerRouter == null ? VlanId.NONE : externalPeerRouter.externalPeerRouterVlanId();
 
         if (exGateway == null) {
-            osNetworkAdminService.deleteExternalPeerRouter(exGateway);
+            deleteUnassociatedExternalPeerRouter();
             osRouterService.routerInterfaces(osRouter.getId()).forEach(iface -> setSourceNat(iface, false));
         } else {
             osNetworkAdminService.deriveExternalPeerRouterMac(exGateway, osRouter, vlanId);
@@ -226,6 +227,31 @@
         }
     }
 
+    private void deleteUnassociatedExternalPeerRouter() {
+        log.trace("Deleting unassociated external peer router");
+
+        try {
+            Set<String> routerIps = Sets.newConcurrentHashSet();
+
+            osRouterService.routers().stream()
+                    .filter(router -> getGatewayIpAddress(router) != null)
+                    .map(router -> getGatewayIpAddress(router).toString())
+                    .forEach(routerIps::add);
+
+            osNetworkAdminService.externalPeerRouters().stream()
+                    .filter(externalPeerRouter ->
+                            !routerIps.contains(externalPeerRouter.externalPeerRouterIp().toString()))
+                    .forEach(externalPeerRouter -> {
+                        osNetworkAdminService
+                                .deleteExternalPeerRouter(externalPeerRouter.externalPeerRouterIp().toString());
+                        log.trace("Deleted unassociated external peer router {}",
+                                externalPeerRouter.externalPeerRouterIp().toString());
+                    });
+        } catch (Exception e) {
+            log.error("Exception occurred because of {}", e.toString());
+        }
+    }
+
     private void routerRemove(Router osRouter) {
         osRouterService.routerInterfaces(osRouter.getId()).forEach(iface -> {
             Network network = osNetworkAdminService.network(osNetworkAdminService.subnet(iface.getSubnetId())
@@ -357,6 +383,9 @@
 
     private IpAddress getGatewayIpAddress(Router osRouter) {
 
+        if (osRouter.getExternalGatewayInfo() == null) {
+            return null;
+        }
         String extNetId = osNetworkAdminService.network(osRouter.getExternalGatewayInfo().getNetworkId()).getId();
         Optional<Subnet> extSubnet = osNetworkAdminService.subnets().stream()
                 .filter(subnet -> subnet.getNetworkId().equals(extNetId))