From 902407f3f0a8b0cdc9348680b61369b8fd807305 Mon Sep 17 00:00:00 2001
From: Srinivasan Ramasubramanian <srini@bigswitch.com>
Date: Thu, 18 Oct 2012 02:32:59 -0700
Subject: [PATCH] Changes to REST API for links. 
 http://<controller>:8080/wm/topology/links/json would now return only direct
 and tunnel links (LinkType.DIRECT_LINK or LinkType.TUNNEL).  To get external
 links, use http://<controller>:8080/wm/topology/external-links/json.

---
 .../web/ExternalLinksResource.java            | 42 +++++++++++++++++++
 .../linkdiscovery/web/LinksResource.java      |  8 +++-
 .../topology/web/TopologyWebRoutable.java     |  2 +
 3 files changed, 50 insertions(+), 2 deletions(-)
 create mode 100644 src/main/java/net/floodlightcontroller/linkdiscovery/web/ExternalLinksResource.java

diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/web/ExternalLinksResource.java b/src/main/java/net/floodlightcontroller/linkdiscovery/web/ExternalLinksResource.java
new file mode 100644
index 000000000..8adcf119e
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/linkdiscovery/web/ExternalLinksResource.java
@@ -0,0 +1,42 @@
+package net.floodlightcontroller.linkdiscovery.web;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import net.floodlightcontroller.linkdiscovery.ILinkDiscovery.LinkType;
+import net.floodlightcontroller.linkdiscovery.ILinkDiscoveryService;
+import net.floodlightcontroller.linkdiscovery.LinkInfo;
+import net.floodlightcontroller.routing.Link;
+
+import org.restlet.resource.Get;
+import org.restlet.resource.ServerResource;
+
+public class ExternalLinksResource extends ServerResource {
+
+    @Get("json")
+    public Set<LinkWithType> retrieve() {
+        ILinkDiscoveryService ld = (ILinkDiscoveryService)getContext().getAttributes().
+                get(ILinkDiscoveryService.class.getCanonicalName());
+        Map<Link, LinkInfo> links = new HashMap<Link, LinkInfo>();
+        Set<LinkWithType> returnLinkSet = new HashSet<LinkWithType>();
+
+        if (ld != null) {
+            links.putAll(ld.getLinks());
+            for (Link link: links.keySet()) {
+                LinkInfo info = links.get(link);
+                LinkType type = ld.getLinkType(link, info);
+                if (type == LinkType.MULTIHOP_LINK) {
+                    LinkWithType lwt = new LinkWithType(link,
+                                                        info.getSrcPortState(),
+                                                        info.getDstPortState(),
+                                                        type);
+
+                    returnLinkSet.add(lwt);
+                }
+            }
+        }
+        return returnLinkSet;
+    }
+}
diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/web/LinksResource.java b/src/main/java/net/floodlightcontroller/linkdiscovery/web/LinksResource.java
index 4cad18e61..5e1ffd4c1 100644
--- a/src/main/java/net/floodlightcontroller/linkdiscovery/web/LinksResource.java
+++ b/src/main/java/net/floodlightcontroller/linkdiscovery/web/LinksResource.java
@@ -5,6 +5,7 @@ import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
+import net.floodlightcontroller.linkdiscovery.ILinkDiscovery.LinkType;
 import net.floodlightcontroller.linkdiscovery.ILinkDiscoveryService;
 import net.floodlightcontroller.linkdiscovery.LinkInfo;
 import net.floodlightcontroller.routing.Link;
@@ -25,11 +26,14 @@ public class LinksResource extends ServerResource {
             links.putAll(ld.getLinks());
             for (Link link: links.keySet()) {
                 LinkInfo info = links.get(link);
+                LinkType type = ld.getLinkType(link, info);
                 LinkWithType lwt = new LinkWithType(link,
                                                     info.getSrcPortState(),
                                                     info.getDstPortState(),
-                                                    ld.getLinkType(link, info));
-                returnLinkSet.add(lwt);
+                                                    type);
+
+                if (type == LinkType.DIRECT_LINK || type == LinkType.TUNNEL)
+                    returnLinkSet.add(lwt);
             }
         }
         return returnLinkSet;
diff --git a/src/main/java/net/floodlightcontroller/topology/web/TopologyWebRoutable.java b/src/main/java/net/floodlightcontroller/topology/web/TopologyWebRoutable.java
index 79894137a..c9479beb0 100644
--- a/src/main/java/net/floodlightcontroller/topology/web/TopologyWebRoutable.java
+++ b/src/main/java/net/floodlightcontroller/topology/web/TopologyWebRoutable.java
@@ -3,6 +3,7 @@ package net.floodlightcontroller.topology.web;
 import org.restlet.Context;
 import org.restlet.routing.Router;
 
+import net.floodlightcontroller.linkdiscovery.web.ExternalLinksResource;
 import net.floodlightcontroller.linkdiscovery.web.LinksResource;
 import net.floodlightcontroller.restserver.RestletRoutable;
 
@@ -14,6 +15,7 @@ public class TopologyWebRoutable implements RestletRoutable {
     public Router getRestlet(Context context) {
         Router router = new Router(context);
         router.attach("/links/json", LinksResource.class);
+        router.attach("/external-links/json", ExternalLinksResource.class);
         router.attach("/tunnellinks/json", TunnelLinksResource.class);
         router.attach("/switchclusters/json", SwitchClustersResource.class);
         router.attach("/broadcastdomainports/json", BroadcastDomainPortsResource.class);
-- 
GitLab