Integrate port up/down events with discovery

Change-Id: I7826f0a8fc285485fe62187319a3b33d6adf492b
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 d2c10fc..a1d09df 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/RCNetworkGraphPublisher.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/RCNetworkGraphPublisher.java
@@ -194,14 +194,15 @@
 
 	@Override
 	public void switchPortAdded(Long switchId, OFPhysicalPort port) {
-		// TODO Auto-generated method stub
-
+		PortEvent portEvent = new PortEvent(switchId, (long)port.getPortNumber());
+		networkGraphDiscoveryInterface.putPortEvent(portEvent);
+		linkDiscovery.RemoveFromSuppressLLDPs(switchId, port.getPortNumber());
 	}
 
 	@Override
 	public void switchPortRemoved(Long switchId, OFPhysicalPort port) {
-		// TODO Auto-generated method stub
-
+		PortEvent portEvent = new PortEvent(switchId, (long)port.getPortNumber());
+		networkGraphDiscoveryInterface.removePortEvent(portEvent);
 	}
 
 	@Override
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/LinkImpl.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/LinkImpl.java
index 31461a5..c8954a9 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/LinkImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/LinkImpl.java
@@ -32,12 +32,12 @@
 
 	protected void setToPorts() {
 		((PortImpl)srcPort).setOutgoingLink(this);
-		((PortImpl)srcPort).setIncomingLink(this);
+		((PortImpl)dstPort).setIncomingLink(this);
 	}
 
 	protected void unsetFromPorts() {
 		((PortImpl)srcPort).setOutgoingLink(null);
-		((PortImpl)srcPort).setIncomingLink(null);
+		((PortImpl)dstPort).setIncomingLink(null);
 	}
 
 	@Override
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphDatastore.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphDatastore.java
index c8f4d8d..9fd7f86 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphDatastore.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphDatastore.java
@@ -119,47 +119,47 @@
 
 	public void addPort(PortEvent port) {
 		log.debug("Adding port {}", port);
-//		RCSwitch rcSwitch = new RCSwitch(sw.getDpid());
-//
-//		try {
-//			rcSwitch.read();
-//		} catch (ObjectDoesntExistException e) {
-//			log.warn("Add port failed because switch {} doesn't exist", sw.getDpid(), e);
-//			return;
-//		}
-//
-//		RCPort rcPort = new RCPort(port.getSwitch().getDpid(), (long)port.getNumber());
-//		rcPort.setStatus(RCPort.STATUS.ACTIVE);
-//		// TODO add description into RCPort
-//		//rcPort.setDescription(port.getDescription());
-//		rcSwitch.addPortId(rcPort.getId());
-//
-//		writeObject(rcPort);
-//		writeObject(rcSwitch);
+		//RCSwitch rcSwitch = new RCSwitch(sw.getDpid());
+
+		//try {
+			//rcSwitch.read();
+		//} catch (ObjectDoesntExistException e) {
+			//log.warn("Add port failed because switch {} doesn't exist", sw.getDpid(), e);
+			//return;
+		//}
+
+		RCPort rcPort = new RCPort(port.getDpid(), port.getNumber());
+		rcPort.setStatus(RCPort.STATUS.ACTIVE);
+		// TODO add description into RCPort
+		//rcPort.setDescription(port.getDescription());
+		//rcSwitch.addPortId(rcPort.getId());
+
+		writeObject(rcPort);
+		//writeObject(rcSwitch);
 	}
 
 	public void deactivatePort(PortEvent port) {
 		log.debug("Deactivating port {}", port);
-//		RCPort rcPort = new RCPort(port.getSwitch().getDpid(), (long)port.getNumber());
-//
-//		for (int i = 0; i < NUM_RETRIES; i++) {
-//			try {
-//				rcPort.read();
-//			} catch (ObjectDoesntExistException e) {
-//				// oh well, we were deactivating anyway
-//				log.warn("Trying to deactivate a port that doesn't exist: {}", port);
-//				return;
-//			}
-//
-//			rcPort.setStatus(RCPort.STATUS.INACTIVE);
-//
-//			try {
-//				rcPort.update();
-//				break;
-//			} catch (ObjectDoesntExistException | WrongVersionException e) {
-//				// retry
-//			}
-//		}
+		RCPort rcPort = new RCPort(port.getDpid(), port.getNumber());
+
+		for (int i = 0; i < NUM_RETRIES; i++) {
+			try {
+				rcPort.read();
+			} catch (ObjectDoesntExistException e) {
+				// oh well, we were deactivating anyway
+				log.warn("Trying to deactivate a port that doesn't exist: {}", port);
+				return;
+			}
+
+			rcPort.setStatus(RCPort.STATUS.INACTIVE);
+
+			try {
+				rcPort.update();
+				break;
+			} catch (ObjectDoesntExistException | WrongVersionException e) {
+				// retry
+			}
+		}
 	}
 
 	public void addLink(LinkEvent linkEvent) {
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 b821050..1c342e0 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
@@ -85,14 +85,20 @@
 
 	@Override
 	public void putPortEvent(PortEvent portEvent) {
-		// TODO Auto-generated method stub
-
+		if (prepareForAddPortEvent(portEvent)) {
+			datastore.addPort(portEvent);
+			putPort(portEvent);
+			// TODO send out notification
+		}
 	}
 
 	@Override
 	public void removePortEvent(PortEvent portEvent) {
-		// TODO Auto-generated method stub
-
+		if (prepareForRemovePortEvent(portEvent)) {
+			datastore.deactivatePort(portEvent);
+			removePort(portEvent);
+			// TODO send out notification
+		}
 	}
 
 	@Override
@@ -223,7 +229,7 @@
 	    }
 	    // Src/Dst Port must exist
 	    Port srcPort = srcSw.getPort(linkEvt.getSrc().number);
-	    Port dstPort = srcSw.getPort(linkEvt.getDst().number);
+	    Port dstPort = dstSw.getPort(linkEvt.getDst().number);
 	    if ( srcPort == null || dstPort == null ) {
 		return false;
 	    }
@@ -250,14 +256,25 @@
 	    Switch srcSw = getSwitch(linkEvt.getSrc().dpid);
 	    Switch dstSw = getSwitch(linkEvt.getDst().dpid);
 	    if ( srcSw == null || dstSw == null ) {
+	    log.warn("Rejecting addLink {} because switch doesn't exist", linkEvt);
 		return false;
 	    }
 	    // Src/Dst Port must exist
 	    Port srcPort = srcSw.getPort(linkEvt.getSrc().number);
 	    Port dstPort = srcSw.getPort(linkEvt.getDst().number);
 	    if ( srcPort == null || dstPort == null ) {
+	    log.warn("Rejecting addLink {} because port doesn't exist", linkEvt);
 		return false;
 	    }
+	    
+	    Link link = srcPort.getOutgoingLink();
+	    
+	    if (link == null || 
+	    		!link.getDestinationPortNumber().equals(linkEvt.getDst().number)
+	    		|| !link.getDestinationSwitchDpid().equals(linkEvt.getDst().dpid)) {
+	    log.warn("Rejecting removeLink {} because link doesn't exist", linkEvt);
+	  	return false;
+	    }
 
 	    // Prep: None
 	    return true;