diff options
Diffstat (limited to 'framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/NodeConnectionManager.java')
-rw-r--r-- | framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/NodeConnectionManager.java | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/NodeConnectionManager.java b/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/NodeConnectionManager.java new file mode 100644 index 00000000..0b7029ef --- /dev/null +++ b/framework/src/onos/apps/cordvtn/src/main/java/org/onosproject/cordvtn/NodeConnectionManager.java @@ -0,0 +1,145 @@ +/* + * 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.onosproject.cluster.LeadershipService; +import org.onosproject.cluster.NodeId; +import org.onosproject.core.ApplicationId; +import org.onosproject.mastership.MastershipService; +import org.onosproject.net.DeviceId; +import org.onosproject.store.service.EventuallyConsistentMap; +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.slf4j.LoggerFactory.getLogger; + +/** + * Node connection manager. + */ +public class NodeConnectionManager { + protected final Logger log = getLogger(getClass()); + + private final ApplicationId appId; + private final NodeId localId; + private final EventuallyConsistentMap<DeviceId, OvsdbNode> nodeStore; + private final MastershipService mastershipService; + private final LeadershipService leadershipService; + + private static final int DELAY_SEC = 5; + private ScheduledExecutorService connectionExecutor; + + /** + * Creates a new NodeConnectionManager. + * + * @param localId local id + * @param nodeStore node store + * @param mastershipService mastership service + */ + public NodeConnectionManager(ApplicationId appId, NodeId localId, + EventuallyConsistentMap<DeviceId, OvsdbNode> nodeStore, + MastershipService mastershipService, + LeadershipService leadershipService) { + this.appId = appId; + this.localId = localId; + this.nodeStore = nodeStore; + this.mastershipService = mastershipService; + this.leadershipService = leadershipService; + } + + /** + * Starts the node connection manager. + */ + public void start() { + connectionExecutor = Executors.newSingleThreadScheduledExecutor( + groupedThreads("onos/cordvtn", "connection-executor")); + connectionExecutor.scheduleWithFixedDelay(() -> nodeStore.values() + .stream() + .filter(node -> localId.equals(getMaster(node))) + .forEach(node -> connectNode(node)), 0, DELAY_SEC, TimeUnit.SECONDS); + } + + /** + * Stops the node connection manager. + */ + public void stop() { + connectionExecutor.shutdown(); + } + + /** + * Adds a new node to the system. + * + * @param ovsdbNode ovsdb node + */ + public void connectNode(OvsdbNode ovsdbNode) { + switch (ovsdbNode.state()) { + case INIT: + case DISCONNECTED: + // TODO: set the node to passive mode + case READY: + // TODO: initiate connection + break; + case CONNECTED: + break; + default: + } + } + + /** + * Deletes the ovsdb node. + * + * @param ovsdbNode ovsdb node + */ + public void disconnectNode(OvsdbNode ovsdbNode) { + switch (ovsdbNode.state()) { + case CONNECTED: + // TODO: disconnect + break; + case INIT: + case READY: + case DISCONNECTED: + break; + default: + } + } + + private NodeId getMaster(OvsdbNode ovsdbNode) { + // Return the master of the bridge(switch) if it exist or + // return the current leader + if (ovsdbNode.bridgeId() == DeviceId.NONE) { + return leadershipService.getLeader(this.appId.name()); + } else { + return mastershipService.getMasterFor(ovsdbNode.bridgeId()); + } + } + + private void setPassiveMode(OvsdbNode ovsdbNode) { + // TODO: need ovsdb client implementation first + // TODO: set the remove ovsdb server passive mode + // TODO: set the node state READY if it succeed + } + + private void connect(OvsdbNode ovsdbNode) { + // TODO: need ovsdb client implementation first + } + + private void disconnect(OvsdbNode ovsdbNode) { + // TODO: need ovsdb client implementation first + } +} |