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))
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)
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)