-
/*
* Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
*
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;
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.Node;
import org.opendaylight.controller.sal.core.Node.NodeIDType;
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;
* The class describes a shim layer that bridges inventory events from Openflow
* core to various listeners. The notifications are filtered based on container
* configurations.
- *
- *
+ *
+ *
*/
public class InventoryServiceShim implements IContainerListener,
- IMessageListener, ISwitchStateListener {
+ IMessageListener, ISwitchStateListener, IStatisticsListener {
protected static final Logger logger = LoggerFactory
.getLogger(InventoryServiceShim.class);
private IController controller = null;
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);
}
}
/**
* Function called by the dependency manager when all the required
* dependencies are satisfied
- *
+ *
*/
void init() {
this.controller.addMessageListener(OFType.PORT_STATUS, this);
}
/**
- * 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 */
}
/**
- * 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() {
this.controller.removeMessageListener(OFType.PACKET_IN, this);
handlePortStatusMessage(sw, (OFPortStatus) msg);
}
} catch (ConstructionException e) {
- e.printStackTrace();
+ logger.error("",e);
}
return;
}
type = UpdateType.CHANGED;
}
+ logger.trace("handlePortStatusMessage {} type {}", nodeConnector, type);
+
if (type != null) {
// get node connector properties
Set<Property> props = InventoryServiceHelper.OFPortToProps(m
Map<NodeConnector, Set<Property>> ncProps = InventoryServiceHelper
.OFSwitchToProps(sw);
for (Map.Entry<NodeConnector, Set<Property>> entry : ncProps.entrySet()) {
- notifyInventoryShimListener(entry.getKey(), UpdateType.ADDED, entry
- .getValue());
+ notifyInventoryShimListener(entry.getKey(), UpdateType.ADDED,
+ entry.getValue());
}
// Add this node
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<Property> 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);
}
/*
- * Notify all internal and external listeners
+ * Notify all internal and external listeners
*/
private void notifyInventoryShimListener(Node node, UpdateType type,
Set<Property> props) {
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;
}
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);
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<Property> properties = new HashSet<Property>(1);
+ Description desc = new Description(
+ descriptionStats.getDatapathDescription());
+ properties.add(desc);
+
+ // Notify all internal and external listeners
+ notifyInventoryShimListener(node, UpdateType.CHANGED, properties);
+ }
+
+
}