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))
示例#4
0
    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))
示例#6
0
    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