Beispiel #1
0
 def start(self, address):
     LOG.debug('TopologyWatcher: start')
     self.address = address
     self.tc = TopologyClient(address)
     self.is_active = True
     self.threads.append(gevent.spawn(self._polling_loop))
Beispiel #2
0
 def start(self, address):
     LOG.debug('TopologyWatcher: start')
     self.address = address
     self.tc = TopologyClient(address)
     self.is_active = True
     self.threads.append(gevent.spawn(self._polling_loop))
Beispiel #3
0
class TopologyWatcher(object):
    _LOOP_WAIT = 3
    _REST_RETRY_WAIT = 10

    def __init__(self, update_handler=None, rest_error_handler=None):
        self.update_handler = update_handler
        self.rest_error_handler = rest_error_handler
        self.address = None
        self.tc = None

        self.threads = []
        self.topo = Topology()
        self.prev_switches_json = ''
        self.prev_links_json = ''

    def start(self, address):
        LOG.debug('TopologyWatcher: start')
        self.address = address
        self.tc = TopologyClient(address)
        self.is_active = True
        self.threads.append(gevent.spawn(self._polling_loop))

    def stop(self):
        LOG.debug('TopologyWatcher: stop')
        self.is_active = False

    def _polling_loop(self):
        LOG.debug('TopologyWatcher: Enter polling loop')
        while self.is_active:
            try:
                switches_json = self.tc.list_switches().read()
                links_json = self.tc.list_links().read()
            except (SocketError, HTTPException) as e:
                LOG.debug('TopologyWatcher: REST API(%s) is not avaliable.' %
                          self.address)
                LOG.debug('        wait %d secs...' %
                          self._REST_RETRY_WAIT)
                self._call_rest_error_handler(e)
                gevent.sleep(self._REST_RETRY_WAIT)
                continue

            if self._is_updated(switches_json, links_json):
                LOG.debug('TopologyWatcher: topology updated')
                new_topo = Topology(switches_json, links_json)
                delta = new_topo - self.topo
                self.topo = new_topo

                self._call_update_handler(delta)

            gevent.sleep(self._LOOP_WAIT)

    def _is_updated(self, switches_json, links_json):
        updated = (
            self.prev_switches_json != switches_json or
            self.prev_links_json != links_json)

        self.prev_switches_json = switches_json
        self.prev_links_json = links_json

        return updated

    def _call_rest_error_handler(self, e):
        if self.rest_error_handler:
            self.rest_error_handler(self.address, e)

    def _call_update_handler(self, delta):
        if self.update_handler:
            self.update_handler(self.address, delta)
Beispiel #4
0
class TopologyWatcher(object):
    _LOOP_WAIT = 3
    _REST_RETRY_WAIT = 10

    def __init__(self, update_handler=None, rest_error_handler=None):
        self.update_handler = update_handler
        self.rest_error_handler = rest_error_handler
        self.address = None
        self.tc = None

        self.threads = []
        self.topo = Topology()
        self.prev_switches_json = ''
        self.prev_links_json = ''

    def start(self, address):
        LOG.debug('TopologyWatcher: start')
        self.address = address
        self.tc = TopologyClient(address)
        self.is_active = True
        self.threads.append(gevent.spawn(self._polling_loop))

    def stop(self):
        LOG.debug('TopologyWatcher: stop')
        self.is_active = False

    def _polling_loop(self):
        LOG.debug('TopologyWatcher: Enter polling loop')
        while self.is_active:
            try:
                switches_json = self.tc.list_switches().read()
                links_json = self.tc.list_links().read()
            except (SocketError, HTTPException) as e:
                LOG.debug('TopologyWatcher: REST API(%s) is not avaliable.' %
                          self.address)
                LOG.debug('        wait %d secs...' % self._REST_RETRY_WAIT)
                self._call_rest_error_handler(e)
                gevent.sleep(self._REST_RETRY_WAIT)
                continue

            if self._is_updated(switches_json, links_json):
                LOG.debug('TopologyWatcher: topology updated')
                new_topo = Topology(switches_json, links_json)
                delta = new_topo - self.topo
                self.topo = new_topo

                self._call_update_handler(delta)

            gevent.sleep(self._LOOP_WAIT)

    def _is_updated(self, switches_json, links_json):
        updated = (self.prev_switches_json != switches_json
                   or self.prev_links_json != links_json)

        self.prev_switches_json = switches_json
        self.prev_links_json = links_json

        return updated

    def _call_rest_error_handler(self, e):
        if self.rest_error_handler:
            self.rest_error_handler(self.address, e)

    def _call_update_handler(self, delta):
        if self.update_handler:
            self.update_handler(self.address, delta)