示例#1
0
    def __init__(self, args):
        super(DistributedRunner, self).__init__(args)
        self.ssh = args.get('ssh')
        self.run_id = None
        self._stopped_agents = 0
        self._nb_agents = args.get('agents')

        # socket where the results are published
        self.context = zmq.Context()
        self.sub = self.context.socket(zmq.SUB)
        self.sub.setsockopt(zmq.SUBSCRIBE, '')
        self.sub.set_hwm(8096 * 10)
        self.sub.setsockopt(zmq.LINGER, -1)
        self.zmq_publisher = None
        self.zstream = None

        # io loop
        self.loop = ioloop.IOLoop()

        self.zstream = zmqstream.ZMQStream(self.sub, self.loop)
        self.zstream.on_recv(self._recv_result)

        self.agents = []
        self._client = None
        self.refresh_rate = 100
示例#2
0
 def setUp(self):
     self.dbdir = tempfile.mkdtemp()
     loop = ioloop.IOLoop()
     broker = FakeBroker()
     dboptions = {'directory': self.dbdir}
     self.ctrl = BrokerController(broker, loop, dboptions=dboptions)
     self.old_exists = psutil.pid_exists
     psutil.pid_exists = lambda pid: True
示例#3
0
 def setUpClass(cls):
     if 'TRAVIS' in os.environ:
         return
     start_servers()
     cls.client = Client()
     cls.location = os.getcwd()
     cls.loop = ioloop.IOLoop()
     cls.dirs = []
     cls.db = BrokerDB(cls.loop, db='python')
示例#4
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)
示例#5
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)
示例#6
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))
示例#7
0
 def setUp(self):
     self.loop = ioloop.IOLoop()
     self.tmp = tempfile.mkdtemp()
     dboptions = {'directory': self.tmp}
     self.db = BrokerDB(self.loop, db='python',
                        dboptions=dboptions)
示例#8
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)
示例#9
0
 def setUp(self):
     self.loop = ioloop.IOLoop()
     self.db = RedisDB(self.loop)
     self._redis = redis.StrictRedis()
示例#10
0
    def __init__(self,
                 frontend=DEFAULT_FRONTEND,
                 backend=DEFAULT_BACKEND,
                 heartbeat=None,
                 register=DEFAULT_REG,
                 io_threads=DEFAULT_IOTHREADS,
                 agent_timeout=DEFAULT_AGENT_TIMEOUT,
                 receiver=DEFAULT_BROKER_RECEIVER,
                 publisher=DEFAULT_PUBLISHER,
                 db='python',
                 dboptions=None,
                 web_root=None):
        # before doing anything, we verify if a broker is already up and
        # running
        logger.debug('Verifying if there is a running broker')
        pid = verify_broker(frontend)
        if pid is not None:  # oops. can't do this !
            logger.debug('Ooops, we have a running broker on that socket')
            raise DuplicateBrokerError(pid)

        self.endpoints = {
            'frontend': frontend,
            'backend': backend,
            'register': register,
            'receiver': receiver,
            'publisher': publisher
        }

        if heartbeat is not None:
            self.endpoints['heartbeat'] = heartbeat

        logger.debug('Initializing the broker.')

        for endpoint in self.endpoints.values():
            if endpoint.startswith('ipc'):
                register_ipc_file(endpoint)

        self.context = zmq.Context(io_threads=io_threads)

        # setting up the sockets
        self._frontend = self.context.socket(zmq.ROUTER)
        self._frontend.identity = 'broker-' + frontend
        self._frontend.bind(frontend)
        self._backend = self.context.socket(zmq.ROUTER)
        self.pid = str(os.getpid())
        self._backend.identity = self.pid
        self._backend.bind(backend)
        self._registration = self.context.socket(zmq.PULL)
        self._registration.bind(register)
        self._receiver = self.context.socket(zmq.PULL)
        self._receiver.bind(receiver)
        self._publisher = self.context.socket(zmq.PUB)
        self._publisher.bind(publisher)

        # setting up the streams
        self.loop = ioloop.IOLoop()
        self._frontstream = zmqstream.ZMQStream(self._frontend, self.loop)
        self._frontstream.on_recv(self._handle_recv_front)
        self._backstream = zmqstream.ZMQStream(self._backend, self.loop)
        self._backstream.on_recv(self._handle_recv_back)
        self._regstream = zmqstream.ZMQStream(self._registration, self.loop)
        self._regstream.on_recv(self._handle_reg)
        self._rcvstream = zmqstream.ZMQStream(self._receiver, self.loop)
        self._rcvstream.on_recv(self._handle_recv)

        # heartbeat
        if heartbeat is not None:
            self.pong = Heartbeat(heartbeat,
                                  io_loop=self.loop,
                                  ctx=self.context,
                                  onregister=self._deregister)
        else:
            self.pong = None

        # status
        self.started = False
        self.poll_timeout = None

        # controller
        self.ctrl = BrokerController(self,
                                     self.loop,
                                     db=db,
                                     dboptions=dboptions,
                                     agent_timeout=agent_timeout)

        self.web_root = web_root