HostTracker StaticHost changes 01/501/1
authorKalvin Hom <kahom@cisco.com>
Wed, 19 Jun 2013 00:08:53 +0000 (17:08 -0700)
committerKalvin Hom <kahom@cisco.com>
Wed, 19 Jun 2013 00:08:53 +0000 (17:08 -0700)
Added "staticHost" attribute for Device
so ported HostTracker can distinguish
between dynamically discovered hosts
and static hosts given through the API.

Implemented the add/remove/get static host
methods.

Change-Id: I1374b6c40919c6f31b48c8191bf2021620a9509d
Signed-off-by: Kalvin Hom <kahom@cisco.com>
opendaylight/hosttracker_new/api/src/main/java/org/opendaylight/controller/hosttracker/IDevice.java
opendaylight/hosttracker_new/implementation/src/main/java/org/opendaylight/controller/hosttracker/internal/Device.java
opendaylight/hosttracker_new/implementation/src/main/java/org/opendaylight/controller/hosttracker/internal/DeviceManagerImpl.java

index b2ba643a0cdd7eb4674dabb509afeb7450d11238..8c9367e25a180d2c771a488aebaa13b243d3852e 100644 (file)
@@ -134,6 +134,10 @@ public interface IDevice {
      */
     public IEntityClass getEntityClass();
 
      */
     public IEntityClass getEntityClass();
 
+    public boolean isStaticHost();
+
+    public void setStaticHost(boolean isStatic);
+
     public HostNodeConnector toHostNodeConnector();
 
 }
     public HostNodeConnector toHostNodeConnector();
 
 }
