Fix: obtain the correct external gateway NAT IP address

1. Add verbose message in stateful SNAT rules installation phase
2. Refactor openstack networking util

Change-Id: Ia74a529657bf0e7b34957053e1411786ba3fe0d5
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingSnatHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingSnatHandler.java
index d835cca..4a8dc7c 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingSnatHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingSnatHandler.java
@@ -116,10 +116,10 @@
 import static org.onosproject.openstacknetworking.api.OpenstackNetwork.Type.VLAN;
 import static org.onosproject.openstacknetworking.impl.OsgiPropertyConstants.USE_STATEFUL_SNAT;
 import static org.onosproject.openstacknetworking.impl.OsgiPropertyConstants.USE_STATEFUL_SNAT_DEFAULT;
-import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.externalIpFromSubnet;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.externalGatewayIpSnatEnabled;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.externalPeerRouterFromSubnet;
-import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getExternalIp;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getPropertyValueAsBoolean;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getRouterFromSubnet;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.tunnelPortNumByNetType;
 import static org.onosproject.openstacknetworking.util.RulePopulatorUtil.CT_NAT_SRC_FLAG;
 import static org.onosproject.openstacknetworking.util.RulePopulatorUtil.buildExtension;
@@ -298,8 +298,17 @@
 
         IpAddress srcIp = IpAddress.valueOf(iPacket.getSourceAddress());
         Subnet srcSubnet = getSourceSubnet(srcInstPort, srcIp);
+
+        Router osRouter = getRouterFromSubnet(srcSubnet, osRouterService);
+
+        if (osRouter == null || osRouter.getExternalGatewayInfo() == null) {
+            // this router does not have external connectivity
+            log.warn("No router is associated with the given subnet {}", srcSubnet);
+            return;
+        }
+
         IpAddress externalGatewayIp =
-                externalIpFromSubnet(srcSubnet, osRouterService, osNetworkService);
+                externalGatewayIpSnatEnabled(osRouter, osNetworkAdminService);
 
         if (externalGatewayIp == null) {
             return;
@@ -804,36 +813,38 @@
         Type netType = osNetworkAdminService.networkType(osSubnet.getNetworkId());
 
         if (netType == FLAT) {
+            log.warn("FLAT typed network does not need SNAT rules");
             return;
         }
 
         Optional<Router> osRouter = osRouterService.routers().stream()
-                .filter(router -> osRouterService.routerInterfaces(routerIface.getId()) != null)
+                .filter(router -> routerIface.getId().equals(router.getId()))
                 .findAny();
 
         if (!osRouter.isPresent()) {
-            log.error("Cannot find a router for router interface {} ", routerIface);
+            log.warn("Cannot find a router attached with the given router interface {} ", routerIface);
             return;
         }
 
-        IpAddress natAddress = getExternalIp(osRouter.get(), osNetworkService);
+        IpAddress natAddress = externalGatewayIpSnatEnabled(osRouter.get(), osNetworkAdminService);
         if (natAddress == null) {
+            log.warn("NAT address is not found");
             return;
         }
 
         IpAddress extRouterAddress = getGatewayIpAddress(osRouter.get());
         if (extRouterAddress == null) {
+            log.warn("External router address is not found");
             return;
         }
 
         ExternalPeerRouter externalPeerRouter =
                 osNetworkService.externalPeerRouter(extRouterAddress);
         if (externalPeerRouter == null) {
+            log.warn("External peer router not found");
             return;
         }
 
-        String netId = osNetworkAdminService.subnet(routerIface.getSubnetId()).getNetworkId();
-
         Map<OpenstackNode, PortRange> gwPortRangeMap = getAssignedPortsForGateway(
                 ImmutableList.copyOf(osNodeService.nodes(GATEWAY)));
 
@@ -865,7 +876,7 @@
             return;
         }
 
-        IpAddress natAddress = getExternalIp(osRouter, osNetworkAdminService);
+        IpAddress natAddress = externalGatewayIpSnatEnabled(osRouter, osNetworkAdminService);
         if (natAddress == null) {
             return;
         }