[ONOS-7444] Optimize SONA gw doesn't use vrouter app and quagga anymore

Change-Id: I70fd7a9dbe219a9ea6081d0f19bf051a1bee090a
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java
index 625d41d..7b8cda1 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java
@@ -15,9 +15,6 @@
  */
 package org.onosproject.openstacknode.impl;
 
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -42,11 +39,9 @@
 import org.onosproject.net.behaviour.BridgeName;
 import org.onosproject.net.behaviour.ControllerInfo;
 import org.onosproject.net.behaviour.DefaultBridgeDescription;
-import org.onosproject.net.behaviour.DefaultPatchDescription;
 import org.onosproject.net.behaviour.DefaultTunnelDescription;
 import org.onosproject.net.behaviour.ExtensionTreatmentResolver;
 import org.onosproject.net.behaviour.InterfaceConfig;
-import org.onosproject.net.behaviour.PatchDescription;
 import org.onosproject.net.behaviour.TunnelDescription;
 import org.onosproject.net.behaviour.TunnelEndPoints;
 import org.onosproject.net.behaviour.TunnelKeys;
@@ -54,21 +49,11 @@
 import org.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.flow.DefaultTrafficTreatment;
-import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.flow.instructions.ExtensionPropertyException;
 import org.onosproject.net.flow.instructions.ExtensionTreatment;
-import org.onosproject.net.group.DefaultGroupDescription;
-import org.onosproject.net.group.Group;
-import org.onosproject.net.group.GroupBucket;
-import org.onosproject.net.group.GroupBuckets;
-import org.onosproject.net.group.GroupDescription;
-import org.onosproject.net.group.GroupEvent;
-import org.onosproject.net.group.GroupListener;
-import org.onosproject.net.group.GroupService;
+
 import org.onosproject.openstacknode.api.NodeState;
 import org.onosproject.openstacknode.api.OpenstackNode;
-import org.onosproject.openstacknode.api.OpenstackNode.NetworkMode;
 import org.onosproject.openstacknode.api.OpenstackNodeAdminService;
 import org.onosproject.openstacknode.api.OpenstackNodeEvent;
 import org.onosproject.openstacknode.api.OpenstackNodeHandler;
@@ -87,19 +72,13 @@
 import java.util.concurrent.ExecutorService;
 import java.util.stream.Collectors;
 
-import static com.google.common.base.Preconditions.checkArgument;
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
 import static org.onlab.packet.TpPort.tpPort;
 import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.net.AnnotationKeys.PORT_NAME;
 import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_TUNNEL_DST;
-import static org.onosproject.net.group.DefaultGroupBucket.createSelectGroupBucket;
 import static org.onosproject.openstacknode.api.Constants.*;
-import static org.onosproject.openstacknode.api.Constants.PATCH_INTG_BRIDGE;
 import static org.onosproject.openstacknode.api.NodeState.*;
-import static org.onosproject.openstacknode.api.OpenstackNode.NetworkMode.VLAN;
-import static org.onosproject.openstacknode.api.OpenstackNode.NetworkMode.VXLAN;
-import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.COMPUTE;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
 import static org.onosproject.openstacknode.api.OpenstackNodeService.APP_ID;
 import static org.slf4j.LoggerFactory.getLogger;
@@ -137,9 +116,6 @@
     protected OvsdbController ovsdbController;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected GroupService groupService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected OpenstackNodeService osNodeService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
@@ -157,7 +133,6 @@
 
     private final DeviceListener ovsdbListener = new InternalOvsdbListener();
     private final DeviceListener bridgeListener = new InternalBridgeListener();
-    private final GroupListener groupListener = new InternalGroupListener();
     private final OpenstackNodeListener osNodeListener = new InternalOpenstackNodeListener();
 
     private ApplicationId appId;
@@ -170,7 +145,6 @@
 
         componentConfigService.registerProperties(getClass());
         leadershipService.runForLeadership(appId.name());
-        groupService.addListener(groupListener);
         deviceService.addListener(ovsdbListener);
         deviceService.addListener(bridgeListener);
         osNodeService.addListener(osNodeListener);
@@ -183,7 +157,6 @@
         osNodeService.removeListener(osNodeListener);
         deviceService.removeListener(bridgeListener);
         deviceService.removeListener(ovsdbListener);
-        groupService.removeListener(groupListener);
         componentConfigService.unregisterProperties(getClass(), false);
         leadershipService.withdraw(appId.name());
         eventExecutor.shutdown();
