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;
}