Merge "Fix clustering versions"
[controller.git] / opendaylight / connectionmanager / implementation / src / main / java / org / opendaylight / controller / connectionmanager / internal / ConnectionManager.java
index 1beb7fe0bb609860865ed52347f27bfe126aeb2e..ebc56928a23856a158b4247d98c2720af9f98ac6 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
  *
@@ -22,6 +21,7 @@ package org.opendaylight.controller.connectionmanager.internal;
 
 import java.net.InetAddress;
 import java.net.UnknownHostException;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
@@ -56,11 +56,11 @@ import org.osgi.framework.FrameworkUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class ConnectionManager implements IConnectionManager, IConnectionListener,
-                                          ICoordinatorChangeAware, IListenInventoryUpdates,
-                                          ICacheUpdateAware<Node, Set<InetAddress>>,
-                                          CommandProvider {
-    private static final Logger logger = LoggerFactory.getLogger(ConnectionManager.class);
+public class ConnectionManager implements IConnectionManager,
+        IConnectionListener, ICoordinatorChangeAware, IListenInventoryUpdates,
+        ICacheUpdateAware<Node, Set<InetAddress>>, CommandProvider {
+    private static final Logger logger = LoggerFactory
+            .getLogger(ConnectionManager.class);
     private ConnectionMgmtScheme activeScheme = ConnectionMgmtScheme.ANY_CONTROLLER_ONE_MASTER;
     private IClusterGlobalServices clusterServices;
     private ConcurrentMap<ConnectionMgmtScheme, AbstractScheme> schemes;
@@ -100,7 +100,8 @@ public class ConnectionManager implements IConnectionManager, IConnectionListene
     }
 
     private void getInventories() {
-        Map<Node, Map<String, Property>> nodeProp = this.inventoryService.getNodeProps();
+        Map<Node, Map<String, Property>> nodeProp = this.inventoryService
+                .getNodeProps();
         for (Map.Entry<Node, Map<String, Property>> entry : nodeProp.entrySet()) {
             Node node = entry.getKey();
             logger.debug("getInventories for node:{}", new Object[] { node });
@@ -112,8 +113,10 @@ public class ConnectionManager implements IConnectionManager, IConnectionListene
             updateNode(node, UpdateType.ADDED, props);
         }
 
-        Map<NodeConnector, Map<String, Property>> nodeConnectorProp = this.inventoryService.getNodeConnectorProps();
-        for (Map.Entry<NodeConnector, Map<String, Property>> entry : nodeConnectorProp.entrySet()) {
+        Map<NodeConnector, Map<String, Property>> nodeConnectorProp = this.inventoryService
+                .getNodeConnectorProps();
+        for (Map.Entry<NodeConnector, Map<String, Property>> entry : nodeConnectorProp
+                .entrySet()) {
             Map<String, Property> propMap = entry.getValue();
             Set<Property> props = new HashSet<Property>();
             for (Property property : propMap.values()) {
@@ -123,18 +126,7 @@ public class ConnectionManager implements IConnectionManager, IConnectionListene
         }
     }
 
-
-   public void started() {
-       String schemeStr = System.getProperty("connection.scheme");
-       for (ConnectionMgmtScheme scheme : ConnectionMgmtScheme.values()) {
-           AbstractScheme schemeImpl = SchemeFactory.getScheme(scheme, clusterServices);
-           if (schemeImpl != null) {
-               schemes.put(scheme, schemeImpl);
-               if (scheme.name().equalsIgnoreCase(schemeStr)) {
-                   activeScheme = scheme;
-               }
-           }
-       }
+    public void started() {
 
         connectionEventThread.start();
 
@@ -145,9 +137,21 @@ public class ConnectionManager implements IConnectionManager, IConnectionListene
     }
 
     public void init() {
-        connectionEventThread = new Thread(new EventHandler(), "ConnectionEvent Thread");
+        connectionEventThread = new Thread(new EventHandler(),
+                "ConnectionEvent Thread");
         this.connectionEvents = new LinkedBlockingQueue<ConnectionMgmtEvent>();
         schemes = new ConcurrentHashMap<ConnectionMgmtScheme, AbstractScheme>();
+
+        String schemeStr = System.getProperty("connection.scheme");
+        for (ConnectionMgmtScheme scheme : ConnectionMgmtScheme.values()) {
+            AbstractScheme schemeImpl = SchemeFactory.getScheme(scheme, clusterServices);
+            if (schemeImpl != null) {
+                schemes.put(scheme, schemeImpl);
+                if (scheme.name().equalsIgnoreCase(schemeStr)) {
+                    activeScheme = scheme;
+                }
+            }
+        }
     }
 
     public void stopping() {
@@ -157,7 +161,8 @@ public class ConnectionManager implements IConnectionManager, IConnectionListene
             AbstractScheme scheme = schemes.get(activeScheme);
             for (Node localNode : localNodes) {
                 connectionService.disconnect(localNode);
-                if (scheme != null) scheme.removeNode(localNode);
+                if (scheme != null)
+                    scheme.removeNode(localNode);
             }
         }
     }
@@ -170,28 +175,32 @@ public class ConnectionManager implements IConnectionManager, IConnectionListene
     @Override
     public Set<Node> getNodes(InetAddress controller) {
         AbstractScheme scheme = schemes.get(activeScheme);
-        if (scheme == null) return null;
+        if (scheme == null)
+            return null;
         return scheme.getNodes(controller);
     }
 
     @Override
     public Set<Node> getLocalNodes() {
         AbstractScheme scheme = schemes.get(activeScheme);
-        if (scheme == null) return null;
+        if (scheme == null)
+            return null;
         return scheme.getNodes();
     }
 
     @Override
     public boolean isLocal(Node node) {
         AbstractScheme scheme = schemes.get(activeScheme);
-        if (scheme == null) return false;
+        if (scheme == null)
+            return false;
         return scheme.isLocal(node);
     }
 
     @Override
     public ConnectionLocality getLocalityStatus(Node node) {
         AbstractScheme scheme = schemes.get(activeScheme);
-        if (scheme == null) return ConnectionLocality.NOT_CONNECTED;
+        if (scheme == null)
+            return ConnectionLocality.NOT_CONNECTED;
         return scheme.getLocalityStatus(node);
     }
 
@@ -199,7 +208,8 @@ public class ConnectionManager implements IConnectionManager, IConnectionListene
     public void updateNode(Node node, UpdateType type, Set<Property> props) {
         logger.debug("updateNode: {} type {} props {}", node, type, props);
         AbstractScheme scheme = schemes.get(activeScheme);
-        if (scheme == null) return;
+        if (scheme == null)
+            return;
         switch (type) {
         case ADDED:
             scheme.addNode(node);
@@ -208,22 +218,24 @@ public class ConnectionManager implements IConnectionManager, IConnectionListene
             scheme.removeNode(node);
             break;
         default:
-                break;
+            break;
         }
     }
 
     @Override
     public void updateNodeConnector(NodeConnector nodeConnector,
             UpdateType type, Set<Property> props) {
-        logger.debug("updateNodeConnector: {} type {} props {}", nodeConnector, type, props);
+        logger.debug("updateNodeConnector: {} type {} props {}", nodeConnector,
+                type, props);
         AbstractScheme scheme = schemes.get(activeScheme);
-        if (scheme == null) return;
+        if (scheme == null)
+            return;
         switch (type) {
         case ADDED:
             scheme.addNode(nodeConnector.getNode());
             break;
         default:
-                break;
+            break;
         }
     }
 
@@ -233,38 +245,62 @@ public class ConnectionManager implements IConnectionManager, IConnectionListene
     }
 
     @Override
-    public Node connect(String connectionIdentifier, Map<ConnectionConstants, String> params) {
-        if (connectionService == null) return null;
-        return connectionService.connect(connectionIdentifier, params);
+    public Node connect(String connectionIdentifier,
+            Map<ConnectionConstants, String> params) {
+        if (connectionService == null)
+            return null;
+        Node node = connectionService.connect(connectionIdentifier, params);
+        AbstractScheme scheme = schemes.get(activeScheme);
+        if (scheme != null && node != null)
+            scheme.addNode(node);
+        return node;
     }
 
     @Override
-    public Node connect(String type, String connectionIdentifier, Map<ConnectionConstants, String> params) {
-        if (connectionService == null) return null;
-        return connectionService.connect(type, connectionIdentifier, params);
+    public Node connect(String type, String connectionIdentifier,
+            Map<ConnectionConstants, String> params) {
+        if (connectionService == null)
+            return null;
+        Node node = connectionService.connect(connectionIdentifier, params);
+        AbstractScheme scheme = schemes.get(activeScheme);
+        if (scheme != null && node != null)
+            scheme.addNode(node);
+        return node;
     }
 
     @Override
-    public Status disconnect (Node node) {
-        if (connectionService == null) return new Status(StatusCode.NOSERVICE);
-        return connectionService.disconnect(node);
+    public Status disconnect(Node node) {
+        if (node == null)
+            return new Status(StatusCode.BADREQUEST);
+        if (connectionService == null)
+            return new Status(StatusCode.NOSERVICE);
+        Status status = connectionService.disconnect(node);
+        if (status.isSuccess()) {
+            AbstractScheme scheme = schemes.get(activeScheme);
+            if (scheme != null)
+                scheme.removeNode(node);
+        }
+        return status;
     }
 
     @Override
     public void entryCreated(Node key, String cacheName, boolean originLocal) {
-        if (originLocal) return;
+        if (originLocal)
+            return;
     }
 
     /*
-     * Clustering Services' doesnt provide the existing states in the cache update callbacks.
-     * Hence, using a scratch local cache to maintain the existing state.
-     *
+     * Clustering Services doesn't provide the existing states in the cache
+     * update callbacks. Hence, using a scratch local cache to maintain the
+     * existing state.
      */
     private ConcurrentMap<Node, Set<InetAddress>> existingConnections = new ConcurrentHashMap<Node, Set<InetAddress>>();
 
     @Override
-    public void entryUpdated(Node node, Set<InetAddress> newControllers, String cacheName, boolean originLocal) {
-        if (originLocal) return;
+    public void entryUpdated(Node node, Set<InetAddress> newControllers,
+            String cacheName, boolean originLocal) {
+        if (originLocal)
+            return;
         Set<InetAddress> existingControllers = existingConnections.get(node);
         if (existingControllers != null) {
             logger.debug("Processing Update for : {} NewControllers : {} existingControllers : {}", node,
@@ -284,8 +320,9 @@ public class ConnectionManager implements IConnectionManager, IConnectionListene
 
     @Override
     public void entryDeleted(Node key, String cacheName, boolean originLocal) {
-        if (originLocal) return;
-        logger.debug("Deleted : {} cache : {}", key, cacheName);
+        if (originLocal)
+            return;
+        logger.debug("Deleted entry {} from cache : {}", key, cacheName);
         notifyNodeDisconnectedEvent(key);
     }
 
@@ -295,22 +332,27 @@ public class ConnectionManager implements IConnectionManager, IConnectionListene
                 this.connectionEvents.put(event);
             }
         } catch (InterruptedException e) {
-            logger.debug("enqueueConnectionEvent caught Interrupt Exception for event {}", event);
+            logger.debug(
+                    "enqueueConnectionEvent caught Interrupt Exception for event {}",
+                    event);
         }
     }
 
     private void notifyClusterViewChanged() {
-        ConnectionMgmtEvent event = new ConnectionMgmtEvent(ConnectionMgmtEventType.CLUSTER_VIEW_CHANGED, null);
+        ConnectionMgmtEvent event = new ConnectionMgmtEvent(
+                ConnectionMgmtEventType.CLUSTER_VIEW_CHANGED, null);
         enqueueConnectionEvent(event);
     }
 
     private void notifyNodeDisconnectedEvent(Node node) {
-        ConnectionMgmtEvent event = new ConnectionMgmtEvent(ConnectionMgmtEventType.NODE_DISCONNECTED_FROM_MASTER, node);
+        ConnectionMgmtEvent event = new ConnectionMgmtEvent(
+                ConnectionMgmtEventType.NODE_DISCONNECTED_FROM_MASTER, node);
         enqueueConnectionEvent(event);
     }
 
     /*
-     * this thread monitors the connectionEvent queue for new incoming events from
+     * this thread monitors the connectionEvent queue for new incoming events
+     * from
      */
     private class EventHandler implements Runnable {
         @Override
@@ -322,17 +364,19 @@ public class ConnectionManager implements IConnectionManager, IConnectionListene
                     ConnectionMgmtEventType eType = ev.getEvent();
                     switch (eType) {
                     case NODE_DISCONNECTED_FROM_MASTER:
-                        Node node = (Node)ev.getData();
+                        Node node = (Node) ev.getData();
                         connectionService.notifyNodeDisconnectFromMaster(node);
                         break;
                     case CLUSTER_VIEW_CHANGED:
                         AbstractScheme scheme = schemes.get(activeScheme);
-                        if (scheme == null) return;
+                        if (scheme == null)
+                            return;
                         scheme.handleClusterViewChanged();
                         connectionService.notifyClusterViewChanged();
                         break;
                     default:
-                        logger.error("Unknown Connection event {}", eType.ordinal());
+                        logger.error("Unknown Connection event {}",
+                                eType.ordinal());
                     }
                 } catch (InterruptedException e) {
                     connectionEvents.clear();
@@ -349,7 +393,7 @@ public class ConnectionManager implements IConnectionManager, IConnectionListene
                 null);
     }
 
-    public void _scheme (CommandInterpreter ci) {
+    public void _scheme(CommandInterpreter ci) {
         String schemeStr = ci.nextArgument();
         if (schemeStr == null) {
             ci.println("Please enter valid Scheme name");
@@ -364,7 +408,7 @@ public class ConnectionManager implements IConnectionManager, IConnectionListene
         activeScheme = scheme;
     }
 
-    public void _printNodes (CommandInterpreter ci) {
+    public void _printNodes(CommandInterpreter ci) {
         String controller = ci.nextArgument();
         if (controller == null) {
             ci.println("Nodes connected to this controller : ");
@@ -377,14 +421,14 @@ public class ConnectionManager implements IConnectionManager, IConnectionListene
         }
         try {
             InetAddress address = InetAddress.getByName(controller);
-            ci.println("Nodes connected to controller "+controller);
+            ci.println("Nodes connected to controller " + controller);
             if (this.getNodes(address) == null) {
                 ci.println("None");
             } else {
                 ci.println(this.getNodes(address).toString());
             }
         } catch (UnknownHostException e) {
-           logger.error("An error occured",e);
+            logger.error("An error occured", e);
         }
     }
 
@@ -396,4 +440,12 @@ public class ConnectionManager implements IConnectionManager, IConnectionListene
         help.append("\t printNodes [<controller>]            - Print connected nodes\n");
         return help.toString();
     }
+
+    @Override
+    public Set<InetAddress> getControllers(Node node) {
+        AbstractScheme scheme = schemes.get(activeScheme);
+        if (scheme == null)
+            return Collections.emptySet();
+        return scheme.getControllers(node);
+    }
 }