From a43aa252183f146a2cf00936aab5ebbf4da35170 Mon Sep 17 00:00:00 2001 From: alshabib Date: Tue, 21 Oct 2014 21:36:41 -0700 Subject: [PATCH] api and manager for statistic service Change-Id: If00b8b43a2bd780ae3c05321697896290fb0f415 --- .../org/onlab/onos/net/statistic/Load.java | 20 +++++ .../onos/net/statistic/StatisticService.java | 51 +++++++++++ .../onos/net/statistic/StatisticStore.java | 45 ++++++++++ .../onos/net/statistic/package-info.java | 4 + .../net/statistic/impl/StatisticManager.java | 89 +++++++++++++++++++ .../onos/net/statistic/impl/package-info.java | 4 + 6 files changed, 213 insertions(+) create mode 100644 core/api/src/main/java/org/onlab/onos/net/statistic/Load.java create mode 100644 core/api/src/main/java/org/onlab/onos/net/statistic/StatisticService.java create mode 100644 core/api/src/main/java/org/onlab/onos/net/statistic/StatisticStore.java create mode 100644 core/api/src/main/java/org/onlab/onos/net/statistic/package-info.java create mode 100644 core/net/src/main/java/org/onlab/onos/net/statistic/impl/StatisticManager.java create mode 100644 core/net/src/main/java/org/onlab/onos/net/statistic/impl/package-info.java diff --git a/core/api/src/main/java/org/onlab/onos/net/statistic/Load.java b/core/api/src/main/java/org/onlab/onos/net/statistic/Load.java new file mode 100644 index 0000000000..534b10c923 --- /dev/null +++ b/core/api/src/main/java/org/onlab/onos/net/statistic/Load.java @@ -0,0 +1,20 @@ +package org.onlab.onos.net.statistic; + +/** + * Simple data repository for link load information. + */ +public interface Load { + + /** + * Obtain the current observed rate on a link. + * @return long value + */ + long rate(); + + /** + * Obtain the latest counter viewed on that link. + * @return long value + */ + long latest(); + +} diff --git a/core/api/src/main/java/org/onlab/onos/net/statistic/StatisticService.java b/core/api/src/main/java/org/onlab/onos/net/statistic/StatisticService.java new file mode 100644 index 0000000000..b1809d77f0 --- /dev/null +++ b/core/api/src/main/java/org/onlab/onos/net/statistic/StatisticService.java @@ -0,0 +1,51 @@ +package org.onlab.onos.net.statistic; + +import org.onlab.onos.net.ConnectPoint; +import org.onlab.onos.net.Link; +import org.onlab.onos.net.Path; +import org.onlab.onos.net.flow.FlowRule; + +/** + * Service for obtaining statistic information about link in the system. + * Statistics are obtained from the FlowRuleService in order to minimize the + * amount of hammering occuring at the dataplane. + */ +public interface StatisticService { + + /** + * Obtain the load for a the ingress to the given link. + * @param link the link to query. + * @return a {@link org.onlab.onos.net.statistic.Load Load} + */ + Load load(Link link); + + /** + * Obtain the load for the given port. + * @param connectPoint the port to query + * @return a {@link org.onlab.onos.net.statistic.Load} + */ + Load load(ConnectPoint connectPoint); + + /** + * Find the most loaded link along a path. + * @param path the path to search in + * @return the most loaded {@link org.onlab.onos.net.Link}. + */ + Link max(Path path); + + /** + * Find the least loaded link along a path. + * @param path the path to search in + * @return the least loaded {@link org.onlab.onos.net.Link}. + */ + Link min(Path path); + + /** + * Returns the highest hitter (a flow rule) of for a given port, ie. the + * flow rule which is generating the most load. + * @param connectPoint the port + * @return the flow rule + */ + FlowRule highestHitter(ConnectPoint connectPoint); + +} diff --git a/core/api/src/main/java/org/onlab/onos/net/statistic/StatisticStore.java b/core/api/src/main/java/org/onlab/onos/net/statistic/StatisticStore.java new file mode 100644 index 0000000000..d0d625ccfe --- /dev/null +++ b/core/api/src/main/java/org/onlab/onos/net/statistic/StatisticStore.java @@ -0,0 +1,45 @@ +package org.onlab.onos.net.statistic; + +import org.onlab.onos.net.ConnectPoint; +import org.onlab.onos.net.flow.FlowEntry; +import org.onlab.onos.net.flow.FlowRule; + +import java.util.Set; + +/** + * Store to house the computed statistics. + */ +public interface StatisticStore { + + /** + * Lay the foundation for receiving flow stats for this rule. + * @param rule a {@link org.onlab.onos.net.flow.FlowRule} + */ + void prepareForStatistics(FlowRule rule); + + /** + * Remove entries associated with this rule. + a @param rule {@link org.onlab.onos.net.flow.FlowRule} + */ + void removeFromStatistics(FlowRule rule); + + /** + * Adds a stats observation for a flow rule. + * @param rule a {@link org.onlab.onos.net.flow.FlowEntry} + */ + void addOrUpdateStatistic(FlowEntry rule); + + /** + * Fetches the current observed stats values. + * @param connectPoint the port to fetch information for + * @return set of current flow rules + */ + Set getCurrentStatistic(ConnectPoint connectPoint); + + /** + * Fetches the current observed stats values. + * @param connectPoint the port to fetch information for + * @return set of current values + */ + Set getPreviousStatistic(ConnectPoint connectPoint); +} diff --git a/core/api/src/main/java/org/onlab/onos/net/statistic/package-info.java b/core/api/src/main/java/org/onlab/onos/net/statistic/package-info.java new file mode 100644 index 0000000000..445a0f32f0 --- /dev/null +++ b/core/api/src/main/java/org/onlab/onos/net/statistic/package-info.java @@ -0,0 +1,4 @@ +/** + * Service for looking up statistics on links. + */ +package org.onlab.onos.net.statistic; \ No newline at end of file diff --git a/core/net/src/main/java/org/onlab/onos/net/statistic/impl/StatisticManager.java b/core/net/src/main/java/org/onlab/onos/net/statistic/impl/StatisticManager.java new file mode 100644 index 0000000000..4bca2159d0 --- /dev/null +++ b/core/net/src/main/java/org/onlab/onos/net/statistic/impl/StatisticManager.java @@ -0,0 +1,89 @@ +package org.onlab.onos.net.statistic.impl; + +import org.apache.felix.scr.annotations.Activate; +import org.apache.felix.scr.annotations.Component; +import org.apache.felix.scr.annotations.Deactivate; +import org.apache.felix.scr.annotations.Reference; +import org.apache.felix.scr.annotations.ReferenceCardinality; +import org.apache.felix.scr.annotations.Service; +import org.onlab.onos.net.ConnectPoint; +import org.onlab.onos.net.Link; +import org.onlab.onos.net.Path; +import org.onlab.onos.net.flow.FlowRule; +import org.onlab.onos.net.flow.FlowRuleEvent; +import org.onlab.onos.net.flow.FlowRuleListener; +import org.onlab.onos.net.flow.FlowRuleService; +import org.onlab.onos.net.statistic.Load; +import org.onlab.onos.net.statistic.StatisticService; +import org.onlab.onos.net.statistic.StatisticStore; +import org.slf4j.Logger; + +import static org.slf4j.LoggerFactory.getLogger; + +/** + * Provides an implementation of the Statistic Service. + */ +@Component(immediate = true) +@Service +public class StatisticManager implements StatisticService { + + private final Logger log = getLogger(getClass()); + + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected FlowRuleService flowRuleService; + + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected StatisticStore statisticStore; + + private final InternalFlowRuleListener listener = new InternalFlowRuleListener(); + + @Activate + public void activate() { + flowRuleService.addListener(listener); + log.info("Started"); + } + + @Deactivate + public void deactivate() { + flowRuleService.removeListener(listener); + log.info("Stopped"); + } + + @Override + public Load load(Link link) { + return null; + } + + @Override + public Load load(ConnectPoint connectPoint) { + return null; + } + + @Override + public Link max(Path path) { + return null; + } + + @Override + public Link min(Path path) { + return null; + } + + @Override + public FlowRule highestHitter(ConnectPoint connectPoint) { + return null; + } + + /** + * Internal flow rule event listener. + */ + private class InternalFlowRuleListener implements FlowRuleListener { + + @Override + public void event(FlowRuleEvent event) { + + } + } + + +} diff --git a/core/net/src/main/java/org/onlab/onos/net/statistic/impl/package-info.java b/core/net/src/main/java/org/onlab/onos/net/statistic/impl/package-info.java new file mode 100644 index 0000000000..cbe301c53a --- /dev/null +++ b/core/net/src/main/java/org/onlab/onos/net/statistic/impl/package-info.java @@ -0,0 +1,4 @@ +/** + * Core subsystem for responding to statistical inquiries. + */ +package org.onlab.onos.net.statistic.impl; \ No newline at end of file