Exemplo n.º 1
0
    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)
Exemplo n.º 2
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,
                             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)
Exemplo n.º 3
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)
Exemplo n.º 4
0
    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))
Exemplo n.º 5
0
    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)