Added outline of the path taken through the NetworkGraph by an event generated from the discovery modules

Change-Id: Id875f54f522e3a9135e1a7e9a989167ca532a7a5
diff --git a/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/RCNetworkGraphPublisher.java b/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/RCNetworkGraphPublisher.java
index 167583f..156ee1a 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/RCNetworkGraphPublisher.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/RCNetworkGraphPublisher.java
@@ -14,13 +14,10 @@
 import net.onrc.onos.ofcontroller.core.IOFSwitchPortListener;
 import net.onrc.onos.ofcontroller.linkdiscovery.ILinkDiscoveryListener;
 import net.onrc.onos.ofcontroller.linkdiscovery.ILinkDiscoveryService;
-import net.onrc.onos.ofcontroller.networkgraph.FloodlightToOnosMappers;
 import net.onrc.onos.ofcontroller.networkgraph.INetworkGraphService;
-import net.onrc.onos.ofcontroller.networkgraph.LinkImpl;
-import net.onrc.onos.ofcontroller.networkgraph.NetworkGraph;
-import net.onrc.onos.ofcontroller.networkgraph.NetworkGraphDatastore;
-import net.onrc.onos.ofcontroller.networkgraph.Switch;
-import net.onrc.onos.ofcontroller.util.Dpid;
+import net.onrc.onos.ofcontroller.networkgraph.LinkEvent;
+import net.onrc.onos.ofcontroller.networkgraph.NetworkGraphDiscoveryInterface;
+import net.onrc.onos.ofcontroller.networkgraph.SwitchEvent;
 import net.onrc.onos.registry.controller.IControllerRegistryService;
 
 import org.openflow.protocol.OFPhysicalPort;
@@ -49,36 +46,18 @@
 	private IDatagridService datagridService;
 	private INetworkGraphService networkGraphService;
 
