blob: 766eae7e27a937b6ddcb26496a361295af36c448 [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;
Pankaj Berde2239f0d2013-04-04 09:42:43 -070011import net.onrc.onos.util.GraphDBConnection;
Toshio Koide7bdea5b2013-06-13 13:57:18 -070012import net.onrc.onos.util.GraphDBOperation;
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 -080019
20public class LinkStorageImpl implements ILinkStorage {
Pankaj Berde62016142013-04-09 15:35:50 -070021
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080022 protected static Logger log = LoggerFactory.getLogger(LinkStorageImpl.class);
Toshio Koide7bdea5b2013-06-13 13:57:18 -070023 protected GraphDBOperation dbop;
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080024
Naoki Shiota11516712013-06-05 22:36:01 -070025 /**
26 * Update a record in the LinkStorage in a way provided by op.
27 * @param link Record of a link to be updated.
28 * @param op Operation to be done.
29 */
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
Naoki Shiota11516712013-06-05 22:36:01 -070035 /**
36 * Update multiple records in the LinkStorage in a way provided by op.
37 * @param links List of records to be updated.
38 * @param op Operation to be done.
39 */
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080040 @Override
41 public void update(List<Link> links, DM_OPERATION op) {
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080042 for (Link lt: links) {
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080043 update(lt, (LinkInfo)null, op);
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080044 }
45 }
46
Naoki Shiota11516712013-06-05 22:36:01 -070047 /**
48 * Update a record of link with meta-information in the LinkStorage in a way provided by op.
49 * @param link Record of a link to update.
50 * @param linkinfo Meta-information of a link to be updated.
51 * @param op Operation to be done.
52 */
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080053 @Override
54 public void update(Link link, LinkInfo linkinfo, DM_OPERATION op) {
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080055 switch (op) {
56 case UPDATE:
57 case CREATE:
58 case INSERT:
Pankaj Berde254abb42013-06-10 21:21:49 -070059 updateLink(link, linkinfo, op);
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080060 break;
61 case DELETE:
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080062 deleteLink(link);
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080063 break;
64 }
65 }
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080066
Naoki Shiota11516712013-06-05 22:36:01 -070067 /**
68 * Perform INSERT/CREATE/UPDATE operation to update the LinkStorage.
69 * @param lt Record of a link to be updated.
70 * @param linkinfo Meta-information of a link to be updated.
71 * @param op Operation to be done. (only INSERT/CREATE/UPDATE is acceptable)
72 */
Pankaj Berde254abb42013-06-10 21:21:49 -070073 public void updateLink(Link lt, LinkInfo linkinfo, DM_OPERATION op) {
Pankaj Berde5fb27632013-04-05 08:56:12 -070074 IPortObject vportSrc = null, vportDst = null;
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080075
Pankaj Berde254abb42013-06-10 21:21:49 -070076 log.trace("updateLink(): op {} {} {}", new Object[]{op, lt, linkinfo});
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080077
78 try {
79 // get source port vertex
80 String dpid = HexString.toHexString(lt.getSrc());
81 short port = lt.getSrcPort();
Toshio Koide7bdea5b2013-06-13 13:57:18 -070082 vportSrc = dbop.searchPort(dpid, port);
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080083
84 // get dest port vertex
85 dpid = HexString.toHexString(lt.getDst());
86 port = lt.getDstPort();
Toshio Koide7bdea5b2013-06-13 13:57:18 -070087 vportDst = dbop.searchPort(dpid, port);
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080088
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -080089 if (vportSrc != null && vportDst != null) {
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -080090 // check if the link exists
Pankaj Berde77b58512013-04-05 12:06:37 -070091
Pankaj Berde62016142013-04-09 15:35:50 -070092 Iterable<IPortObject> currPorts = vportSrc.getLinkedPorts();
93 List<IPortObject> currLinks = new ArrayList<IPortObject>();
Pankaj Berde77b58512013-04-05 12:06:37 -070094 for (IPortObject V : currPorts) {
Pankaj Berde6debb042013-01-16 18:04:32 -080095 currLinks.add(V);
96 }
Naoki Shiotacae568a2013-06-05 17:53:41 -070097
Pankaj Berde6debb042013-01-16 18:04:32 -080098 if (currLinks.contains(vportDst)) {
Naoki Shiotab0d0c002013-06-05 20:21:20 -070099 // TODO: update linkinfo
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800100 if (op.equals(DM_OPERATION.INSERT) || op.equals(DM_OPERATION.CREATE)) {
Umesh Krishnaswamy9306f952013-01-24 20:42:59 -0800101 log.debug("addOrUpdateLink(): failed link exists {} {} src {} dst {}",
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800102 new Object[]{op, lt, vportSrc, vportDst});
103 }
Pankaj Berde0fc4e432013-01-12 09:47:22 -0800104 } else {
Naoki Shiotab0d0c002013-06-05 20:21:20 -0700105 vportSrc.setLinkPort(vportDst);
Pankaj Berde62016142013-04-09 15:35:50 -0700106
Toshio Koide7bdea5b2013-06-13 13:57:18 -0700107 dbop.commit();
Pankaj Berde254abb42013-06-10 21:21:49 -0700108 log.debug("updateLink(): link added {} {} src {} dst {}", new Object[]{op, lt, vportSrc, vportDst});
Pankaj Berde0fc4e432013-01-12 09:47:22 -0800109 }
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800110 } else {
Pankaj Berde254abb42013-06-10 21:21:49 -0700111 log.error("updateLink(): failed invalid vertices {} {} src {} dst {}", new Object[]{op, lt, vportSrc, vportDst});
Toshio Koide7bdea5b2013-06-13 13:57:18 -0700112 dbop.rollback();
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800113 }
114 } catch (TitanException e) {
115 /*
116 * retry till we succeed?
117 */
Umesh Krishnaswamyc56a8cc2013-01-24 21:47:51 -0800118 e.printStackTrace();
Pankaj Berde254abb42013-06-10 21:21:49 -0700119 log.error("updateLink(): titan exception {} {} {}", new Object[]{op, lt, e.toString()});
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800120 }
121 }
122
Naoki Shiota11516712013-06-05 22:36:01 -0700123 /**
124 * Delete multiple records in the LinkStorage.
125 * @param links List of records to be deleted.
126 */
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800127 @Override
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800128 public void deleteLinks(List<Link> links) {
129
130 for (Link lt : links) {
131 deleteLink(lt);
132 }
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800133 }
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800134
Naoki Shiota11516712013-06-05 22:36:01 -0700135 /**
136 * Delete a record in the LinkStorage.
137 * @param link Record to be deleted.
138 */
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800139 @Override
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800140 public void deleteLink(Link lt) {
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700141 IPortObject vportSrc = null, vportDst = null;
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800142
143 log.debug("deleteLink(): {}", lt);
144
145 try {
146 // get source port vertex
147 String dpid = HexString.toHexString(lt.getSrc());
148 short port = lt.getSrcPort();
Toshio Koide7bdea5b2013-06-13 13:57:18 -0700149 vportSrc = dbop.searchPort(dpid, port);
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800150
151 // get dst port vertex
152 dpid = HexString.toHexString(lt.getDst());
153 port = lt.getDstPort();
Toshio Koide7bdea5b2013-06-13 13:57:18 -0700154 vportDst = dbop.searchPort(dpid, port);
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700155 // FIXME: This needs to remove all edges
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800156
157 if (vportSrc != null && vportDst != null) {
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700158
159 /* for (Edge e : vportSrc.asVertex().getEdges(Direction.OUT)) {
Umesh Krishnaswamy11060ed2013-01-23 19:24:36 -0800160 log.debug("deleteLink(): {} in {} out {}",
161 new Object[]{e.getLabel(), e.getVertex(Direction.IN), e.getVertex(Direction.OUT)});
162 if (e.getLabel().equals("link") && e.getVertex(Direction.IN).equals(vportDst)) {
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800163 graph.removeEdge(e);
164 count++;
165 }
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700166 }*/
167 vportSrc.removeLink(vportDst);
Toshio Koide7bdea5b2013-06-13 13:57:18 -0700168 dbop.commit();
Pankaj Berde2239f0d2013-04-04 09:42:43 -0700169 log.debug("deleteLink(): deleted edges src {} dst {}", new Object[]{
170 lt, vportSrc, vportDst});
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800171
172 } else {
Umesh Krishnaswamy9306f952013-01-24 20:42:59 -0800173 log.error("deleteLink(): failed invalid vertices {} src {} dst {}", new Object[]{lt, vportSrc, vportDst});
Toshio Koide7bdea5b2013-06-13 13:57:18 -0700174 dbop.rollback();
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800175 }
176
177 } catch (TitanException e) {
178 /*
179 * retry till we succeed?
180 */
Umesh Krishnaswamyc56a8cc2013-01-24 21:47:51 -0800181 log.error("deleteLink(): titan exception {} {}", new Object[]{lt, e.toString()});
Toshio Koide7bdea5b2013-06-13 13:57:18 -0700182 dbop.rollback();
Umesh Krishnaswamyc56a8cc2013-01-24 21:47:51 -0800183 e.printStackTrace();
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800184 }
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800185 }
186
Naoki Shiota11516712013-06-05 22:36:01 -0700187 /**
188 * Get list of all links connected to the port specified by given DPID and port number.
189 * @param dpid DPID of desired port.
190 * @param port Port number of desired port.
191 * @return List of links. Empty list if no port was found.
192 */
Naoki Shiotab0d0c002013-06-05 20:21:20 -0700193 // TODO: Fix me
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800194 @Override
195 public List<Link> getLinks(Long dpid, short port) {
Naoki Shiota93ec1712013-06-13 15:49:36 -0700196 List<Link> links = new ArrayList<Link>();
197
198 IPortObject srcPort = dbop.searchPort(HexString.toHexString(dpid), port);
199 ISwitchObject srcSw = srcPort.getSwitch();
200
201 if(srcSw != null) {
202 for(IPortObject dstPort : srcPort.getLinkedPorts()) {
203 ISwitchObject dstSw = dstPort.getSwitch();
204 Link link = new Link(HexString.toLong(srcSw.getDPID()),
205 srcPort.getNumber(),
206 HexString.toLong(dstSw.getDPID()),
207 dstPort.getNumber());
208
209 links.add(link);
210 }
211 }
212
mininet403d5892013-06-05 03:48:17 -0700213 return links;
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800214 }
215
Naoki Shiota11516712013-06-05 22:36:01 -0700216 /**
217 * Initialize the object. Open LinkStorage using given configuration file.
218 * @param conf Path (absolute path for now) to configuration file.
219 */
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800220 @Override
221 public void init(String conf) {
Pankaj Berde1f10be02013-02-01 14:06:02 -0800222 //TODO extract the DB location from properties
Toshio Koide7bdea5b2013-06-13 13:57:18 -0700223 this.dbop = new GraphDBOperation(GraphDBConnection.getInstance(conf));
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800224 }
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800225
Naoki Shiota11516712013-06-05 22:36:01 -0700226 /**
227 * Delete records of the links connected to the port specified by given DPID and port number.
228 * @param dpid DPID of desired port.
229 * @param port Port number of desired port.
230 */
Naoki Shiotab0d0c002013-06-05 20:21:20 -0700231 // TODO: Fix me
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800232 @Override
233 public void deleteLinksOnPort(Long dpid, short port) {
mininet403d5892013-06-05 03:48:17 -0700234 List<Link> linksToDelete = getLinks(dpid,port);
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800235
mininet403d5892013-06-05 03:48:17 -0700236 for(Link l : linksToDelete) {
237 deleteLink(l);
238 }
Umesh Krishnaswamyf962d642013-01-23 19:04:23 -0800239 }
240
Naoki Shiota11516712013-06-05 22:36:01 -0700241 /**
242 * Get list of all links connected to the switch specified by given DPID.
243 * @param dpid DPID of desired switch.
244 * @return List of links. Empty list if no port was found.
245 */
Naoki Shiota1b972862013-06-05 19:49:09 -0700246 // TODO: Fix me
Pankaj Berdeff421802013-01-29 20:28:52 -0800247 @Override
248 public List<Link> getLinks(String dpid) {
mininet403d5892013-06-05 03:48:17 -0700249 List<Link> links = new ArrayList<Link>();
250
Naoki Shiota93ec1712013-06-13 15:49:36 -0700251 ISwitchObject srcSw = dbop.searchSwitch(dpid);
252
253 if(srcSw != null) {
254 for(IPortObject srcPort : srcSw.getPorts()) {
255 for(IPortObject dstPort : srcPort.getLinkedPorts()) {
256 ISwitchObject dstSw = dstPort.getSwitch();
257 if(dstSw != null) {
258 Link link = new Link(HexString.toLong(srcSw.getDPID()),
259 srcPort.getNumber(),
260 HexString.toLong(dstSw.getDPID()),
261 dstPort.getNumber());
262 links.add(link);
263 }
264 }
265 }
266 }
267
mininet403d5892013-06-05 03:48:17 -0700268 return links;
Pankaj Berdeff421802013-01-29 20:28:52 -0800269 }
270
Naoki Shiota11516712013-06-05 22:36:01 -0700271 /**
272 * Get list of all links whose state is ACTIVE.
273 * @return List of active links. Empty list if no port was found.
274 */
Pankaj Berdeff421802013-01-29 20:28:52 -0800275 public List<Link> getActiveLinks() {
Toshio Koide7bdea5b2013-06-13 13:57:18 -0700276 Iterable<ISwitchObject> switches = dbop.getActiveSwitches();
Pankaj Berde5024ec12013-01-31 17:07:29 -0800277
278 List<Link> links = new ArrayList<Link>();
Naoki Shiota826e84a2013-06-18 13:13:25 -0700279
280 for (ISwitchObject srcSw : switches) {
281 for(IPortObject srcPort : srcSw.getPorts()) {
282 for(IPortObject dstPort : srcPort.getLinkedPorts()) {
283 ISwitchObject dstSw = dstPort.getSwitch();
Pankaj Berde5024ec12013-01-31 17:07:29 -0800284
Naoki Shiota826e84a2013-06-18 13:13:25 -0700285 if(dstSw != null && dstSw.getState().equals("ACTIVE")) {
286 links.add(new Link(HexString.toLong(srcSw.getDPID()),
287 srcPort.getNumber(),
288 HexString.toLong(dstSw.getDPID()),
289 dstPort.getNumber()));
290 }
291 }
Pankaj Berde5024ec12013-01-31 17:07:29 -0800292 }
Pankaj Berde5024ec12013-01-31 17:07:29 -0800293 }
Naoki Shiota826e84a2013-06-18 13:13:25 -0700294
Pankaj Berde5024ec12013-01-31 17:07:29 -0800295 return links;
Pankaj Berdeff421802013-01-29 20:28:52 -0800296 }
Pankaj Berde5024ec12013-01-31 17:07:29 -0800297
Naoki Shiota11516712013-06-05 22:36:01 -0700298 /**
299 * Finalize the object.
300 */
Pankaj Berded18c7622013-02-04 10:28:35 -0800301 public void finalize() {
302 close();
303 }
304
Naoki Shiota11516712013-06-05 22:36:01 -0700305 /**
306 * Close LinkStorage.
307 */
Pankaj Berded18c7622013-02-04 10:28:35 -0800308 @Override
309 public void close() {
310 // TODO Auto-generated method stub
Pankaj Berde62016142013-04-09 15:35:50 -0700311// graph.shutdown();
Pankaj Berded18c7622013-02-04 10:28:35 -0800312 }
Pankaj Berde5024ec12013-01-31 17:07:29 -0800313
Pankaj Berdeff421802013-01-29 20:28:52 -0800314
Umesh Krishnaswamyb676ca22013-01-11 12:39:25 -0800315}