blob: 5373d99c76fe4a51fa44444f203818e8c809c529 [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.LinkInfo;
7import net.floodlightcontroller.routing.Link;
HIGUCHI Yuta20514902013-06-12 11:24:16 -07008import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
9import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
HIGUCHI Yuta80c3ab82013-06-12 13:17:05 -070010import net.onrc.onos.ofcontroller.linkdiscovery.ILinkStorage;
Toshio Koide7bdea5b2013-06-13 13:57:18 -070011import net.onrc.onos.util.GraphDBOperation;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080012
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080013import org.openflow.util.HexString;
14import org.slf4j.Logger;
15import org.slf4j.LoggerFactory;
16
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080017import com.thinkaurelius.titan.core.TitanException;
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080018import com.tinkerpop.blueprints.Direction;
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080019import com.tinkerpop.blueprints.Edge;
Pankaj Berde62016142013-04-09 15:35:50 -070020import com.tinkerpop.blueprints.Vertex;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080021import com.tinkerpop.gremlin.java.GremlinPipeline;
Pankaj Berde5024ec12013-01-31 17:07:29 -080022import com.tinkerpop.pipes.PipeFunction;
23import com.tinkerpop.pipes.transform.PathPipe;
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080024
25public class LinkStorageImpl implements ILinkStorage {
Pankaj Berde62016142013-04-09 15:35:50 -070026
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080027 protected static Logger log = LoggerFactory.getLogger(LinkStorageImpl.class);
Toshio Koide7bdea5b2013-06-13 13:57:18 -070028 protected GraphDBOperation dbop;
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080029
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080030 @Override
31 public void update(Link link, DM_OPERATION op) {
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080032 update(link, (LinkInfo)null, op);
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080033 }
34
35 @Override
36 public void update(List<Link> links, DM_OPERATION op) {
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080037 for (Link lt: links) {
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080038 update(lt, (LinkInfo)null, op);
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080039 }
40 }
41
42 @Override
43 public void update(Link link, LinkInfo linkinfo, DM_OPERATION op) {
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080044 switch (op) {
45 case UPDATE:
46 case CREATE:
47 case INSERT:
Pankaj Berde254abb42013-06-10 21:21:49 -070048 updateLink(link, linkinfo, op);
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080049 break;
50 case DELETE:
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080051 deleteLink(link);
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080052 break;
53 }
54 }
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080055
Pankaj Berde254abb42013-06-10 21:21:49 -070056 public void updateLink(Link lt, LinkInfo linkinfo, DM_OPERATION op) {
Pankaj Berde5fb27632013-04-05 08:56:12 -070057 IPortObject vportSrc = null, vportDst = null;
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080058
Pankaj Berde254abb42013-06-10 21:21:49 -070059 log.trace("updateLink(): op {} {} {}", new Object[]{op, lt, linkinfo});
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080060
61 try {
62 // get source port vertex
63 String dpid = HexString.toHexString(lt.getSrc());
64 short port = lt.getSrcPort();
Toshio Koide7bdea5b2013-06-13 13:57:18 -070065 vportSrc = dbop.searchPort(dpid, port);
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080066
67 // get dest port vertex
68 dpid = HexString.toHexString(lt.getDst());
69 port = lt.getDstPort();
Toshio Koide7bdea5b2013-06-13 13:57:18 -070070 vportDst = dbop.searchPort(dpid, port);
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080071
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080072 if (vportSrc != null && vportDst != null) {
Pankaj Berde86a0d412013-04-05 15:06:26 -070073
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080074 // check if the link exists
Pankaj Berde77b58512013-04-05 12:06:37 -070075
Pankaj Berde62016142013-04-09 15:35:50 -070076 Iterable<IPortObject> currPorts = vportSrc.getLinkedPorts();
77 List<IPortObject> currLinks = new ArrayList<IPortObject>();
Pankaj Berde77b58512013-04-05 12:06:37 -070078 for (IPortObject V : currPorts) {
Pankaj Berde6debb042013-01-16 18:04:32 -080079 currLinks.add(V);
80 }
81
82 if (currLinks.contains(vportDst)) {
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080083 // TODO: update linkinfo
84 if (op.equals(DM_OPERATION.INSERT) || op.equals(DM_OPERATION.CREATE)) {
Umesh Krishnaswamy9306f952013-01-24 20:42:59 -080085 log.debug("addOrUpdateLink(): failed link exists {} {} src {} dst {}",
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080086 new Object[]{op, lt, vportSrc, vportDst});
87 }
Pankaj Berde0fc4e432013-01-12 09:47:22 -080088 } else {
Pankaj Berde62016142013-04-09 15:35:50 -070089 vportSrc.setLinkPort(vportDst);
90
Toshio Koide7bdea5b2013-06-13 13:57:18 -070091 dbop.commit();
Pankaj Berde254abb42013-06-10 21:21:49 -070092 log.debug("updateLink(): link added {} {} src {} dst {}", new Object[]{op, lt, vportSrc, vportDst});
Pankaj Berde0fc4e432013-01-12 09:47:22 -080093 }
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080094 } else {
Pankaj Berde254abb42013-06-10 21:21:49 -070095 log.error("updateLink(): failed invalid vertices {} {} src {} dst {}", new Object[]{op, lt, vportSrc, vportDst});
Toshio Koide7bdea5b2013-06-13 13:57:18 -070096 dbop.rollback();
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080097 }
98 } catch (TitanException e) {
99 /*
100 * retry till we succeed?
101 */
Umesh Krishnaswamyc56a8cc2013-01-24 21:47:51 -0800102 e.printStackTrace();
Pankaj Berde254abb42013-06-10 21:21:49 -0700103 log.error("updateLink(): titan exception {} {} {}", new Object[]{op, lt, e.toString()});
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800104 }
105 }
106
107 @Override
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800108 public void deleteLinks(List<Link> links) {
109
110 for (Link lt : links) {
111 deleteLink(lt);
112 }
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800113 }
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800114
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800115
116 @Override
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800117 public void deleteLink(Link lt) {
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700118 IPortObject vportSrc = null, vportDst = null;
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800119 int count = 0;
120
121 log.debug("deleteLink(): {}", lt);
122
123 try {
124 // get source port vertex
125 String dpid = HexString.toHexString(lt.getSrc());
126 short port = lt.getSrcPort();
Toshio Koide7bdea5b2013-06-13 13:57:18 -0700127 vportSrc = dbop.searchPort(dpid, port);
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800128
129 // get dst port vertex
130 dpid = HexString.toHexString(lt.getDst());
131 port = lt.getDstPort();
Toshio Koide7bdea5b2013-06-13 13:57:18 -0700132 vportDst = dbop.searchPort(dpid, port);
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700133 // FIXME: This needs to remove all edges
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800134
135 if (vportSrc != null && vportDst != null) {
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700136
137 /* for (Edge e : vportSrc.asVertex().getEdges(Direction.OUT)) {
Umesh Krishnaswamy11060ed2013-01-23 19:24:36 -0800138 log.debug("deleteLink(): {} in {} out {}",
139 new Object[]{e.getLabel(), e.getVertex(Direction.IN), e.getVertex(Direction.OUT)});
140 if (e.getLabel().equals("link") && e.getVertex(Direction.IN).equals(vportDst)) {
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800141 graph.removeEdge(e);
142 count++;
143 }
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700144 }*/
145 vportSrc.removeLink(vportDst);
Toshio Koide7bdea5b2013-06-13 13:57:18 -0700146 dbop.commit();
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700147 log.debug("deleteLink(): deleted edges src {} dst {}", new Object[]{
148 lt, vportSrc, vportDst});
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800149
150 } else {
Umesh Krishnaswamy9306f952013-01-24 20:42:59 -0800151 log.error("deleteLink(): failed invalid vertices {} src {} dst {}", new Object[]{lt, vportSrc, vportDst});
Toshio Koide7bdea5b2013-06-13 13:57:18 -0700152 dbop.rollback();
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800153 }
154
155 } catch (TitanException e) {
156 /*
157 * retry till we succeed?
158 */
Umesh Krishnaswamyc56a8cc2013-01-24 21:47:51 -0800159 log.error("deleteLink(): titan exception {} {}", new Object[]{lt, e.toString()});
Toshio Koide7bdea5b2013-06-13 13:57:18 -0700160 dbop.rollback();
Umesh Krishnaswamyc56a8cc2013-01-24 21:47:51 -0800161 e.printStackTrace();
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800162 }
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800163 }
164
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800165 // TODO: Fix me
166 @Override
167 public List<Link> getLinks(Long dpid, short port) {
Toshio Koidebfe9b922013-06-18 10:56:05 -0700168 IPortObject vportSrc;
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800169
Toshio Koide7bdea5b2013-06-13 13:57:18 -0700170 vportSrc = dbop.searchPort(HexString.toHexString(dpid), port);
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800171 if (vportSrc != null) {
Pankaj Berde62016142013-04-09 15:35:50 -0700172
173 for (Edge e : vportSrc.asVertex().getEdges(Direction.OUT)) {
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800174 if (e.getLabel().equals("link")) {
175 break;
176 }
177 }
178 }
179 return null;
180 }
181
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800182 @Override
183 public void init(String conf) {
Pankaj Berde1f10be02013-02-01 14:06:02 -0800184 //TODO extract the DB location from properties
Toshio Koidebfe9b922013-06-18 10:56:05 -0700185 this.dbop = new GraphDBOperation(conf);
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800186 }
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800187
188 @Override
189 public void deleteLinksOnPort(Long dpid, short port) {
190 // TODO Auto-generated method stub
191
192 }
193
Pankaj Berdeff421802013-01-29 20:28:52 -0800194 @Override
195 public List<Link> getLinks(String dpid) {
196 // TODO Auto-generated method stub
197 return null;
198 }
199
200 public List<Link> getActiveLinks() {
Toshio Koide7bdea5b2013-06-13 13:57:18 -0700201 Iterable<ISwitchObject> switches = dbop.getActiveSwitches();
Pankaj Berde5024ec12013-01-31 17:07:29 -0800202
203 List<Link> links = new ArrayList<Link>();
204 for (ISwitchObject sw : switches) {
205 GremlinPipeline<Vertex, Link> pipe = new GremlinPipeline<Vertex, Link>();
206 ExtractLink extractor = new ExtractLink();
207
208 pipe.start(sw.asVertex());
209 pipe.enablePath(true);
Pankaj Berde1f10be02013-02-01 14:06:02 -0800210 pipe.out("on").out("link").in("on").path().step(extractor);
Pankaj Berde5024ec12013-01-31 17:07:29 -0800211
Pankaj Berde1f10be02013-02-01 14:06:02 -0800212 while (pipe.hasNext() ) {
Pankaj Berde5024ec12013-01-31 17:07:29 -0800213 Link l = pipe.next();
214 links.add(l);
215 }
216
217 }
218 return links;
Pankaj Berdeff421802013-01-29 20:28:52 -0800219 }
Pankaj Berde5024ec12013-01-31 17:07:29 -0800220
HIGUCHI Yuta909de462013-06-12 14:32:26 -0700221 // FIXME Scope changed to public to allow access from TopoLinkServiceImpl. Move class definition to appropriate place.
222 static public class ExtractLink implements PipeFunction<PathPipe<Vertex>, Link> {
Pankaj Berde5024ec12013-01-31 17:07:29 -0800223
Pankaj Berde5024ec12013-01-31 17:07:29 -0800224 @Override
225 public Link compute(PathPipe<Vertex> pipe ) {
Pankaj Berded18c7622013-02-04 10:28:35 -0800226 // TODO Auto-generated method stub
Pankaj Berde5024ec12013-01-31 17:07:29 -0800227 long s_dpid = 0;
228 long d_dpid = 0;
229 short s_port = 0;
230 short d_port = 0;
231 List<Vertex> V = new ArrayList<Vertex>();
232 V = pipe.next();
233 Vertex src_sw = V.get(0);
234 Vertex dest_sw = V.get(3);
235 Vertex src_port = V.get(1);
236 Vertex dest_port = V.get(2);
237 s_dpid = HexString.toLong((String) src_sw.getProperty("dpid"));
238 d_dpid = HexString.toLong((String) dest_sw.getProperty("dpid"));
239 s_port = (Short) src_port.getProperty("number");
240 d_port = (Short) dest_port.getProperty("number");
241
242 Link l = new Link(s_dpid,s_port,d_dpid,d_port);
243
244 return l;
245 }
246 }
Pankaj Berded18c7622013-02-04 10:28:35 -0800247
248 public void finalize() {
249 close();
250 }
251
252 @Override
253 public void close() {
254 // TODO Auto-generated method stub
Pankaj Berde62016142013-04-09 15:35:50 -0700255// graph.shutdown();
Pankaj Berded18c7622013-02-04 10:28:35 -0800256 }
Pankaj Berde5024ec12013-01-31 17:07:29 -0800257
Pankaj Berdeff421802013-01-29 20:28:52 -0800258
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800259}