blob: d62d65bae06661e086f8ce29c6ab393385834a39 [file] [log] [blame]
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -08001package net.floodlightcontroller.linkdiscovery.internal;
2
Pankaj Berde6debb042013-01-16 18:04:32 -08003import java.util.ArrayList;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -08004import java.util.List;
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -08005
Pankaj Berde2239f0d2013-04-04 09:42:43 -07006import net.floodlightcontroller.core.INetMapTopologyObjects.IPortObject;
Pankaj Berde1e2f7312013-02-15 08:25:31 -08007import net.floodlightcontroller.core.INetMapTopologyObjects.ISwitchObject;
Pankaj Berde5024ec12013-01-31 17:07:29 -08008import net.floodlightcontroller.core.INetMapTopologyService.ITopoSwitchService;
Pankaj Berde5024ec12013-01-31 17:07:29 -08009import net.floodlightcontroller.core.internal.TopoSwitchServiceImpl;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080010import net.floodlightcontroller.linkdiscovery.ILinkStorage;
11import net.floodlightcontroller.linkdiscovery.LinkInfo;
12import net.floodlightcontroller.routing.Link;
Pankaj Berde2239f0d2013-04-04 09:42:43 -070013import net.onrc.onos.util.GraphDBConnection;
Pankaj Berde2239f0d2013-04-04 09:42:43 -070014import net.onrc.onos.util.GraphDBConnection.Transaction;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080015
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080016import org.openflow.util.HexString;
17import org.slf4j.Logger;
18import org.slf4j.LoggerFactory;
19
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080020import com.thinkaurelius.titan.core.TitanException;
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080021import com.tinkerpop.blueprints.Direction;
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080022import com.tinkerpop.blueprints.Edge;
Pankaj Berde62016142013-04-09 15:35:50 -070023import com.tinkerpop.blueprints.Vertex;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080024import com.tinkerpop.gremlin.java.GremlinPipeline;
Pankaj Berde5024ec12013-01-31 17:07:29 -080025import com.tinkerpop.pipes.PipeFunction;
26import com.tinkerpop.pipes.transform.PathPipe;
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080027
28public class LinkStorageImpl implements ILinkStorage {
Pankaj Berde62016142013-04-09 15:35:50 -070029
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080030 protected static Logger log = LoggerFactory.getLogger(LinkStorageImpl.class);
Pankaj Berde5fb27632013-04-05 08:56:12 -070031 protected String conf;
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080032
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080033 @Override
34 public void update(Link link, DM_OPERATION op) {
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080035 update(link, (LinkInfo)null, op);
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080036 }
37
38 @Override
39 public void update(List<Link> links, DM_OPERATION op) {
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080040 for (Link lt: links) {
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080041 update(lt, (LinkInfo)null, op);
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080042 }
43 }
44
45 @Override
46 public void update(Link link, LinkInfo linkinfo, DM_OPERATION op) {
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080047 switch (op) {
48 case UPDATE:
49 case CREATE:
50 case INSERT:
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080051 addOrUpdateLink(link, linkinfo, op);
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080052 break;
53 case DELETE:
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080054 deleteLink(link);
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080055 break;
56 }
57 }
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080058
59 public void addOrUpdateLink(Link lt, LinkInfo linkinfo, DM_OPERATION op) {
Pankaj Berde5fb27632013-04-05 08:56:12 -070060 GraphDBConnection conn = GraphDBConnection.getInstance(this.conf);
61 IPortObject vportSrc = null, vportDst = null;
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080062
Umesh Krishnaswamy0ef75ee2013-03-25 17:50:27 -070063 log.trace("addOrUpdateLink(): op {} {} {}", new Object[]{op, lt, linkinfo});
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080064
65 try {
66 // get source port vertex
67 String dpid = HexString.toHexString(lt.getSrc());
68 short port = lt.getSrcPort();
Pankaj Berde5fb27632013-04-05 08:56:12 -070069 vportSrc = conn.utils().searchPort(conn, dpid, port);
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080070
71 // get dest port vertex
72 dpid = HexString.toHexString(lt.getDst());
73 port = lt.getDstPort();
Pankaj Berde5fb27632013-04-05 08:56:12 -070074 vportDst = conn.utils().searchPort(conn, dpid, port);
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080075
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080076 if (vportSrc != null && vportDst != null) {
Pankaj Berde86a0d412013-04-05 15:06:26 -070077
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080078 // check if the link exists
Pankaj Berde77b58512013-04-05 12:06:37 -070079
Pankaj Berde62016142013-04-09 15:35:50 -070080 Iterable<IPortObject> currPorts = vportSrc.getLinkedPorts();
81 List<IPortObject> currLinks = new ArrayList<IPortObject>();
Pankaj Berde77b58512013-04-05 12:06:37 -070082 for (IPortObject V : currPorts) {
Pankaj Berde6debb042013-01-16 18:04:32 -080083 currLinks.add(V);
84 }
85
86 if (currLinks.contains(vportDst)) {
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080087 // TODO: update linkinfo
88 if (op.equals(DM_OPERATION.INSERT) || op.equals(DM_OPERATION.CREATE)) {
Umesh Krishnaswamy9306f952013-01-24 20:42:59 -080089 log.debug("addOrUpdateLink(): failed link exists {} {} src {} dst {}",
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080090 new Object[]{op, lt, vportSrc, vportDst});
91 }
Pankaj Berde0fc4e432013-01-12 09:47:22 -080092 } else {
Pankaj Berde62016142013-04-09 15:35:50 -070093 vportSrc.setLinkPort(vportDst);
94
Pankaj Berde86a0d412013-04-05 15:06:26 -070095 conn.endTx(Transaction.COMMIT);
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080096 log.debug("addOrUpdateLink(): link added {} {} src {} dst {}", new Object[]{op, lt, vportSrc, vportDst});
Pankaj Berde0fc4e432013-01-12 09:47:22 -080097 }
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080098 } else {
Umesh Krishnaswamy9306f952013-01-24 20:42:59 -080099 log.error("addOrUpdateLink(): failed invalid vertices {} {} src {} dst {}", new Object[]{op, lt, vportSrc, vportDst});
Pankaj Berde62016142013-04-09 15:35:50 -0700100 // conn.endTx(Transaction.ROLLBACK);
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800101 }
102 } catch (TitanException e) {
103 /*
104 * retry till we succeed?
105 */
Umesh Krishnaswamyc56a8cc2013-01-24 21:47:51 -0800106 e.printStackTrace();
Pankaj Berde62016142013-04-09 15:35:50 -0700107 log.error("addOrUpdateLink(): titan exception {} {} {}", new Object[]{op, lt, e.toString()});
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800108 }
109 }
110
111 @Override
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800112 public void deleteLinks(List<Link> links) {
113
114 for (Link lt : links) {
115 deleteLink(lt);
116 }
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800117 }
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800118
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800119
120 @Override
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800121 public void deleteLink(Link lt) {
Pankaj Berde5fb27632013-04-05 08:56:12 -0700122 GraphDBConnection conn = GraphDBConnection.getInstance(this.conf);
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700123 IPortObject vportSrc = null, vportDst = null;
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800124 int count = 0;
125
126 log.debug("deleteLink(): {}", lt);
127
128 try {
129 // get source port vertex
130 String dpid = HexString.toHexString(lt.getSrc());
131 short port = lt.getSrcPort();
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700132 vportSrc = conn.utils().searchPort(conn, dpid, port);
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800133
134 // get dst port vertex
135 dpid = HexString.toHexString(lt.getDst());
136 port = lt.getDstPort();
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700137 vportDst = conn.utils().searchPort(conn, dpid, port);
138 // FIXME: This needs to remove all edges
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800139
140 if (vportSrc != null && vportDst != null) {
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700141
142 /* for (Edge e : vportSrc.asVertex().getEdges(Direction.OUT)) {
Umesh Krishnaswamy11060ed2013-01-23 19:24:36 -0800143 log.debug("deleteLink(): {} in {} out {}",
144 new Object[]{e.getLabel(), e.getVertex(Direction.IN), e.getVertex(Direction.OUT)});
145 if (e.getLabel().equals("link") && e.getVertex(Direction.IN).equals(vportDst)) {
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800146 graph.removeEdge(e);
147 count++;
148 }
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700149 }*/
150 vportSrc.removeLink(vportDst);
Pankaj Berde5fb27632013-04-05 08:56:12 -0700151 conn.endTx(Transaction.COMMIT);
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700152 log.debug("deleteLink(): deleted edges src {} dst {}", new Object[]{
153 lt, vportSrc, vportDst});
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800154
155 } else {
Umesh Krishnaswamy9306f952013-01-24 20:42:59 -0800156 log.error("deleteLink(): failed invalid vertices {} src {} dst {}", new Object[]{lt, vportSrc, vportDst});
Pankaj Berde62016142013-04-09 15:35:50 -0700157// conn.endTx(Transaction.ROLLBACK);
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800158 }
159
160 } catch (TitanException e) {
161 /*
162 * retry till we succeed?
163 */
Umesh Krishnaswamyc56a8cc2013-01-24 21:47:51 -0800164 log.error("deleteLink(): titan exception {} {}", new Object[]{lt, e.toString()});
165 e.printStackTrace();
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800166 }
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800167 }
168
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800169 // TODO: Fix me
170 @Override
171 public List<Link> getLinks(Long dpid, short port) {
Pankaj Berde62016142013-04-09 15:35:50 -0700172 GraphDBConnection conn = GraphDBConnection.getInstance(this.conf);
173 IPortObject vportSrc, vportDst;
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800174 List<Link> links = null;
175 Link lt;
176
Pankaj Berde62016142013-04-09 15:35:50 -0700177 vportSrc = conn.utils().searchPort(conn, HexString.toHexString(dpid), port);
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800178 if (vportSrc != null) {
Pankaj Berde62016142013-04-09 15:35:50 -0700179
180 for (Edge e : vportSrc.asVertex().getEdges(Direction.OUT)) {
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800181 if (e.getLabel().equals("link")) {
182 break;
183 }
184 }
185 }
186 return null;
187 }
188
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800189 @Override
190 public void init(String conf) {
Pankaj Berde1f10be02013-02-01 14:06:02 -0800191 //TODO extract the DB location from properties
Pankaj Berde67f88fb2013-01-15 17:16:01 -0800192
Pankaj Berde5fb27632013-04-05 08:56:12 -0700193 this.conf = conf;
Pankaj Berde62016142013-04-09 15:35:50 -0700194
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800195 }
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800196
197 @Override
198 public void deleteLinksOnPort(Long dpid, short port) {
199 // TODO Auto-generated method stub
200
201 }
202
Pankaj Berdeff421802013-01-29 20:28:52 -0800203 @Override
204 public List<Link> getLinks(String dpid) {
205 // TODO Auto-generated method stub
206 return null;
207 }
208
209 public List<Link> getActiveLinks() {
Pankaj Berde5024ec12013-01-31 17:07:29 -0800210
Pankaj Berde62016142013-04-09 15:35:50 -0700211 GraphDBConnection conn = GraphDBConnection.getInstance(this.conf);
Pankaj Berdeff421802013-01-29 20:28:52 -0800212
Pankaj Berde62016142013-04-09 15:35:50 -0700213 Iterable<ISwitchObject> switches = conn.utils().getActiveSwitches(conn);
Pankaj Berde5024ec12013-01-31 17:07:29 -0800214
215 List<Link> links = new ArrayList<Link>();
216 for (ISwitchObject sw : switches) {
217 GremlinPipeline<Vertex, Link> pipe = new GremlinPipeline<Vertex, Link>();
218 ExtractLink extractor = new ExtractLink();
219
220 pipe.start(sw.asVertex());
221 pipe.enablePath(true);
Pankaj Berde1f10be02013-02-01 14:06:02 -0800222 pipe.out("on").out("link").in("on").path().step(extractor);
Pankaj Berde5024ec12013-01-31 17:07:29 -0800223
Pankaj Berde1f10be02013-02-01 14:06:02 -0800224 while (pipe.hasNext() ) {
Pankaj Berde5024ec12013-01-31 17:07:29 -0800225 Link l = pipe.next();
226 links.add(l);
227 }
228
229 }
230 return links;
Pankaj Berdeff421802013-01-29 20:28:52 -0800231 }
Pankaj Berde5024ec12013-01-31 17:07:29 -0800232
233 static class ExtractLink implements PipeFunction<PathPipe<Vertex>, Link> {
234
Pankaj Berde5024ec12013-01-31 17:07:29 -0800235 @Override
236 public Link compute(PathPipe<Vertex> pipe ) {
Pankaj Berded18c7622013-02-04 10:28:35 -0800237 // TODO Auto-generated method stub
Pankaj Berde5024ec12013-01-31 17:07:29 -0800238 long s_dpid = 0;
239 long d_dpid = 0;
240 short s_port = 0;
241 short d_port = 0;
242 List<Vertex> V = new ArrayList<Vertex>();
243 V = pipe.next();
244 Vertex src_sw = V.get(0);
245 Vertex dest_sw = V.get(3);
246 Vertex src_port = V.get(1);
247 Vertex dest_port = V.get(2);
248 s_dpid = HexString.toLong((String) src_sw.getProperty("dpid"));
249 d_dpid = HexString.toLong((String) dest_sw.getProperty("dpid"));
250 s_port = (Short) src_port.getProperty("number");
251 d_port = (Short) dest_port.getProperty("number");
252
253 Link l = new Link(s_dpid,s_port,d_dpid,d_port);
254
255 return l;
256 }
257 }
Pankaj Berded18c7622013-02-04 10:28:35 -0800258
259 public void finalize() {
260 close();
261 }
262
263 @Override
264 public void close() {
265 // TODO Auto-generated method stub
Pankaj Berde62016142013-04-09 15:35:50 -0700266// graph.shutdown();
Pankaj Berded18c7622013-02-04 10:28:35 -0800267 }
Pankaj Berde5024ec12013-01-31 17:07:29 -0800268
Pankaj Berdeff421802013-01-29 20:28:52 -0800269
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800270}