blob: 1fb80e9e41a0832fdceaed8caa9987b831749e37 [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
13import org.apache.commons.configuration.BaseConfiguration;
14import org.apache.commons.configuration.Configuration;
15import com.thinkaurelius.titan.core.TitanException;
16import com.thinkaurelius.titan.core.TitanFactory;
17import com.thinkaurelius.titan.core.TitanGraph;
18import com.tinkerpop.blueprints.Direction;
19import com.tinkerpop.blueprints.TransactionalGraph.Conclusion;
20import com.tinkerpop.blueprints.Vertex;
21
22public class LinkStorageImpl implements ILinkStorage {
23 public TitanGraph graph;
24 protected static Logger log = LoggerFactory.getLogger(LinkStorageImpl.class);
25
26 @Override
27 public void update(Link link, DM_OPERATION op) {
28 update (link, (LinkInfo)null, op);
29 }
30
31 @Override
32 public void update(List<Link> links, DM_OPERATION op) {
33 log.debug("LinkStorage:update(): {} {}", op, links);
34
35 for (Link lt: links) {
36 update(lt, op);
37 }
38 }
39
40 @Override
41 public void update(Link link, LinkInfo linkinfo, DM_OPERATION op) {
42 log.debug("LinkStorage:update(): {} {}", op, link);
43
44 switch (op) {
45 case UPDATE:
46 case CREATE:
47 case INSERT:
48 addLink(link, linkinfo);
49 break;
50 case DELETE:
51 break;
52 }
53 }
54
55 protected void addLink(Link lt, LinkInfo linkinfo) {
56 Vertex vswSrc, vswDst;
57 Vertex vportSrc = null, vportDst = null;
58
59 log.debug("addLink(): {} {} getSrc {}", new Object[]{lt, linkinfo, lt.getSrc()});
60
61 try {
62 // get source port vertex
63 String dpid = HexString.toHexString(lt.getSrc());
64 short port = lt.getSrcPort();
65 if ((vswSrc = graph.getVertices("dpid", dpid).iterator().next()) != null) {
66 log.debug("addLink(): sw exits {} {}", dpid, vswSrc);
67 if (vswSrc.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().hasNext()) {
68 vportSrc = vswSrc.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().next();
69 log.debug("addLink(): port found {} {}", port, vportSrc);
70 } else {
71 log.error("addLink(): sw {} port {} not found", dpid, port);
72 }
73 }
74
75 // get dest port vertex
76 dpid = HexString.toHexString(lt.getDst());
77 port = lt.getDstPort();
78 if ((vswDst = graph.getVertices("dpid",dpid).iterator().next()) != null) {
79 log.debug("addLink(): sw exits {} {}", dpid, vswDst);
80 if (vswDst.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().hasNext()) {
81 vportDst = vswDst.query().direction(Direction.OUT).labels("on").has("number",port).vertices().iterator().next();
82 log.debug("addLink(): port found {} {}", port, vportDst);
83 } else {
84 log.error ("addLink(): sw {} port {} not found", dpid, port);
85 }
86 }
87
88 if (vportSrc != null && vportDst != null) {
Pankaj Berde0fc4e432013-01-12 09:47:22 -080089 //TODO: If Edge already exists should we remove and add again?
90 if (vportSrc.query().direction(Direction.OUT).labels("link").vertices().iterator().equals(vportDst)) {
91 //FIXME: Succeed silently for now
92 } else {
93 graph.addEdge(null, vportSrc, vportDst, "link");
94 graph.stopTransaction(Conclusion.SUCCESS);
95 }
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080096 log.debug("addLink(): link added {} src {} dst {}", new Object[]{lt, vportSrc, vportDst});
97 } else {
98 log.error("addLink(): failed {} src {} dst {}", new Object[]{lt, vportSrc, vportDst});
99 graph.stopTransaction(Conclusion.FAILURE);
100 }
101 } catch (TitanException e) {
102 /*
103 * retry till we succeed?
104 */
105 log.error("addLink(): {} failed", lt);
106 }
107 }
108
109 @Override
110 public List<Link> getLinks(Long dpid, int port) {
111 // TODO Auto-generated method stub
112 return null;
113 }
114
115 @Override
116 public void deleteLinks(Long dpid, int port) {
117 // TODO Auto-generated method stub
118
119 }
120
121 @Override
122 public void init(String conf) {
123 //TODO extract the DB location from conf
124 Configuration db = new BaseConfiguration();
125
126 // Local storage gets locked for single process
127 db.setProperty("storage.backend","cassandra");
128 db.setProperty("storage.hostname","127.0.0.1");
129 graph = TitanFactory.open(db);
130
131 // FIXME:
132 Set<String> s = graph.getIndexedKeys(Vertex.class);
133 if (!s.contains("dpid")) {
134 graph.createKeyIndex("dpid", Vertex.class);
135 graph.stopTransaction(Conclusion.SUCCESS);
136 }
137 if (!s.contains("type")) {
138 graph.createKeyIndex("type", Vertex.class);
139 graph.stopTransaction(Conclusion.SUCCESS);
140 }
141 }
142}