X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fsal%2Fimplementation%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fimplementation%2Finternal%2FReadService.java;h=356c0e57c887f29f5d448ba523976f8fe077b5da;hp=0ee48d5b880b8efd4039e98d0d8c217aaf095a96;hb=315a10ec8b79abec3f4d718359ebb4202bffcb11;hpb=d192c699590d441eb96a697b9e8ab7a028f18860 diff --git a/opendaylight/sal/implementation/src/main/java/org/opendaylight/controller/sal/implementation/internal/ReadService.java b/opendaylight/sal/implementation/src/main/java/org/opendaylight/controller/sal/implementation/internal/ReadService.java index 0ee48d5b88..356c0e57c8 100644 --- a/opendaylight/sal/implementation/src/main/java/org/opendaylight/controller/sal/implementation/internal/ReadService.java +++ b/opendaylight/sal/implementation/src/main/java/org/opendaylight/controller/sal/implementation/internal/ReadService.java @@ -1,6 +1,5 @@ - /* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * Copyright (c) 2013-2014 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, @@ -9,12 +8,15 @@ package org.opendaylight.controller.sal.implementation.internal; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArraySet; import org.eclipse.osgi.framework.console.CommandInterpreter; import org.eclipse.osgi.framework.console.CommandProvider; @@ -25,39 +27,41 @@ import org.opendaylight.controller.sal.action.Output; import org.opendaylight.controller.sal.action.PopVlan; import org.opendaylight.controller.sal.core.ConstructionException; import org.opendaylight.controller.sal.core.Node; -import org.opendaylight.controller.sal.core.NodeConnector; import org.opendaylight.controller.sal.core.Node.NodeIDType; +import org.opendaylight.controller.sal.core.NodeConnector; +import org.opendaylight.controller.sal.core.NodeTable; import org.opendaylight.controller.sal.flowprogrammer.Flow; import org.opendaylight.controller.sal.match.Match; import org.opendaylight.controller.sal.match.MatchType; import org.opendaylight.controller.sal.reader.FlowOnNode; import org.opendaylight.controller.sal.reader.IPluginInReadService; +import org.opendaylight.controller.sal.reader.IPluginOutReadService; import org.opendaylight.controller.sal.reader.IReadService; +import org.opendaylight.controller.sal.reader.IReadServiceListener; import org.opendaylight.controller.sal.reader.NodeConnectorStatistics; import org.opendaylight.controller.sal.reader.NodeDescription; +import org.opendaylight.controller.sal.reader.NodeTableStatistics; import org.opendaylight.controller.sal.utils.EtherTypes; import org.opendaylight.controller.sal.utils.IPProtocols; import org.opendaylight.controller.sal.utils.NodeConnectorCreator; import org.opendaylight.controller.sal.utils.NodeCreator; +import org.opendaylight.controller.sal.utils.NodeTableCreator; import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * The SAL Read Service. It dispatches the read request to - * the proper SDN protocol plugin - * - * - * + * The SAL Read Service. Dispatches read requests to the proper SDN protocol + * plugin, and notifies any listeners on updates from any plugin readers */ -public class ReadService implements IReadService, CommandProvider { +public class ReadService implements IReadService, CommandProvider, IPluginOutReadService { - protected static final Logger logger = LoggerFactory - .getLogger(ReadService.class); - private ConcurrentHashMap - pluginReader = - new ConcurrentHashMap(); + protected static final Logger logger = LoggerFactory.getLogger(ReadService.class); + private ConcurrentHashMap> pluginReader = + new ConcurrentHashMap>(); + private Set readerListeners = + new CopyOnWriteArraySet(); /** * Function called by the dependency manager when all the required @@ -77,6 +81,7 @@ public class ReadService implements IReadService, CommandProvider { // In case of plugin disactivating make sure we clear the // dependencies this.pluginReader.clear(); + this.readerListeners.clear(); } /** @@ -99,129 +104,99 @@ public class ReadService implements IReadService, CommandProvider { } // Set the reference to the plugin flow Reader service - public void setService(Map props, IPluginInReadService s) { - if (this.pluginReader == null) { - logger.error("pluginReader store null"); - return; - } - - logger.trace("Got a service set request {}", s); - String type = null; - for (Object e : props.entrySet()) { - Map.Entry entry = (Map.Entry) e; - logger.trace("Prop key:({}) value:({})", entry.getKey(), - entry.getValue()); - } - - Object value = props.get("protocolPluginType"); - if (value instanceof String) { - type = (String) value; - } - if (type == null) { - logger.error("Received a pluginReader without any " - + "protocolPluginType provided"); - } else { - this.pluginReader.put(type, s); - logger.debug("Stored the pluginReader for type: {}", type); - } + public void setService(Map props, IPluginInReadService s) { + ProtocolService.set(this.pluginReader, props, s, logger); } - public void unsetService(Map props, IPluginInReadService s) { - if (this.pluginReader == null) { - logger.error("pluginReader store null"); - return; - } + public void unsetService(Map props, IPluginInReadService s) { + ProtocolService.unset(this.pluginReader, props, s, logger); + } - String type = null; - logger.debug("Received unsetpluginReader request"); - for (Object e : props.entrySet()) { - Map.Entry entry = (Map.Entry) e; - logger.trace("Prop key:({}) value:({})", entry.getKey(), - entry.getValue()); - } + public void setReaderListener(IReadServiceListener service) { + logger.trace("Got a listener set request {}", service); + this.readerListeners.add(service); + } - Object value = props.get("protocoloPluginType"); - if (value instanceof String) { - type = (String) value; - } - if (type == null) { - logger.error("Received a pluginReader without any " - + "protocolPluginType provided"); - } else if (this.pluginReader.get(type).equals(s)) { - this.pluginReader.remove(type); - logger.debug("Removed the pluginReader for type: {}", type); - } + public void unsetReaderListener(IReadServiceListener service) { + logger.trace("Got a listener Unset request"); + this.readerListeners.remove(service); } @Override public FlowOnNode readFlow(Node node, Flow flow) { if (pluginReader != null) { - if (this.pluginReader.get(node.getType()) != null) { - return this.pluginReader.get(node.getType()) - .readFlow(node, flow, true); + ProtocolService service = + this.pluginReader.get(node.getType()); + if (service != null) { + return service.getService().readFlow(node, flow, true); } } - logger.warn("Plugin unavailable"); + logger.warn("Plugin {} unavailable", node.getType()); return null; } @Override public FlowOnNode nonCachedReadFlow(Node node, Flow flow) { if (pluginReader != null) { - if (this.pluginReader.get(node.getType()) != null) { - return this.pluginReader.get(node.getType()) - .readFlow(node, flow, false); + ProtocolService service = + this.pluginReader.get(node.getType()); + if (service != null) { + return service.getService().readFlow(node, flow, false); } } - logger.warn("Plugin unavailable"); + logger.warn("Plugin {} unavailable", node.getType()); return null; } @Override public List readAllFlows(Node node) { if (pluginReader != null) { - if (this.pluginReader.get(node.getType()) != null) { - return this.pluginReader.get(node.getType()) - .readAllFlow(node, true); + ProtocolService service = + this.pluginReader.get(node.getType()); + if (service != null) { + return service.getService().readAllFlow(node, true); } } - logger.warn("Plugin unavailable"); - return null; + logger.warn("Plugin {} unavailable", node.getType()); + return Collections.emptyList(); } @Override public List nonCachedReadAllFlows(Node node) { if (pluginReader != null) { - if (this.pluginReader.get(node.getType()) != null) { - return this.pluginReader.get(node.getType()) - .readAllFlow(node, false); + ProtocolService service = + this.pluginReader.get(node.getType()); + if (service != null) { + return service.getService().readAllFlow(node, false); } } - logger.warn("Plugin unavailable"); - return null; + logger.warn("Plugin {} unavailable", node.getType()); + return Collections.emptyList(); } @Override public NodeDescription readDescription(Node node) { if (pluginReader != null) { - if (this.pluginReader.get(node.getType()) != null) { - return this.pluginReader.get(node.getType()) - .readDescription(node, true); + ProtocolService service = + this.pluginReader.get(node.getType()); + if (service != null) { + return service.getService().readDescription(node, true); } } - logger.warn("Plugin unavailable"); + logger.warn("Plugin {} unavailable", node.getType()); return null; } @Override public NodeDescription nonCachedReadDescription(Node node) { if (pluginReader != null) { - if (this.pluginReader.get(node.getType()) != null) { - return this.pluginReader.get(node.getType()) - .readDescription(node, false); + ProtocolService service = + this.pluginReader.get(node.getType()); + if (service != null) { + return service.getService().readDescription(node, false); } } - logger.warn("Plugin unavailable"); + logger.warn("Plugin {} unavailable", node.getType()); return null; } @@ -229,12 +204,13 @@ public class ReadService implements IReadService, CommandProvider { public NodeConnectorStatistics readNodeConnector(NodeConnector connector) { Node node = connector.getNode(); if (pluginReader != null && node != null) { - if (this.pluginReader.get(node.getType()) != null) { - return this.pluginReader.get(node.getType()) - .readNodeConnector(connector, true); + ProtocolService service = + this.pluginReader.get(node.getType()); + if (service != null) { + return service.getService().readNodeConnector(connector, true); } } - logger.warn("Plugin unavailable"); + logger.warn("Plugin {} unavailable", node.getType()); return null; } @@ -243,52 +219,126 @@ public class ReadService implements IReadService, CommandProvider { NodeConnector connector) { Node node = connector.getNode(); if (pluginReader != null && node != null) { - if (this.pluginReader.get(node.getType()) != null) { - return this.pluginReader.get(node.getType()) - .readNodeConnector(connector, false); + ProtocolService service = + this.pluginReader.get(node.getType()); + if (service != null) { + return service.getService().readNodeConnector(connector, false); } } - logger.warn("Plugin unavailable"); + logger.warn("Plugin {} unavailable", node.getType()); return null; } @Override public List readNodeConnectors(Node node) { if (pluginReader != null) { - if (this.pluginReader.get(node.getType()) != null) { - return this.pluginReader.get(node.getType()) - .readAllNodeConnector(node, true); + ProtocolService service = + this.pluginReader.get(node.getType()); + if (service != null) { + return service.getService().readAllNodeConnector(node, true); + } + } + logger.warn("Plugin {} unavailable", node.getType()); + return Collections.emptyList(); + } + + @Override + public List readNodeTable(Node node) { + if (pluginReader != null) { + ProtocolService service = + this.pluginReader.get(node.getType()); + if (service != null) { + return service.getService().readAllNodeTable(node, true); } } - logger.warn("Plugin unavailable"); + logger.warn("Plugin {} unavailable", node.getType()); + return Collections.emptyList(); + } + + + @Override + public NodeTableStatistics nonCachedReadNodeTable(NodeTable table) { + Node node = table.getNode(); + if (pluginReader != null && node != null) { + ProtocolService service = + this.pluginReader.get(node.getType()); + if (service != null) { + return service.getService().readNodeTable(table, false); + } + } + logger.warn("Plugin {} unavailable", node.getType()); + return null; + } + + @Override + public NodeTableStatistics readNodeTable(NodeTable table) { + Node node = table.getNode(); + if (pluginReader != null && node != null) { + ProtocolService service = + this.pluginReader.get(node.getType()); + if (service != null) { + return service.getService().readNodeTable(table, true); + } + } + logger.warn("Plugin {} unavailable", node.getType()); return null; } @Override public List nonCachedReadNodeConnectors(Node node) { if (pluginReader != null) { - if (this.pluginReader.get(node.getType()) != null) { - return this.pluginReader.get(node.getType()) - .readAllNodeConnector(node, false); + ProtocolService service = + this.pluginReader.get(node.getType()); + if (service != null) { + return service.getService().readAllNodeConnector(node, false); } } - logger.warn("Plugin unavailable"); - return null; + logger.warn("Plugin {} unavailable", node.getType()); + return Collections.emptyList(); } @Override public long getTransmitRate(NodeConnector connector) { Node node = connector.getNode(); if (pluginReader != null && node != null) { - if (this.pluginReader.get(node.getType()) != null) { - return this.pluginReader.get(node.getType()) - .getTransmitRate(connector); + ProtocolService service = + this.pluginReader.get(node.getType()); + if (service != null) { + return service.getService().getTransmitRate(connector); } } - logger.warn("Plugin unavailable"); + logger.warn("Plugin {} unavailable", node.getType()); return 0; } + @Override + public void nodeFlowStatisticsUpdated(Node node, List flowStatsList) { + for (IReadServiceListener l : readerListeners){ + l.nodeFlowStatisticsUpdated(node, flowStatsList); + } + } + + @Override + public void nodeConnectorStatisticsUpdated(Node node, List ncStatsList) { + for (IReadServiceListener l : readerListeners){ + l.nodeConnectorStatisticsUpdated(node, ncStatsList); + } + } + + @Override + public void nodeTableStatisticsUpdated(Node node, List tableStatsList) { + for (IReadServiceListener l : readerListeners){ + l.nodeTableStatisticsUpdated(node, tableStatsList); + } + } + + @Override + public void descriptionStatisticsUpdated(Node node, NodeDescription nodeDescription) { + for (IReadServiceListener l : readerListeners){ + l.descriptionStatisticsUpdated(node, nodeDescription); + } + } + // ---------------- OSGI TEST CODE ------------------------------// private void registerWithOSGIConsole() { @@ -302,16 +352,15 @@ public class ReadService implements IReadService, CommandProvider { public String getHelp() { StringBuffer help = new StringBuffer(); help.append("---SAL Reader testing commands---\n"); - help - .append("\t readflows - Read all the (cached) flows from the openflow switch \n"); - help - .append("\t readflow - Read the (cached) sample flow from the openflow switch \n"); - help - .append("\t readdesc - Read the (cached) description from openflow switch \n"); - help - .append("\t cached=true/false. If false or not specified, the protocol plugin cached info\n"); - help - .append("\t is returned. If true, the info is directly retrieved from the switch\n"); + help.append("\t readflows - Read all the (cached) flows from the openflow switch \n"); + help.append("\t readflow - Read the (cached) sample flow from the openflow switch \n"); + help.append("\t readdescr - Read the (cached) description from openflow switch \n"); + help.append("\t\t cached = (true|false). If false or not specified, the plugin cached info\n"); + help.append("\t\t is returned. If true, the info is directly retrieved from the switch\n"); + help.append("\t readport - Read port statistics for the specified port\n"); + help.append("\t readports - Read port statistics for all ports of specified switch\n"); + help.append("\t readtable - Read specified table statistics\n"); + return help.toString(); } @@ -389,11 +438,11 @@ public class ReadService implements IReadService, CommandProvider { List list = (cached) ? this .readNodeConnectors(node) : this .nonCachedReadNodeConnectors(node); - if (list != null) { - ci.println(list.toString()); - } else { - ci.println("null"); - } + if (list != null) { + ci.println(list.toString()); + } else { + ci.println("null"); + } } public void _readport(CommandInterpreter ci) { @@ -417,11 +466,39 @@ public class ReadService implements IReadService, CommandProvider { NodeConnectorStatistics stats = (cached) ? this .readNodeConnector(nodeConnector) : this .nonCachedReadNodeConnector(nodeConnector); - if (stats != null) { - ci.println(stats.toString()); - } else { - ci.println("null"); + if (stats != null) { + ci.println(stats.toString()); + } else { + ci.println("null"); + } + } + + public void _readtable(CommandInterpreter ci) { + String nodeId = ci.nextArgument(); + String tableId = ci.nextArgument(); + String cacheReq = ci.nextArgument(); + boolean cached; + if (nodeId == null) { + ci.print("Node id not specified"); + return; } + if (tableId == null) { + ci.print("Table id not specified"); + return; + } + cached = (cacheReq == null) ? true : cacheReq.equals("true"); + NodeTable nodeTable = null; + Node node = NodeCreator.createOFNode(Long.parseLong(nodeId)); + nodeTable = NodeTableCreator.createNodeTable(Byte + .valueOf(tableId), node); + NodeTableStatistics stats = (cached) ? this + .readNodeTable(nodeTable) : this + .nonCachedReadNodeTable(nodeTable); + if (stats != null) { + ci.println(stats.toString()); + } else { + ci.println("null"); + } } public void _readdescr(CommandInterpreter ci) { @@ -496,5 +573,4 @@ public class ReadService implements IReadService, CommandProvider { actions.add(new Controller()); return new Flow(match, actions); } - }