From: Suchi Raman Date: Wed, 16 Oct 2013 17:31:31 +0000 (-0400) Subject: Merge commit 'refs/changes/43/1843/1' of https://git.opendaylight.org/gerrit/affinity X-Git-Tag: jenkins-affinity-bulk-release-prepare-only-1~49^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=de3b89cc1654b421dcfa41bc9ec2b121403eb50d;p=affinity.git Merge commit 'refs/changes/43/1843/1' of https://git.opendaylight.org/gerrit/affinity Conflicts: scripts/analytics.py Signed-off-by: Suchi Raman --- diff --git a/analytics/api/src/main/java/org/opendaylight/affinity/analytics/IAnalyticsManager.java b/analytics/api/src/main/java/org/opendaylight/affinity/analytics/IAnalyticsManager.java index de7b6b1..f89a80a 100644 --- a/analytics/api/src/main/java/org/opendaylight/affinity/analytics/IAnalyticsManager.java +++ b/analytics/api/src/main/java/org/opendaylight/affinity/analytics/IAnalyticsManager.java @@ -20,4 +20,6 @@ public interface IAnalyticsManager { long getByteCountOnAffinityLink(AffinityLink al); double getBitRateOnAffinityLink(AffinityLink al); + + long getByteCountIntoPrefix(String ipAndMask); } diff --git a/analytics/implementation/src/main/java/org/opendaylight/affinity/analytics/internal/AnalyticsManager.java b/analytics/implementation/src/main/java/org/opendaylight/affinity/analytics/internal/AnalyticsManager.java index ac7c152..72dc5dc 100644 --- a/analytics/implementation/src/main/java/org/opendaylight/affinity/analytics/internal/AnalyticsManager.java +++ b/analytics/implementation/src/main/java/org/opendaylight/affinity/analytics/internal/AnalyticsManager.java @@ -285,7 +285,7 @@ public class AnalyticsManager implements IReadServiceListener, IAnalyticsManager return totalBytes; } - public long getByteCountIntoPrefix(String prefixAndMask, Set allHosts) { + public long getByteCountIntoPrefix(String prefixAndMask) { long totalBytes = 0; InetAddress ip; Short mask; @@ -302,6 +302,7 @@ public class AnalyticsManager implements IReadServiceListener, IAnalyticsManager // Match on prefixes InetAddress targetPrefix = getPrefix(ip, mask); + Set allHosts = this.hostTracker.getAllHosts(); for (HostNodeConnector host : allHosts) { InetAddress hostPrefix = getPrefix(host.getNetworkAddress(), mask); if (hostPrefix.equals(targetPrefix)) { diff --git a/analytics/northbound/src/main/java/org/opendaylight/affinity/analytics/northbound/AnalyticsNorthbound.java b/analytics/northbound/src/main/java/org/opendaylight/affinity/analytics/northbound/AnalyticsNorthbound.java index 8ca2977..d0ab81a 100644 --- a/analytics/northbound/src/main/java/org/opendaylight/affinity/analytics/northbound/AnalyticsNorthbound.java +++ b/analytics/northbound/src/main/java/org/opendaylight/affinity/analytics/northbound/AnalyticsNorthbound.java @@ -8,6 +8,7 @@ package org.opendaylight.affinity.analytics.northbound; +import java.lang.Long; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.List; @@ -176,6 +177,41 @@ public class AnalyticsNorthbound { return new AffinityLinkStatistics(al, byteCount, bitRate); } + /** + * Returns TODO: + * + * @param containerName + * Name of the Container. The Container name for the base + * controller is "default". + * @param TODO: + * @return TODO: + */ + @Path("/{containerName}/prefixstats/{ip}/{mask}/") + @GET + @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) + // @TypeHint(Long.class) + @StatusCodes({ + @ResponseCode(code = 200, condition = "Operation successful"), + @ResponseCode(code = 404, condition = "The containerName is not found"), + @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") }) + public PrefixStatistics getPrefixMaskStatistics( + @PathParam("containerName") String containerName, + @PathParam("ip") String ip, + @PathParam("mask") String mask) { + if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.READ, this)) { + throw new UnauthorizedException("User is not authorized to perform this operation on container " + containerName); + } + handleDefaultDisabled(containerName); + + IAnalyticsManager analyticsManager = getAnalyticsService(containerName); + if (analyticsManager == null) { + throw new ServiceUnavailableException("Analytics " + RestMessages.SERVICEUNAVAILABLE.toString()); + } + + long byteCount = analyticsManager.getByteCountIntoPrefix(ip + "/" + mask); + return new PrefixStatistics(byteCount); + } + private void handleDefaultDisabled(String containerName) { IContainerManager containerManager = (IContainerManager) ServiceHelper.getGlobalInstance(IContainerManager.class, this); if (containerManager == null) { diff --git a/analytics/northbound/src/main/java/org/opendaylight/affinity/analytics/northbound/PrefixStatistics.java b/analytics/northbound/src/main/java/org/opendaylight/affinity/analytics/northbound/PrefixStatistics.java new file mode 100644 index 0000000..aba03cd --- /dev/null +++ b/analytics/northbound/src/main/java/org/opendaylight/affinity/analytics/northbound/PrefixStatistics.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2013 Plexxi, 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, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.affinity.analytics.northbound; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import org.opendaylight.controller.sal.core.Host; + +@XmlRootElement +@XmlAccessorType(XmlAccessType.NONE) +public class PrefixStatistics { + @XmlElement + private long byteCount; + + // To satisfy JAXB + @SuppressWarnings("unused") + private PrefixStatistics() { + } + + public PrefixStatistics(long byteCount) { + super(); + this.byteCount = byteCount; + } + + public long getByteCount() { + return this.byteCount; + } + + public void setByteCount(long byteCount) { + this.byteCount = byteCount; + } +} diff --git a/scripts/analytics.py b/scripts/analytics.py index c1ea7db..de20742 100644 --- a/scripts/analytics.py +++ b/scripts/analytics.py @@ -174,38 +174,46 @@ def run_interactive_mode(): if (request_type == "quit"): sys.exit() - action = request[1] - if (request_type == "host"): + action = request[1] src, dst = request[2:4] + host_stat = Stats("host", src=src, dst=dst) if (action == "bytes"): - host_stat = Stats("host", src=src, dst=dst) print("%d bytes between %s and %s" % (host_stat.get_bytes(), src, dst)) elif (action == "rate"): - host_stat = Stats("host", src=src, dst=dst) print("%f bit/s between %s and %s" % (host_stat.get_bit_rate(), src, dst)) else: + print "wrong action" raise Exception - # TODO: Change this to use AffinityLinkStats elif (request_type == "link"): + action = request[1] link = request[2] - h = httplib2.Http(".cache") - h.add_credentials("admin", "admin") - resp, content = h.request("http://localhost:8080/affinity/nb/v2/analytics/default/affinitylinkstats/" + link, "GET") - al_stats = json.loads(content) - + link_stat = Stats("affinityLink", al=link) if (action == "bytes"): - print("%d bytes on %s" % (long(al_stats["byteCount"]), link)) + print("%d bytes on %s" % (link_stat.get_bytes(), link)) elif (action == "rate"): - print("%f bit/s on %s" % (float(al_stats["bitRate"]), link)) + print("%f bit/s on %s" % (link_stat.get_bit_rate(), link)) else: + print "wrong action 2" raise Exception + elif (request_type == "prefix"): + prefix = request[1] + h = httplib2.Http(".cache") + h.add_credentials("admin", "admin") + url_prefix = "http://localhost:8080/affinity/nb/v2/analytics/default/prefixstats/" + resp, content = h.request(url_prefix + prefix, "GET") + if (resp.status == 200): + data = json.loads(content) + print data['byteCount'], "bytes" + else: + print "something else" raise Exception except Exception as e: print "Error" + print e def get_all_hosts(): @@ -249,9 +257,9 @@ def main(): affinity_control.add_affinity_group("testAG1", ["10.0.0.1", "10.0.0.2"]) affinity_control.add_affinity_group("testAG2", ["10.0.0.3", "10.0.0.4"]) affinity_control.add_affinity_link("testAL", "testAG1", "testAG2") - raw_input("[Press enter to continue] ") + raw_input("[Press enter to continue]" ) - interactive_mode = False + interactive_mode = True if interactive_mode: run_interactive_mode()