CORD-151 Implement initial compute node setup

Followings are changed
- Changed nodeStore from eventually consistent map to consistent map
- Removed ovsdb connection management(ovsdb controller has connection status)
- Not only one leader but all onos instances make ovsdb session

Following jobs are done
- Reads compute node and ovsdb access info from network config
- Initiates ovsdb connection to the nodes
- Creates integration bridge on each ovsdbs
- Creates vxlan tunnel port on each integration bridges

Change-Id: I8df4061fcb1eae9b0abd545b7a3f540be50607a9
diff --git a/apps/cordvtn/pom.xml b/apps/cordvtn/pom.xml
index a019bec..b8e913d 100644
--- a/apps/cordvtn/pom.xml
+++ b/apps/cordvtn/pom.xml
@@ -49,6 +49,11 @@
             <artifactId>onos-core-serializers</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-ovsdb-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtn.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtn.java
index cb8acab..ba70780 100644
--- a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtn.java
+++ b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtn.java
@@ -15,6 +15,8 @@
  */
 package org.onosproject.cordvtn;
 
+import com.google.common.collect.Collections2;
+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;
@@ -22,31 +24,39 @@
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
 import org.onlab.util.KryoNamespace;
+import org.onosproject.cluster.ClusterService;
+import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
+import org.onosproject.mastership.MastershipService;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Host;
+import org.onosproject.net.behaviour.ControllerInfo;
 import org.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.host.HostEvent;
 import org.onosproject.net.host.HostListener;
 import org.onosproject.net.host.HostService;
+import org.onosproject.ovsdb.controller.OvsdbClientService;
+import org.onosproject.ovsdb.controller.OvsdbController;
+import org.onosproject.ovsdb.controller.OvsdbNodeId;
 import org.onosproject.store.serializers.KryoNamespaces;
-import org.onosproject.store.service.EventuallyConsistentMap;
-import org.onosproject.store.service.LogicalClockService;
+import org.onosproject.store.service.ConsistentMap;
+import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
+import org.onosproject.store.service.Versioned;
 import org.slf4j.Logger;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import java.util.stream.Collectors;
 
+import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onlab.util.Tools.groupedThreads;
-import static org.onosproject.cordvtn.OvsdbNode.State;
-import static org.onosproject.cordvtn.OvsdbNode.State.INIT;
-import static org.onosproject.cordvtn.OvsdbNode.State.DISCONNECT;
 import static org.onosproject.net.Device.Type.SWITCH;
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -63,7 +73,17 @@
     private static final int NUM_THREADS = 1;
     private static final KryoNamespace.Builder NODE_SERIALIZER = KryoNamespace.newBuilder()
             .register(KryoNamespaces.API)
-            .register(OvsdbNode.class);
+            .register(DefaultOvsdbNode.class);
+    private static final String DEFAULT_BRIDGE_NAME = "br-int";
+    private static final Map<String, String> VXLAN_OPTIONS = new HashMap<String, String>() {
+        {
+            put("key", "flow");
+            put("local_ip", "flow");
+            put("remote_ip", "flow");
+        }
+    };
+    private static final int DPID_BEGIN = 3;
+    private static final int OFPORT = 6653;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected CoreService coreService;
@@ -72,14 +92,20 @@
     protected StorageService storageService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected LogicalClockService clockService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected DeviceService deviceService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected HostService hostService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected MastershipService mastershipService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected OvsdbController controller;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected ClusterService clusterService;
+
     private final ExecutorService eventExecutor = Executors
             .newFixedThreadPool(NUM_THREADS, groupedThreads("onos/cordvtn", "event-handler"));
 
@@ -90,15 +116,16 @@
     private final BridgeHandler bridgeHandler = new BridgeHandler();
     private final VmHandler vmHandler = new VmHandler();
 
