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%2FInventoryServiceShim.java;h=f7210a333bd870d87216128b73cffb8a8402842f;hb=1e9531138e44cd757ca27b0d86e98eccb22ccd82;hp=8d157ac29f694f721f232ba752fcac277c2fb1a5;hpb=cffdfafd2b23b24025f5ba4b32f16bca501bfeb5;p=controller.git 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 8d157ac29f..f7210a333b 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 @@ -1,4 +1,3 @@ - /* * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * @@ -20,6 +19,7 @@ import java.util.concurrent.CopyOnWriteArrayList; import org.opendaylight.controller.protocol_plugin.openflow.IInventoryShimExternalListener; import org.opendaylight.controller.protocol_plugin.openflow.IInventoryShimInternalListener; +import org.opendaylight.controller.protocol_plugin.openflow.IStatisticsListener; 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; @@ -29,7 +29,9 @@ 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.ContainerFlow; +import org.opendaylight.controller.sal.core.Description; import org.opendaylight.controller.sal.core.IContainerListener; +import org.opendaylight.controller.sal.core.MacAddress; import org.opendaylight.controller.sal.core.Node; import org.opendaylight.controller.sal.core.Node.NodeIDType; import org.opendaylight.controller.sal.core.NodeConnector; @@ -42,6 +44,7 @@ import org.openflow.protocol.OFMessage; import org.openflow.protocol.OFPortStatus; import org.openflow.protocol.OFPortStatus.OFPortReason; import org.openflow.protocol.OFType; +import org.openflow.protocol.statistics.OFDescriptionStatistics; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,13 +56,13 @@ import org.slf4j.LoggerFactory; * */ public class InventoryServiceShim implements IContainerListener, - IMessageListener, ISwitchStateListener { + IMessageListener, ISwitchStateListener, IStatisticsListener { protected static final Logger logger = LoggerFactory .getLogger(InventoryServiceShim.class); private IController controller = null; - private ConcurrentMap inventoryShimInternalListeners = new ConcurrentHashMap(); - private List inventoryShimExternalListeners = new CopyOnWriteArrayList(); - private ConcurrentMap> containerMap = new ConcurrentHashMap>(); + private final ConcurrentMap inventoryShimInternalListeners = new ConcurrentHashMap(); + private final List inventoryShimExternalListeners = new CopyOnWriteArrayList(); + private final ConcurrentMap> containerMap = new ConcurrentHashMap>(); void setController(IController s) { this.controller = s; @@ -74,42 +77,42 @@ public class InventoryServiceShim implements IContainerListener, void setInventoryShimInternalListener(Map props, IInventoryShimInternalListener s) { if (props == null) { - logger.error("Didn't receive the service properties"); + logger.error("setInventoryShimInternalListener property is null"); return; } String containerName = (String) props.get("containerName"); if (containerName == null) { - logger.error("containerName not supplied"); + logger.error("setInventoryShimInternalListener containerName not supplied"); return; } if ((this.inventoryShimInternalListeners != null) && !this.inventoryShimInternalListeners.containsValue(s)) { this.inventoryShimInternalListeners.put(containerName, s); - logger.trace("Added inventoryShimInternalListener for container:" - + containerName); + logger.trace( + "Added inventoryShimInternalListener for container {}", + containerName); } } void unsetInventoryShimInternalListener(Map props, IInventoryShimInternalListener s) { if (props == null) { - logger.error("Didn't receive the service properties"); + logger.error("unsetInventoryShimInternalListener property is null"); return; } String containerName = (String) props.get("containerName"); if (containerName == null) { - logger.error("containerName not supplied"); + logger.error("unsetInventoryShimInternalListener containerName not supplied"); return; } if ((this.inventoryShimInternalListeners != null) - && this.inventoryShimInternalListeners - .get(containerName) != null - && this.inventoryShimInternalListeners - .get(containerName).equals(s)) { + && this.inventoryShimInternalListeners.get(containerName) != null + && this.inventoryShimInternalListeners.get(containerName) + .equals(s)) { this.inventoryShimInternalListeners.remove(containerName); - logger - .trace("Removed inventoryShimInternalListener for container: " - + containerName); + logger.trace( + "Removed inventoryShimInternalListener for container {}", + containerName); } } @@ -139,8 +142,7 @@ public class InventoryServiceShim implements IContainerListener, } /** - * Function called after registering the - * service in OSGi service registry. + * Function called after registering the service in OSGi service registry. */ void started() { /* Start with existing switches */ @@ -148,9 +150,9 @@ public class InventoryServiceShim implements IContainerListener, } /** - * 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. + * 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() { @@ -169,7 +171,7 @@ public class InventoryServiceShim implements IContainerListener, handlePortStatusMessage(sw, (OFPortStatus) msg); } } catch (ConstructionException e) { - e.printStackTrace(); + logger.error("",e); } return; } @@ -189,6 +191,8 @@ public class InventoryServiceShim implements IContainerListener, type = UpdateType.CHANGED; } + logger.trace("handlePortStatusMessage {} type {}", nodeConnector, type); + if (type != null) { // get node connector properties Set props = InventoryServiceHelper.OFPortToProps(m @@ -199,15 +203,16 @@ public class InventoryServiceShim implements IContainerListener, @Override public void switchAdded(ISwitch sw) { - if (sw == null) + if (sw == null) { return; + } // Add all the nodeConnectors of this switch Map> ncProps = InventoryServiceHelper .OFSwitchToProps(sw); for (Map.Entry> entry : ncProps.entrySet()) { - notifyInventoryShimListener(entry.getKey(), UpdateType.ADDED, entry - .getValue()); + notifyInventoryShimListener(entry.getKey(), UpdateType.ADDED, + entry.getValue()); } // Add this node @@ -216,8 +221,9 @@ public class InventoryServiceShim implements IContainerListener, @Override public void switchDeleted(ISwitch sw) { - if (sw == null) + if (sw == null) { return; + } removeNode(sw); } @@ -300,17 +306,19 @@ public class InventoryServiceShim implements IContainerListener, if (inventoryShimInternalListener != null) { inventoryShimInternalListener.updateNodeConnector(nodeConnector, type, props); - logger.trace(type + " " + nodeConnector + " on container " - + container); + logger.trace( + "notifyInventoryShimInternalListener {} type {} for container {}", + nodeConnector, type, container); } } /* - * Notify all internal and external listeners + * Notify all internal and external listeners */ private void notifyInventoryShimListener(NodeConnector nodeConnector, UpdateType type, Set props) { - // Always notify default InventoryService. Store properties in default one. + // Always notify default InventoryService. Store properties in default + // one. notifyInventoryShimInternalListener(GlobalConstants.DEFAULT.toString(), nodeConnector, type, props); @@ -329,7 +337,7 @@ public class InventoryServiceShim implements IContainerListener, } /* - * Notify all internal and external listeners + * Notify all internal and external listeners */ private void notifyInventoryShimListener(Node node, UpdateType type, Set props) { @@ -349,6 +357,14 @@ public class InventoryServiceShim implements IContainerListener, inventoryShimInternalListener.updateNode(node, type, null); } break; + case CHANGED: + // Notify only the default Inventory Service + inventoryShimDefaultListener = inventoryShimInternalListeners + .get(GlobalConstants.DEFAULT.toString()); + if (inventoryShimDefaultListener != null) { + inventoryShimDefaultListener.updateNode(node, type, props); + } + break; default: break; } @@ -376,27 +392,29 @@ public class InventoryServiceShim implements IContainerListener, Long connectedSinceTime = (connectedSince == null) ? 0 : connectedSince .getTime(); props.add(new TimeStamp(connectedSinceTime, "connectedSince")); + props.add(new MacAddress(deriveMacAddress(sid))); byte tables = sw.getTables(); Tables t = new Tables(tables); if (t != null) { - props.add(t); + props.add(t); } int cap = sw.getCapabilities(); Capabilities c = new Capabilities(cap); if (c != null) { - props.add(c); + props.add(c); } int act = sw.getActions(); Actions a = new Actions(act); if (a != null) { - props.add(a); + props.add(a); } int buffers = sw.getBuffers(); Buffers b = new Buffers(buffers); if (b != null) { - props.add(b); + props.add(b); } + // Notify all internal and external listeners notifyInventoryShimListener(node, type, props); } @@ -423,4 +441,35 @@ public class InventoryServiceShim implements IContainerListener, switchAdded(sw); } } + + @Override + public void descriptionRefreshed(Long switchId, + OFDescriptionStatistics descriptionStats) { + Node node; + try { + node = new Node(NodeIDType.OPENFLOW, switchId); + } catch (ConstructionException e) { + logger.error("{}", e.getMessage()); + return; + } + + Set properties = new HashSet(1); + Description desc = new Description( + descriptionStats.getDatapathDescription()); + properties.add(desc); + + // Notify all internal and external listeners + notifyInventoryShimListener(node, UpdateType.CHANGED, properties); + } + + private byte[] deriveMacAddress(long dpid) { + byte[] mac = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + + for (short i = 0; i < 6; i++) { + mac[5 - i] = (byte) dpid; + dpid >>= 8; + } + + return mac; + } }