[ONOS-6168, ONOS-6436] Implement multiple gateway nodes support for VLAN mode and implement VLAN based Logical Routing

Change-Id: Ifd1c26375abdf84603f28184e9cb9ad6c88648dd
diff --git a/apps/openstacknode/src/main/java/org/onosproject/openstacknode/OpenstackNodeManager.java b/apps/openstacknode/src/main/java/org/onosproject/openstacknode/OpenstackNodeManager.java
index 4f3e5e7..bea3a41 100644
--- a/apps/openstacknode/src/main/java/org/onosproject/openstacknode/OpenstackNodeManager.java
+++ b/apps/openstacknode/src/main/java/org/onosproject/openstacknode/OpenstackNodeManager.java
@@ -297,7 +297,7 @@
         process(new OpenstackNodeEvent(COMPLETE, node));
         switch (node.type()) {
             case COMPUTE:
-                selectGroupHandler.createGatewayGroup(node.intBridge(), gatewayNodes());
+                selectGroupHandler.createGatewayGroup(node, gatewayNodes());
                 break;
             case GATEWAY:
                 updateGatewayGroup(node, true);
@@ -386,12 +386,15 @@
     }
 
     @Override
-    public synchronized GroupId gatewayGroupId(DeviceId srcDeviceId) {
-        GroupKey groupKey = selectGroupHandler.getGroupKey(srcDeviceId);
+    public synchronized GroupId gatewayGroupId(DeviceId srcDeviceId, NetworkMode networkMode) {
+        GroupKey groupKey = selectGroupHandler.groupKey(srcDeviceId, networkMode);
         Group group = groupService.getGroup(srcDeviceId, groupKey);
+
         if (group == null) {
             log.info("Created gateway group for {}", srcDeviceId);
-            return selectGroupHandler.createGatewayGroup(srcDeviceId, gatewayNodes());
+            selectGroupHandler.createGatewayGroup(nodeByDeviceId(srcDeviceId), gatewayNodes());
+
+            return groupService.getGroup(srcDeviceId, selectGroupHandler.groupKey(srcDeviceId, networkMode)).id();
         } else {
             return group.id();
         }
@@ -425,13 +428,26 @@
                 .stream()
                 .map(Versioned::value)
                 .filter(node -> node.type().equals(NodeType.COMPUTE))
+                .filter(node -> node.dataIp().isPresent())
                 .filter(node -> node.state().equals(COMPLETE))
-                .forEach(node -> {
-                    selectGroupHandler.updateGatewayGroupBuckets(node.intBridge(),
-                            ImmutableList.of(gatewayNode),
-                            isInsert);
-                    log.trace("Updated gateway group on {}", node.intBridge());
+                .forEach(computeNode -> {
+                    selectGroupHandler.updateGatewayGroupBuckets(computeNode,
+                            ImmutableList.of(gatewayNode), NetworkMode.VXLAN, isInsert);
+                    log.trace("Updated gateway group on {} for vxlan mode", computeNode.intBridge());
                 });
+
+        nodeStore.values()
+                .stream()
+                .map(Versioned::value)
+                .filter(node -> node.type().equals(NodeType.COMPUTE))
+                .filter(node -> node.vlanPort().isPresent())
+                .filter(node -> node.state().equals(COMPLETE))
+                .forEach(computeNode -> {
+                    selectGroupHandler.updateGatewayGroupBuckets(computeNode,
+                            ImmutableList.of(gatewayNode), NetworkMode.VLAN, isInsert);
+                    log.trace("Updated gateway group on {} for vlan mode", computeNode.intBridge());
+                });
+
     }
 
     private void initNode(OpenstackNode node) {