blob: 7c897d4c72fc42e4e862e1bf7e6f5f654c34a88b [file] [log] [blame]
HIGUCHI Yutaf05c4802013-06-17 11:15:50 -07001package net.onrc.onos.ofcontroller.core.internal;
Pankaj Berde5024ec12013-01-31 17:07:29 -08002
Pankaj Berde15193092013-03-21 17:30:14 -07003import java.util.ArrayList;
Pankaj Berde5024ec12013-01-31 17:07:29 -08004import java.util.List;
5
Pankaj Berde5024ec12013-01-31 17:07:29 -08006import net.floodlightcontroller.routing.Link;
Pankaj Berde38646d62013-06-21 11:34:04 -07007import net.onrc.onos.graph.GraphDBOperation;
HIGUCHI Yuta20514902013-06-12 11:24:16 -07008import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
9import net.onrc.onos.ofcontroller.core.INetMapTopologyService.ITopoLinkService;
Pankaj Berde15193092013-03-21 17:30:14 -070010
Naoki Shiota991093a2013-12-10 14:47:18 -080011import org.openflow.util.HexString;
Pankaj Berde15193092013-03-21 17:30:14 -070012import org.slf4j.Logger;
13import org.slf4j.LoggerFactory;
14
15import com.tinkerpop.blueprints.Vertex;
16import com.tinkerpop.gremlin.java.GremlinPipeline;
Naoki Shiota991093a2013-12-10 14:47:18 -080017import com.tinkerpop.pipes.PipeFunction;
18import com.tinkerpop.pipes.transform.PathPipe;
Pankaj Berde5024ec12013-01-31 17:07:29 -080019
20public class TopoLinkServiceImpl implements ITopoLinkService {
Yuta HIGUCHI67a7a3e2014-01-03 14:51:34 -080021
Toshio Koide22f192c2013-06-13 14:01:45 -070022 protected GraphDBOperation op;
Yuta HIGUCHI6ac8d182013-10-22 15:24:56 -070023 protected final static Logger log = LoggerFactory.getLogger(TopoLinkServiceImpl.class);
Pankaj Berde15193092013-03-21 17:30:14 -070024
Yuta HIGUCHI67a7a3e2014-01-03 14:51:34 -080025 @Override
26 protected void finalize() {
Pankaj Berde15193092013-03-21 17:30:14 -070027 close();
28 }
Yuta HIGUCHI67a7a3e2014-01-03 14:51:34 -080029
Pankaj Berde15193092013-03-21 17:30:14 -070030 @Override
31 public void close() {
Toshio Koide22f192c2013-06-13 14:01:45 -070032 op.close();
Pankaj Berde15193092013-03-21 17:30:14 -070033 }
Yuta HIGUCHI67a7a3e2014-01-03 14:51:34 -080034
Pankaj Berde5024ec12013-01-31 17:07:29 -080035 @Override
Pankaj Berde1cde50b2013-02-19 20:16:06 -080036 public List<Link> getActiveLinks() {
Toshio Koidebfe9b922013-06-18 10:56:05 -070037 op = new GraphDBOperation("");
38 op.commit(); //Commit to ensure we see latest data
Toshio Koide22f192c2013-06-13 14:01:45 -070039 Iterable<ISwitchObject> switches = op.getActiveSwitches();
Yuta HIGUCHI67a7a3e2014-01-03 14:51:34 -080040 List<Link> links = new ArrayList<Link>();
Pankaj Berde15193092013-03-21 17:30:14 -070041 for (ISwitchObject sw : switches) {
42 GremlinPipeline<Vertex, Link> pipe = new GremlinPipeline<Vertex, Link>();
43 ExtractLink extractor = new ExtractLink();
44
45 pipe.start(sw.asVertex());
46 pipe.enablePath(true);
47 pipe.out("on").out("link").in("on").path().step(extractor);
Yuta HIGUCHI67a7a3e2014-01-03 14:51:34 -080048
Pankaj Berde15193092013-03-21 17:30:14 -070049 while (pipe.hasNext() ) {
50 Link l = pipe.next();
51 links.add(l);
52 }
Yuta HIGUCHI67a7a3e2014-01-03 14:51:34 -080053
Pankaj Berde15193092013-03-21 17:30:14 -070054 }
Toshio Koide22f192c2013-06-13 14:01:45 -070055 op.commit();
Pankaj Berde15193092013-03-21 17:30:14 -070056 return links;
Pankaj Berde5024ec12013-01-31 17:07:29 -080057 }
58
59 @Override
Pankaj Berde1cde50b2013-02-19 20:16:06 -080060 public List<Link> getLinksOnSwitch(String dpid) {
Yuta HIGUCHI67a7a3e2014-01-03 14:51:34 -080061 List<Link> links = new ArrayList<Link>();
Toshio Koide22f192c2013-06-13 14:01:45 -070062 ISwitchObject sw = op.searchSwitch(dpid);
Pankaj Berde15193092013-03-21 17:30:14 -070063 GremlinPipeline<Vertex, Link> pipe = new GremlinPipeline<Vertex, Link>();
64 ExtractLink extractor = new ExtractLink();
65
66 pipe.start(sw.asVertex());
67 pipe.enablePath(true);
68 pipe.out("on").out("link").in("on").path().step(extractor);
Yuta HIGUCHI67a7a3e2014-01-03 14:51:34 -080069
Pankaj Berde15193092013-03-21 17:30:14 -070070 while (pipe.hasNext() ) {
71 Link l = pipe.next();
72 links.add(l);
73 }
74 return links;
75
Pankaj Berde5024ec12013-01-31 17:07:29 -080076 }
Naoki Shiota991093a2013-12-10 14:47:18 -080077
78 private class ExtractLink implements PipeFunction<PathPipe<Vertex>, Link> {
79 @Override
80 public Link compute(PathPipe<Vertex> pipe) {
81 long s_dpid = 0;
82 long d_dpid = 0;
83 short s_port = 0;
84 short d_port = 0;
Yuta HIGUCHI67a7a3e2014-01-03 14:51:34 -080085
Naoki Shiotade5d8422013-12-11 13:56:57 -080086 List<?> V = pipe.next();
87 Vertex src_sw = (Vertex)V.get(0);
88 Vertex dest_sw = (Vertex)V.get(3);
89 Vertex src_port = (Vertex)V.get(1);
90 Vertex dest_port = (Vertex)V.get(2);
Naoki Shiota991093a2013-12-10 14:47:18 -080091 s_dpid = HexString.toLong((String) src_sw.getProperty("dpid"));
92 d_dpid = HexString.toLong((String) dest_sw.getProperty("dpid"));
93 s_port = (Short) src_port.getProperty("number");
94 d_port = (Short) dest_port.getProperty("number");
Yuta HIGUCHI67a7a3e2014-01-03 14:51:34 -080095
Naoki Shiota991093a2013-12-10 14:47:18 -080096 Link l = new Link(s_dpid,s_port,d_dpid,d_port);
Yuta HIGUCHI67a7a3e2014-01-03 14:51:34 -080097
Naoki Shiota991093a2013-12-10 14:47:18 -080098 return l;
99 }
100 }
Pankaj Berde5024ec12013-01-31 17:07:29 -0800101}