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=fce0a39719234a58e1d37c98b5d84d3ae67fe6d7;hb=315a10ec8b79abec3f4d718359ebb4202bffcb11;hpb=1e9531138e44cd757ca27b0d86e98eccb22ccd82 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 fce0a39719..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,15 +27,17 @@ 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.NodeTable; -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; @@ -48,19 +52,16 @@ 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 @@ -80,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(); } /** @@ -102,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; } @@ -232,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; } @@ -246,37 +219,40 @@ 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"); - return null; + logger.warn("Plugin {} unavailable", node.getType()); + return Collections.emptyList(); } @Override public List readNodeTable(Node node) { if (pluginReader != null) { - if (this.pluginReader.get(node.getType()) != null) { - return this.pluginReader.get(node.getType()) - .readAllNodeTable(node, true); + ProtocolService service = + this.pluginReader.get(node.getType()); + if (service != null) { + return service.getService().readAllNodeTable(node, true); } } - logger.warn("Plugin unavailable"); - return null; + logger.warn("Plugin {} unavailable", node.getType()); + return Collections.emptyList(); } @@ -284,12 +260,13 @@ public class ReadService implements IReadService, CommandProvider { public NodeTableStatistics nonCachedReadNodeTable(NodeTable table) { Node node = table.getNode(); if (pluginReader != null && node != null) { - if (this.pluginReader.get(node.getType()) != null) { - return this.pluginReader.get(node.getType()) - .readNodeTable(table, false); + ProtocolService service = + this.pluginReader.get(node.getType()); + if (service != null) { + return service.getService().readNodeTable(table, false); } } - logger.warn("Plugin unavailable"); + logger.warn("Plugin {} unavailable", node.getType()); return null; } @@ -297,40 +274,71 @@ public class ReadService implements IReadService, CommandProvider { public NodeTableStatistics readNodeTable(NodeTable table) { Node node = table.getNode(); if (pluginReader != null && node != null) { - if (this.pluginReader.get(node.getType()) != null) { - return this.pluginReader.get(node.getType()) - .readNodeTable(table, true); + ProtocolService service = + this.pluginReader.get(node.getType()); + if (service != null) { + return service.getService().readNodeTable(table, true); } } - logger.warn("Plugin unavailable"); + 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() { @@ -344,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(); } @@ -566,5 +573,4 @@ public class ReadService implements IReadService, CommandProvider { actions.add(new Controller()); return new Flow(match, actions); } - }