@@ -211,64 +184,31 @@
         if (!deviceService.isAvailable(osNode.intgBridge())) {
             createBridge(osNode, INTEGRATION_BRIDGE, osNode.intgBridge());
         }
-        if (osNode.type() == GATEWAY &&
-                !isBridgeCreated(osNode.ovsdb(), ROUTER_BRIDGE)) {
-            createBridge(osNode, ROUTER_BRIDGE, osNode.routerBridge());
-        }
     }
 
     @Override
     public void processDeviceCreatedState(OpenstackNode osNode) {
-        if (!isOvsdbConnected(osNode)) {
-            ovsdbController.connect(osNode.managementIp(), tpPort(ovsdbPort));
-            return;
-        }
-        if (osNode.type() == GATEWAY && (
-                !isIntfEnabled(osNode, PATCH_INTG_BRIDGE) ||
-                        !isIntfCreated(osNode, PATCH_ROUT_BRIDGE)
-        )) {
-            createPatchInterface(osNode);
-        }
-        if (osNode.dataIp() != null &&
-                !isIntfEnabled(osNode, DEFAULT_TUNNEL)) {
-            createTunnelInterface(osNode);
-        }
-        if (osNode.vlanIntf() != null &&
-                !isIntfEnabled(osNode, osNode.vlanIntf())) {
-            addSystemInterface(osNode, INTEGRATION_BRIDGE, osNode.vlanIntf());
-        }
-    }
+        try {
+            if (!isOvsdbConnected(osNode)) {
+                ovsdbController.connect(osNode.managementIp(), tpPort(ovsdbPort));
+                return;
+            }
 
-    @Override
-    public void processPortCreatedState(OpenstackNode osNode) {
-        switch (osNode.type()) {
-            case COMPUTE:
-                if (osNode.dataIp() != null) {
-                    addOrUpdateGatewayGroup(osNode,
-                            osNodeService.completeNodes(GATEWAY),
-                            VXLAN);
-                }
-                if (osNode.vlanIntf() != null) {
-                    addOrUpdateGatewayGroup(osNode,
-                            osNodeService.completeNodes(GATEWAY),
-                            VLAN);
-                }
-                break;
-            case GATEWAY:
-                Set<OpenstackNode> gateways =
-                        Sets.newHashSet(osNodeService.completeNodes(GATEWAY));
-                gateways.add(osNode);
-                osNodeService.completeNodes(COMPUTE).forEach(n -> {
-                    if (n.dataIp() != null) {
-                        addOrUpdateGatewayGroup(n, gateways, VXLAN);
-                    }
-                    if (n.vlanIntf() != null) {
-                        addOrUpdateGatewayGroup(n, gateways, VLAN);
-                    }
-                });
-                break;
-            default:
-                break;
+            if (osNode.type() == GATEWAY) {
+                addSystemInterface(osNode, INTEGRATION_BRIDGE, osNode.uplinkPort());
+            }
+
+            if (osNode.dataIp() != null &&
+                    !isIntfEnabled(osNode, DEFAULT_TUNNEL)) {
+                createTunnelInterface(osNode);
+            }
+
+            if (osNode.vlanIntf() != null &&
+                    !isIntfEnabled(osNode, osNode.vlanIntf())) {
+                addSystemInterface(osNode, INTEGRATION_BRIDGE, osNode.vlanIntf());
+            }
+        } catch (Exception e) {
+            log.error("Exception occured because of {}", e.toString());
         }
     }
 
@@ -283,28 +223,7 @@
 
     @Override
     public void processIncompleteState(OpenstackNode osNode) {
-        if (osNode.type() == COMPUTE) {
-            if (osNode.dataIp() != null) {
-                groupService.removeGroup(osNode.intgBridge(), osNode.gatewayGroupKey(VXLAN), appId);
-            }
-            if (osNode.vlanIntf() != null) {
-                groupService.removeGroup(osNode.intgBridge(), osNode.gatewayGroupKey(VLAN), appId);
-            }
-        }
-        if (osNode.type() == GATEWAY) {
-            osNodeService.completeNodes(COMPUTE).forEach(n -> {
-                if (n.dataIp() != null) {
-                    addOrUpdateGatewayGroup(n,
-                            osNodeService.completeNodes(GATEWAY),
-                            VXLAN);
-                }
-                if (n.vlanIntf() != null) {
-                    addOrUpdateGatewayGroup(n,
-                            osNodeService.completeNodes(GATEWAY),
-                            VLAN);
-                }
-            });
-        }
+        //TODO
     }
 
     private boolean isOvsdbConnected(OpenstackNode osNode) {
@@ -322,22 +241,16 @@
             return;
         }
 
-        // TODO fix this when we use single ONOS cluster for both openstackNode and vRouter
-        Set<IpAddress> controllerIps;
-        if (bridgeName.equals(ROUTER_BRIDGE)) {
-            // TODO checks if empty controller does not break anything
-            controllerIps = ImmutableSet.of();
-        } else {
-            controllerIps = clusterService.getNodes().stream()
+        Set<IpAddress> controllerIps = clusterService.getNodes().stream()
                     .map(ControllerNode::ip)
                     .collect(Collectors.toSet());
-        }
 
         List<ControllerInfo> controllers = controllerIps.stream()
                 .map(ip -> new ControllerInfo(ip, DEFAULT_OFPORT, DEFAULT_OF_PROTO))
                 .collect(Collectors.toList());
 
         String dpid = deviceId.toString().substring(DPID_BEGIN);
+
         BridgeDescription bridgeDesc = DefaultBridgeDescription.builder()
                 .name(bridgeName)
                 .failMode(BridgeDescription.FailMode.SECURE)
@@ -382,91 +295,6 @@
         ifaceConfig.addTunnelMode(DEFAULT_TUNNEL, tunnelDesc);
     }
 
