Fix: listen correct openstack event to add/remove ext GW ICMP rule

Change-Id: I1082c9b33d3684ae52251de5395eeef735d20f88
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingIcmpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingIcmpHandler.java
index 1ff77a8..d8f5be1 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingIcmpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingIcmpHandler.java
@@ -58,7 +58,6 @@
 import org.slf4j.Logger;
 
 import java.util.Objects;
-import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
 import java.util.stream.Collectors;
@@ -73,7 +72,6 @@
 import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_ICMP_RULE;
 import static org.onosproject.openstacknetworking.api.Constants.ROUTING_TABLE;
 import static org.onosproject.openstacknetworking.impl.OsgiPropertyConstants.USE_STATEFUL_SNAT;
-import static org.onosproject.openstacknetworking.api.OpenstackNetwork.Type.FLAT;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getExternalIp;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getPropertyValueAsBoolean;
 import static org.onosproject.openstacknetworking.util.RulePopulatorUtil.NXM_NX_IP_TTL;
@@ -176,34 +174,31 @@
                 .forEach(cNode -> {
                     setRoutableSubnetsIcmpRules(cNode, segId, osSubnet,
                             routableSubnets, gatewayIp, netType, install);
-                    setExtGatewayIcmpReplyRules(cNode, routerIface,
-                            netType, install);
+                });
+    }
+
+    private void processRouteGatewayEvent(Router osRouter, boolean install) {
+        if (!getStatefulSnatFlag()) {
+            return;
+        }
+
+        osNodeService.completeNodes(COMPUTE).stream()
+                .filter(cNode -> cNode.dataIp() != null)
+                .forEach(cNode -> {
+                    setExtGatewayIcmpReplyRules(cNode, osRouter, install);
                 });
     }
 
     private void setExtGatewayIcmpReplyRules(OpenstackNode osNode,
-                                             RouterInterface routerIface,
-                                             Type networkType, boolean install) {
+                                             Router osRouter,
+                                             boolean install) {
 
-        if (networkType == FLAT) {
-            return;
-        }
-
-        Optional<Router> osRouter = osRouterService.routers().stream()
-                .filter(router -> osRouterService.routerInterfaces(routerIface.getId()) != null)
-                .findAny();
-
-        if (!osRouter.isPresent()) {
-            log.error("Cannot find a router for router interface {} ", routerIface);
-            return;
-        }
-
-        IpAddress natAddress = getExternalIp(osRouter.get(), osNetworkService);
+        IpAddress natAddress = getExternalIp(osRouter, osNetworkService);
         if (natAddress == null) {
             return;
         }
 
-        setGatewayIcmpReplyRule(osNode, null, natAddress, networkType, install);
+        setGatewayIcmpReplyRule(osNode, null, natAddress, null, install);
     }
 
     private void setRoutableSubnetsIcmpRules(OpenstackNode osNode,
@@ -296,6 +291,12 @@
                 case OPENSTACK_ROUTER_INTERFACE_REMOVED:
                     eventExecutor.execute(() -> processRouterIntfRemoval(event));
                     break;
+                case OPENSTACK_ROUTER_GATEWAY_ADDED:
+                    eventExecutor.execute(() -> processRouterGatewayAddition(event));
+                    break;
+                case OPENSTACK_ROUTER_GATEWAY_REMOVED:
+                    eventExecutor.execute(() -> processRouterGatewayRemoval(event));
+                    break;
                 default:
                     // do nothing for the other events
                     break;
@@ -325,6 +326,28 @@
 
             processRouterIntfEvent(event.subject(), event.routerIface(), false);
         }
+
+        private void processRouterGatewayAddition(OpenstackRouterEvent event) {
+            if (!isRelevantHelper()) {
+                return;
+            }
+
+            log.debug("Router external gateway {} added",
+                    event.externalGateway().getNetworkId());
+
+            processRouteGatewayEvent(event.subject(), true);
+        }
+
+        private void processRouterGatewayRemoval(OpenstackRouterEvent event) {
+            if (!isRelevantHelper()) {
+                return;
+            }
+
+            log.debug("Router external gateway {} removed",
+                    event.externalGateway().getNetworkId());
+
+            processRouteGatewayEvent(event.subject(), false);
+        }
     }
 
     private class InternalNodeEventListener implements OpenstackNodeListener {
@@ -358,6 +381,7 @@
                 osRouterService.routerInterfaces(osRouter.getId()).forEach(iface -> {
                     processRouterIntfEvent(osRouter, iface, true);
                 });
+                processRouteGatewayEvent(osRouter, true);
             });
             log.info("Reconfigure routers for {}", osNode.hostname());
         }