Enhance the RM logic for Kubevirt Networking App

Change-Id: I84fa678c75ba1e738c68c72ffbc89c54e5309997
(cherry picked from commit 842b3031e5b82a95d1f292fc952e8f091cc1e20b)
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtRoutingArpHandler.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtRoutingArpHandler.java
index 1e5260b..40f492d 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtRoutingArpHandler.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtRoutingArpHandler.java
@@ -235,8 +235,10 @@
                     eventExecutor.execute(() -> processRouterExternalNetAttachedOrGwAttached(event.subject()));
                     break;
                 case KUBEVIRT_ROUTER_REMOVED:
+                    eventExecutor.execute(() -> processRouterRemoved(event.subject()));
+                    break;
                 case KUBEVIRT_ROUTER_EXTERNAL_NETWORK_DETACHED:
-                    eventExecutor.execute(() -> processRouterRemovedOrExternalNetDetached(event.subject(),
+                    eventExecutor.execute(() -> processRouterExternalNetDetached(event.subject(),
                             event.externalIp(), event.externalPeerRouterIp()));
                     break;
                 case KUBEVIRT_GATEWAY_NODE_DETACHED:
@@ -273,8 +275,9 @@
             }
         }
 
-        private void processRouterRemovedOrExternalNetDetached(KubevirtRouter router, String routerSnatIp,
-                                                               String peerRouterIp) {
+        private void processRouterExternalNetDetached(KubevirtRouter router, String routerSnatIp,
+                                                      String peerRouterIp) {
+            log.info("processRouterRemovedOrExternalNetDetached called");
             if (!isRelevantHelper()) {
                 return;
             }
@@ -294,13 +297,42 @@
                     IpAddress.valueOf(peerRouterIp), gatewayNode.hostname(), false);
         }
 
+
+        private void processRouterRemoved(KubevirtRouter router) {
+            if (!isRelevantHelper()) {
+                return;
+            }
+            if (router.electedGateway() == null) {
+                return;
+            }
+            KubevirtNode gatewayNode = kubevirtNodeService.node(router.electedGateway());
+            if (gatewayNode == null) {
+                return;
+            }
+
+            String routerSnatIp = router.external().keySet().stream().findAny().orElse(null);
+            if (routerSnatIp == null) {
+                return;
+            }
+
+            IpAddress peerRouterIp = router.peerRouter().ipAddress();
+            if (peerRouterIp == null) {
+                return;
+            }
+
+            setRuleArpRequestToController(IpAddress.valueOf(routerSnatIp),
+                    peerRouterIp, gatewayNode.hostname(), false);
+        }
+
         private void processRouterGatewayNodeDetached(KubevirtRouter router, String detachedGatewayNode) {
             if (!isRelevantHelper()) {
                 return;
             }
+
             if (detachedGatewayNode == null) {
                 return;
             }
+
             String routerSnatIp = router.external().keySet().stream().findAny().orElse(null);
             if (routerSnatIp == null) {
                 return;