-    private void createPatchInterface(OpenstackNode osNode) {
-        checkArgument(osNode.type().equals(OpenstackNode.NodeType.GATEWAY));
-        if (isIntfEnabled(osNode, PATCH_INTG_BRIDGE) &&
-                isIntfCreated(osNode, PATCH_ROUT_BRIDGE)) {
-            return;
-        }
-
-        Device device = deviceService.getDevice(osNode.ovsdb());
-        if (device == null || !device.is(InterfaceConfig.class)) {
-            log.error("Failed to create patch interfaces on {}", osNode.hostname());
-            return;
-        }
-
-        PatchDescription patchIntg = DefaultPatchDescription.builder()
-                .deviceId(INTEGRATION_BRIDGE)
-                .ifaceName(PATCH_INTG_BRIDGE)
-                .peer(PATCH_ROUT_BRIDGE)
-                .build();
-
-        PatchDescription patchRout = DefaultPatchDescription.builder()
-                .deviceId(ROUTER_BRIDGE)
-                .ifaceName(PATCH_ROUT_BRIDGE)
-                .peer(PATCH_INTG_BRIDGE)
-                .build();
-
-        InterfaceConfig ifaceConfig = device.as(InterfaceConfig.class);
-        ifaceConfig.addPatchMode(PATCH_INTG_BRIDGE, patchIntg);
-        ifaceConfig.addPatchMode(PATCH_ROUT_BRIDGE, patchRout);
-    }
-
-    private void addOrUpdateGatewayGroup(OpenstackNode osNode,
-                                         Set<OpenstackNode> gatewayNodes,
-                                         NetworkMode mode) {
-        GroupBuckets buckets = gatewayGroupBuckets(osNode, gatewayNodes, mode);
-        if (groupService.getGroup(osNode.intgBridge(), osNode.gatewayGroupKey(mode)) == null) {
-            GroupDescription groupDescription = new DefaultGroupDescription(
-                    osNode.intgBridge(),
-                    GroupDescription.Type.SELECT,
-                    buckets,
-                    osNode.gatewayGroupKey(mode),
-                    osNode.gatewayGroupId(mode).id(),
-                    appId);
-            groupService.addGroup(groupDescription);
-            log.debug("Created gateway group for {}", osNode.hostname());
-        } else {
-            groupService.setBucketsForGroup(
-                    osNode.intgBridge(),
-                    osNode.gatewayGroupKey(mode),
-                    buckets,
-                    osNode.gatewayGroupKey(mode),
-                    appId);
-            log.debug("Updated gateway group for {}", osNode.hostname());
-        }
-    }
-
-    private GroupBuckets gatewayGroupBuckets(OpenstackNode osNode,
-                                             Set<OpenstackNode> gatewayNodes,
-                                             NetworkMode mode) {
-        List<GroupBucket> bucketList = Lists.newArrayList();
-        switch (mode) {
-            case VXLAN:
-                gatewayNodes.stream().filter(n -> n.dataIp() != null).forEach(n -> {
-                    TrafficTreatment treatment = DefaultTrafficTreatment.builder()
-                            .extension(tunnelDstTreatment(osNode.intgBridge(),
-                                    n.dataIp()),
-                                    osNode.intgBridge())
-                            .setOutput(osNode.tunnelPortNum())
-                            .build();
-                    bucketList.add(createSelectGroupBucket(treatment));
-                });
-                return new GroupBuckets(bucketList);
-            case VLAN:
-                gatewayNodes.stream().filter(n -> n.vlanIntf() != null).forEach(n -> {
-                    TrafficTreatment treatment = DefaultTrafficTreatment.builder()
-                            .setEthDst(n.vlanPortMac())
-                            .setOutput(osNode.vlanPortNum())
-                            .build();
-                    bucketList.add(createSelectGroupBucket(treatment));
-                });
-                return new GroupBuckets(bucketList);
-            default:
-                return null;
-        }
-    }
-
     private ExtensionTreatment tunnelDstTreatment(DeviceId deviceId, IpAddress remoteIp) {
         Device device = deviceService.getDevice(deviceId);
         if (device != null && !device.is(ExtensionTreatmentResolver.class)) {
@@ -489,17 +317,6 @@
         }
     }
 
