blob: 65b832c1d217c7b731503ccf18348d290125cf51 [file] [log] [blame]
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -08001package net.floodlightcontroller.linkdiscovery.internal;
2
3import java.util.*;
4
5import org.openflow.util.HexString;
6import org.slf4j.Logger;
7import org.slf4j.LoggerFactory;
8
9import net.floodlightcontroller.linkdiscovery.LinkInfo;
10import net.floodlightcontroller.routing.Link;
11import net.floodlightcontroller.linkdiscovery.ILinkStorage;
12
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080013import com.thinkaurelius.titan.core.TitanException;
14import com.thinkaurelius.titan.core.TitanFactory;
15import com.thinkaurelius.titan.core.TitanGraph;
16import com.tinkerpop.blueprints.Direction;
17import com.tinkerpop.blueprints.TransactionalGraph.Conclusion;
18import com.tinkerpop.blueprints.Vertex;
19
20public class LinkStorageImpl implements ILinkStorage {
21 public TitanGraph graph;
22 protected static Logger log = LoggerFactory.getLogger(LinkStorageImpl.class);
23
24 @Override
25 public void update(Link link, DM_OPERATION op) {
26 update (link, (LinkInfo)null, op);
27 }
28
29 @Override
30 public void update(List<Link> links, DM_OPERATION op) {
31 log.debug("LinkStorage:update(): {} {}", op, links);
32
33 for (Link lt: links) {
34 update(lt, op);
35 }
36 }
37
38 @Override
39 public void update(Link link, LinkInfo linkinfo, DM_OPERATION op) {
40 log.debug("LinkStorage:update(): {} {}", op, link);
41
42 switch (op) {
43 case UPDATE:
44 case CREATE:
45 case INSERT:
46 addLink(link, linkinfo);
47 break;
48 case DELETE:
49 break;
50 }
51 }
52
53 protected void addLink(Link lt, LinkInfo linkinfo) {
54 Vertex vswSrc, vswDst;
55 Vertex vportSrc = null, vportDst = null;
56
Pankaj Berde0a31dab2013-01-15 16:06:36 -080057 log.info("addLink(): {} {} getSrc {}", new Object[]{lt, linkinfo, lt.getSrc()});
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080058
59 try {
60 // get source port vertex
61 String dpid = HexString.toHexString(lt.getSrc());
62 short port = lt.getSrcPort();
63 if ((vswSrc = graph.getVertices("dpid", dpid).iterator().next()) != null) {
64 log.debug("addLink(): sw exits {} {}", dpid, vswSrc);
65 if (vswSrc.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().hasNext()) {
66 vportSrc = vswSrc.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().next();
67 log.debug("addLink(): port found {} {}", port, vportSrc);
68 } else {
69 log.error("addLink(): sw {} port {} not found", dpid, port);
70 }
71 }
72
73 // get dest port vertex
74 dpid = HexString.toHexString(lt.getDst());
75 port = lt.getDstPort();
76 if ((vswDst = graph.getVertices("dpid",dpid).iterator().next()) != null) {
77 log.debug("addLink(): sw exits {} {}", dpid, vswDst);
78 if (vswDst.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().hasNext()) {
79 vportDst = vswDst.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().next();
80 log.debug("addLink(): port found {} {}", port, vportDst);
81 } else {
82 log.error ("addLink(): sw {} port {} not found", dpid, port);
83 }
84 }
85
86 if (vportSrc != null && vportDst != null) {
Pankaj Berde0fc4e432013-01-12 09:47:22 -080087 //TODO: If Edge already exists should we remove and add again?
Pankaj Berde0a31dab2013-01-15 16:06:36 -080088 if (vportSrc.query().direction(Direction.OUT).labels("link").vertices().iterator().hasNext() &&
89 vportSrc.query().direction(Direction.OUT).labels("link").vertices().iterator().next().equals(vportDst)) {
Pankaj Berde0fc4e432013-01-12 09:47:22 -080090 //FIXME: Succeed silently for now
91 } else {
92 graph.addEdge(null, vportSrc, vportDst, "link");
93 graph.stopTransaction(Conclusion.SUCCESS);
94 }
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080095 log.debug("addLink(): link added {} src {} dst {}", new Object[]{lt, vportSrc, vportDst});
96 } else {
97 log.error("addLink(): failed {} src {} dst {}", new Object[]{lt, vportSrc, vportDst});
98 graph.stopTransaction(Conclusion.FAILURE);
99 }
100 } catch (TitanException e) {
101 /*
102 * retry till we succeed?
103 */
104 log.error("addLink(): {} failed", lt);
105 }
106 }
107
108 @Override
109 public List<Link> getLinks(Long dpid, int port) {
110 // TODO Auto-generated method stub
111 return null;
112 }
113
114 @Override
115 public void deleteLinks(Long dpid, int port) {
116 // TODO Auto-generated method stub
117
118 }
119
120 @Override
121 public void init(String conf) {
122 //TODO extract the DB location from conf
Pankaj Berde67f88fb2013-01-15 17:16:01 -0800123
124 graph = TitanFactory.open(conf);
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800125
Pankaj Berde67f88fb2013-01-15 17:16:01 -0800126 // FIXME: These keys are not needed for Links but we better create it before using it as per titan
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800127 Set<String> s = graph.getIndexedKeys(Vertex.class);
128 if (!s.contains("dpid")) {
129 graph.createKeyIndex("dpid", Vertex.class);
130 graph.stopTransaction(Conclusion.SUCCESS);
131 }
132 if (!s.contains("type")) {
133 graph.createKeyIndex("type", Vertex.class);
134 graph.stopTransaction(Conclusion.SUCCESS);
135 }
136 }
137}