ONOS listens to device discovery messages
diff --git a/src/main/java/net/floodlightcontroller/core/INetMapTopologyObjects.java b/src/main/java/net/floodlightcontroller/core/INetMapTopologyObjects.java
index a54136c..1cf6f7b 100644
--- a/src/main/java/net/floodlightcontroller/core/INetMapTopologyObjects.java
+++ b/src/main/java/net/floodlightcontroller/core/INetMapTopologyObjects.java
@@ -47,6 +47,9 @@
public Iterable<IPortObject> getPorts();
@Adjacency(label="on")
+ public IPortObject getPort(final short port_num);
+
+ @Adjacency(label="on")
public void addPort(final IPortObject port);
@Adjacency(label="on")
diff --git a/src/main/java/net/floodlightcontroller/core/ISwitchStorage.java b/src/main/java/net/floodlightcontroller/core/ISwitchStorage.java
index 5a1e1a7..3646e15 100644
--- a/src/main/java/net/floodlightcontroller/core/ISwitchStorage.java
+++ b/src/main/java/net/floodlightcontroller/core/ISwitchStorage.java
@@ -4,16 +4,8 @@
import net.floodlightcontroller.core.INetMapTopologyObjects.ISwitchObject;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
import org.openflow.protocol.OFPhysicalPort;
-import com.tinkerpop.blueprints.Direction;
-import com.tinkerpop.frames.Adjacency;
-import com.tinkerpop.frames.Incidence;
-import com.tinkerpop.frames.Property;
-import com.tinkerpop.frames.VertexFrame;
-
public interface ISwitchStorage extends INetMapStorage {
public enum SwitchState {
diff --git a/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImpl.java b/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImpl.java
index 0e43ed2..3039679 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImpl.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImpl.java
@@ -20,8 +20,6 @@
import com.tinkerpop.blueprints.Edge;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.frames.FramedGraph;
-import com.tinkerpop.gremlin.java.GremlinPipeline;
-
import net.floodlightcontroller.core.INetMapTopologyObjects.ISwitchObject;
import net.floodlightcontroller.core.ISwitchStorage;
diff --git a/src/main/java/net/floodlightcontroller/core/internal/TopoSwitchServiceImpl.java b/src/main/java/net/floodlightcontroller/core/internal/TopoSwitchServiceImpl.java
index deae4bf..e8b1bf8 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/TopoSwitchServiceImpl.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/TopoSwitchServiceImpl.java
@@ -1,7 +1,5 @@
package net.floodlightcontroller.core.internal;
-import java.util.List;
-
import net.floodlightcontroller.core.INetMapTopologyObjects.IPortObject;
import net.floodlightcontroller.core.INetMapTopologyObjects.ISwitchObject;
import net.floodlightcontroller.core.INetMapTopologyService.ITopoSwitchService;
diff --git a/src/main/java/net/floodlightcontroller/devicemanager/IDeviceStorage.java b/src/main/java/net/floodlightcontroller/devicemanager/IDeviceStorage.java
index 582afe0..f41e32c 100644
--- a/src/main/java/net/floodlightcontroller/devicemanager/IDeviceStorage.java
+++ b/src/main/java/net/floodlightcontroller/devicemanager/IDeviceStorage.java
@@ -7,8 +7,9 @@
public IDeviceObject addDevice(IDevice device);
public IDeviceObject updateDevice(IDevice device);
- public IDeviceObject removeDevice(IDevice device);
+ public void removeDevice(IDevice device);
public IDeviceObject getDeviceByMac(String mac);
public IDeviceObject getDeviceByIP(String ip);
-
+ public void changeDeviceAttachments(IDevice device);
+ public void changeDeviceIPv4Address(IDevice device);
}
diff --git a/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceStorageImpl.java b/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceStorageImpl.java
index 14f93cb..cfbbb41 100644
--- a/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceStorageImpl.java
+++ b/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceStorageImpl.java
@@ -1,21 +1,12 @@
package net.floodlightcontroller.devicemanager.internal;
-import java.util.ArrayList;
import java.util.List;
-import java.util.Set;
-
import org.openflow.util.HexString;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Lists;
import com.thinkaurelius.titan.core.TitanException;
-import com.thinkaurelius.titan.core.TitanFactory;
-import com.thinkaurelius.titan.core.TitanGraph;
-import com.tinkerpop.blueprints.Vertex;
-import com.tinkerpop.blueprints.TransactionalGraph.Conclusion;
-import com.tinkerpop.frames.FramedGraph;
-
import net.floodlightcontroller.core.INetMapTopologyObjects.IDeviceObject;
import net.floodlightcontroller.core.INetMapTopologyObjects.IPortObject;
import net.floodlightcontroller.core.INetMapTopologyService.ITopoSwitchService;
@@ -23,31 +14,19 @@
import net.floodlightcontroller.devicemanager.IDevice;
import net.floodlightcontroller.devicemanager.IDeviceStorage;
import net.floodlightcontroller.devicemanager.SwitchPort;
+import net.onrc.onos.util.GraphDBConnection;
+import net.onrc.onos.util.GraphDBConnection.Transaction;
public class DeviceStorageImpl implements IDeviceStorage {
- public TitanGraph graph;
+// public TitanGraph graph;
+ public GraphDBConnection conn;
protected static Logger log = LoggerFactory.getLogger(SwitchStorageImpl.class);
public ITopoSwitchService svc;
@Override
public void init(String conf) {
- graph = TitanFactory.open(conf);
-
- // FIXME: Creation on Indexes should be done only once
- Set<String> s = graph.getIndexedKeys(Vertex.class);
- if (!s.contains("dpid")) {
- graph.createKeyIndex("dpid", Vertex.class);
- graph.stopTransaction(Conclusion.SUCCESS);
- }
- if (!s.contains("type")) {
- graph.createKeyIndex("type", Vertex.class);
- graph.stopTransaction(Conclusion.SUCCESS);
- }
- if (!s.contains("dl_address")) {
- graph.createKeyIndex("dl_address", Vertex.class);
- graph.stopTransaction(Conclusion.SUCCESS);
- }
+ conn = GraphDBConnection.getInstance(conf);
}
public void finalize() {
@@ -56,45 +35,32 @@
@Override
public void close() {
- graph.shutdown();
+ conn.close();
}
@Override
public IDeviceObject addDevice(IDevice device) {
// TODO Auto-generated method stub
- FramedGraph<TitanGraph> fg = new FramedGraph<TitanGraph>(graph);;
IDeviceObject obj = null;
- SwitchPort[] attachmentPoints = device.getAttachmentPoints();
- List<IPortObject> attachedPorts;
try {
- if (fg.getVertices("dl_address",device.getMACAddressString()).iterator().hasNext()) {
- obj = fg.getVertices("dl_address",device.getMACAddressString(),
- IDeviceObject.class).iterator().next();
- attachedPorts = Lists.newArrayList(obj.getAttachedPorts());
-
+ if ((obj = conn.utils().searchDevice(conn, device.getMACAddressString())) != null) {
+ log.debug("Adding device {}: found existing device",device.getMACAddressString());
} else {
- obj = fg.addVertex(null,IDeviceObject.class);
- attachedPorts = new ArrayList<IPortObject>();
+ obj = conn.utils().newDevice(conn);
+ log.debug("Adding device {}: creating new device",device.getMACAddressString());
}
- for (SwitchPort ap : attachmentPoints) {
- IPortObject port = svc.getPortOnSwitch(HexString.toHexString(ap.getSwitchDPID()),
- (short) ap.getPort());
- if (attachedPorts.contains(port)) {
- attachedPorts.remove(port);
- } else {
- obj.setHostPort(port);
- }
- }
- for (IPortObject port: attachedPorts) {
- obj.removeHostPort(port);
- }
+ changeDeviceAttachments(device, obj);
+
obj.setIPAddress(device.getIPv4Addresses().toString());
obj.setMACAddress(device.getMACAddressString());
obj.setType("device");
obj.setState("ACTIVE");
- graph.stopTransaction(Conclusion.SUCCESS);
- } catch (TitanException e) {
+ conn.endTx(Transaction.COMMIT);
+
+ log.debug("Adding device {}",device.getMACAddressString());
+ } catch (Exception e) {
// TODO: handle exceptions
+ conn.endTx(Transaction.ROLLBACK);
log.error(":addDevice mac:{} failed", device.getMACAddressString());
}
@@ -103,19 +69,29 @@
@Override
public IDeviceObject updateDevice(IDevice device) {
- // TODO Auto-generated method stub
return addDevice(device);
}
@Override
- public IDeviceObject removeDevice(IDevice device) {
+ public void removeDevice(IDevice device) {
// TODO Auto-generated method stub
- return null;
+ IDeviceObject dev;
+ try {
+ if ((dev = conn.utils().searchDevice(conn, device.getMACAddressString())) != null) {
+ conn.utils().removeDevice(conn, dev);
+ conn.endTx(Transaction.COMMIT);
+ log.error("DeviceStorage:removeDevice mac:{} done", device.getMACAddressString());
+ }
+ } catch (Exception e) {
+ // TODO: handle exceptions
+ conn.endTx(Transaction.ROLLBACK);
+ log.error("DeviceStorage:removeDevice mac:{} failed", device.getMACAddressString());
+ }
}
@Override
public IDeviceObject getDeviceByMac(String mac) {
- // TODO Auto-generated method stub
+
return null;
}
@@ -125,4 +101,64 @@
return null;
}
+ @Override
+ public void changeDeviceAttachments(IDevice device) {
+ // TODO Auto-generated method stub
+ IDeviceObject obj = null;
+ try {
+ if ((obj = conn.utils().searchDevice(conn, device.getMACAddressString())) != null) {
+ log.debug("Changing device ports {}: found existing device",device.getMACAddressString());
+ changeDeviceAttachments(device, obj);
+ conn.endTx(Transaction.COMMIT);
+ } else {
+ log.debug("failed to search device...now adding {}",device.getMACAddressString());
+ addDevice(device);
+ }
+ } catch (Exception e) {
+ // TODO: handle exceptions
+ conn.endTx(Transaction.ROLLBACK);
+ log.error(":addDevice mac:{} failed", device.getMACAddressString());
+ }
+ }
+
+ public void changeDeviceAttachments(IDevice device, IDeviceObject obj) {
+ SwitchPort[] attachmentPoints = device.getAttachmentPoints();
+ List<IPortObject> attachedPorts = Lists.newArrayList(obj.getAttachedPorts());
+
+ for (SwitchPort ap : attachmentPoints) {
+ IPortObject port = conn.utils().searchPort(conn,
+ HexString.toHexString(ap.getSwitchDPID()),
+ (short) ap.getPort());
+ if (attachedPorts.contains(port)) {
+ attachedPorts.remove(port);
+ } else {
+ log.debug("Adding device {}: attaching to port",device.getMACAddressString());
+ port.setDevice(obj);
+ //obj.setHostPort(port);
+ }
+ }
+ for (IPortObject port: attachedPorts) {
+ port.removeDevice(obj);
+ // obj.removeHostPort(port);
+ }
+ }
+
+ @Override
+ public void changeDeviceIPv4Address(IDevice device) {
+ // TODO Auto-generated method stub
+ IDeviceObject obj;
+ try {
+ if ((obj = conn.utils().searchDevice(conn, device.getMACAddressString())) != null) {
+ obj.setIPAddress(device.getIPv4Addresses().toString());
+ conn.endTx(Transaction.COMMIT);
+ } else {
+ log.error(":changeDeviceIPv4Address mac:{} failed", device.getMACAddressString());
+ }
+ } catch (TitanException e) {
+ // TODO: handle exceptions
+ conn.endTx(Transaction.ROLLBACK);
+ log.error(":changeDeviceIPv4Address mac:{} failed due to exception {}", device.getMACAddressString(),e);
+ }
+ }
+
}
diff --git a/src/main/java/net/floodlightcontroller/onoslistener/OnosPublisher.java b/src/main/java/net/floodlightcontroller/onoslistener/OnosPublisher.java
new file mode 100644
index 0000000..532e293
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/onoslistener/OnosPublisher.java
@@ -0,0 +1,144 @@
+package net.floodlightcontroller.onoslistener;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import net.floodlightcontroller.core.IFloodlightProviderService;
+import net.floodlightcontroller.core.IOFSwitch;
+import net.floodlightcontroller.core.IOFSwitchListener;
+import net.floodlightcontroller.core.ISwitchStorage;
+import net.floodlightcontroller.core.internal.SwitchStorageImpl;
+import net.floodlightcontroller.core.module.FloodlightModuleContext;
+import net.floodlightcontroller.core.module.FloodlightModuleException;
+import net.floodlightcontroller.core.module.IFloodlightModule;
+import net.floodlightcontroller.core.module.IFloodlightService;
+import net.floodlightcontroller.devicemanager.IDevice;
+import net.floodlightcontroller.devicemanager.IDeviceListener;
+import net.floodlightcontroller.devicemanager.IDeviceService;
+import net.floodlightcontroller.devicemanager.IDeviceStorage;
+import net.floodlightcontroller.devicemanager.internal.DeviceStorageImpl;
+import net.floodlightcontroller.linkdiscovery.ILinkDiscoveryListener;
+
+public class OnosPublisher implements IDeviceListener, IOFSwitchListener,
+ ILinkDiscoveryListener, IFloodlightModule {
+
+ protected IDeviceStorage devStore;
+ protected ISwitchStorage swStore;
+ protected static Logger log;
+ protected IDeviceService deviceService;
+
+ protected static final String DBConfigFile = "dbconf";
+
+ @Override
+ public void linkDiscoveryUpdate(LDUpdate update) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void addedSwitch(IOFSwitch sw) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void removedSwitch(IOFSwitch sw) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void switchPortChanged(Long switchId) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public String getName() {
+ return "OnosPublisher";
+ }
+
+ @Override
+ public void deviceAdded(IDevice device) {
+ // TODO Auto-generated method stub
+ log.debug("{}:deviceAdded(): Adding device {}",this.getClass(),device.getMACAddressString());
+ devStore.addDevice(device);
+ }
+
+ @Override
+ public void deviceRemoved(IDevice device) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void deviceMoved(IDevice device) {
+ // TODO Auto-generated method stub
+ devStore.changeDeviceAttachments(device);
+
+ }
+
+ @Override
+ public void deviceIPV4AddrChanged(IDevice device) {
+ // TODO Auto-generated method stub
+ devStore.changeDeviceIPv4Address(device);
+
+ }
+
+ @Override
+ public void deviceVlanChanged(IDevice device) {
+ // TODO Auto-generated method stub
+ }
+
+
+ @Override
+ public Collection<Class<? extends IFloodlightService>> getModuleServices() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
+ Collection<Class<? extends IFloodlightService>> l =
+ new ArrayList<Class<? extends IFloodlightService>>();
+ l.add(IFloodlightProviderService.class);
+ l.add(IDeviceService.class);
+ return l;
+ }
+
+ @Override
+ public void init(FloodlightModuleContext context)
+ throws FloodlightModuleException {
+ // TODO Auto-generated method stub
+ Map<String, String> configMap = context.getConfigParams(this);
+ String conf = configMap.get(DBConfigFile);
+
+ log = LoggerFactory.getLogger(OnosPublisher.class);
+ deviceService = context.getServiceImpl(IDeviceService.class);
+
+ swStore = new SwitchStorageImpl();
+ swStore.init(conf);
+ devStore = new DeviceStorageImpl();
+ devStore.init(conf);
+
+ log.debug("Initializing OnosPublisher module with {}", conf);
+
+ }
+
+ @Override
+ public void startUp(FloodlightModuleContext context) {
+ // TODO Auto-generated method stub
+ deviceService.addListener(this);
+ }
+
+}