X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fprotocol_plugins%2Fopenflow%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fprotocol_plugin%2Fopenflow%2Finternal%2FInventoryService.java;h=f983e1244dba519f7a2afc0c6d13f8937f1178bc;hb=dfa4383b0b5c9c6de340526a62aef731922fa29f;hp=8af9b3ea058d894bf544c960bedf019256924721;hpb=a3a28e8138fa25170b01e6b51a44490f002f6e91;p=controller.git diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/InventoryService.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/InventoryService.java index 8af9b3ea05..f983e1244d 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/InventoryService.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/InventoryService.java @@ -8,8 +8,6 @@ package org.opendaylight.controller.protocol_plugin.openflow.internal; -import java.util.Collections; -import java.util.Date; import java.util.Dictionary; import java.util.HashMap; import java.util.HashSet; @@ -17,21 +15,16 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.CopyOnWriteArraySet; import org.apache.felix.dm.Component; +import org.opendaylight.controller.protocol_plugin.openflow.IInventoryProvider; import org.opendaylight.controller.protocol_plugin.openflow.IInventoryShimInternalListener; import org.opendaylight.controller.protocol_plugin.openflow.core.IController; import org.opendaylight.controller.protocol_plugin.openflow.core.ISwitch; -import org.opendaylight.controller.sal.core.Actions; -import org.opendaylight.controller.sal.core.Buffers; -import org.opendaylight.controller.sal.core.Capabilities; -import org.opendaylight.controller.sal.core.ConstructionException; import org.opendaylight.controller.sal.core.Node; -import org.opendaylight.controller.sal.core.Node.NodeIDType; import org.opendaylight.controller.sal.core.NodeConnector; import org.opendaylight.controller.sal.core.Property; -import org.opendaylight.controller.sal.core.Tables; -import org.opendaylight.controller.sal.core.TimeStamp; import org.opendaylight.controller.sal.core.UpdateType; import org.opendaylight.controller.sal.inventory.IPluginInInventoryService; import org.opendaylight.controller.sal.inventory.IPluginOutInventoryService; @@ -44,19 +37,20 @@ import org.slf4j.LoggerFactory; * container of the network. Each instance gets container specific inventory * events from InventoryServiceShim. It interacts with SAL to pass inventory * data to the upper application. - * - * + * + * */ public class InventoryService implements IInventoryShimInternalListener, - IPluginInInventoryService { + IPluginInInventoryService, IInventoryProvider { protected static final Logger logger = LoggerFactory .getLogger(InventoryService.class); - private Set pluginOutInventoryServices = Collections - .synchronizedSet(new HashSet()); + private final Set pluginOutInventoryServices = + new CopyOnWriteArraySet(); private IController controller = null; - private ConcurrentMap> nodeProps; // properties are maintained in global container only - private ConcurrentMap> nodeConnectorProps; // properties are maintained in global container only + private ConcurrentMap> nodeProps; + private ConcurrentMap> nodeConnectorProps; private boolean isDefaultContainer = false; + private String containerName = null; void setController(IController s) { this.controller = s; @@ -71,7 +65,7 @@ public class InventoryService implements IInventoryShimInternalListener, /** * Function called by the dependency manager when all the required * dependencies are satisfied - * + * */ @SuppressWarnings("rawtypes") void init(Component c) { @@ -79,9 +73,11 @@ public class InventoryService implements IInventoryShimInternalListener, Dictionary props = c.getServiceProperties(); if (props != null) { - String containerName = (String) props.get("containerName"); - isDefaultContainer = containerName.equals(GlobalConstants.DEFAULT - .toString()); + containerName = (String) props.get("containerName"); + if (containerName != null) { + isDefaultContainer = containerName.equals(GlobalConstants.DEFAULT + .toString()); + } } nodeProps = new ConcurrentHashMap>(); @@ -92,7 +88,7 @@ public class InventoryService implements IInventoryShimInternalListener, * Function called by the dependency manager when at least one dependency * become unsatisfied or when the component is shutting down because for * example bundle is being stopped. - * + * */ void destroy() { logger.trace("DESTROY called!"); @@ -101,7 +97,7 @@ public class InventoryService implements IInventoryShimInternalListener, /** * Function called by dependency manager after "init ()" is called and after * the services provided by the class are registered in the service registry - * + * */ void start() { logger.trace("START called!"); @@ -111,10 +107,11 @@ public class InventoryService implements IInventoryShimInternalListener, * Function called by the dependency manager before the services exported by * the component are unregistered, this will be followed by a "destroy ()" * calls - * + * */ void stop() { logger.trace("STOP called!"); + pluginOutInventoryServices.clear(); } public void setPluginOutInventoryServices(IPluginOutInventoryService service) { @@ -132,62 +129,12 @@ public class InventoryService implements IInventoryShimInternalListener, } } - protected Node OFSwitchToNode(ISwitch sw) { - Node node = null; - Object id = sw.getId(); - - try { - node = new Node(NodeIDType.OPENFLOW, id); - } catch (ConstructionException e) { - logger.error("", e); - } - - return node; - } - /** * Retrieve nodes from openflow */ @Override public ConcurrentMap> getNodeProps() { - if (nodeProps == null) - return null; - Map switches = controller.getSwitches(); - for (Map.Entry entry : switches.entrySet()) { - ISwitch sw = entry.getValue(); - Node node = OFSwitchToNode(sw); - Map propMap = null; - if (isDefaultContainer) { - propMap = new HashMap(); - byte tables = sw.getTables(); - Tables t = new Tables(tables); - if (t != null) { - propMap.put(Tables.TablesPropName, t); - } - int cap = sw.getCapabilities(); - Capabilities c = new Capabilities(cap); - if (c != null) { - propMap.put(Capabilities.CapabilitiesPropName, c); - } - int act = sw.getActions(); - Actions a = new Actions(act); - if (a != null) { - propMap.put(Actions.ActionsPropName, a); - } - int buffers = sw.getBuffers(); - Buffers b = new Buffers(buffers); - if (b != null) { - propMap.put(Buffers.BuffersPropName, b); - } - Date connectedSince = sw.getConnectedDate(); - Long connectedSinceTime = (connectedSince == null) ? 0 - : connectedSince.getTime(); - TimeStamp timeStamp = new TimeStamp(connectedSinceTime, - "connectedSince"); - propMap.put(TimeStamp.TimeStampPropName, timeStamp); - nodeProps.put(node, propMap); - } - } + logger.debug("getNodePros for container {}", containerName); return nodeProps; } @@ -246,38 +193,44 @@ public class InventoryService implements IInventoryShimInternalListener, } // update sal and discovery - synchronized (pluginOutInventoryServices) { - for (IPluginOutInventoryService service : pluginOutInventoryServices) { - service.updateNodeConnector(nodeConnector, type, props); - } + for (IPluginOutInventoryService service : pluginOutInventoryServices) { + service.updateNodeConnector(nodeConnector, type, props); } + } private void addNode(Node node, Set props) { - logger.trace("{} added, props: {}", node, props); if (nodeProps == null) { return; } + logger.trace("addNode: {} added, props: {} for container {}", + new Object[] { node, props, containerName }); + // update local cache - Map propMap = new HashMap(); - for (Property prop : props) { - propMap.put(prop.getName(), prop); + Map propMap = nodeProps.get(node); + if (propMap == null) { + propMap = new HashMap(); + } + + if (props != null) { + for (Property prop : props) { + propMap.put(prop.getName(), prop); + } } nodeProps.put(node, propMap); // update sal - synchronized (pluginOutInventoryServices) { - for (IPluginOutInventoryService service : pluginOutInventoryServices) { - service.updateNode(node, UpdateType.ADDED, props); - } + for (IPluginOutInventoryService service : pluginOutInventoryServices) { + service.updateNode(node, UpdateType.ADDED, props); } } private void removeNode(Node node) { logger.trace("{} removed", node); - if (nodeProps == null) + if (nodeProps == null) { return; + } // update local cache nodeProps.remove(node); @@ -293,17 +246,15 @@ public class InventoryService implements IInventoryShimInternalListener, } // update sal - synchronized (pluginOutInventoryServices) { - for (IPluginOutInventoryService service : pluginOutInventoryServices) { - service.updateNode(node, UpdateType.REMOVED, null); - } + for (IPluginOutInventoryService service : pluginOutInventoryServices) { + service.updateNode(node, UpdateType.REMOVED, null); } } - + private void updateNode(Node node, Set properties) { logger.trace("{} updated, props: {}", node, properties); - if (nodeProps == null || !nodeProps.containsKey(node) || - properties == null || properties.isEmpty()) { + if ((nodeProps == null) || !nodeProps.containsKey(node) || + (properties == null) || properties.isEmpty()) { return; } @@ -315,16 +266,14 @@ public class InventoryService implements IInventoryShimInternalListener, Property currentProperty = propertyMap.get(name); if (!property.equals(currentProperty)) { propertyMap.put(name, property); - newProperties.add(property); + newProperties.add(property); } } // Update SAL if we got new properties if (!newProperties.isEmpty()) { - synchronized (pluginOutInventoryServices) { - for (IPluginOutInventoryService service : pluginOutInventoryServices) { - service.updateNode(node, UpdateType.CHANGED, newProperties); - } + for (IPluginOutInventoryService service : pluginOutInventoryServices) { + service.updateNode(node, UpdateType.CHANGED, newProperties); } } } @@ -345,5 +294,4 @@ public class InventoryService implements IInventoryShimInternalListener, break; } } - }