def __init__(self, host_tracker=False, pusher_stream="pox"): core.listen_to_dependencies(self) core.addListeners(self) self.initModel() self.stream = pusher_stream if host_tracker: # TODO: Don't seem to be getting host events at the moment? log.info("Host tracking enabled") host_tracker.addListenerByName( "HostEvent", self.__handle_host_tracker_HostEvent) self.stopSyncThread = Event() self.syncThread = TimerThread(self.stopSyncThread, self.sync, 15) self.syncThread.start()
def __init__ (self, host_tracker=False, pusher_stream="pox"): core.listen_to_dependencies(self) core.addListeners(self) self.initModel() self.stream = pusher_stream if host_tracker: # TODO: Don't seem to be getting host events at the moment? log.info("Host tracking enabled") host_tracker.addListenerByName("HostEvent", self.__handle_host_tracker_HostEvent) self.stopSyncThread = Event() self.syncThread = TimerThread(self.stopSyncThread, self.sync, 15) self.syncThread.start()
class NetworkTopo(object): def __init__(self, host_tracker=False, pusher_stream="pox"): core.listen_to_dependencies(self) core.addListeners(self) self.initModel() self.stream = pusher_stream if host_tracker: # TODO: Don't seem to be getting host events at the moment? log.info("Host tracking enabled") host_tracker.addListenerByName( "HostEvent", self.__handle_host_tracker_HostEvent) self.stopSyncThread = Event() self.syncThread = TimerThread(self.stopSyncThread, self.sync, 15) self.syncThread.start() def initModel(self): self.switches = set() self.links = set() self.hosts = {} # mac -> dpid self.host_switch_ports = {} # (h, s) -> port_no def sync(self): self.send_full() def send(self, data): pusher.send_message(data, self.stream) def send_full(self): out = [] out.append(reset_graph()) for s in self.switches: out.append(add_switch(s)) for e in self.links: out.append(add_link(e[0], e[2], e[1], e[3])) for h, s in self.hosts.iteritems(): out.append(add_host(h)) if s in self.switches: out.append(add_host_link(h, s)) self.send(SyncMessage(out)) def __handle_host_tracker_HostEvent(self, event): # Name is intentionally mangled to keep listen_to_dependencies away h = str(event.entry.macaddr) s = dpid_to_str(event.entry.dpid) if event.leave: if h in self.hosts: if s in self.switches: self.send(delete_host_link(h, s)) self.send(delete_host(h)) del self.hosts[h] else: if h not in self.hosts: self.hosts[h] = s self.send(add_host(h)) if s in self.switches: self.send(add_host_link(h, s)) else: log.warn("Missing switch") def _handle_GoingDownEvent(self, event): # Stop the sync thread self.stopSyncThread.set() pusher.send_message_immediate(ClearMessage(), self.stream) def _handle_openflow_ConnectionUp(self, event): s = dpid_to_str(event.dpid) if s not in self.switches: self.switches.add(s) self.send(add_switch(s)) def _handle_openflow_ConnectionDown(self, event): s = dpid_to_str(event.dpid) if s in self.switches: self.switches.remove(s) self.send(delete_switch(s)) # Reset network completely if no switches left if len(self.switches) == 0: self.initModel() self.sync() def _handle_openflow_discovery_LinkEvent(self, event): # Normalise link direction link = event.link.uni s1 = link.dpid1 s2 = link.dpid2 s1 = dpid_to_str(s1) s2 = dpid_to_str(s2) p1 = link.port1 p2 = link.port2 assert s1 in self.switches assert s2 in self.switches if event.added and (s1, s2, p1, p2) not in self.links: self.links.add((s1, s2, p1, p2)) self.send(add_link(s1, p1, s2, p2)) # Do we have abandoned hosts? for h, s in self.hosts.iteritems(): if s == s1: self.send(add_host_link(h, s1)) elif s == s2: self.send(add_host_link(h, s2)) elif event.removed and (s1, s2, p1, p2) in self.links: self.links.remove((s1, s2, p1, p2)) self.send(delete_link(s1, s2))
def __init__(self, cb, time, stream): TimerThread.__init__(self, Event(), cb, time) log.debug("Pusher is up, on stream %s" % stream) self.setDaemon(True) self.stream = stream
class NetworkTopo(object): def __init__ (self, host_tracker=False, pusher_stream="pox"): core.listen_to_dependencies(self) core.addListeners(self) self.initModel() self.stream = pusher_stream if host_tracker: # TODO: Don't seem to be getting host events at the moment? log.info("Host tracking enabled") host_tracker.addListenerByName("HostEvent", self.__handle_host_tracker_HostEvent) self.stopSyncThread = Event() self.syncThread = TimerThread(self.stopSyncThread, self.sync, 15) self.syncThread.start() def initModel(self): self.switches = set() self.links = set() self.hosts = {} # mac -> dpid self.host_switch_ports = {} # (h, s) -> port_no def sync(self): self.send_full() def send (self, data): pusher.send_message(data, self.stream) def send_full (self): out = [] out.append(reset_graph()) for s in self.switches: out.append(add_switch(s)) for e in self.links: out.append(add_link(e[0], e[2], e[1], e[3])) for h,s in self.hosts.iteritems(): out.append(add_host(h)) if s in self.switches: out.append(add_host_link(h,s)) self.send(SyncMessage(out)) def __handle_host_tracker_HostEvent (self, event): # Name is intentionally mangled to keep listen_to_dependencies away h = str(event.entry.macaddr) s = dpid_to_str(event.entry.dpid) if event.leave: if h in self.hosts: if s in self.switches: self.send(delete_host_link(h,s)) self.send(delete_host(h)) del self.hosts[h] else: if h not in self.hosts: self.hosts[h] = s self.send(add_host(h)) if s in self.switches: self.send(add_host_link(h, s)) else: log.warn("Missing switch") def _handle_GoingDownEvent(self, event): # Stop the sync thread self.stopSyncThread.set() pusher.send_message_immediate(ClearMessage(), self.stream) def _handle_openflow_ConnectionUp (self, event): s = dpid_to_str(event.dpid) if s not in self.switches: self.switches.add(s) self.send(add_switch(s)) def _handle_openflow_ConnectionDown (self, event): s = dpid_to_str(event.dpid) if s in self.switches: self.switches.remove(s) self.send(delete_switch(s)) # Reset network completely if no switches left if len(self.switches) == 0: self.initModel() self.sync() def _handle_openflow_discovery_LinkEvent (self, event): # Normalise link direction link = event.link.uni s1 = link.dpid1 s2 = link.dpid2 s1 = dpid_to_str(s1) s2 = dpid_to_str(s2) p1 = link.port1 p2 = link.port2 assert s1 in self.switches assert s2 in self.switches if event.added and (s1, s2, p1, p2) not in self.links: self.links.add((s1, s2, p1, p2)) self.send(add_link(s1, p1, s2, p2)) # Do we have abandoned hosts? for h,s in self.hosts.iteritems(): if s == s1: self.send(add_host_link(h, s1)) elif s == s2: self.send(add_host_link(h, s2)) elif event.removed and (s1, s2, p1, p2) in self.links: self.links.remove((s1, s2, p1, p2)) self.send(delete_link(s1, s2))