[ONOS-7444] Optimize SONA gw doesn't use vrouter app and quagga anymore
- Done: Deriving MAC address from external peer router, SNAT, Floating IP-based routing, SNAT with VLAN
- Todo: Floating IP-based routing with VLAN, GW loadbalancing
Change-Id: I718b71eaf64a40049fc86687f10432446bb1b5bf
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 6d2f70b..42a3da4 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
@@ -49,6 +49,7 @@
import org.onosproject.net.flow.TrafficTreatment;
import org.onosproject.net.flow.instructions.ExtensionTreatment;
import org.onosproject.openstacknetworking.api.Constants;
+import org.onosproject.openstacknetworking.api.ExternalPeerRouter;
import org.onosproject.openstacknetworking.api.InstancePort;
import org.onosproject.openstacknetworking.api.InstancePortEvent;
import org.onosproject.openstacknetworking.api.InstancePortListener;
@@ -211,16 +212,17 @@
setRouterAdminRules(network.getProviderSegID(), network.getNetworkType(), !osRouter.isAdminStateUp());
});
+
+ ExternalPeerRouter externalPeerRouter = osNetworkService.externalPeerRouter(exGateway);
+ VlanId vlanId = externalPeerRouter == null ? VlanId.NONE : externalPeerRouter.externalPeerRouterVlanId();
+
if (exGateway == null) {
osNetworkService.deleteExternalPeerRouter(exGateway);
- osRouterService.routerInterfaces(osRouter.getId()).forEach(iface -> {
- setSourceNat(osRouter, iface, false);
- });
+ osRouterService.routerInterfaces(osRouter.getId()).forEach(iface -> setSourceNat(iface, false));
} else {
- osNetworkService.deriveExternalPeerRouterMac(exGateway, osRouter);
- osRouterService.routerInterfaces(osRouter.getId()).forEach(iface -> {
- setSourceNat(osRouter, iface, exGateway.isEnableSnat());
- });
+ osNetworkService.deriveExternalPeerRouterMac(exGateway, osRouter, vlanId);
+ osRouterService.routerInterfaces(osRouter.getId()).forEach(iface ->
+ setSourceNat(iface, exGateway.isEnableSnat()));
}
}
@@ -251,7 +253,7 @@
setGatewayIcmp(osSubnet, true);
ExternalGateway exGateway = osRouter.getExternalGatewayInfo();
if (exGateway != null && exGateway.isEnableSnat()) {
- setSourceNat(osRouter, osRouterIface, true);
+ setSourceNat(osRouterIface, true);
}
log.info("Connected subnet({}) to {}", osSubnet.getCidr(), osRouter.getName());
}
@@ -275,12 +277,12 @@
setGatewayIcmp(osSubnet, false);
ExternalGateway exGateway = osRouter.getExternalGatewayInfo();
if (exGateway != null && exGateway.isEnableSnat()) {
- setSourceNat(osRouter, osRouterIface, false);
+ setSourceNat(osRouterIface, false);
}
log.info("Disconnected subnet({}) from {}", osSubnet.getCidr(), osRouter.getName());
}
- private void setSourceNat(Router osRouter, RouterInterface routerIface, boolean install) {
+ private void setSourceNat(RouterInterface routerIface, boolean install) {
Subnet osSubnet = osNetworkService.subnet(routerIface.getSubnetId());
Network osNet = osNetworkService.network(osSubnet.getNetworkId());
@@ -320,8 +322,8 @@
osNodeService.completeNodes(OpenstackNode.NodeType.GATEWAY)
.forEach(gwNode -> {
- instancePortService.instancePorts(netId).stream()
- .forEach(port -> setRulesForSnatIngressRule(gwNode.intgBridge(),
+ instancePortService.instancePorts(netId)
+ .forEach(port -> setRulesForSnatIngressRule(gwNode.intgBridge(),
Long.parseLong(osNet.getProviderSegID()),
IpPrefix.valueOf(port.ipAddress(), 32),
port.deviceId(),
@@ -427,13 +429,11 @@
}
IpAddress gatewayIp = IpAddress.valueOf(osSubnet.getGateway());
- osNodeService.completeNodes(GATEWAY).forEach(gNode -> {
+ osNodeService.completeNodes(GATEWAY).forEach(gNode ->
setGatewayIcmpRule(
gatewayIp,
gNode.intgBridge(),
- install
- );
- });
+ install));
final String updateStr = install ? MSG_ENABLED : MSG_DISABLED;
log.debug(updateStr + "ICMP to {}", osSubnet.getGateway());