def __init__(self, logger, config): """ :param config: a salt client_config instance """ self._log = logger.getChild("salt") self._silence_counter = 0 self._config = config self._master_event = MasterEvent(self._config['sock_dir'])
def __init__(self, logger, config): """ :param config: a salt client_config instance """ # getChild isn't in 2.6 self._log = logging.getLogger('.'.join((logger.name, 'salt'))) self._silence_counter = 0 self._config = config self._master_event = MasterEvent(self._config['sock_dir'])
def get_event(self, *args, **kwargs): """ Wrap MasterEvent.get_event """ ev = self._master_event.get_event(self.POLL_TIMEOUT, *args, **kwargs) if ev is None: self._silence_counter += self.POLL_TIMEOUT if self._silence_counter > self.SILENCE_TIMEOUT: self._log.warning("Re-opening connection to salt-master") self._silence_counter = 0 # Re-open the connection as a precaution against this lack of # messages being a symptom of a connection that has gone bad. old_ev = self._master_event gevent.spawn(lambda: self._destroy_conn(old_ev)) self._master_event = MasterEvent(self._config['sock_dir']) else: self._silence_counter = 0 return ev
class SaltEventSource(object): """ A wrapper around salt's MasterEvent class that closes and re-opens the connection if it goes quiet for too long, to ward off mysterious silent-death of communications (#8144) """ # Not a logical timeout, just how long we stick inside a get_event call POLL_TIMEOUT = 5 # After this long without messages, close and reopen out connection to # salt-master. Don't want to do this gratuitously because it can drop # messages during the cutover (lossiness is functionally OK but user # might notice). SILENCE_TIMEOUT = 20 def __init__(self, logger, config): """ :param config: a salt client_config instance """ # getChild isn't in 2.6 self._log = logging.getLogger('.'.join((logger.name, 'salt'))) self._silence_counter = 0 self._config = config self._master_event = MasterEvent(self._config['sock_dir']) def _destroy_conn(self, old_ev): old_ev.destroy() def get_event(self, *args, **kwargs): """ Wrap MasterEvent.get_event """ ev = self._master_event.get_event(self.POLL_TIMEOUT, *args, **kwargs) if ev is None: self._silence_counter += self.POLL_TIMEOUT if self._silence_counter > self.SILENCE_TIMEOUT: self._log.warning("Re-opening connection to salt-master") self._silence_counter = 0 # Re-open the connection as a precaution against this lack of # messages being a symptom of a connection that has gone bad. old_ev = self._master_event gevent.spawn(lambda: self._destroy_conn(old_ev)) self._master_event = MasterEvent(self._config['sock_dir']) else: self._silence_counter = 0 return ev
class EventListener(threading.Thread): """ Background thread that listens for salt events and replays them as steward events """ def __init__(self, settings): super(EventListener, self).__init__() salt_conf = settings.get('salt.master_config', '/etc/salt/master') salt_opts = salt_config.master_config(salt_conf) self.daemon = True self.event = MasterEvent(salt_opts['sock_dir']) def run(self): while True: data = self.event.get_event() if data and 'tag' in data: name = 'salt/' + data['tag'] if 'tok' in data: del data['tok'] pub.delay(name, data)
def __init__(self, settings): super(EventListener, self).__init__() salt_conf = settings.get('salt.master_config', '/etc/salt/master') salt_opts = salt_config.master_config(salt_conf) self.daemon = True self.event = MasterEvent(salt_opts['sock_dir'])