[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());