-	private NetworkGraph networkGraph;
-	private NetworkGraphDatastore southboundNetworkGraph;
+	private NetworkGraphDiscoveryInterface networkGraphDiscoveryInterface;
 
 
 	@Override
 	public void linkDiscoveryUpdate(LDUpdate update) {
-
-		// TODO Move this sanity check when retrieving port to common place?
-		Switch srcSw = networkGraph.getSwitch(update.getSrc());
-		if (srcSw == null) {
-			log.error("Switch {} missing when adding Link {}",
-					new Dpid(update.getSrc()), update);
-			return;
-		}
-
-		Switch dstSw = networkGraph.getSwitch(update.getDst());
-		if (dstSw == null) {
-			log.error("Switch {} missing when adding Link {}",
-					new Dpid(update.getDst()), update);
-			return;
-		}
-
-		// XXX Is it correct to add Link object created with networkGraph to southboundNetworkGraph?
-		LinkImpl link = new LinkImpl(networkGraph,
-			srcSw.getPort((long) update.getSrcPort()),
-			dstSw.getPort((long) update.getDstPort()));
-
+		LinkEvent linkEvent = new LinkEvent(update.getSrc(), 
+				(long)update.getSrcPort(), update.getDst(), 
+				(long)update.getDstPort());
+		
 		switch (update.getOperation()) {
 		case LINK_ADDED:
-//			southboundNetworkGraph.addLink(link);
+			networkGraphDiscoveryInterface.putLinkEvent(linkEvent);
 			/*
 			TopologyElement topologyElement =
 					new TopologyElement(update.getSrc(),
@@ -93,7 +72,7 @@
 			// We never use it.
 			break;
 		case LINK_REMOVED:
-//			southboundNetworkGraph.removeLink(link);
+			networkGraphDiscoveryInterface.removeLinkEvent(linkEvent);
 			/*
 			TopologyElement topologyElement =
 					new TopologyElement(update.getSrc(),
@@ -127,8 +106,8 @@
 			return;
 		}
 
-		Switch onosSwitch = FloodlightToOnosMappers.map(networkGraph, sw);
-//		southboundNetworkGraph.addSwitch(onosSwitch);
+		SwitchEvent switchEvent = new SwitchEvent(sw.getId());
+		networkGraphDiscoveryInterface.putSwitchEvent(switchEvent);
 
 		/*
 		// TODO publish ADD_SWITCH event here
@@ -167,8 +146,9 @@
 
 	@Override
 	public void removedSwitch(IOFSwitch sw) {
-		// TODO Auto-generated method stub
-
+		// TODO move to cleanup thread
+		SwitchEvent switchEvent = new SwitchEvent(sw.getId());
+		networkGraphDiscoveryInterface.removeSwitchEvent(switchEvent);
 	}
 
 	@Override
@@ -227,7 +207,6 @@
 		floodlightProvider.addOFSwitchListener(this);
 		linkDiscovery.addListener(this);
 
-		networkGraph = networkGraphService.getNetworkGraph();
-		southboundNetworkGraph = networkGraphService.getSouthboundNetworkGraph();
+		networkGraphDiscoveryInterface = networkGraphService.getNetworkGraphDiscoveryInterface();
 	}
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/INetworkGraphService.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/INetworkGraphService.java
index cef80ad..318c0f7 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/INetworkGraphService.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/INetworkGraphService.java
@@ -19,5 +19,5 @@
      * applications/modules that shouldn't touch it
      * @return
      */
-    public NetworkGraphDatastore getSouthboundNetworkGraph();
+    public NetworkGraphDiscoveryInterface getNetworkGraphDiscoveryInterface();
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphDiscoveryInterface.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphDiscoveryInterface.java
new file mode 100644
index 0000000..a4d21a9
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphDiscoveryInterface.java
@@ -0,0 +1,16 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+import java.net.InetAddress;
+import java.util.Set;
+
+public interface NetworkGraphDiscoveryInterface {
+	public void putSwitchEvent(SwitchEvent switchEvent);
+	public void removeSwitchEvent(SwitchEvent switchEvent);
+	public void putPortEvent(PortEvent portEvent);
+	public void removePortEvent(PortEvent portEvent);
+	public void putLinkEvent(LinkEvent linkEvent);
+	public void removeLinkEvent(LinkEvent linkEvent);
+	public void updateDeviceEvent(DeviceEvent deviceToUpdate, 
+			Set<InetAddress> updatedIpAddrs, Set<Port> updatedAttachmentPoints);
+	public void removeDeviceEvent(DeviceEvent deviceEvent);
+}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
index 14dfd64..539ca63 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
@@ -28,13 +28,17 @@
  * re-ordering. e.g.) Link Add came in, but Switch was not there.
  *
  */
-public class NetworkGraphImpl extends AbstractNetworkGraph {
+public class NetworkGraphImpl extends AbstractNetworkGraph
+								implements NetworkGraphDiscoveryInterface {
 
     private static final Logger log = LoggerFactory
 	    .getLogger(NetworkGraphImpl.class);
+    
+    private final NetworkGraphDatastore datastore;
 
     public NetworkGraphImpl() {
 	super();
+	datastore = new NetworkGraphDatastore(this);
     }
 
     /**
@@ -518,4 +522,113 @@
 	    super(message);
 	}
     }
+
+    /* ******************************
+     * NetworkGraphDiscoveryInterface methods
+     * ******************************/
+    
+	@Override
+	public void putSwitchEvent(SwitchEvent switchEvent) {
+		if (checkAddSwitchInvariant()) {
+			datastore.addSwitch(switchEvent);
+			putSwitch(switchEvent);
+		}
+		// TODO handle invariant violation
+	}
+
+	@Override
+	public void removeSwitchEvent(SwitchEvent switchEvent) {
+		if (checkRemoveSwitchInvariant()) {
+			datastore.deactivateSwitch(switchEvent);
+			removeSwitch(switchEvent);
+		}
+		// TODO handle invariant violation
+	}
+
+	@Override
+	public void putPortEvent(PortEvent portEvent) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void removePortEvent(PortEvent portEvent) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void putLinkEvent(LinkEvent linkEvent) {
+		if (checkAddLinkInvariant()) {
+			datastore.addLink(linkEvent);
+			putLink(linkEvent);
+		}
+		// TODO handle invariant violation
+	}
+
+	@Override
+	public void removeLinkEvent(LinkEvent linkEvent) {
+		if (checkRemoveLinkInvariant()) {
+			datastore.removeLink(linkEvent);
+			removeLink(linkEvent);
+		}
+		// TODO handle invariant violation
+	}
+
+	@Override
+	public void updateDeviceEvent(DeviceEvent deviceToUpdate,
+			Set<InetAddress> updatedIpAddrs, Set<Port> updatedAttachmentPoints) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void removeDeviceEvent(DeviceEvent deviceEvent) {
+		// TODO Auto-generated method stub
+		
+	}
+	
+	/* *****************
+	 * Internal methods to check invariants of the network graph
+	 * *****************/
+	
+	private boolean checkAddSwitchInvariant() {
+		// TODO implement
+		return true;
+	}
+	
+	private boolean checkRemoveSwitchInvariant() {
+		// TODO implement
+		return true;
+	}
+	
+	private boolean checkAddPortInvariant() {
+		// TODO implement
+		return true;
+	}
+	
+	private boolean checkRemovePortInvariant() {
+		// TODO implement
+		return true;
+	}
+	
+	private boolean checkAddLinkInvariant() {
+		// TODO implement
+		return true;
+	}
+	
+	private boolean checkRemoveLinkInvariant() {
+		// TODO implement
+		return true;
+	}
+	
+	private boolean checkAddDeviceInvariant() {
+		// TODO implement
+		return true;
+	}
+	
+	private boolean checkRemoveDeviceInvariant() {
+		// TODO implement
+		return true;
+	}
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphModule.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphModule.java
index 0824f63..7315f1c 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphModule.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphModule.java
@@ -19,7 +19,7 @@
 	// private RCNetworkGraphPublisher eventListener;
 	
 	private NetworkGraphImpl networkGraph;
-	private NetworkGraphDatastore southboundNetworkGraph;
+	//private NetworkGraphDatastore southboundNetworkGraph;
 
 	private IRestApiService restApi;
 
@@ -54,7 +54,7 @@
 		restApi = context.getServiceImpl(IRestApiService.class);
 		
 		networkGraph = new NetworkGraphImpl();
-		southboundNetworkGraph = new NetworkGraphDatastore(networkGraph);
+		//southboundNetworkGraph = new NetworkGraphDatastore(networkGraph);
 	}
 
 	@Override
@@ -68,8 +68,8 @@
 	}
 
 	@Override
-	public NetworkGraphDatastore getSouthboundNetworkGraph() {
-		return southboundNetworkGraph;
+	public NetworkGraphDiscoveryInterface getNetworkGraphDiscoveryInterface() {
+		return networkGraph;
 	}
 
 }