-    private boolean isBridgeCreated(DeviceId ovsdbId, String bridgeName) {
-        Device device = deviceService.getDevice(ovsdbId);
-        if (device == null || !deviceService.isAvailable(device.id()) ||
-                !device.is(BridgeConfig.class)) {
-            return false;
-        }
-        BridgeConfig bridgeConfig = device.as(BridgeConfig.class);
-        return bridgeConfig.getBridges().stream()
-                .anyMatch(bridge -> bridge.name().equals(bridgeName));
-    }
-
     private boolean isIntfEnabled(OpenstackNode osNode, String intf) {
         if (!deviceService.isAvailable(osNode.intgBridge())) {
             return false;
@@ -510,67 +327,12 @@
                         port.isEnabled());
     }
 
-    private boolean isIntfCreated(OpenstackNode osNode, String intf) {
-        Device device = deviceService.getDevice(osNode.ovsdb());
-        if (device == null || !deviceService.isAvailable(osNode.ovsdb()) ||
-                !device.is(BridgeConfig.class)) {
-            return false;
-        }
-
-        BridgeConfig bridgeConfig =  device.as(BridgeConfig.class);
-        return bridgeConfig.getPorts().stream()
-                .anyMatch(port -> port.annotations().value(PORT_NAME).equals(intf));
-    }
-
-    private boolean isGroupCreated(OpenstackNode osNode) {
-        for (OpenstackNode gNode : osNodeService.completeNodes(GATEWAY)) {
-            if (!isGatewayBucketAdded(osNode, gNode)) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private boolean isGatewayBucketAdded(OpenstackNode cNode, OpenstackNode gNode) {
-        if (cNode.dataIp() != null) {
-            Group osGroup = groupService.getGroup(cNode.intgBridge(),
-                    cNode.gatewayGroupKey(VXLAN));
-            TrafficTreatment treatment = DefaultTrafficTreatment.builder()
-                    .extension(tunnelDstTreatment(gNode.intgBridge(),
-                            gNode.dataIp()),
-                            cNode.intgBridge())
-                    .setOutput(cNode.tunnelPortNum())
-                    .build();
-            GroupBucket bucket = createSelectGroupBucket(treatment);
-            if (osGroup == null || !osGroup.buckets().buckets().contains(bucket)) {
-                return false;
-            }
-        }
-        if (cNode.vlanIntf() != null) {
-            Group osGroup = groupService.getGroup(cNode.intgBridge(),
-                    cNode.gatewayGroupKey(VLAN));
-            TrafficTreatment treatment = DefaultTrafficTreatment.builder()
-                    .setEthDst(gNode.vlanPortMac())
-                    .setOutput(cNode.vlanPortNum())
-                    .build();
-            GroupBucket bucket = createSelectGroupBucket(treatment);
-            if (osGroup == null || !osGroup.buckets().buckets().contains(bucket)) {
-                return false;
-            }
-        }
-        return true;
-    }
-
     private boolean isCurrentStateDone(OpenstackNode osNode) {
         switch (osNode.state()) {
             case INIT:
                 if (!deviceService.isAvailable(osNode.intgBridge())) {
                     return false;
                 }
-                if (osNode.type() == GATEWAY &&
-                        !isBridgeCreated(osNode.ovsdb(), ROUTER_BRIDGE)) {
-                    return false;
-                }
                 return true;
             case DEVICE_CREATED:
                 if (osNode.dataIp() != null &&
@@ -581,23 +343,11 @@
                         !isIntfEnabled(osNode, osNode.vlanIntf())) {
                     return false;
                 }
-                if (osNode.type() == GATEWAY && (
-                        !isIntfEnabled(osNode, PATCH_INTG_BRIDGE) ||
-                        !isIntfCreated(osNode, PATCH_ROUT_BRIDGE))) {
+                if (osNode.type() == GATEWAY &&
+                        !isIntfEnabled(osNode, osNode.uplinkPort())) {
                     return false;
                 }
                 return true;
-            case PORT_CREATED:
-                if (osNode.type() == COMPUTE) {
-                    return isGroupCreated(osNode);
-                } else {
-                    for (OpenstackNode cNode : osNodeService.completeNodes(COMPUTE)) {
-                        if (!isGatewayBucketAdded(cNode, osNode)) {
-                            return false;
-                        }
-                    }
-                    return true;
-                }
             case COMPLETE:
                 return false;
             case INCOMPLETE:
@@ -700,9 +450,7 @@
                         if (osNode.state() == DEVICE_CREATED && (
                                 Objects.equals(portName, DEFAULT_TUNNEL) ||
                                 Objects.equals(portName, osNode.vlanIntf()) ||
-                                Objects.equals(portName, PATCH_INTG_BRIDGE) ||
-                                Objects.equals(portName, PATCH_ROUT_BRIDGE))) {
-                            // FIXME we never gets PATCH_ROUTE_BRIDGE port added events as of now
+                                Objects.equals(portName, osNode.uplinkPort()))) {
                             log.debug("Interface {} added to {}", portName, event.subject().id());
                             bootstrapNode(osNode);
                         }
@@ -715,8 +463,7 @@
                         if (osNode.state() == COMPLETE && (
                                 Objects.equals(portName, DEFAULT_TUNNEL) ||
                                 Objects.equals(portName, osNode.vlanIntf()) ||
-                                Objects.equals(portName, PATCH_INTG_BRIDGE) ||
-                                Objects.equals(portName, PATCH_ROUT_BRIDGE))) {
+                                        Objects.equals(portName, osNode.uplinkPort()))) {
                             log.warn("Interface {} removed from {}", portName, event.subject().id());
                             setState(osNode, INCOMPLETE);
                         }
@@ -731,54 +478,6 @@
         }
     }
 
-    private class InternalGroupListener implements GroupListener {
-
-        @Override
-        public boolean isRelevant(GroupEvent event) {
-            NodeId leader = leadershipService.getLeader(appId.name());
-            return Objects.equals(localNode, leader);
-        }
-
-        @Override
-        public void event(GroupEvent event) {
-            switch (event.type()) {
-                case GROUP_ADDED:
-                    eventExecutor.execute(() -> {
-                        log.trace("Group added, ID:{} state:{}", event.subject().id(),
-                                event.subject().state());
-                        processGroup(event.subject());
-                    });
-                    break;
-                case GROUP_UPDATED:
-                    eventExecutor.execute(() -> {
-                        log.trace("Group updated, ID:{} state:{}", event.subject().id(),
-                                event.subject().state());
-                        processGroup(event.subject());
-                    });
-                    break;
-                case GROUP_REMOVED:
-                    // TODO handle group removed
-                    break;
-                default:
-                    break;
-            }
-        }
-
-        private void processGroup(Group group) {
-            OpenstackNode osNode = osNodeService.nodes(COMPUTE).stream()
-                    .filter(n -> n.state() == PORT_CREATED &&
-                            (n.gatewayGroupId(VXLAN).equals(group.id()) ||
-                            n.gatewayGroupId(VLAN).equals(group.id())))
-                    .findAny().orElse(null);
-            if (osNode != null) {
-                bootstrapNode(osNode);
-            }
-            osNodeService.nodes(GATEWAY).stream()
-                    .filter(gNode -> gNode.state() == PORT_CREATED)
-                    .forEach(DefaultOpenstackNodeHandler.this::bootstrapNode);
-        }
-    }
-
     private class InternalOpenstackNodeListener implements OpenstackNodeListener {
 
         @Override