blob: fb85636b1220065022aabc497ffedad634316cfd [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
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -08006import net.floodlightcontroller.linkdiscovery.ILinkStorage;
7import net.floodlightcontroller.linkdiscovery.LinkInfo;
8import net.floodlightcontroller.routing.Link;
HIGUCHI Yuta20514902013-06-12 11:24:16 -07009import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
10import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
Pankaj Berde2239f0d2013-04-04 09:42:43 -070011import net.onrc.onos.util.GraphDBConnection;
Pankaj Berde2239f0d2013-04-04 09:42:43 -070012import net.onrc.onos.util.GraphDBConnection.Transaction;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080013
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080014import org.openflow.util.HexString;
15import org.slf4j.Logger;
16import org.slf4j.LoggerFactory;
17
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080018import com.thinkaurelius.titan.core.TitanException;
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080019import com.tinkerpop.blueprints.Direction;
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080020import com.tinkerpop.blueprints.Edge;
Pankaj Berde62016142013-04-09 15:35:50 -070021import com.tinkerpop.blueprints.Vertex;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080022import com.tinkerpop.gremlin.java.GremlinPipeline;
Pankaj Berde5024ec12013-01-31 17:07:29 -080023import com.tinkerpop.pipes.PipeFunction;
24import com.tinkerpop.pipes.transform.PathPipe;
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080025
26public class LinkStorageImpl implements ILinkStorage {
Pankaj Berde62016142013-04-09 15:35:50 -070027
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080028 protected static Logger log = LoggerFactory.getLogger(LinkStorageImpl.class);
Pankaj Berde5fb27632013-04-05 08:56:12 -070029 protected String conf;
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080030
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080031 @Override
32 public void update(Link link, DM_OPERATION op) {
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080033 update(link, (LinkInfo)null, op);
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080034 }
35
36 @Override
37 public void update(List<Link> links, DM_OPERATION op) {
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080038 for (Link lt: links) {
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080039 update(lt, (LinkInfo)null, op);
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080040 }
41 }
42
43 @Override
44 public void update(Link link, LinkInfo linkinfo, DM_OPERATION op) {
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080045 switch (op) {
46 case UPDATE:
47 case CREATE:
48 case INSERT:
Pankaj Berde254abb42013-06-10 21:21:49 -070049 updateLink(link, linkinfo, op);
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080050 break;
51 case DELETE:
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080052 deleteLink(link);
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080053 break;
54 }
55 }
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080056
Pankaj Berde254abb42013-06-10 21:21:49 -070057 public void updateLink(Link lt, LinkInfo linkinfo, DM_OPERATION op) {
Pankaj Berde5fb27632013-04-05 08:56:12 -070058 GraphDBConnection conn = GraphDBConnection.getInstance(this.conf);
59 IPortObject vportSrc = null, vportDst = null;
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080060
Pankaj Berde254abb42013-06-10 21:21:49 -070061 log.trace("updateLink(): op {} {} {}", new Object[]{op, lt, linkinfo});
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080062
63 try {
64 // get source port vertex
65 String dpid = HexString.toHexString(lt.getSrc());
66 short port = lt.getSrcPort();
Pankaj Berde5fb27632013-04-05 08:56:12 -070067 vportSrc = conn.utils().searchPort(conn, dpid, port);
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080068
69 // get dest port vertex
70 dpid = HexString.toHexString(lt.getDst());
71 port = lt.getDstPort();
Pankaj Berde5fb27632013-04-05 08:56:12 -070072 vportDst = conn.utils().searchPort(conn, dpid, port);
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080073
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080074 if (vportSrc != null && vportDst != null) {
Pankaj Berde86a0d412013-04-05 15:06:26 -070075
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080076 // check if the link exists
Pankaj Berde77b58512013-04-05 12:06:37 -070077
Pankaj Berde62016142013-04-09 15:35:50 -070078 Iterable<IPortObject> currPorts = vportSrc.getLinkedPorts();
79 List<IPortObject> currLinks = new ArrayList<IPortObject>();
Pankaj Berde77b58512013-04-05 12:06:37 -070080 for (IPortObject V : currPorts) {
Pankaj Berde6debb042013-01-16 18:04:32 -080081 currLinks.add(V);
82 }
83
84 if (currLinks.contains(vportDst)) {
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080085 // TODO: update linkinfo
86 if (op.equals(DM_OPERATION.INSERT) || op.equals(DM_OPERATION.CREATE)) {
Umesh Krishnaswamy9306f952013-01-24 20:42:59 -080087 log.debug("addOrUpdateLink(): failed link exists {} {} src {} dst {}",
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080088 new Object[]{op, lt, vportSrc, vportDst});
89 }
Pankaj Berde0fc4e432013-01-12 09:47:22 -080090 } else {
Pankaj Berde62016142013-04-09 15:35:50 -070091 vportSrc.setLinkPort(vportDst);
92
Pankaj Berde86a0d412013-04-05 15:06:26 -070093 conn.endTx(Transaction.COMMIT);
Pankaj Berde254abb42013-06-10 21:21:49 -070094 log.debug("updateLink(): link added {} {} src {} dst {}", new Object[]{op, lt, vportSrc, vportDst});
Pankaj Berde0fc4e432013-01-12 09:47:22 -080095 }
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080096 } else {
Pankaj Berde254abb42013-06-10 21:21:49 -070097 log.error("updateLink(): failed invalid vertices {} {} src {} dst {}", new Object[]{op, lt, vportSrc, vportDst});
98 conn.endTx(Transaction.ROLLBACK);
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080099 }
100 } catch (TitanException e) {
101 /*
102 * retry till we succeed?
103 */
Umesh Krishnaswamyc56a8cc2013-01-24 21:47:51 -0800104 e.printStackTrace();
Pankaj Berde254abb42013-06-10 21:21:49 -0700105 log.error("updateLink(): titan exception {} {} {}", new Object[]{op, lt, e.toString()});
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800106 }
107 }
108
109 @Override
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800110 public void deleteLinks(List<Link> links) {
111
112 for (Link lt : links) {
113 deleteLink(lt);
114 }
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800115 }
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800116
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800117
118 @Override
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800119 public void deleteLink(Link lt) {
Pankaj Berde5fb27632013-04-05 08:56:12 -0700120 GraphDBConnection conn = GraphDBConnection.getInstance(this.conf);
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700121 IPortObject vportSrc = null, vportDst = null;
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800122 int count = 0;
123
124 log.debug("deleteLink(): {}", lt);
125
126 try {
127 // get source port vertex
128 String dpid = HexString.toHexString(lt.getSrc());
129 short port = lt.getSrcPort();
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700130 vportSrc = conn.utils().searchPort(conn, dpid, port);
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800131
132 // get dst port vertex
133 dpid = HexString.toHexString(lt.getDst());
134 port = lt.getDstPort();
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700135 vportDst = conn.utils().searchPort(conn, dpid, port);
136 // FIXME: This needs to remove all edges
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800137
138 if (vportSrc != null && vportDst != null) {
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700139
140 /* for (Edge e : vportSrc.asVertex().getEdges(Direction.OUT)) {
Umesh Krishnaswamy11060ed2013-01-23 19:24:36 -0800141 log.debug("deleteLink(): {} in {} out {}",
142 new Object[]{e.getLabel(), e.getVertex(Direction.IN), e.getVertex(Direction.OUT)});
143 if (e.getLabel().equals("link") && e.getVertex(Direction.IN).equals(vportDst)) {
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800144 graph.removeEdge(e);
145 count++;
146 }
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700147 }*/
148 vportSrc.removeLink(vportDst);
Pankaj Berde5fb27632013-04-05 08:56:12 -0700149 conn.endTx(Transaction.COMMIT);
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700150 log.debug("deleteLink(): deleted edges src {} dst {}", new Object[]{
151 lt, vportSrc, vportDst});
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800152
153 } else {
Umesh Krishnaswamy9306f952013-01-24 20:42:59 -0800154 log.error("deleteLink(): failed invalid vertices {} src {} dst {}", new Object[]{lt, vportSrc, vportDst});
Pankaj Berde254abb42013-06-10 21:21:49 -0700155 conn.endTx(Transaction.ROLLBACK);
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800156 }
157
158 } catch (TitanException e) {
159 /*
160 * retry till we succeed?
161 */
Umesh Krishnaswamyc56a8cc2013-01-24 21:47:51 -0800162 log.error("deleteLink(): titan exception {} {}", new Object[]{lt, e.toString()});
Pankaj Berde254abb42013-06-10 21:21:49 -0700163 conn.endTx(Transaction.ROLLBACK);
Umesh Krishnaswamyc56a8cc2013-01-24 21:47:51 -0800164 e.printStackTrace();
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800165 }
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800166 }
167
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800168 // TODO: Fix me
169 @Override
170 public List<Link> getLinks(Long dpid, short port) {
Pankaj Berde62016142013-04-09 15:35:50 -0700171 GraphDBConnection conn = GraphDBConnection.getInstance(this.conf);
172 IPortObject vportSrc, vportDst;
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800173 List<Link> links = null;
174 Link lt;
175
Pankaj Berde62016142013-04-09 15:35:50 -0700176 vportSrc = conn.utils().searchPort(conn, HexString.toHexString(dpid), port);
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800177 if (vportSrc != null) {
Pankaj Berde62016142013-04-09 15:35:50 -0700178
179 for (Edge e : vportSrc.asVertex().getEdges(Direction.OUT)) {
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800180 if (e.getLabel().equals("link")) {
181 break;
182 }
183 }
184 }
185 return null;
186 }
187
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800188 @Override
189 public void init(String conf) {
Pankaj Berde1f10be02013-02-01 14:06:02 -0800190 //TODO extract the DB location from properties
Pankaj Berde67f88fb2013-01-15 17:16:01 -0800191
Pankaj Berde5fb27632013-04-05 08:56:12 -0700192 this.conf = conf;
Pankaj Berde62016142013-04-09 15:35:50 -0700193
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800194 }
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800195
196 @Override
197 public void deleteLinksOnPort(Long dpid, short port) {
198 // TODO Auto-generated method stub
199
200 }
201
Pankaj Berdeff421802013-01-29 20:28:52 -0800202 @Override
203 public List<Link> getLinks(String dpid) {
204 // TODO Auto-generated method stub
205 return null;
206 }
207
208 public List<Link> getActiveLinks() {
Pankaj Berde5024ec12013-01-31 17:07:29 -0800209
Pankaj Berde62016142013-04-09 15:35:50 -0700210 GraphDBConnection conn = GraphDBConnection.getInstance(this.conf);
Pankaj Berdeff421802013-01-29 20:28:52 -0800211
Pankaj Berde62016142013-04-09 15:35:50 -0700212 Iterable<ISwitchObject> switches = conn.utils().getActiveSwitches(conn);
Pankaj Berde5024ec12013-01-31 17:07:29 -0800213
214 List<Link> links = new ArrayList<Link>();
215 for (ISwitchObject sw : switches) {
216 GremlinPipeline<Vertex, Link> pipe = new GremlinPipeline<Vertex, Link>();
217 ExtractLink extractor = new ExtractLink();
218
219 pipe.start(sw.asVertex());
220 pipe.enablePath(true);
Pankaj Berde1f10be02013-02-01 14:06:02 -0800221 pipe.out("on").out("link").in("on").path().step(extractor);
Pankaj Berde5024ec12013-01-31 17:07:29 -0800222
Pankaj Berde1f10be02013-02-01 14:06:02 -0800223 while (pipe.hasNext() ) {
Pankaj Berde5024ec12013-01-31 17:07:29 -0800224 Link l = pipe.next();
225 links.add(l);
226 }
227
228 }
229 return links;
Pankaj Berdeff421802013-01-29 20:28:52 -0800230 }
Pankaj Berde5024ec12013-01-31 17:07:29 -0800231
232 static class ExtractLink implements PipeFunction<PathPipe<Vertex>, Link> {
233
Pankaj Berde5024ec12013-01-31 17:07:29 -0800234 @Override
235 public Link compute(PathPipe<Vertex> pipe ) {
Pankaj Berded18c7622013-02-04 10:28:35 -0800236 // TODO Auto-generated method stub
Pankaj Berde5024ec12013-01-31 17:07:29 -0800237 long s_dpid = 0;
238 long d_dpid = 0;
239 short s_port = 0;
240 short d_port = 0;
241 List<Vertex> V = new ArrayList<Vertex>();
242 V = pipe.next();
243 Vertex src_sw = V.get(0);
244 Vertex dest_sw = V.get(3);
245 Vertex src_port = V.get(1);
246 Vertex dest_port = V.get(2);
247 s_dpid = HexString.toLong((String) src_sw.getProperty("dpid"));
248 d_dpid = HexString.toLong((String) dest_sw.getProperty("dpid"));
249 s_port = (Short) src_port.getProperty("number");
250 d_port = (Short) dest_port.getProperty("number");
251
252 Link l = new Link(s_dpid,s_port,d_dpid,d_port);
253
254 return l;
255 }
256 }
Pankaj Berded18c7622013-02-04 10:28:35 -0800257
258 public void finalize() {
259 close();
260 }
261
262 @Override
263 public void close() {
264 // TODO Auto-generated method stub
Pankaj Berde62016142013-04-09 15:35:50 -0700265// graph.shutdown();
Pankaj Berded18c7622013-02-04 10:28:35 -0800266 }
Pankaj Berde5024ec12013-01-31 17:07:29 -0800267
Pankaj Berdeff421802013-01-29 20:28:52 -0800268
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800269}