blob: 5f76f33eb61fc9226d3f23fad3ec05ea2de762b5 [file] [log] [blame]
Pavlin Radoslavov13669052014-05-13 10:33:39 -07001package net.onrc.onos.core.intent.runtime.web;
2
Yuta HIGUCHIa0dcd472014-07-06 21:06:29 -07003import static net.onrc.onos.core.topology.web.TopologyResource.eval;
Pavlin Radoslavov13669052014-05-13 10:33:39 -07004import java.util.LinkedList;
5import java.util.List;
6
7import net.onrc.onos.core.intent.ConstrainedBFSTree;
8import net.onrc.onos.core.intent.Path;
Jonathan Harte37e4e22014-05-13 19:12:02 -07009import net.onrc.onos.core.topology.ITopologyService;
Pavlin Radoslavov13669052014-05-13 10:33:39 -070010import net.onrc.onos.core.topology.Link;
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -070011import net.onrc.onos.core.topology.LinkData;
Pavlin Radoslavov13669052014-05-13 10:33:39 -070012import net.onrc.onos.core.topology.Switch;
Yuta HIGUCHId92b10c2014-08-25 09:30:28 -070013import net.onrc.onos.core.topology.MutableTopology;
Pavlin Radoslavov13669052014-05-13 10:33:39 -070014import net.onrc.onos.core.util.Dpid;
Yuta HIGUCHIa0dcd472014-07-06 21:06:29 -070015
Pavlin Radoslavovc097fdf2014-05-23 17:40:57 -070016import org.restlet.representation.Representation;
Pavlin Radoslavov13669052014-05-13 10:33:39 -070017import org.restlet.resource.Get;
18import org.restlet.resource.ServerResource;
19import org.slf4j.Logger;
20import org.slf4j.LoggerFactory;
21
22/**
23 * A class to access Shortest-Path information between switches.
24 */
25public class ShortestPathResource extends ServerResource {
Pavlin Radoslavov13669052014-05-13 10:33:39 -070026 private static final Logger log = LoggerFactory.getLogger(ShortestPathResource.class);
27
28 /**
29 * Gets the Shortest-Path infomration between switches.
30 *
Pavlin Radoslavovc097fdf2014-05-23 17:40:57 -070031 * @return a Representation with the Shortest-Path information between
32 * switches if found, otherwise null. The Shortest-Path information is an
33 * ordered collection of Links.
Pavlin Radoslavov13669052014-05-13 10:33:39 -070034 */
35 @Get("json")
Pavlin Radoslavovc097fdf2014-05-23 17:40:57 -070036 public Representation retrieve() {
Jonathan Harte37e4e22014-05-13 19:12:02 -070037 ITopologyService topologyService =
Pavlin Radoslavovc097fdf2014-05-23 17:40:57 -070038 (ITopologyService) getContext().getAttributes()
39 .get(ITopologyService.class.getCanonicalName());
Pavlin Radoslavov13669052014-05-13 10:33:39 -070040
41 //
42 // Fetch the attributes
43 //
44 String srcDpidStr = (String) getRequestAttributes().get("src-dpid");
45 String dstDpidStr = (String) getRequestAttributes().get("dst-dpid");
46 Dpid srcDpid = new Dpid(srcDpidStr);
47 Dpid dstDpid = new Dpid(dstDpidStr);
48 log.debug("Getting Shortest Path {}--{}", srcDpidStr, dstDpidStr);
49
50 //
51 // Do the Shortest Path computation and return the result: a list of
52 // links.
53 //
Yuta HIGUCHId92b10c2014-08-25 09:30:28 -070054 MutableTopology mutableTopology = topologyService.getTopology();
55 mutableTopology.acquireReadLock();
Pavlin Radoslavov13669052014-05-13 10:33:39 -070056 try {
Yuta HIGUCHId92b10c2014-08-25 09:30:28 -070057 Switch srcSwitch = mutableTopology.getSwitch(srcDpid);
58 Switch dstSwitch = mutableTopology.getSwitch(dstDpid);
Pavlin Radoslavov13669052014-05-13 10:33:39 -070059 if ((srcSwitch == null) || (dstSwitch == null)) {
Pavlin Radoslavovc097fdf2014-05-23 17:40:57 -070060 return null;
Pavlin Radoslavov13669052014-05-13 10:33:39 -070061 }
62 ConstrainedBFSTree bfsTree = new ConstrainedBFSTree(srcSwitch);
63 Path path = bfsTree.getPath(dstSwitch);
Pavlin Radoslavov8bfacf32014-06-09 16:02:56 -070064 if (path == null) {
65 return null;
66 }
Pavlin Radoslavov13669052014-05-13 10:33:39 -070067 List<Link> links = new LinkedList<>();
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -070068 for (LinkData linkData : path) {
Yuta HIGUCHId92b10c2014-08-25 09:30:28 -070069 Link link = mutableTopology.getLink(
Yuta HIGUCHI93d35ea2014-08-31 23:26:13 -070070 linkData.getSrc().getDpid(),
71 linkData.getSrc().getPortNumber(),
72 linkData.getDst().getDpid(),
73 linkData.getDst().getPortNumber());
Pavlin Radoslavov13669052014-05-13 10:33:39 -070074 if (link == null) {
Pavlin Radoslavovc097fdf2014-05-23 17:40:57 -070075 return null;
Pavlin Radoslavov13669052014-05-13 10:33:39 -070076 }
77 links.add(link);
78 }
Yuta HIGUCHIa0dcd472014-07-06 21:06:29 -070079 return eval(toRepresentation(links, null));
Pavlin Radoslavov13669052014-05-13 10:33:39 -070080 } finally {
Yuta HIGUCHId92b10c2014-08-25 09:30:28 -070081 mutableTopology.releaseReadLock();
Pavlin Radoslavov13669052014-05-13 10:33:39 -070082 }
83 }
84}