def __init__(self, broker=DEFAULT_FRONTEND, ping_delay=10., ping_retries=3, params=None, timeout=DEFAULT_TIMEOUT_MOVF, max_age=DEFAULT_MAX_AGE, max_age_delta=DEFAULT_MAX_AGE_DELTA): logger.debug('Initializing the agent.') self.debug = logger.isEnabledFor(logging.DEBUG) self.params = params self.pid = os.getpid() self.agent_id = '%s-%s' % (get_hostname(), self.pid) self.timeout = timeout self.max_age = max_age self.max_age_delta = max_age_delta self.env = os.environ.copy() self.running = False self._workers = {} self._max_id = defaultdict(int) # Let's ask the broker its options self.broker = broker client = Client(self.broker) # this will timeout in case the broker is unreachable result = client.ping() self.endpoints = result['endpoints'] # Setup the zmq sockets self.loop = ioloop.IOLoop() self.ctx = zmq.Context() # backend socket - used to receive work from the broker self._backend = self.ctx.socket(zmq.ROUTER) self._backend.identity = self.agent_id self._backend.connect(self.endpoints['backend']) # register socket - used to register into the broker self._reg = self.ctx.socket(zmq.PUSH) self._reg.connect(self.endpoints['register']) # hearbeat socket - used to check if the broker is alive heartbeat = self.endpoints.get('heartbeat') if heartbeat is not None: logger.info("Hearbeat activated") self.ping = Stethoscope(heartbeat, onbeatlost=self.lost, delay=ping_delay, retries=ping_retries, ctx=self.ctx, io_loop=self.loop, onregister=self.register) else: self.ping = None # Setup the zmq streams. self._backstream = zmqstream.ZMQStream(self._backend, self.loop) self._backstream.on_recv(self._handle_recv_back) self._check = ioloop.PeriodicCallback(self._check_proc, ping_delay * 1000, io_loop=self.loop)
def test_lost(self): beats = [] lost = [] loop = ioloop.IOLoop() def _hbreg(): beats.append('o') def _onregister(): beats.append('+') def _onbeat(): beats.append('.') def _onbeatlost(): lost.append('.') hb = Heartbeat('ipc:///tmp/stetho.ipc', interval=0.1, io_loop=loop, onregister=_hbreg) stetho = Stethoscope('ipc:///tmp/stetho.ipc', onbeat=_onbeat, onbeatlost=_onbeatlost, delay=0.1, io_loop=loop, onregister=_onregister, warmup_delay=0) # scenario def start(): hb.start() stetho.start() def stop_hb(): hb.stop() def stop_st(): stetho.stop() loop.stop() # that starts the heartbeat and the client loop.add_callback(start) # the hb stops after 500ms loop.add_timeout(time.time() + .5, stop_hb) # the st stops after 1 second, then the loop loop.add_timeout(time.time() + 1., stop_st) loop.start() self.assertTrue(len(beats) > 0) self.assertEqual(beats[:2], ['o', '+']) self.assertTrue(len(lost) > 0)
def test_lost(self): beats = [] lost = [] loop = ioloop.IOLoop() def _hbreg(): beats.append('o') def _onregister(): beats.append('+') def _onbeat(): beats.append('.') def _onbeatlost(): lost.append('.') hb = Heartbeat('ipc:///tmp/stetho.ipc', interval=0.1, io_loop=loop, onregister=_hbreg) stetho = Stethoscope('ipc:///tmp/stetho.ipc', onbeat=_onbeat, onbeatlost=_onbeatlost, delay=0.1, io_loop=loop, onregister=_onregister) # scenario def start(): hb.start() stetho.start() def stop_hb(): hb.stop() def stop_st(): stetho.stop() loop.stop() loop.add_callback(start) # the hb stops after 500ms cb = ioloop.DelayedCallback(stop_hb, 500, io_loop=loop) cb.start() # the st stops after 1 second, then the loop cb = ioloop.DelayedCallback(stop_st, 1500, io_loop=loop) cb.start() loop.start() self.assertTrue(len(beats) > 0) self.assertEqual(beats[:2], ['o', '+']) self.assertTrue(len(lost) > 3)
def test_working(self): loop = ioloop.IOLoop() beats = [] lost = [] def onbeat(): beats.append('.') def onbeatlost(): lost.append('.') hb = Heartbeat('ipc:///tmp/stetho.ipc', interval=0.1, io_loop=loop) stetho = Stethoscope('ipc:///tmp/stetho.ipc', onbeat=onbeat, onbeatlost=onbeatlost, delay=1., retries=5., io_loop=loop) def start(): hb.start() def start_2(): stetho.start() # it's ok to try to start it again stetho.start() # hb starts immediatly loop.add_callback(start) # stetho 0.2 seconds after cb = ioloop.DelayedCallback(start_2, 200, io_loop=loop) cb.start() def stop(): hb.stop() stetho.stop() loop.stop() # all stops after 1s cb = ioloop.DelayedCallback(stop, 1000, io_loop=loop) cb.start() # let's go loop.start() self.assertEqual(len(lost), 0, len(lost)) self.assertTrue(len(beats) > 2, len(beats))
def test_restart(self): # we want to make sure the Stethoscope can be restarted beats = [] lost = [] loop = ioloop.IOLoop() def _hbreg(): beats.append('o') def _onregister(): beats.append('+') def _onbeat(): beats.append('.') def _onbeatlost(): lost.append('.') hb = Heartbeat('ipc:///tmp/stetho.ipc', interval=0.1, io_loop=loop, onregister=_hbreg) stetho = Stethoscope('ipc:///tmp/stetho.ipc', onbeat=_onbeat, onbeatlost=_onbeatlost, delay=0.1, io_loop=loop, onregister=_onregister, warmup_delay=0) # scenario def start(): hb.start() stetho.start() def stop_st(): stetho.stop() def restart_st(): stetho.start() beats.append('RESTARTED') def stop(): stetho.stop() loop.stop() # that starts the heartbeat and the client loop.add_callback(start) # the st stops after 500ms loop.add_timeout(time.time() + .5, stop_st) # the st starts again after 500ms loop.add_timeout(time.time() + .5, restart_st) # the st stops after 1 second, then the loop loop.add_timeout(time.time() + 1., stop) loop.start() self.assertTrue(len(beats) > 0) self.assertTrue('RESTARTED' in beats) # make sure the st gets the beats after a restart rest = beats.index('RESTARTED') self.assertTrue('o+' in ''.join(beats[rest:]), beats)