index a97cb273837257a23a34460696de49cf29942241..fb81cddc964c3887ad30ee030f8600140faea922 100755 (executable)
@@ -78,6 +78,8 @@ public class Device implements IDevice {
     protected final Short[] vlanIds;
     protected volatile String dhcpClientName;
 
     protected final Short[] vlanIds;
     protected volatile String dhcpClientName;
 
+    private boolean staticHost;
+
     /**
      * These are the old attachment points for the device that were valid no
      * more than INACTIVITY_TIME ago.
     /**
      * These are the old attachment points for the device that were valid no
      * more than INACTIVITY_TIME ago.
@@ -793,6 +795,7 @@ public class Device implements IDevice {
             byte[] macAddr = macLongToByte(this.getMACAddress());
             HostNodeConnector nc = new HostNodeConnector(macAddr, ip, n,
                     (short) 0);
             byte[] macAddr = macLongToByte(this.getMACAddress());
             HostNodeConnector nc = new HostNodeConnector(macAddr, ip, n,
                     (short) 0);
+            nc.setStaticHost(this.isStaticHost());
             return nc;
         } catch (Exception e) {
             return null;
             return nc;
         } catch (Exception e) {
             return null;
@@ -807,6 +810,14 @@ public class Device implements IDevice {
         return macAddr;
     }
 
         return macAddr;
     }
 
+    public boolean isStaticHost(){
+        return this.staticHost;
+    }
+
+    public void setStaticHost(boolean isStatic){
+        this.staticHost = isStatic;
+    }
+
     @Override
     public String toString() {
         StringBuilder builder = new StringBuilder();
     @Override
     public String toString() {
         StringBuilder builder = new StringBuilder();
index 0a70b72575dca0ca05bb0b599ed1ce88679e64e4..faf9416934f897dd77bafda31ea565d4c75742e7 100755 (executable)
@@ -38,6 +38,7 @@ import static org.opendaylight.controller.hosttracker.internal.DeviceManagerImpl
 import static org.opendaylight.controller.hosttracker.internal.DeviceManagerImpl.DeviceUpdate.Change.DELETE;
 
 import java.net.InetAddress;
 import static org.opendaylight.controller.hosttracker.internal.DeviceManagerImpl.DeviceUpdate.Change.DELETE;
 
 import java.net.InetAddress;
+import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Collection;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Collection;
@@ -81,10 +82,12 @@ import org.opendaylight.controller.sal.packet.Packet;
 import org.opendaylight.controller.sal.packet.PacketResult;
 import org.opendaylight.controller.sal.packet.RawPacket;
 import org.opendaylight.controller.sal.topology.TopoEdgeUpdate;
 import org.opendaylight.controller.sal.packet.PacketResult;
 import org.opendaylight.controller.sal.packet.RawPacket;
 import org.opendaylight.controller.sal.topology.TopoEdgeUpdate;
+import org.opendaylight.controller.sal.utils.HexEncode;
 import org.opendaylight.controller.sal.utils.ListenerDispatcher;
 import org.opendaylight.controller.sal.utils.MultiIterator;
 import org.opendaylight.controller.sal.utils.SingletonTask;
 import org.opendaylight.controller.sal.utils.Status;
 import org.opendaylight.controller.sal.utils.ListenerDispatcher;
 import org.opendaylight.controller.sal.utils.MultiIterator;
 import org.opendaylight.controller.sal.utils.SingletonTask;
 import org.opendaylight.controller.sal.utils.Status;
+import org.opendaylight.controller.sal.utils.StatusCode;
 import org.opendaylight.controller.switchmanager.ISwitchManager;
 import org.opendaylight.controller.topologymanager.ITopologyManager;
 import org.opendaylight.controller.topologymanager.ITopologyManagerAware;
 import org.opendaylight.controller.switchmanager.ISwitchManager;
 import org.opendaylight.controller.topologymanager.ITopologyManager;
 import org.opendaylight.controller.topologymanager.ITopologyManagerAware;
@@ -1179,6 +1182,7 @@ public class DeviceManagerImpl implements IDeviceService, IEntityClassListener,
         logger.info("Primary index {}", primaryIndex);
         ArrayList<Long> deleteQueue = null;
         LinkedList<DeviceUpdate> deviceUpdates = null;
         logger.info("Primary index {}", primaryIndex);
         ArrayList<Long> deleteQueue = null;
         LinkedList<DeviceUpdate> deviceUpdates = null;
+        Device oldDevice = null;
         Device device = null;
 
         // we may need to restart the learning process if we detect
         Device device = null;
 
         // we may need to restart the learning process if we detect
@@ -1334,7 +1338,7 @@ public class DeviceManagerImpl implements IDeviceService, IEntityClassListener,
                 // modified this Device).
                 if (!res)
                     continue;
                 // modified this Device).
                 if (!res)
                     continue;
-
+                oldDevice = device;
                 device = newDevice;
                 // update indices
                 if (!updateIndices(device, deviceKey)) {
                 device = newDevice;
                 // update indices
                 if (!updateIndices(device, deviceKey)) {
@@ -1363,7 +1367,7 @@ public class DeviceManagerImpl implements IDeviceService, IEntityClassListener,
                 if (moved) {
                     // we count device moved events in
                     // sendDeviceMovedNotification()
                 if (moved) {
                     // we count device moved events in
                     // sendDeviceMovedNotification()
-                    sendDeviceMovedNotification(device);
+                    sendDeviceMovedNotification(device, oldDevice);
                     if (logger.isTraceEnabled()) {
                         logger.trace("Device moved: attachment points {},"
                                 + "entities {}", device.attachmentPoints,
                     if (logger.isTraceEnabled()) {
                         logger.trace("Device moved: attachment points {},"
                                 + "entities {}", device.attachmentPoints,
@@ -1472,6 +1476,10 @@ public class DeviceManagerImpl implements IDeviceService, IEntityClassListener,
             case ADD:
                 notify.notifyHTClient(update.device.toHostNodeConnector());
                 break;
             case ADD:
                 notify.notifyHTClient(update.device.toHostNodeConnector());
                 break;
+            case DELETE:
+                notify.notifyHTClientHostRemoved(update.device.toHostNodeConnector());
+                break;
+            case CHANGE:
             }
         }
 
             }
         }
 
@@ -1898,6 +1906,19 @@ public class DeviceManagerImpl implements IDeviceService, IEntityClassListener,
             }
         }
     }
             }
         }
     }
+    /**
+     * Send update notifications to listeners.
+     * IfNewHostNotify listeners need to remove old device and add new device.
+     * @param device
+     * @param oldDevice
+     */
+    protected void sendDeviceMovedNotification(Device device, Device oldDevice){
+        for (IfNewHostNotify notify : newHostNotify){
+                notify.notifyHTClientHostRemoved(oldDevice.toHostNodeConnector());
+                notify.notifyHTClient(device.toHostNodeConnector());
+            }
+        sendDeviceMovedNotification(device);
+        }
 
     /**
      * this method will reclassify and reconcile a device - possibilities are -
 
     /**
      * this method will reclassify and reconcile a device - possibilities are -
@@ -2131,8 +2152,16 @@ public class DeviceManagerImpl implements IDeviceService, IEntityClassListener,
 
     @Override
     public Set<HostNodeConnector> getActiveStaticHosts() {
 
     @Override
     public Set<HostNodeConnector> getActiveStaticHosts() {
-        // TODO Auto-generated method stub
-        return null;
+        Collection<Device> devices = Collections
+                .unmodifiableCollection(deviceMap.values());
+        Iterator<Device> i = devices.iterator();
+        Set<HostNodeConnector> nc = new HashSet<HostNodeConnector>();
+        while (i.hasNext()) {
+            Device device = i.next();
+            if(device.isStaticHost())
+                nc.add(device.toHostNodeConnector());
+        }
+        return nc;
     }
 
     @Override
     }
 
     @Override
@@ -2144,14 +2173,41 @@ public class DeviceManagerImpl implements IDeviceService, IEntityClassListener,
     @Override
     public Status addStaticHost(String networkAddress, String dataLayerAddress,
             NodeConnector nc, String vlan) {
     @Override
     public Status addStaticHost(String networkAddress, String dataLayerAddress,
             NodeConnector nc, String vlan) {
-        // TODO Auto-generated method stub
-        return null;
+        Long mac = HexEncode.stringToLong(dataLayerAddress);
+        try{
+            InetAddress addr = InetAddress.getByName(networkAddress);
+            int ip = toIPv4Address(addr.getAddress());
+            Entity e = new Entity(mac, Short.valueOf(vlan), ip, nc, new Date());
+            Device d = this.learnDeviceByEntity(e);
+            d.setStaticHost(true);
+            return new Status(StatusCode.SUCCESS);
+        }catch(UnknownHostException e){
+            return new Status(StatusCode.INTERNALERROR);
+        }
     }
 
     @Override
     public Status removeStaticHost(String networkAddress) {
     }
 
     @Override
     public Status removeStaticHost(String networkAddress) {
-        // TODO Auto-generated method stub
-        return null;
+        Integer addr;
+        try {
+            addr = toIPv4Address(InetAddress.getByName(networkAddress).getAddress());
+        } catch (UnknownHostException e) {
+            return new Status(StatusCode.NOTFOUND, "Host does not exist");
+        }
+        Iterator<Device> di = this.getDeviceIteratorForQuery(null, null, addr, null);
+        List<IDeviceListener> listeners = deviceListeners
+                .getOrderedListeners();
+        while(di.hasNext()){
+            Device d = di.next();
+            if(d.isStaticHost()){
+                deleteDevice(d);
+                for (IfNewHostNotify notify : newHostNotify)
+                    notify.notifyHTClientHostRemoved(d.toHostNodeConnector());
+                for (IDeviceListener listener : listeners)
+                        listener.deviceRemoved(d);
+            }
+        }
+        return new Status(StatusCode.SUCCESS);
     }
 
     /**
     }
 
     /**