- Fixed null pointer exceptions on switch disconnect that was
connected to 2 or more controllers in "Any controller-One master" scheme
- Added node count to clustered controllers table in UI
Change-Id: I0c322a7a4105955a545b24a9ba1f36743800a802
Signed-off-by: Yevgeny Khodorkovsky <ykhodork@cisco.com>
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
-import javax.transaction.SystemException;
-
import org.opendaylight.controller.clustering.services.CacheConfigException;
import org.opendaylight.controller.clustering.services.CacheExistException;
import org.opendaylight.controller.clustering.services.IClusterGlobalServices;
import org.opendaylight.controller.clustering.services.CacheConfigException;
import org.opendaylight.controller.clustering.services.CacheExistException;
import org.opendaylight.controller.clustering.services.IClusterGlobalServices;
return controllerNodesMap.get(controller);
}
return controllerNodesMap.get(controller);
}
- @SuppressWarnings("deprecation")
public Set<Node> getNodes() {
return getNodes(clusterServices.getMyAddress());
}
public Set<Node> getNodes() {
return getNodes(clusterServices.getMyAddress());
}
return nodeConnections;
}
return nodeConnections;
}
- @SuppressWarnings("deprecation")
public boolean isLocal(Node node) {
if (nodeConnections == null) return false;
InetAddress myController = clusterServices.getMyAddress();
public boolean isLocal(Node node) {
if (nodeConnections == null) return false;
InetAddress myController = clusterServices.getMyAddress();
return (controllers != null && controllers.contains(myController));
}
return (controllers != null && controllers.contains(myController));
}
- @SuppressWarnings("deprecation")
public Status removeNode (Node node) {
return removeNodeFromController(node, clusterServices.getMyAddress());
}
public Status removeNode (Node node) {
return removeNodeFromController(node, clusterServices.getMyAddress());
}
import org.opendaylight.controller.protocol_plugin.openflow.IInventoryShimExternalListener;
import org.opendaylight.controller.protocol_plugin.openflow.core.IController;
import org.opendaylight.controller.protocol_plugin.openflow.core.ISwitch;
import org.opendaylight.controller.protocol_plugin.openflow.IInventoryShimExternalListener;
import org.opendaylight.controller.protocol_plugin.openflow.core.IController;
import org.opendaylight.controller.protocol_plugin.openflow.core.ISwitch;
-import org.openflow.protocol.OFPhysicalPort;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.FrameworkUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import org.opendaylight.controller.sal.connection.IPluginOutConnectionService;
import org.opendaylight.controller.sal.core.Config;
import org.opendaylight.controller.sal.core.ConstructionException;
import org.opendaylight.controller.sal.connection.IPluginOutConnectionService;
import org.opendaylight.controller.sal.core.Config;
import org.opendaylight.controller.sal.core.ConstructionException;
-import org.opendaylight.controller.sal.core.Edge;
import org.opendaylight.controller.sal.core.ContainerFlow;
import org.opendaylight.controller.sal.core.ContainerFlow;
+import org.opendaylight.controller.sal.core.Edge;
import org.opendaylight.controller.sal.core.IContainerListener;
import org.opendaylight.controller.sal.core.Node;
import org.opendaylight.controller.sal.core.NodeConnector;
import org.opendaylight.controller.sal.core.IContainerListener;
import org.opendaylight.controller.sal.core.Node;
import org.opendaylight.controller.sal.core.NodeConnector;
import org.opendaylight.controller.sal.utils.NetUtils;
import org.opendaylight.controller.sal.utils.NodeConnectorCreator;
import org.opendaylight.controller.sal.utils.NodeCreator;
import org.opendaylight.controller.sal.utils.NetUtils;
import org.opendaylight.controller.sal.utils.NodeConnectorCreator;
import org.opendaylight.controller.sal.utils.NodeCreator;
+import org.openflow.protocol.OFPhysicalPort;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* The class describes neighbor discovery service for an OpenFlow network.
/**
* The class describes neighbor discovery service for an OpenFlow network.
private void addDiscovery(Node node) {
Map<Long, ISwitch> switches = controller.getSwitches();
ISwitch sw = switches.get(node.getID());
private void addDiscovery(Node node) {
Map<Long, ISwitch> switches = controller.getSwitches();
ISwitch sw = switches.get(node.getID());
- List<OFPhysicalPort> ports = sw.getEnabledPorts();
- if (ports == null) {
+ if (sw == null) {
+ //switch could be removed by now, stop propagation
+ List<OFPhysicalPort> ports = sw.getEnabledPorts();
for (OFPhysicalPort port : ports) {
NodeConnector nodeConnector = NodeConnectorCreator.createOFNodeConnector(port.getPortNumber(), node);
if (!readyListHi.contains(nodeConnector)) {
for (OFPhysicalPort port : ports) {
NodeConnector nodeConnector = NodeConnectorCreator.createOFNodeConnector(port.getPortNumber(), node);
if (!readyListHi.contains(nodeConnector)) {
Set<Property> props = new HashSet<Property>();
Long sid = (Long) node.getID();
Set<Property> props = new HashSet<Property>();
Long sid = (Long) node.getID();
- Date connectedSince = controller.getSwitches().get(sid)
- .getConnectedDate();
+ Date connectedSince = sw.getConnectedDate();
Long connectedSinceTime = (connectedSince == null) ? 0 : connectedSince
.getTime();
props.add(new TimeStamp(connectedSinceTime, "connectedSince"));
Long connectedSinceTime = (connectedSince == null) ? 0 : connectedSince
.getTime();
props.add(new TimeStamp(connectedSinceTime, "connectedSince"));
private final String name;
private final Boolean me;
private final Boolean coordinator;
private final String name;
private final Boolean me;
private final Boolean coordinator;
+ private final Integer numConnectedNodes;
public static class Builder {
// required params
public static class Builder {
// required params
// optional params
private Boolean me = null;
private Boolean coordinator = null;
// optional params
private Boolean me = null;
private Boolean coordinator = null;
+ private Integer numConnectedNodes = null;
public Builder(InetAddress address) {
this.address = address.getAddress();
public Builder(InetAddress address) {
this.address = address.getAddress();
+ public Builder nodesConnected(int numNodes) {
+ this.numConnectedNodes = numNodes;
+ return this;
+ }
+
public ClusterNodeBean build() {
return new ClusterNodeBean(this);
}
public ClusterNodeBean build() {
return new ClusterNodeBean(this);
}
this.name = builder.name;
this.me = builder.me;
this.coordinator = builder.coordinator;
this.name = builder.name;
this.me = builder.me;
this.coordinator = builder.coordinator;
+ this.numConnectedNodes = builder.numConnectedNodes;
}
}
\ No newline at end of file
}
}
\ No newline at end of file
if (clusterServices == null) {
return null;
}
if (clusterServices == null) {
return null;
}
+ IConnectionManager connectionManager = (IConnectionManager) ServiceHelper.getGlobalInstance(
+ IConnectionManager.class, this);
+ if (connectionManager == null) {
+ return null;
+ }
List<ClusterNodeBean> clusterNodes = new ArrayList<ClusterNodeBean>();
List<InetAddress> controllers = clusterServices.getClusteredControllers();
for (InetAddress controller : controllers) {
ClusterNodeBean.Builder clusterBeanBuilder = new ClusterNodeBean.Builder(controller);
List<ClusterNodeBean> clusterNodes = new ArrayList<ClusterNodeBean>();
List<InetAddress> controllers = clusterServices.getClusteredControllers();
for (InetAddress controller : controllers) {
ClusterNodeBean.Builder clusterBeanBuilder = new ClusterNodeBean.Builder(controller);
+
+ //get number of connected nodes
+ Set<Node> connectedNodes = connectionManager.getNodes(controller);
+ int numNodes = connectedNodes == null ? 0 : connectedNodes.size();
+ clusterBeanBuilder.nodesConnected(numNodes);
+
+ //determine if this is the executing controller
if (controller.equals(clusterServices.getMyAddress())) {
clusterBeanBuilder.highlightMe();
}
if (controller.equals(clusterServices.getMyAddress())) {
clusterBeanBuilder.highlightMe();
}
+
+ //determine whether this is coordinator
if (clusterServices.getCoordinatorAddress().equals(controller)) {
clusterBeanBuilder.iAmCoordinator();
}
if (clusterServices.getCoordinatorAddress().equals(controller)) {
clusterBeanBuilder.iAmCoordinator();
}
data : function(data) {
var tdata = [];
var registry = [];
data : function(data) {
var tdata = [];
var registry = [];
- $(data).each(function(idx, val) {
- var name = val.name;
- var address = val.address;
+ $(data).each(function(idx, controller) {
+ var name = controller.name;
+ var address = controller.address;
var $registry = $(document.createElement('span'));
$registry
.append(JSON.stringify(address))
var $registry = $(document.createElement('span'));
$registry
.append(JSON.stringify(address))
.addClass('ux-id');
name = one.lib.dashlet.label(name, null)[0].outerHTML;
name += $registry[0].outerHTML;
.addClass('ux-id');
name = one.lib.dashlet.label(name, null)[0].outerHTML;
name += $registry[0].outerHTML;
+ if (controller.me === true) {
var me = one.lib.dashlet.label('*', 'label-inverse')[0].outerHTML;
name += ' '+me;
}
var me = one.lib.dashlet.label('*', 'label-inverse')[0].outerHTML;
name += ' '+me;
}
- if (val.coordinator === true) {
+ if (controller.coordinator === true) {
var coord = one.lib.dashlet.label('C')[0].outerHTML;
name += ' '+coord;
}
tdata.push({
var coord = one.lib.dashlet.label('C')[0].outerHTML;
name += ' '+coord;
}
tdata.push({
+ 'controller' : name,
+ 'numNodes' : controller.numConnectedNodes
});
});
var source = new StaticDataSource({
});
});
var source = new StaticDataSource({
- columns : [
- {
- property : 'controller',
- label : 'Controller',
- sortable : true
- }
- ],
+ columns : [
+ {
+ property : 'controller',
+ label : 'Controller',
+ sortable : true
+ },
+ {
+ property : 'numNodes',
+ label : 'Nodes',
+ sortable : true
+ }
+ ],
data : tdata,
delay : 0
});
data : tdata,
delay : 0
});