X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fhosttracker_new%2Fimplementation%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fhosttracker%2Finternal%2FDeviceManagerImpl.java;h=0a6c2713dde0a2e6a0087f7d7c889e5d77668765;hp=0a70b72575dca0ca05bb0b599ed1ce88679e64e4;hb=baee86e2553be56ac224d0b6241e67150da72bbe;hpb=124579fbc8cc5cd149b216a285ac1ee9d3f99f6e diff --git a/opendaylight/hosttracker_new/implementation/src/main/java/org/opendaylight/controller/hosttracker/internal/DeviceManagerImpl.java b/opendaylight/hosttracker_new/implementation/src/main/java/org/opendaylight/controller/hosttracker/internal/DeviceManagerImpl.java index 0a70b72575..0a6c2713dd 100755 --- a/opendaylight/hosttracker_new/implementation/src/main/java/org/opendaylight/controller/hosttracker/internal/DeviceManagerImpl.java +++ b/opendaylight/hosttracker_new/implementation/src/main/java/org/opendaylight/controller/hosttracker/internal/DeviceManagerImpl.java @@ -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 java.net.UnknownHostException; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; @@ -70,9 +71,14 @@ import org.opendaylight.controller.hosttracker.IfIptoHost; import org.opendaylight.controller.hosttracker.IfNewHostNotify; import org.opendaylight.controller.hosttracker.SwitchPort; import org.opendaylight.controller.hosttracker.hostAware.HostNodeConnector; +import org.opendaylight.controller.sal.core.ConstructionException; import org.opendaylight.controller.sal.core.Edge; +import org.opendaylight.controller.sal.core.Host; +import org.opendaylight.controller.sal.core.Node; import org.opendaylight.controller.sal.core.NodeConnector; import org.opendaylight.controller.sal.core.NodeConnector.NodeConnectorIDType; +import org.opendaylight.controller.sal.core.Tier; +import org.opendaylight.controller.sal.core.UpdateType; import org.opendaylight.controller.sal.packet.ARP; import org.opendaylight.controller.sal.packet.Ethernet; import org.opendaylight.controller.sal.packet.IDataPacketService; @@ -80,11 +86,16 @@ import org.opendaylight.controller.sal.packet.IListenDataPacket; 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.packet.address.DataLinkAddress; +import org.opendaylight.controller.sal.packet.address.EthernetAddress; 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.NetUtils; 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; @@ -1179,6 +1190,7 @@ public class DeviceManagerImpl implements IDeviceService, IEntityClassListener, logger.info("Primary index {}", primaryIndex); ArrayList deleteQueue = null; LinkedList deviceUpdates = null; + Device oldDevice = null; Device device = null; // we may need to restart the learning process if we detect @@ -1334,7 +1346,7 @@ public class DeviceManagerImpl implements IDeviceService, IEntityClassListener, // modified this Device). if (!res) continue; - + oldDevice = device; device = newDevice; // update indices if (!updateIndices(device, deviceKey)) { @@ -1363,7 +1375,7 @@ public class DeviceManagerImpl implements IDeviceService, IEntityClassListener, 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, @@ -1457,6 +1469,45 @@ public class DeviceManagerImpl implements IDeviceService, IEntityClassListener, protected void notifyListeners(List listeners, DeviceUpdate update) { + // Topology update is for some reason outside of listeners registry + // logic + Entity[] ents = update.device.getEntities(); + Entity e = ents[ents.length-1]; + NodeConnector p = e.getPort(); + Node node = p.getNode(); + Host h = null; + try { + byte[] mac = NetUtils.longToByteArray6(e.getMacAddress()); + DataLinkAddress dla = new EthernetAddress( + mac); + e.getIpv4Address(); + InetAddress.getAllByName(e.getIpv4Address().toString()); + h = new org.opendaylight.controller.sal.core.Host(dla, + InetAddress.getByName(e.getIpv4Address().toString())); + } catch (ConstructionException ce) { + p = null; + h = null; + } catch (UnknownHostException ue){ + p = null; + h = null; + } + + if (topology != null && p != null && h != null) { + if (update.change.equals(DeviceUpdate.Change.ADD)) { + Tier tier = new Tier(1); + switchManager.setNodeProp(node, tier); + topology.updateHostLink(p, h, UpdateType.ADDED, null); + } else { + // No need to reset the tiering if no other hosts are currently + // connected + // If this switch was discovered to be an access switch, it + // still is even if the host is down + Tier tier = new Tier(0); + switchManager.setNodeProp(node, tier); + topology.updateHostLink(p, h, UpdateType.REMOVED, null); + } + } + if (listeners == null && newHostNotify.isEmpty()) { return; } @@ -1472,6 +1523,10 @@ public class DeviceManagerImpl implements IDeviceService, IEntityClassListener, case ADD: notify.notifyHTClient(update.device.toHostNodeConnector()); break; + case DELETE: + notify.notifyHTClientHostRemoved(update.device.toHostNodeConnector()); + break; + case CHANGE: } } @@ -1898,6 +1953,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 - @@ -2131,8 +2199,16 @@ public class DeviceManagerImpl implements IDeviceService, IEntityClassListener, @Override public Set getActiveStaticHosts() { - // TODO Auto-generated method stub - return null; + Collection devices = Collections + .unmodifiableCollection(deviceMap.values()); + Iterator i = devices.iterator(); + Set nc = new HashSet(); + while (i.hasNext()) { + Device device = i.next(); + if(device.isStaticHost()) + nc.add(device.toHostNodeConnector()); + } + return nc; } @Override @@ -2144,14 +2220,41 @@ public class DeviceManagerImpl implements IDeviceService, IEntityClassListener, @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) { - // 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 di = this.getDeviceIteratorForQuery(null, null, addr, null); + List 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); } /**