Merge branch 'master' into RAMCloud
Conflicts:
conf/onos.properties
src/main/java/net/onrc/onos/flow/FlowManagerImpl.java
src/main/java/net/onrc/onos/graph/LocalTopologyEventListener.java
src/main/java/net/onrc/onos/ofcontroller/bgproute/BgpRoute.java
src/main/java/net/onrc/onos/ofcontroller/core/ILinkStorage.java
src/main/java/net/onrc/onos/ofcontroller/core/ISwitchStorage.java
src/main/java/net/onrc/onos/ofcontroller/core/internal/DeviceStorageImpl.java
src/main/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImpl.java
src/main/java/net/onrc/onos/ofcontroller/core/internal/SwitchStorageImpl.java
src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowManager.java
src/main/java/net/onrc/onos/ofcontroller/topology/ShortestPath.java
src/main/java/net/onrc/onos/ofcontroller/topology/web/RouteResource.java
src/test/java/net/onrc/onos/ofcontroller/core/internal/SwitchStorageImplTest.java
src/test/java/net/onrc/onos/ofcontroller/core/internal/SwitchStorageImplTestBB.java
src/test/java/net/onrc/onos/ofcontroller/devicemanager/internal/DeviceStorageImplTest.java
src/test/java/net/onrc/onos/ofcontroller/topology/TopologyManagerTest.java
diff --git a/src/main/java/net/onrc/onos/graph/GraphDBConnection.java b/src/main/java/net/onrc/onos/graph/GraphDBConnection.java
index f9f3b67..bf30297 100644
--- a/src/main/java/net/onrc/onos/graph/GraphDBConnection.java
+++ b/src/main/java/net/onrc/onos/graph/GraphDBConnection.java
@@ -29,7 +29,7 @@
}
}
- protected static Logger log = LoggerFactory
+ protected final static Logger log = LoggerFactory
.getLogger(GraphDBConnection.class);
private static GraphDBConnection singleton = new GraphDBConnection();
private static TitanGraph graph;
@@ -81,15 +81,19 @@
if (!s.contains("switch_state")) {
graph.createKeyIndex("switch_state", Vertex.class);
}
+ if (!s.contains("ipv4_address")) {
+ graph.createKeyIndex("ipv4_address", Vertex.class);
+ }
graph.commit();
eg = new EventTransactionalGraph<TitanGraph>(graph);
}
return singleton;
}
- /**
+ /**
* Get a FramedGraph instance of the graph.
*/
+ @Override
public FramedGraph<TitanGraph> getFramedGraph() {
if (isValid()) {
FramedGraph<TitanGraph> fg = new FramedGraph<TitanGraph>(graph);
@@ -115,6 +119,7 @@
/**
* Add LocalGraphChangedLister for the graph.
*/
+ @Override
public void addEventListener(final LocalGraphChangedListener listener) {
EventTransactionalGraph<TitanGraph> eg = this.getEventGraph();
eg.addListener(listener);
@@ -124,38 +129,49 @@
/**
* Return whether this connection is valid.
*/
+ @Override
public Boolean isValid() {
- return (graph != null || graph.isOpen());
+ return (graph != null && graph.isOpen());
}
/**
* Commit changes for the graph operations.
+ * @throws Exception
*/
+ @Override
public void commit() {
- try {
+// // Should not catch exception here!
+// try {
graph.commit();
- }
- catch (Exception e) {
- log.error("{}", e.toString());
- }
+// }
+// catch (Exception e) {
+// log.error("{}", e.toString());
+// }
}
/**
* Rollback changes for the graph operations.
*/
+ @Override
public void rollback() {
- try {
+ // Should not catch exception here!
+// try {
graph.rollback();
- }
- catch (Exception e) {
- log.error("{}", e.toString());
- }
+// }
+// catch (Exception e) {
+// log.error("{}", e.toString());
+// }
}
/**
* Close this database connection.
*/
+ @Override
public void close() {
- commit();
+ try {
+ commit();
+ } catch (Exception e) {
+ log.error("{}", e.toString());
+ }
}
}
diff --git a/src/main/java/net/onrc/onos/graph/GraphDBOperation.java b/src/main/java/net/onrc/onos/graph/GraphDBOperation.java
index f1e9b46..bfd9046 100644
--- a/src/main/java/net/onrc/onos/graph/GraphDBOperation.java
+++ b/src/main/java/net/onrc/onos/graph/GraphDBOperation.java
@@ -1,11 +1,14 @@
package net.onrc.onos.graph;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IBaseObject;
import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IDeviceObject;
import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowEntry;
import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowPath;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IIpv4Address;
import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
import net.onrc.onos.ofcontroller.core.ISwitchStorage.SwitchState;
@@ -225,6 +228,49 @@
FramedGraph<TitanGraph> fg = conn.getFramedGraph();
if (fg != null) fg.removeVertex(dev.asVertex());
}
+
+ public IIpv4Address newIpv4Address() {
+ return newVertex("ipv4Address", IIpv4Address.class);
+ }
+
+ private <T extends IBaseObject> T newVertex(String type, Class<T> vertexType) {
+ FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+ T newVertex = fg.addVertex(null, vertexType);
+ if (newVertex != null) {
+ newVertex.setType(type);
+ }
+ return newVertex;
+ }
+
+ public IIpv4Address searchIpv4Address(int intIpv4Address) {
+ return searchForVertex("ipv4_address", intIpv4Address, IIpv4Address.class);
+ }
+
+ private <T> T searchForVertex(String propertyName, Object propertyValue, Class<T> vertexType) {
+ FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+ if (fg != null) {
+ Iterator<T> it =
+ fg.getVertices(propertyName, propertyValue, vertexType).iterator();
+ if (it.hasNext()) {
+ return it.next();
+ }
+ }
+ return null;
+ }
+
+ public IIpv4Address ensureIpv4Address(int intIpv4Address) {
+ IIpv4Address ipv4Vertex = searchIpv4Address(intIpv4Address);
+ if (ipv4Vertex == null) {
+ ipv4Vertex = newIpv4Address();
+ ipv4Vertex.setIpv4Address(intIpv4Address);
+ }
+ return ipv4Vertex;
+ }
+
+ public void removeIpv4Address(IIpv4Address ipv4Address) {
+ FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+ fg.removeVertex(ipv4Address.asVertex());
+ }
/**
* Create and return a flow path object.
diff --git a/src/main/java/net/onrc/onos/graph/LocalTopologyEventListener.java b/src/main/java/net/onrc/onos/graph/LocalTopologyEventListener.java
index fc8a196..7014e23 100644
--- a/src/main/java/net/onrc/onos/graph/LocalTopologyEventListener.java
+++ b/src/main/java/net/onrc/onos/graph/LocalTopologyEventListener.java
@@ -15,98 +15,99 @@
import java.util.Map;
public class LocalTopologyEventListener implements LocalGraphChangedListener {
+
+ protected final static Logger log = LoggerFactory.getLogger(LocalTopologyEventListener.class);
+ protected static DBConnection conn;
+
+ public LocalTopologyEventListener(DBConnection conn) {
+ LocalTopologyEventListener.conn = conn;
+ }
- protected static Logger log = LoggerFactory.getLogger(LocalTopologyEventListener.class);
- protected static DBConnection conn;
+ @Override
+ public void edgeAdded(Edge arg0) {
+ // TODO Auto-generated method stub
+ // Convert this Event into NetMapEvent (LinkAdded, FlowEntryEnabled, HostAttached, PortEnabled)
+ }
- public LocalTopologyEventListener(DBConnection conn) {
- LocalTopologyEventListener.conn = conn;
- }
- @Override
- public void edgeAdded(Edge arg0) {
- // TODO Auto-generated method stub
- // Convert this Event into NetMapEvent (LinkAdded, FlowEntryEnabled, HostAttached, PortEnabled)
- }
+ @Override
+ public void edgePropertyRemoved(Edge arg0, String arg1, Object arg2) {
+ // TODO Auto-generated method stub
+ // Currently not needed
- @Override
- public void edgePropertyRemoved(Edge arg0, String arg1, Object arg2) {
- // TODO Auto-generated method stub
- // Currently not needed
- }
+ }
- public void edgeRemoved(Edge e) {
- Edge edge;
- if (e instanceof com.tinkerpop.blueprints.impls.ramcloud.RamCloudEdge) {
- edge = (RamCloudEdge) e;
- } else {
- edge = (TitanEdge) e;
- }
- // TODO Auto-generated method stub
- // Fire NetMapEvents (LinkRemoved, FlowEntryRemoved, HostRemoved, PortRemoved)
- // TitanEdge edge = (TitanEdge) e;
- log.debug("TopologyEvents: Received edge removed event: {}", edge.toString());
- String label = edge.getLabel();
- if (label.equals("link")) {
- Vertex v = edge.getVertex(Direction.IN);
- IPortObject src_port = (IPortObject)conn.getFramedGraph().frame(v, IPortObject.class);
- v = edge.getVertex(Direction.OUT);
- IPortObject dest_port = (IPortObject)conn.getFramedGraph().frame(v, IPortObject.class);
+ public void edgeRemoved(Edge e) {
+ // TODO Auto-generated method stub
+ // Fire NetMapEvents (LinkRemoved, FlowEntryRemoved, HostRemoved, PortRemoved)
+ TitanEdge edge = (TitanEdge) e;
+ log.debug("TopologyEvents: Received edge removed event: {}",edge.toString());
+ String label = edge.getLabel();
+ if (label.equals("link")) {
+ Vertex v = edge.getVertex(Direction.IN);
+ IPortObject src_port = (IPortObject) conn.getFramedGraph().frame(v, IPortObject.class);
+ v = edge.getVertex(Direction.OUT);
+ IPortObject dest_port = (IPortObject) conn.getFramedGraph().frame(v, IPortObject.class);
- log.debug("TopologyEvents: link broken {}", new Object[]{src_port.getSwitch().getDPID(),
- src_port.getNumber(),
- dest_port.getSwitch().getDPID(),
- dest_port.getNumber()});
- IFlowManager manager = new FlowManagerImpl();
- // TODO: Find the flows and add to reconcile queue
- manager.reconcileFlows(src_port);
- }
- }
+ log.debug("TopologyEvents: link broken {}", new Object []{src_port.getSwitch().getDPID(),
+ src_port.getNumber(),
+ dest_port.getSwitch().getDPID(),
+ dest_port.getNumber()});
+ IFlowManager manager = new FlowManagerImpl();
+ // TODO: Find the flows and add to reconcile queue
+ manager.reconcileFlows(src_port);
+ }
+ }
- @Override
- public void vertexAdded(Vertex arg0) {
- // TODO Auto-generated method stub
- }
+ @Override
+ public void vertexAdded(Vertex arg0) {
+ // TODO Auto-generated method stub
- @Override
- public void vertexPropertyRemoved(Vertex arg0, String arg1, Object arg2) {
- // TODO Auto-generated method stub
- }
+ }
- public void vertexRemoved(Vertex vertex) {
- // TODO Auto-generated method stub
- // Generate NetMapEvents
- String type = (String) vertex.getProperty("type");
- log.debug("TopologyEvents: Received vertex removed event: {}", vertex.toString());
- if (type.equals("port")) {
- // port is removed...lets fire reconcile here directly for now
+ @Override
+ public void vertexPropertyRemoved(Vertex arg0, String arg1, Object arg2) {
+ // TODO Auto-generated method stub
- IPortObject src_port = (IPortObject)conn.getFramedGraph().frame(vertex, IPortObject.class);
- log.debug("TopologyEvents: Port removed: {}:{}", src_port.getSwitch().getDPID(), src_port.getNumber());
- IFlowManager manager = new FlowManagerImpl();
- manager.reconcileFlows(src_port);
- }
- }
+ }
- @Override
- public void edgePropertyChanged(Edge arg0, String arg1, Object arg2,
- Object arg3) {
- // TODO Auto-generated method stub
- }
+ public void vertexRemoved(Vertex vertex) {
+ // TODO Auto-generated method stub
+ // Generate NetMapEvents
+ String type = (String) vertex.getProperty("type");
+ log.debug("TopologyEvents: Received vertex removed event: {}",vertex.toString());
+ if (type.equals("port")) {
+ // port is removed...lets fire reconcile here directly for now
+
+ IPortObject src_port = (IPortObject) conn.getFramedGraph().frame(vertex, IPortObject.class);
+ log.debug("TopologyEvents: Port removed: {}:{}",src_port.getSwitch().getDPID(),src_port.getNumber());
+ IFlowManager manager = new FlowManagerImpl();
+ manager.reconcileFlows(src_port);
+ }
+ }
- @Override
- public void vertexPropertyChanged(Vertex arg0, String arg1, Object arg2,
- Object arg3) {
- // TODO Auto-generated method stub
- }
- @Override
- public void vertexRemoved(Vertex vertex, Map<String, Object> props) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
- }
+ @Override
+ public void edgePropertyChanged(Edge arg0, String arg1, Object arg2,
+ Object arg3) {
+ // TODO Auto-generated method stub
+
+ }
- @Override
- public void edgeRemoved(Edge edge, Map<String, Object> props) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
- }
+ @Override
+ public void vertexPropertyChanged(Vertex arg0, String arg1, Object arg2,
+ Object arg3) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void vertexRemoved(Vertex vertex, Map<String, Object> props) {
+ throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ }
+
+ @Override
+ public void edgeRemoved(Edge edge, Map<String, Object> props) {
+ throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ }
}