[ONOS-4481] Integrate scalable gateway to openstackRouting

 - Modified openstack_routing to use scalable gateway application
 - Add GatewayNode Builder method

Change-Id: Ib12d52009eeb89ab59f01cafe794894aac80985e
diff --git a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingManager.java b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingManager.java
index 406179a..6da1523 100644
--- a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingManager.java
+++ b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingManager.java
@@ -56,6 +56,7 @@
 import org.onosproject.openstacknetworking.OpenstackRoutingService;
 import org.onosproject.openstacknetworking.OpenstackSubjectFactories;
 import org.onosproject.openstacknetworking.OpenstackSwitchingService;
+import org.onosproject.scalablegateway.api.ScalableGatewayService;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.ConsistentMap;
 import org.onosproject.store.service.Serializer;
@@ -113,6 +114,8 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected StorageService storageService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected ScalableGatewayService gatewayService;
 
     private ApplicationId appId;
     private ConsistentMap<Integer, String> tpPortNumMap; // Map<PortNum, allocated VM`s Mac & destionation Ip address>
@@ -444,8 +447,7 @@
 
             if (context.isHandled()) {
                 return;
-            } else if (!context.inPacket().receivedFrom().deviceId().toString()
-                    .equals(config.gatewayBridgeId())) {
+            } else if (!checkGatewayNode(context.inPacket().receivedFrom().deviceId())) {
                 return;
             }
 
@@ -472,16 +474,19 @@
                         }
                     default:
                         int portNum = getPortNum(ethernet.getSourceMAC(), iPacket.getDestinationAddress());
-                        Optional<Port> port =
-                                getExternalPort(pkt.receivedFrom().deviceId(), config.gatewayExternalInterfaceName());
-                        if (port.isPresent()) {
+                        DeviceId deviceId = pkt.receivedFrom().deviceId();
+                        Port port = null;
+                        port = deviceService.getPort(deviceId,
+                                gatewayService.getGatewayExternalPorts(deviceId).get(0));
+                        if (port != null) {
                             OpenstackPort openstackPort = getOpenstackPort(ethernet.getSourceMAC(),
                                     Ip4Address.valueOf(iPacket.getSourceAddress()));
                             l3EventExecutorService.execute(new OpenstackPnatHandler(rulePopulator, context,
-                                    portNum, openstackPort, port.get(), config));
+                                    portNum, openstackPort, port, config));
                         } else {
                             log.warn("There`s no external interface");
                         }
+
                         break;
                 }
             } else if (ethernet.getEtherType() == Ethernet.TYPE_ARP) {
@@ -511,6 +516,10 @@
 
     }
 
+    private boolean checkGatewayNode(DeviceId deviceId) {
+        return gatewayService.getGatewayDeviceIds().contains(deviceId);
+    }
+
     private void clearPortNumMap() {
         tpPortNumMap.entrySet().forEach(e -> {
             if (System.currentTimeMillis() - e.getValue().creationTime() > PNAT_PORT_EXPIRE_TIME) {
@@ -600,21 +609,12 @@
             return;
         }
 
-        checkNotNull(config.physicalRouterMac());
-        checkNotNull(config.gatewayBridgeId());
-        checkNotNull(config.gatewayExternalInterfaceMac());
-        checkNotNull(config.gatewayExternalInterfaceName());
-
-        log.warn("Configured info: {}, {}, {}, {}", config.physicalRouterMac(), config.gatewayBridgeId(),
-                config.gatewayExternalInterfaceMac(), config.gatewayExternalInterfaceName());
-
-        rulePopulator = new OpenstackRoutingRulePopulator(appId,
-                openstackService, flowObjectiveService, deviceService, driverService, config);
-
+        rulePopulator = new OpenstackRoutingRulePopulator(appId, openstackService, flowObjectiveService,
+                deviceService, driverService, config, gatewayService);
         openstackIcmpHandler = new OpenstackIcmpHandler(packetService, deviceService,
-                openstackService, config, openstackSwitchingService);
-        openstackArpHandler = new OpenstackRoutingArpHandler(packetService, openstackService, config);
-
+                openstackService, config, openstackSwitchingService, gatewayService);
+        openstackArpHandler = new OpenstackRoutingArpHandler(packetService, openstackService,
+                config, gatewayService);
         openstackIcmpHandler.requestPacket(appId);
         openstackArpHandler.requestPacket(appId);