Esempio n. 1
0
    def __init__(self, runtime, port=5556):
        from rill.runtime.handlers.runtime import RuntimeHandler

        self.runtime = runtime

        self.port = port
        # Context wrapper
        self.ctx = zmq.Context()
        # IOLoop reactor
        self.loop = IOLoop.instance()

        if not isinstance(self.loop, IOLoop):
            raise TypeError("Expected %s, got %s" % (IOLoop, type(self.loop)))

        # Set up our client server sockets

        # Publish updates to clients
        self.publisher = self.ctx.socket(zmq.PUB)
        # Collect updates and snapshot requests from clients, and send back
        # errors
        self.collector = self.ctx.socket(zmq.ROUTER)

        self.collector.bind("tcp://*:%d" % (self.port))
        self.publisher.bind("tcp://*:%d" % (self.port + 1))

        # Wrap sockets in ZMQStreams for IOLoop handlers
        self.publisher = zmqstream.ZMQStream(
            self.publisher)  # only necessary for heartbeat
        self.collector = zmqstream.ZMQStream(self.collector)

        # Register handlers with reactor
        self.collector.on_recv(self.handle_message)

        self.dispatcher = MessageDispatcher(self.publisher, self.collector)
        self.handler = RuntimeHandler(self.dispatcher, runtime)
Esempio n. 2
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
Esempio n. 3
0
    def _attach_publisher(self):
        zmq_publisher = self.args.get('zmq_publisher')

        if zmq_publisher in (None, DEFAULT_PUBLISHER):
            # if this option is not provided by the command line,
            # we ask the broker about it
            res = self.client.ping()
            endpoint = res['endpoints']['publisher']
            if endpoint.startswith('ipc'):
                # IPC - lets hope we're on the same box
                zmq_publisher = endpoint
            elif endpoint.startswith('tcp'):
                # TCP, let's see what IP & port we have
                splitted = split_endpoint(endpoint)
                if splitted['ip'] == '0.0.0.0':
                    # let's use the broker ip
                    broker = self.args['broker']
                    broker_ip = split_endpoint(broker)['ip']
                    zmq_publisher = 'tcp://%s:%d' % (broker_ip,
                                                     splitted['port'])
                else:
                    # let's use the original ip
                    zmq_publisher = endpoint
            else:
                zmq_publisher = DEFAULT_PUBLISHER

        self.sub.connect(zmq_publisher)
        self.zstream = zmqstream.ZMQStream(self.sub, self.loop)
        self.zstream.on_recv(self._recv_result)
        self.zmq_publisher = zmq_publisher
Esempio n. 4
0
 def _initialize(self):
     logger.debug('Subscribing to ' + self.endpoint)
     self._endpoint = self.context.socket(zmq.SUB)
     self._endpoint.setsockopt(zmq.SUBSCRIBE, '')
     self._endpoint.linger = 0
     #self._endpoint.identity = str(os.getpid())
     self._endpoint.connect(self.endpoint)
     self._stream = zmqstream.ZMQStream(self._endpoint, self.loop)
     self._stream.on_recv(self._handle_recv)
     self._timer = ioloop.PeriodicCallback(self._delayed,
                                           self.delay * 1000,
                                           io_loop=self.loop)
Esempio n. 5
0
 def _init_stream(self):
     self.stream = zmqstream.ZMQStream(self.ctrl_socket, self.loop)
     self.stream.on_recv(self.handle_message)
Esempio n. 6
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