X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fprotocol_plugins%2Fopenflow%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fprotocol_plugin%2Fopenflow%2Finternal%2FInventoryServiceShim.java;h=9e0179680612c52a46a194544471d1c0a88c19ca;hp=837426eda42576ceb09ebb169e40ce954983df62;hb=a2e0ce161dfaa25245e24f2899b2a020298c5920;hpb=90187806b89850300203ef904223c091262fcf3c diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/InventoryServiceShim.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/InventoryServiceShim.java index 837426eda4..9e01796806 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/InventoryServiceShim.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/InventoryServiceShim.java @@ -26,6 +26,7 @@ import org.opendaylight.controller.protocol_plugin.openflow.core.IController; import org.opendaylight.controller.protocol_plugin.openflow.core.IMessageListener; import org.opendaylight.controller.protocol_plugin.openflow.core.ISwitch; import org.opendaylight.controller.protocol_plugin.openflow.core.ISwitchStateListener; +import org.opendaylight.controller.sal.connection.IPluginOutConnectionService; import org.opendaylight.controller.sal.core.Actions; import org.opendaylight.controller.sal.core.Buffers; import org.opendaylight.controller.sal.core.Capabilities; @@ -63,11 +64,13 @@ public class InventoryServiceShim implements IContainerListener, .getLogger(InventoryServiceShim.class); private IController controller = null; private final ConcurrentMap inventoryShimInternalListeners = new ConcurrentHashMap(); + private final Set globalInventoryShimInternalListeners = new HashSet(); private final List inventoryShimExternalListeners = new CopyOnWriteArrayList(); private final ConcurrentMap> nodeConnectorContainerMap = new ConcurrentHashMap>(); private final ConcurrentMap> nodeContainerMap = new ConcurrentHashMap>(); private final ConcurrentMap> nodeConnectorProps = new ConcurrentHashMap>(); private final ConcurrentMap> nodeProps = new ConcurrentHashMap>(); + private IPluginOutConnectionService connectionOutService; void setController(IController s) { this.controller = s; @@ -79,6 +82,20 @@ public class InventoryServiceShim implements IContainerListener, } } + void setInventoryShimGlobalInternalListener(Map props, + IInventoryShimInternalListener s) { + if ((this.globalInventoryShimInternalListeners != null)) { + this.globalInventoryShimInternalListeners.add(s); + } + } + + void unsetInventoryShimGlobalInternalListener(Map props, + IInventoryShimInternalListener s) { + if ((this.globalInventoryShimInternalListeners != null)) { + this.globalInventoryShimInternalListeners.remove(s); + } + } + void setInventoryShimInternalListener(Map props, IInventoryShimInternalListener s) { if (props == null) { @@ -107,7 +124,7 @@ public class InventoryServiceShim implements IContainerListener, } String containerName = (String) props.get("containerName"); if (containerName == null) { - logger.error("unsetInventoryShimInternalListener containerName not supplied"); + logger.error("setInventoryShimInternalListener containerName not supplied"); return; } if ((this.inventoryShimInternalListeners != null) @@ -136,6 +153,16 @@ public class InventoryServiceShim implements IContainerListener, } } + void setIPluginOutConnectionService(IPluginOutConnectionService s) { + connectionOutService = s; + } + + void unsetIPluginOutConnectionService(IPluginOutConnectionService s) { + if (connectionOutService == s) { + connectionOutService = null; + } + } + /** * Function called by the dependency manager when all the required * dependencies are satisfied @@ -167,6 +194,7 @@ public class InventoryServiceShim implements IContainerListener, this.inventoryShimInternalListeners.clear(); this.nodeConnectorContainerMap.clear(); this.nodeContainerMap.clear(); + this.globalInventoryShimInternalListeners.clear(); this.controller = null; } @@ -255,10 +283,10 @@ public class InventoryServiceShim implements IContainerListener, } @Override - public void nodeConnectorUpdated(String containerName, NodeConnector p, UpdateType t) { - logger.debug("nodeConnectorUpdated: {} type {} for container {}", new Object[] { p, t, containerName }); - Node node = p.getNode(); - Set ncContainers = this.nodeConnectorContainerMap.get(p); + public void nodeConnectorUpdated(String containerName, NodeConnector nc, UpdateType t) { + logger.debug("nodeConnectorUpdated: {} type {} for container {}", new Object[] { nc, t, containerName }); + Node node = nc.getNode(); + Set ncContainers = this.nodeConnectorContainerMap.get(nc); Set nodeContainers = this.nodeContainerMap.get(node); if (ncContainers == null) { ncContainers = new CopyOnWriteArraySet(); @@ -271,7 +299,7 @@ public class InventoryServiceShim implements IContainerListener, switch (t) { case ADDED: if (ncContainers.add(containerName)) { - this.nodeConnectorContainerMap.put(p, ncContainers); + this.nodeConnectorContainerMap.put(nc, ncContainers); } if (nodeContainers.add(containerName)) { this.nodeContainerMap.put(node, nodeContainers); @@ -283,14 +311,14 @@ public class InventoryServiceShim implements IContainerListener, if (ncContainers.isEmpty()) { // Do cleanup to reduce memory footprint if no // elements to be tracked - this.nodeConnectorContainerMap.remove(p); + this.nodeConnectorContainerMap.remove(nc); } else { - this.nodeConnectorContainerMap.put(p, ncContainers); + this.nodeConnectorContainerMap.put(nc, ncContainers); } } boolean nodeContainerUpdate = true; - for (NodeConnector nc : nodeConnectorContainerMap.keySet()) { - if ((nc.getNode().equals(node)) && (nodeConnectorContainerMap.get(nc).contains(containerName))) { + for (NodeConnector ncContainer : nodeConnectorContainerMap.keySet()) { + if ((ncContainer.getNode().equals(node)) && (nodeConnectorContainerMap.get(ncContainer).contains(containerName))) { nodeContainerUpdate = false; break; } @@ -309,12 +337,15 @@ public class InventoryServiceShim implements IContainerListener, break; } - Set ncProp = nodeConnectorProps.get(p); + Set nodeProp = nodeProps.get(node); + if (nodeProp == null) { + return; + } + Set ncProp = nodeConnectorProps.get(nc); // notify InventoryService - notifyInventoryShimInternalListener(containerName, p, t, ncProp); + notifyInventoryShimInternalListener(containerName, nc, t, ncProp); if (notifyNodeUpdate) { - Set nodeProp = nodeProps.get(node); notifyInventoryShimInternalListener(containerName, node, t, nodeProp); } } @@ -350,32 +381,86 @@ public class InventoryServiceShim implements IContainerListener, * Notify all internal and external listeners */ private void notifyInventoryShimListener(NodeConnector nodeConnector, UpdateType type, Set props) { - // notify other containers - Set containers = (nodeConnectorContainerMap.get(nodeConnector) == null) ? new HashSet() - : new HashSet(nodeConnectorContainerMap.get(nodeConnector)); - containers.add(GlobalConstants.DEFAULT.toString()); - for (String container : containers) { - notifyInventoryShimInternalListener(container, nodeConnector, type, props); - } - // Notify DiscoveryService - notifyInventoryShimExternalListener(nodeConnector, type, props); + //establish locality before notifying + boolean isNodeLocal; + if (type == UpdateType.REMOVED){ + //if removing get the locality first + isNodeLocal = connectionOutService.isLocal(nodeConnector.getNode()); + notifyGlobalInventoryShimInternalListener(nodeConnector, type, props); + } else { + notifyGlobalInventoryShimInternalListener(nodeConnector, type, props); + isNodeLocal = connectionOutService.isLocal(nodeConnector.getNode()); + } + + if (isNodeLocal) { + // notify other containers + Set containers = (nodeConnectorContainerMap.get(nodeConnector) == null) ? new HashSet() + : new HashSet(nodeConnectorContainerMap.get(nodeConnector)); + containers.add(GlobalConstants.DEFAULT.toString()); + for (String container : containers) { + notifyInventoryShimInternalListener(container, nodeConnector, type, props); + } + + // Notify DiscoveryService + notifyInventoryShimExternalListener(nodeConnector, type, props); + + logger.debug("Connection service accepted the inventory notification for {} {}", nodeConnector, type); + } else { + logger.debug("Connection service dropped the inventory notification for {} {}", nodeConnector, type); + } } /* * Notify all internal and external listeners */ private void notifyInventoryShimListener(Node node, UpdateType type, Set props) { - // Now notify other containers - Set containers = (nodeContainerMap.get(node) == null) ? new HashSet() : new HashSet( - nodeContainerMap.get(node)); - containers.add(GlobalConstants.DEFAULT.toString()); - for (String container : containers) { - notifyInventoryShimInternalListener(container, node, type, props); + + //establish locality before notifying + boolean isNodeLocal; + if (type == UpdateType.REMOVED){ + //if removing get the locality first + isNodeLocal = connectionOutService.isLocal(node); + notifyGlobalInventoryShimInternalListener(node, type, props); + } else { + notifyGlobalInventoryShimInternalListener(node, type, props); + isNodeLocal = connectionOutService.isLocal(node); + } + + if (isNodeLocal) { + // Now notify other containers + Set containers = (nodeContainerMap.get(node) == null) ? new HashSet() : new HashSet( + nodeContainerMap.get(node)); + containers.add(GlobalConstants.DEFAULT.toString()); + for (String container : containers) { + notifyInventoryShimInternalListener(container, node, type, props); + } + + // Notify external listener + notifyInventoryShimExternalListener(node, type, props); + + logger.debug("Connection service accepted the inventory notification for {} {}", node, type); + } else { + logger.debug("Connection service dropped the inventory notification for {} {}", node, type); + } + } + + private void notifyGlobalInventoryShimInternalListener(Node node, UpdateType type, Set props) { + for (IInventoryShimInternalListener globalListener : globalInventoryShimInternalListeners) { + globalListener.updateNode(node, type, props); + logger.trace( + "notifyGlobalInventoryShimInternalListener {} type {}", + new Object[] { node, type }); } + } - // Notify external listener - notifyInventoryShimExternalListener(node, type, props); + private void notifyGlobalInventoryShimInternalListener(NodeConnector nodeConnector, UpdateType type, Set props) { + for (IInventoryShimInternalListener globalListener : globalInventoryShimInternalListeners) { + globalListener.updateNodeConnector(nodeConnector, type, props); + logger.trace( + "notifyGlobalInventoryShimInternalListener {} type {}", + new Object[] { nodeConnector, type }); + } } private void notifyInventoryShimInternalListener(String container,