-    private EventuallyConsistentMap<DeviceId, OvsdbNode> nodeStore;
+    private ConsistentMap<DeviceId, OvsdbNode> nodeStore;
+    private ApplicationId appId;
 
     @Activate
     protected void activate() {
-        coreService.registerApplication("org.onosproject.cordvtn");
-        nodeStore = storageService.<DeviceId, OvsdbNode>eventuallyConsistentMapBuilder()
+        appId = coreService.registerApplication("org.onosproject.cordvtn");
+        nodeStore = storageService.<DeviceId, OvsdbNode>consistentMapBuilder()
+                .withSerializer(Serializer.using(NODE_SERIALIZER.build()))
                 .withName("cordvtn-nodestore")
-                .withSerializer(NODE_SERIALIZER)
-                .withTimestampProvider((k, v) -> clockService.getTimestamp())
+                .withApplicationId(appId)
                 .build();
 
         deviceService.addListener(deviceListener);
@@ -113,43 +140,59 @@
         hostService.removeListener(hostListener);
 
         eventExecutor.shutdown();
-        nodeStore.destroy();
+        nodeStore.clear();
 
         log.info("Stopped");
     }
 
     @Override
-    public void addNode(OvsdbNode ovsdbNode) {
-        if (nodeStore.containsKey(ovsdbNode.deviceId())) {
-            log.warn("Node {} already exists", ovsdbNode.host());
+    public void addNode(OvsdbNode ovsdb) {
+        checkNotNull(ovsdb);
+        nodeStore.put(ovsdb.deviceId(), ovsdb);
+    }
+
+    @Override
+    public void deleteNode(OvsdbNode ovsdb) {
+        checkNotNull(ovsdb);
+
+        if (!nodeStore.containsKey(ovsdb.deviceId())) {
             return;
         }
-        nodeStore.put(ovsdbNode.deviceId(), ovsdbNode);
-        if (ovsdbNode.state() != INIT) {
-            updateNode(ovsdbNode, INIT);
+
+        // check ovsdb and integration bridge connection state first
+        if (isNodeConnected(ovsdb)) {
+            log.warn("Cannot delete connected node {}", ovsdb.host());
+        } else {
+            nodeStore.remove(ovsdb.deviceId());
         }
     }
 
     @Override
-    public void deleteNode(OvsdbNode ovsdbNode) {
-        if (!nodeStore.containsKey(ovsdbNode.deviceId())) {
-            log.warn("Node {} does not exist", ovsdbNode.host());
+    public void connect(OvsdbNode ovsdb) {
+        checkNotNull(ovsdb);
+
+        if (!nodeStore.containsKey(ovsdb.deviceId())) {
+            log.warn("Node {} does not exist", ovsdb.host());
             return;
         }
-        updateNode(ovsdbNode, DISCONNECT);
+        controller.connect(ovsdb.ip(), ovsdb.port());
     }
 
     @Override
-    public void updateNode(OvsdbNode ovsdbNode, State state) {
-        if (!nodeStore.containsKey(ovsdbNode.deviceId())) {
-            log.warn("Node {} does not exist", ovsdbNode.host());
+    public void disconnect(OvsdbNode ovsdb) {
+        checkNotNull(ovsdb);
+
+        if (!nodeStore.containsKey(ovsdb.deviceId())) {
+            log.warn("Node {} does not exist", ovsdb.host());
             return;
         }
-        DefaultOvsdbNode updatedNode = new DefaultOvsdbNode(ovsdbNode.host(),
-                                                            ovsdbNode.ip(),
-                                                            ovsdbNode.port(),
-                                                            state);
-        nodeStore.put(ovsdbNode.deviceId(), updatedNode);
+
+        OvsdbClientService ovsdbClient = getOvsdbClient(ovsdb);
+        checkNotNull(ovsdbClient);
+
+        if (ovsdbClient.isConnected()) {
+            ovsdbClient.disconnect();
+        }
     }
 
     @Override
@@ -159,14 +202,42 @@
 
     @Override
     public OvsdbNode getNode(DeviceId deviceId) {
-        return nodeStore.get(deviceId);
+        Versioned<OvsdbNode> ovsdb = nodeStore.get(deviceId);
+        if (ovsdb != null) {
+            return ovsdb.value();
+        } else {
+            return null;
+        }
     }
 
     @Override
     public List<OvsdbNode> getNodes() {
-        return nodeStore.values()
-                .stream()
-                .collect(Collectors.toList());
+        List<OvsdbNode> ovsdbs = new ArrayList<>();
+        ovsdbs.addAll(Collections2.transform(nodeStore.values(), Versioned::value));
+        return ovsdbs;
+    }
+
+    @Override
+    public boolean isNodeConnected(OvsdbNode ovsdb) {
+        checkNotNull(ovsdb);
+
+        OvsdbClientService ovsdbClient = getOvsdbClient(ovsdb);
+        if (ovsdbClient == null) {
+            return false;
+        } else {
+            return ovsdbClient.isConnected();
+        }
+    }
+
+    private OvsdbClientService getOvsdbClient(OvsdbNode ovsdb) {
+        checkNotNull(ovsdb);
+
+        OvsdbClientService ovsdbClient = controller.getOvsdbClient(
+                new OvsdbNodeId(ovsdb.ip(), ovsdb.port().toInt()));
+        if (ovsdbClient == null) {
+            log.warn("Couldn't find ovsdb client of node {}", ovsdb.host());
+        }
+        return ovsdbClient;
     }
 
     private class InternalDeviceListener implements DeviceListener {
@@ -182,6 +253,7 @@
                     break;
                 case DEVICE_AVAILABILITY_CHANGED:
                     eventExecutor.submit(() -> handler.disconnected(device));
+                    // TODO handle the case that the device is recovered
                     break;
                 default:
                     break;
@@ -212,14 +284,27 @@
 
         @Override
         public void connected(Device device) {
-            // create bridge and set bridgeId
-            // set node state connected
+            log.info("Ovsdb {} is connected", device.id());
+
+            if (!mastershipService.isLocalMaster(device.id())) {
+                return;
+            }
+
+            // TODO change to use bridge config
+            OvsdbNode ovsdb = getNode(device.id());
+            OvsdbClientService ovsdbClient = getOvsdbClient(ovsdb);
+
+            List<ControllerInfo> controllers = new ArrayList<>();
+            Sets.newHashSet(clusterService.getNodes()).forEach(controller ->
+                        controllers.add(new ControllerInfo(controller.ip(), OFPORT, "tcp")));
+            String dpid = ovsdb.intBrId().toString().substring(DPID_BEGIN);
+
+            ovsdbClient.createBridge(DEFAULT_BRIDGE_NAME, dpid, controllers);
         }
 
         @Override
         public void disconnected(Device device) {
-            // set node state disconnected if the node exists
-            // which means that the node is not deleted explicitly
+            log.warn("Ovsdb {} is disconnected", device.id());
         }
     }
 
@@ -227,12 +312,29 @@
 
         @Override
         public void connected(Device device) {
-            // create vxlan port
+            log.info("Integration Bridge {} is detected", device.id());
+
+            OvsdbNode ovsdb = getNodes().stream()
+                    .filter(node -> node.intBrId().equals(device.id()))
+                    .findFirst().get();
+
+            if (ovsdb == null) {
+                log.warn("Couldn't find OVSDB associated with {}", device.id());
+                return;
+            }
+
+            if (!mastershipService.isLocalMaster(ovsdb.deviceId())) {
+                return;
+            }
+
+            // TODO change to use tunnel config and tunnel description
+            OvsdbClientService ovsdbClient = getOvsdbClient(ovsdb);
+            ovsdbClient.createTunnel(DEFAULT_BRIDGE_NAME, "vxlan", "vxlan", VXLAN_OPTIONS);
         }
 
         @Override
         public void disconnected(Device device) {
-
+            log.info("Integration Bridge {} is vanished", device.id());
         }
     }
 
@@ -240,12 +342,12 @@
 
         @Override
         public void connected(Host host) {
-            // install flow rules for this vm
+            log.info("VM {} is detected", host.id());
         }
 
         @Override
         public void disconnected(Host host) {
-            // uninstall flow rules associated with this vm
+            log.info("VM {} is vanished", host.id());
         }
     }
 }
diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnConfig.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnConfig.java
index fdaf752..550452c 100644
--- a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnConfig.java
+++ b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnConfig.java
@@ -20,6 +20,7 @@
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.TpPort;
 import org.onosproject.core.ApplicationId;
+import org.onosproject.net.DeviceId;
 import org.onosproject.net.config.Config;
 
 import java.util.Set;
@@ -35,6 +36,7 @@
     public static final String HOST = "host";
     public static final String IP = "ip";
     public static final String PORT = "port";
+    public static final String BRIDGE_ID = "bridgeId";
 
     /**
      * Returns the set of ovsdb nodes read from network config.
@@ -51,7 +53,8 @@
         nodes.forEach(jsonNode -> ovsdbNodes.add(new OvsdbNodeConfig(
             jsonNode.path(HOST).asText(),
             IpAddress.valueOf(jsonNode.path(IP).asText()),
-            TpPort.tpPort(jsonNode.path(PORT).asInt()))));
+            TpPort.tpPort(jsonNode.path(PORT).asInt()),
+            DeviceId.deviceId(jsonNode.path(BRIDGE_ID).asText()))));
 
         return ovsdbNodes;
     }
@@ -64,11 +67,13 @@
         private final String host;
         private final IpAddress ip;
         private final TpPort port;
+        private final DeviceId bridgeId;
 
-        public OvsdbNodeConfig(String host, IpAddress ip, TpPort port) {
+        public OvsdbNodeConfig(String host, IpAddress ip, TpPort port, DeviceId bridgeId) {
             this.host = checkNotNull(host);
             this.ip = checkNotNull(ip);
             this.port = checkNotNull(port);
+            this.bridgeId = checkNotNull(bridgeId);
         }
 
         /**
@@ -97,5 +102,9 @@
         public TpPort port() {
             return this.port;
         }
+
+        public DeviceId bridgeId() {
+            return this.bridgeId;
+        }
     }
 }
diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnConfigManager.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnConfigManager.java
index 043b376..f276c7c 100644
--- a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnConfigManager.java
+++ b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnConfigManager.java
@@ -20,11 +20,6 @@
 import org.apache.felix.scr.annotations.Deactivate;
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.onosproject.cluster.ClusterService;
-import org.onosproject.cluster.LeadershipEvent;
-import org.onosproject.cluster.LeadershipEventListener;
-import org.onosproject.cluster.LeadershipService;
-import org.onosproject.cluster.NodeId;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.net.config.ConfigFactory;
@@ -35,7 +30,6 @@
 import org.onosproject.net.config.basics.SubjectFactories;
 import org.slf4j.Logger;
 
-import static org.onosproject.cordvtn.OvsdbNode.State.INIT;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -58,12 +52,6 @@
     protected NetworkConfigService configService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected LeadershipService leadershipService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected ClusterService clusterService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected CordVtnService cordVtnService;
 
     private final ConfigFactory configFactory =
@@ -74,29 +62,22 @@
                 }
             };
 
-    private final LeadershipEventListener leadershipListener = new InternalLeadershipListener();
     private final NetworkConfigListener configListener = new InternalConfigListener();
 
-    private NodeId local;
     private ApplicationId appId;
 
     @Activate
     protected void active() {
-        local = clusterService.getLocalNode().id();
         appId = coreService.getAppId(CordVtnService.CORDVTN_APP_ID);
 
         configService.addListener(configListener);
         configRegistry.registerConfigFactory(configFactory);
 
-        leadershipService.addListener(leadershipListener);
-        leadershipService.runForLeadership(CordVtnService.CORDVTN_APP_ID);
+        readConfiguration();
     }
 
     @Deactivate
     protected void deactivate() {
-        leadershipService.removeListener(leadershipListener);
-        leadershipService.withdraw(appId.name());
-
         configRegistry.unregisterConfigFactory(configFactory);
         configService.removeListener(configListener);
     }
@@ -110,30 +91,13 @@
         }
 
         config.ovsdbNodes().forEach(node -> {
-            DefaultOvsdbNode ovsdbNode =
-                    new DefaultOvsdbNode(node.host(), node.ip(), node.port(), INIT);
-            cordVtnService.addNode(ovsdbNode);
-            log.info("Add new node {}", node.host());
+            DefaultOvsdbNode ovsdb = new DefaultOvsdbNode(
+                    node.host(), node.ip(), node.port(), node.bridgeId());
+            cordVtnService.addNode(ovsdb);
+            cordVtnService.connect(ovsdb);
         });
     }
 
-    private synchronized void processLeadershipChange(NodeId leader) {
-        if (leader == null || !leader.equals(local)) {
-            return;
-        }
-        readConfiguration();
-    }
-
-    private class InternalLeadershipListener implements LeadershipEventListener {
-
-        @Override
-        public void event(LeadershipEvent event) {
-            if (event.subject().topic().equals(appId.name())) {
-                processLeadershipChange(event.subject().leader());
-            }
-        }
-    }
-
     private class InternalConfigListener implements NetworkConfigListener {
 
         @Override
diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnService.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnService.java
index 1f75dce..7e01a45 100644
--- a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnService.java
+++ b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnService.java
@@ -15,7 +15,6 @@
  */
 package org.onosproject.cordvtn;
 
-import org.onosproject.cordvtn.OvsdbNode.State;
 import org.onosproject.net.DeviceId;
 
 import java.util.List;
@@ -29,25 +28,30 @@
     /**
      * Adds a new node to the service.
      *
-     * @param ovsdbNode ovsdb node
+     * @param ovsdb ovsdb node
      */
-    void addNode(OvsdbNode ovsdbNode);
+    void addNode(OvsdbNode ovsdb);
 
     /**
      * Deletes a node from the service.
      *
-     * @param ovsdbNode ovsdb node
+     * @param ovsdb ovsdb node
      */
-    void deleteNode(OvsdbNode ovsdbNode);
+    void deleteNode(OvsdbNode ovsdb);
 
     /**
-     * Updates ovsdb node.
-     * It only used for updating node's connection state.
+     * Connect to a node.
      *
-     * @param ovsdbNode ovsdb node
-     * @param state ovsdb connection state
+     * @param ovsdb ovsdb node
      */
-    void updateNode(OvsdbNode ovsdbNode, State state);
+    void connect(OvsdbNode ovsdb);
+
+    /**
+     * Disconnect a node.
+     *
+     * @param ovsdb ovsdb node
+     */
+    void disconnect(OvsdbNode ovsdb);
 
     /**
      * Returns the number of the nodes known to the service.
@@ -65,6 +69,14 @@
     OvsdbNode getNode(DeviceId deviceId);
 
     /**
+     * Returns connection state of the node.
+     *
+     * @param ovsdb ovsdb node
+     * @return true if the node is connected, false otherwise
+     */
+    boolean isNodeConnected(OvsdbNode ovsdb);
+
+    /**
      * Returns all nodes known to the service.
      *
      * @return list of nodes
diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/DefaultOvsdbNode.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/DefaultOvsdbNode.java
index ce8b0f1..eba5210 100644
--- a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/DefaultOvsdbNode.java
+++ b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/DefaultOvsdbNode.java
@@ -30,13 +30,13 @@
     private final String host;
     private final IpAddress ip;
     private final TpPort port;
-    private final State state;
+    private final DeviceId brId;
 
-    public DefaultOvsdbNode(String host, IpAddress ip, TpPort port, State state) {
+    public DefaultOvsdbNode(String host, IpAddress ip, TpPort port, DeviceId brId) {
         this.host = host;
         this.ip = ip;
         this.port = port;
-        this.state = state;
+        this.brId = brId;
     }
 
     @Override
@@ -55,8 +55,8 @@
     }
 
     @Override
-    public State state() {
-        return this.state;
+    public DeviceId intBrId() {
+        return this.brId;
     }
 
     @Override
@@ -65,11 +65,6 @@
     }
 
     @Override
-    public DeviceId intBrId() {
-        return DeviceId.deviceId("of:" + this.host);
-    }
-
-    @Override
     public boolean equals(Object o) {
         if (this == o) {
             return true;
@@ -79,7 +74,8 @@
             DefaultOvsdbNode that = (DefaultOvsdbNode) o;
             if (this.host.equals(that.host) &&
                     this.ip.equals(that.ip) &&
-                    this.port.equals(that.port)) {
+                    this.port.equals(that.port) &&
+                    this.brId.equals(that.brId)) {
                 return true;
             }
         }
@@ -97,7 +93,7 @@
                 .add("host", host)
                 .add("ip", ip)
                 .add("port", port)
-                .add("state", state)
+                .add("bridgeId", brId)
                 .toString();
     }
 }
diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/NodeConnectionManager.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/NodeConnectionManager.java
deleted file mode 100644
index ebba4cd..0000000
--- a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/NodeConnectionManager.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright 2014-2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.cordvtn;
-
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.onosproject.cluster.ClusterService;
-import org.onosproject.cluster.LeadershipService;
-import org.onosproject.cluster.NodeId;
-import org.onosproject.mastership.MastershipService;
-import org.onosproject.net.Device;
-import org.onosproject.net.device.DeviceEvent;
-import org.onosproject.net.device.DeviceListener;
-import org.onosproject.net.device.DeviceService;
-import org.slf4j.Logger;
-
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
-import static org.onlab.util.Tools.groupedThreads;
-import static org.onosproject.cordvtn.OvsdbNode.State.CONNECTED;
-import static org.onosproject.cordvtn.OvsdbNode.State.DISCONNECTED;
-import static org.onosproject.cordvtn.OvsdbNode.State.READY;
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * Provides the connection state management of all nodes registered to the service
- * so that the nodes keep connected unless it is requested to be deleted.
- */
-@Component(immediate = true)
-public class NodeConnectionManager {
-    protected final Logger log = getLogger(getClass());
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    MastershipService mastershipService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    LeadershipService leadershipService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    ClusterService clusterService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    DeviceService deviceService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    CordVtnService cordVtnService;
-
-    private static final int DELAY_SEC = 5;
-
-    private final DeviceListener deviceListener = new InternalDeviceListener();
-    private final ScheduledExecutorService connectionExecutor = Executors
-            .newSingleThreadScheduledExecutor(groupedThreads("onos/cordvtn", "connection-manager"));
-
-    private NodeId localId;
-
-    @Activate
-    protected void activate() {
-        localId = clusterService.getLocalNode().id();
-        deviceService.addListener(deviceListener);
-
-        connectionExecutor.scheduleWithFixedDelay(() -> cordVtnService.getNodes()
-                .stream()
-                .filter(node -> localId.equals(getMaster(node)))
-                .forEach(node -> {
-                    connect(node);
-                    disconnect(node);
-                }), 0, DELAY_SEC, TimeUnit.SECONDS);
-    }
-
-    @Deactivate
-    public void stop() {
-        connectionExecutor.shutdown();
-        deviceService.removeListener(deviceListener);
-    }
-
-    public void connect(OvsdbNode ovsdbNode) {
-        switch (ovsdbNode.state()) {
-            case INIT:
-            case DISCONNECTED:
-                setPassiveMode(ovsdbNode);
-            case READY:
-                setupConnection(ovsdbNode);
-                break;
-            default:
-                break;
-        }
-    }
-
-    public void disconnect(OvsdbNode ovsdbNode) {
-        switch (ovsdbNode.state()) {
-            case DISCONNECT:
-                // TODO: disconnect
-                break;
-            default:
-                break;
-        }
-    }
-
-    private class InternalDeviceListener implements DeviceListener {
-
-        @Override
-        public void event(DeviceEvent event) {
-            Device device = event.subject();
-            if (device.type() != Device.Type.CONTROLLER) {
-                return;
-            }
-
-            DefaultOvsdbNode node;
-            switch (event.type()) {
-                case DEVICE_ADDED:
-                    node = (DefaultOvsdbNode) cordVtnService.getNode(device.id());
-                    if (node != null) {
-                        cordVtnService.updateNode(node, CONNECTED);
-                    }
-                    break;
-                case DEVICE_AVAILABILITY_CHANGED:
-                    node = (DefaultOvsdbNode) cordVtnService.getNode(device.id());
-                    if (node != null) {
-                        cordVtnService.updateNode(node, DISCONNECTED);
-                    }
-                    break;
-                default:
-                    break;
-            }
-        }
-    }
-
-    private NodeId getMaster(OvsdbNode ovsdbNode) {
-        NodeId master = mastershipService.getMasterFor(ovsdbNode.intBrId());
-
-        // master is null if there's no such device
-        if (master == null) {
-            master = leadershipService.getLeader(CordVtnService.CORDVTN_APP_ID);
-        }
-        return master;
-    }
-
-    private void setPassiveMode(OvsdbNode ovsdbNode) {
-        // TODO: need ovsdb client implementation first
-        // TODO: set the remove ovsdb server passive mode
-        cordVtnService.updateNode(ovsdbNode, READY);
-    }
-
-    private void setupConnection(OvsdbNode ovsdbNode) {
-        // TODO initiate connection
-    }
-}
diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/OvsdbNode.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/OvsdbNode.java
index 296bd43..c5b7a07 100644
--- a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/OvsdbNode.java
+++ b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/OvsdbNode.java
@@ -23,12 +23,6 @@
  * Representation of a node with ovsdb server.
  */
 public interface OvsdbNode {
-    /**
-     * Ovsdb connection state.
-     */
-    enum State {
-        INIT, READY, CONNECTED, DISCONNECT, DISCONNECTED
-    }
 
     /**
      * Returns the IP address of the ovsdb server.
@@ -53,13 +47,6 @@
     String host();
 
     /**
-     * Returns the connection state of the ovsdb server.
-     *
-     * @return connection state
-     */
-    State state();
-
-    /**
      * Returns the device id of the ovsdb server.
      *
      * @return device id