Gather I*Storage and it's impl to core
diff --git a/src/main/java/net/onrc/onos/ofcontroller/core/internal/DeviceStorageImpl.java b/src/main/java/net/onrc/onos/ofcontroller/core/internal/DeviceStorageImpl.java
new file mode 100644
index 0000000..5b3ed74
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/core/internal/DeviceStorageImpl.java
@@ -0,0 +1,269 @@
+package net.onrc.onos.ofcontroller.core.internal;
+
+import java.util.ArrayList;
+import java.util.List;
+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 net.floodlightcontroller.devicemanager.IDevice;
+import net.floodlightcontroller.devicemanager.SwitchPort;
+import net.floodlightcontroller.packet.IPv4;
+import net.onrc.onos.ofcontroller.core.IDeviceStorage;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IDeviceObject;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
+import net.onrc.onos.util.GraphDBConnection;
+import net.onrc.onos.util.GraphDBConnection.Transaction;
+import net.onrc.onos.util.GraphDBOperation;
+
+/**
+ * This is the class for storing the information of devices into CassandraDB
+ * @author Pankaj
+ */
+public class DeviceStorageImpl implements IDeviceStorage {
+
+ private GraphDBConnection conn;
+ private GraphDBOperation ope;
+ protected static Logger log = LoggerFactory.getLogger(SwitchStorageImpl.class);
+
+ /***
+ * Initialize function. Before you use this class, please call this method
+ * @param conf configuration file for Cassandra DB
+ */
+ @Override
+ public void init(String conf) {
+ try{
+ if((conn = GraphDBConnection.getInstance(conf)) != null)
+ {
+ ope = new GraphDBOperation(conn);
+ }
+ } catch(Exception e) {
+ log.error(e.getMessage());
+ }
+ }
+
+ /***
+ * Finalize/close function. After you use this class, please call this method.
+ * It will close the DB connection.
+ */
+ @Override
+ public void close() {
+ conn.close();
+ }
+
+ /***
+ * Finalize/close function. After you use this class, please call this method.
+ * It will close the DB connection. This is for Java gabage collection.
+ */
+ @Override
+ public void finalize() {
+ close();
+ }
+
+ /***
+ * This function is for adding the device into the DB.
+ * @param device The device you want to add into the DB.
+ * @return IDeviceObject which was added in the DB.
+ */
+ @Override
+ public IDeviceObject addDevice(IDevice device) {
+ IDeviceObject obj = null;
+ try {
+ if ((obj = ope.searchDevice(device.getMACAddressString())) != null) {
+ log.debug("Adding device {}: found existing device",device.getMACAddressString());
+ } else {
+ obj = ope.newDevice();
+ log.debug("Adding device {}: creating new device",device.getMACAddressString());
+ }
+ changeDeviceAttachments(device, obj);
+
+ String multiIntString = "";
+ for(Integer intValue : device.getIPv4Addresses()) {
+ if (multiIntString == null || multiIntString.isEmpty()){
+ multiIntString = IPv4.fromIPv4Address(intValue);
+ multiIntString = "[" + IPv4.fromIPv4Address(intValue);
+ }else{
+ multiIntString += "," + IPv4.fromIPv4Address(intValue);
+ }
+ }
+
+ if(multiIntString.toString() != null && !multiIntString.toString().isEmpty()){
+ obj.setIPAddress(multiIntString + "]");
+ }
+
+ obj.setMACAddress(device.getMACAddressString());
+ obj.setType("device");
+ obj.setState("ACTIVE");
+ ope.commit();
+
+ log.debug("Adding device {}",device.getMACAddressString());
+ } catch (Exception e) {
+ ope.rollback();
+ log.error(":addDevice mac:{} failed", device.getMACAddressString());
+ obj = null;
+ }
+ return obj;
+ }
+
+ /***
+ * This function is for updating the Device properties.
+ * @param device The device you want to add into the DB.
+ * @return IDeviceObject which was added in the DB.
+ */
+ @Override
+ public IDeviceObject updateDevice(IDevice device) {
+ return addDevice(device);
+ }
+
+ /***
+ * This function is for removing the Device from the DB.
+ * @param device The device you want to delete from the DB.
+ */
+ @Override
+ public void removeDevice(IDevice device) {
+ IDeviceObject dev;
+ try {
+ if ((dev = ope.searchDevice(device.getMACAddressString())) != null) {
+ ope.removeDevice(dev);
+ ope.commit();
+ log.error("DeviceStorage:removeDevice mac:{} done", device.getMACAddressString());
+ }
+ } catch (Exception e) {
+ ope.rollback();
+ log.error("DeviceStorage:removeDevice mac:{} failed", device.getMACAddressString());
+ }
+ }
+
+ /***
+ * This function is for getting the Device from the DB by Mac address of the device.
+ * @param mac The device mac address you want to get from the DB.
+ * @return IDeviceObject you want to get.
+ */
+ @Override
+ public IDeviceObject getDeviceByMac(String mac) {
+ return ope.searchDevice(mac);
+ }
+
+ /***
+ * This function is for getting the Device from the DB by IP address of the device.
+ * @param ip The device ip address you want to get from the DB.
+ * @return IDeviceObject you want to get.
+ */
+ @Override
+ public IDeviceObject getDeviceByIP(String ip) {
+ try
+ {
+ for(IDeviceObject dev : ope.getDevices()){
+ String ips;
+ if((ips = dev.getIPAddress()) != null){
+ String nw_addr_wob = ips.replace("[", "").replace("]", "");
+ ArrayList<String> iplists = Lists.newArrayList(nw_addr_wob.split(","));
+ if(iplists.contains(ip)){
+ return dev;
+ }
+ }
+ }
+ return null;
+ }
+ catch (Exception e)
+ {
+ log.error("DeviceStorage:getDeviceByIP:{} failed");
+ return null;
+ }
+ }
+
+ /***
+ * This function is for changing the Device attachment point.
+ * @param device The device you want change the attachment point
+ */
+ @Override
+ public void changeDeviceAttachments(IDevice device) {
+ IDeviceObject obj = null;
+ try {
+ if ((obj = ope.searchDevice(device.getMACAddressString())) != null) {
+ log.debug("Changing device ports {}: found existing device",device.getMACAddressString());
+ changeDeviceAttachments(device, obj);
+ ope.commit();
+ } else {
+ log.debug("failed to search device...now adding {}",device.getMACAddressString());
+ addDevice(device);
+ }
+ } catch (Exception e) {
+ ope.rollback();
+ log.error(":addDevice mac:{} failed", device.getMACAddressString());
+ }
+ }
+
+ /***
+ * This function is for changing the Device attachment point.
+ * @param device The new device you want change the attachment point
+ * @param obj The old device IDeviceObject that is going to change the attachment point.
+ */
+ public void changeDeviceAttachments(IDevice device, IDeviceObject obj) {
+ SwitchPort[] attachmentPoints = device.getAttachmentPoints();
+ List<IPortObject> attachedPorts = Lists.newArrayList(obj.getAttachedPorts());
+
+ for (SwitchPort ap : attachmentPoints) {
+ //Check weather there is the port
+ IPortObject port = ope.searchPort( HexString.toHexString(ap.getSwitchDPID()),
+ (short) ap.getPort());
+ log.debug("New Switch Port is {},{}", HexString.toHexString(ap.getSwitchDPID()),(short) ap.getPort());
+
+ if(port != null){
+ if(attachedPorts.contains(port))
+ {
+ log.debug("This is the port you already attached {}: do nothing",device.getMACAddressString());
+ //This port will be remained, so remove from the removed port lists.
+ attachedPorts.remove(port);
+ } else {
+ log.debug("Adding device {}: attaching to port",device.getMACAddressString());
+ port.setDevice(obj);
+ }
+
+ log.debug("port number is {}", port.getNumber().toString());
+ log.debug("port desc is {}", port.getDesc());
+ }
+ }
+
+ for (IPortObject port: attachedPorts) {
+ log.debug("Detouching the device {}: detouching from port",device.getMACAddressString());
+ port.removeDevice(obj);
+ }
+ }
+
+ /***
+ * This function is for changing the Device IPv4 address.
+ * @param device The new device you want change the ipaddress
+ */
+ @Override
+ public void changeDeviceIPv4Address(IDevice device) {
+ IDeviceObject obj;
+ try {
+ if ((obj = ope.searchDevice(device.getMACAddressString())) != null) {
+
+ String multiIntString = "";
+ for(Integer intValue : device.getIPv4Addresses()){
+ if (multiIntString == null || multiIntString.isEmpty()){
+ multiIntString = "[" + IPv4.fromIPv4Address(intValue);
+ } else {
+ multiIntString += "," + IPv4.fromIPv4Address(intValue);
+ }
+ }
+
+ if(multiIntString != null && !multiIntString.isEmpty()){
+ obj.setIPAddress(multiIntString + "]");
+ }
+
+ ope.commit();
+ } else {
+ log.error(":changeDeviceIPv4Address mac:{} failed", device.getMACAddressString());
+ }
+ } catch (TitanException e) {
+ ope.rollback();
+ log.error(":changeDeviceIPv4Address mac:{} failed due to exception {}", device.getMACAddressString(),e);
+ }
+ }
+
+}