Gather I*Storage and it's impl to core
diff --git a/src/main/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImpl.java b/src/main/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImpl.java
new file mode 100644
index 0000000..f3de81d
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImpl.java
@@ -0,0 +1,262 @@
+package net.onrc.onos.ofcontroller.core.internal;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.floodlightcontroller.linkdiscovery.LinkInfo;
+import net.floodlightcontroller.routing.Link;
+import net.onrc.onos.ofcontroller.core.ILinkStorage;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
+import net.onrc.onos.util.GraphDBConnection;
+import net.onrc.onos.util.GraphDBOperation;
+
+import org.openflow.util.HexString;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.thinkaurelius.titan.core.TitanException;
+import com.tinkerpop.blueprints.Direction;
+import com.tinkerpop.blueprints.Edge;
+import com.tinkerpop.blueprints.Vertex;
+import com.tinkerpop.gremlin.java.GremlinPipeline;
+import com.tinkerpop.pipes.PipeFunction;
+import com.tinkerpop.pipes.transform.PathPipe;
+
+public class LinkStorageImpl implements ILinkStorage {
+
+ protected static Logger log = LoggerFactory.getLogger(LinkStorageImpl.class);
+ protected GraphDBOperation dbop;
+
+ @Override
+ public void update(Link link, DM_OPERATION op) {
+ update(link, (LinkInfo)null, op);
+ }
+
+ @Override
+ public void update(List<Link> links, DM_OPERATION op) {
+ for (Link lt: links) {
+ update(lt, (LinkInfo)null, op);
+ }
+ }
+
+ @Override
+ public void update(Link link, LinkInfo linkinfo, DM_OPERATION op) {
+ switch (op) {
+ case UPDATE:
+ case CREATE:
+ case INSERT:
+ updateLink(link, linkinfo, op);
+ break;
+ case DELETE:
+ deleteLink(link);
+ break;
+ }
+ }
+
+ public void updateLink(Link lt, LinkInfo linkinfo, DM_OPERATION op) {
+ IPortObject vportSrc = null, vportDst = null;
+
+ log.trace("updateLink(): op {} {} {}", new Object[]{op, lt, linkinfo});
+
+ try {
+ // get source port vertex
+ String dpid = HexString.toHexString(lt.getSrc());
+ short port = lt.getSrcPort();
+ vportSrc = dbop.searchPort(dpid, port);
+
+ // get dest port vertex
+ dpid = HexString.toHexString(lt.getDst());
+ port = lt.getDstPort();
+ vportDst = dbop.searchPort(dpid, port);
+
+ if (vportSrc != null && vportDst != null) {
+
+ // check if the link exists
+
+ Iterable<IPortObject> currPorts = vportSrc.getLinkedPorts();
+ List<IPortObject> currLinks = new ArrayList<IPortObject>();
+ for (IPortObject V : currPorts) {
+ currLinks.add(V);
+ }
+
+ if (currLinks.contains(vportDst)) {
+ // TODO: update linkinfo
+ if (op.equals(DM_OPERATION.INSERT) || op.equals(DM_OPERATION.CREATE)) {
+ log.debug("addOrUpdateLink(): failed link exists {} {} src {} dst {}",
+ new Object[]{op, lt, vportSrc, vportDst});
+ }
+ } else {
+ vportSrc.setLinkPort(vportDst);
+
+ dbop.commit();
+ log.debug("updateLink(): link added {} {} src {} dst {}", new Object[]{op, lt, vportSrc, vportDst});
+ }
+ } else {
+ log.error("updateLink(): failed invalid vertices {} {} src {} dst {}", new Object[]{op, lt, vportSrc, vportDst});
+ dbop.rollback();
+ }
+ } catch (TitanException e) {
+ /*
+ * retry till we succeed?
+ */
+ e.printStackTrace();
+ log.error("updateLink(): titan exception {} {} {}", new Object[]{op, lt, e.toString()});
+ }
+ }
+
+ @Override
+ public void deleteLinks(List<Link> links) {
+
+ for (Link lt : links) {
+ deleteLink(lt);
+ }
+ }
+
+
+ @Override
+ public void deleteLink(Link lt) {
+ IPortObject vportSrc = null, vportDst = null;
+ int count = 0;
+
+ log.debug("deleteLink(): {}", lt);
+
+ try {
+ // get source port vertex
+ String dpid = HexString.toHexString(lt.getSrc());
+ short port = lt.getSrcPort();
+ vportSrc = dbop.searchPort(dpid, port);
+
+ // get dst port vertex
+ dpid = HexString.toHexString(lt.getDst());
+ port = lt.getDstPort();
+ vportDst = dbop.searchPort(dpid, port);
+ // FIXME: This needs to remove all edges
+
+ if (vportSrc != null && vportDst != null) {
+
+ /* for (Edge e : vportSrc.asVertex().getEdges(Direction.OUT)) {
+ log.debug("deleteLink(): {} in {} out {}",
+ new Object[]{e.getLabel(), e.getVertex(Direction.IN), e.getVertex(Direction.OUT)});
+ if (e.getLabel().equals("link") && e.getVertex(Direction.IN).equals(vportDst)) {
+ graph.removeEdge(e);
+ count++;
+ }
+ }*/
+ vportSrc.removeLink(vportDst);
+ dbop.commit();
+ log.debug("deleteLink(): deleted edges src {} dst {}", new Object[]{
+ lt, vportSrc, vportDst});
+
+ } else {
+ log.error("deleteLink(): failed invalid vertices {} src {} dst {}", new Object[]{lt, vportSrc, vportDst});
+ dbop.rollback();
+ }
+
+ } catch (TitanException e) {
+ /*
+ * retry till we succeed?
+ */
+ log.error("deleteLink(): titan exception {} {}", new Object[]{lt, e.toString()});
+ dbop.rollback();
+ e.printStackTrace();
+ }
+ }
+
+ // TODO: Fix me
+ @Override
+ public List<Link> getLinks(Long dpid, short port) {
+ IPortObject vportSrc, vportDst;
+ List<Link> links = null;
+ Link lt;
+
+ vportSrc = dbop.searchPort(HexString.toHexString(dpid), port);
+ if (vportSrc != null) {
+
+ for (Edge e : vportSrc.asVertex().getEdges(Direction.OUT)) {
+ if (e.getLabel().equals("link")) {
+ break;
+ }
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void init(String conf) {
+ //TODO extract the DB location from properties
+ this.dbop = new GraphDBOperation(GraphDBConnection.getInstance(conf));
+ }
+
+ @Override
+ public void deleteLinksOnPort(Long dpid, short port) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public List<Link> getLinks(String dpid) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public List<Link> getActiveLinks() {
+ Iterable<ISwitchObject> switches = dbop.getActiveSwitches();
+
+ List<Link> links = new ArrayList<Link>();
+ for (ISwitchObject sw : switches) {
+ GremlinPipeline<Vertex, Link> pipe = new GremlinPipeline<Vertex, Link>();
+ ExtractLink extractor = new ExtractLink();
+
+ pipe.start(sw.asVertex());
+ pipe.enablePath(true);
+ pipe.out("on").out("link").in("on").path().step(extractor);
+
+ while (pipe.hasNext() ) {
+ Link l = pipe.next();
+ links.add(l);
+ }
+
+ }
+ return links;
+ }
+
+ // FIXME Scope changed to public to allow access from TopoLinkServiceImpl. Move class definition to appropriate place.
+ static public class ExtractLink implements PipeFunction<PathPipe<Vertex>, Link> {
+
+ @Override
+ public Link compute(PathPipe<Vertex> pipe ) {
+ // TODO Auto-generated method stub
+ long s_dpid = 0;
+ long d_dpid = 0;
+ short s_port = 0;
+ short d_port = 0;
+ List<Vertex> V = new ArrayList<Vertex>();
+ V = pipe.next();
+ Vertex src_sw = V.get(0);
+ Vertex dest_sw = V.get(3);
+ Vertex src_port = V.get(1);
+ Vertex dest_port = V.get(2);
+ s_dpid = HexString.toLong((String) src_sw.getProperty("dpid"));
+ d_dpid = HexString.toLong((String) dest_sw.getProperty("dpid"));
+ s_port = (Short) src_port.getProperty("number");
+ d_port = (Short) dest_port.getProperty("number");
+
+ Link l = new Link(s_dpid,s_port,d_dpid,d_port);
+
+ return l;
+ }
+ }
+
+ public void finalize() {
+ close();
+ }
+
+ @Override
+ public void close() {
+ // TODO Auto-generated method stub
+// graph.shutdown();
+ }
+
+
+}