Example #1
0
class ThriftServer(object):
    """
    ThriftServer
    Register both RootScheduler and Host processors
    """
    def __init__(self, address, port,
                 hostHandler=None,
                 leafSchedulerHandler=None,
                 rootSchedulerHandler=None,
                 enable_ping=True):
        """
        :param address [str]: agent thrift server hostname
        :param port [int]: agent thrift server tcp port
        :param hostHandler [HostHandler]: HostHandler instance
        :param rootSchedulerHandler [RootSchedulerHandler]:
            RootSchedulerHandler instance
        :param enable_ping [bool]: Register AgentControl processor
        """
        self._address = address
        self._port = port
        self._hostHandler = hostHandler
        self._leafSchedulerHandler = leafSchedulerHandler
        self._rootSchedulerHandler = rootSchedulerHandler
        self._enable_ping = enable_ping

        if self._hostHandler is None and self._rootSchedulerHandler is None:
            raise Exception("Handlers not set.")

        self._server = None
        self._thread = None

        # setup logger
        self._logger = logging.getLogger(__name__)

    def _register_processer(self, service_name, mux_processor):
        """
        Registers processor
        """

        if service_name == "Host":
            _processor = Host.Processor(self._hostHandler)

        if service_name == "RootScheduler":
            _processor = RootScheduler.Processor(self._rootSchedulerHandler)

        if service_name == "AgentControl":
            _processor = AgentControl.Processor(AgentControlHandler())

        if service_name == "Scheduler":
            _processor = Scheduler.Processor(self._leafSchedulerHandler)

        mux_processor.registerProcessor(
            service_name,
            _processor,
            1,
            0)  # unbounded queue

    def start_server(self):
        """
        Registers the host and root scheduler processors and
        starts the thrift server.
        """
        mux_processor = TMultiplexedProcessor()

        if self._hostHandler:
            self._register_processer("Host", mux_processor)

        if self._leafSchedulerHandler:
            self._register_processer("Scheduler", mux_processor)

        if self._rootSchedulerHandler:
            self._register_processer(
                "RootScheduler", mux_processor)

        if self._enable_ping:
            self._register_processer(
                "AgentControl", mux_processor)

        transport = TSocket.TServerSocket(self._address, self._port)

        protocol_factory = TCompactProtocol.TCompactProtocolFactory()

        self._server = TNonblockingServer(
            mux_processor, transport, protocol_factory, protocol_factory)

        self._thread = threading.Thread(target=self._server.serve)
        self._thread.daemon = True
        self._thread.start()
        self._server_started = True

        self._logger.info(
            "[ThriftServer] Thrift server started. Address: {0} Port: {1}"
            .format(self._address, self._port))

    def stop_server(self):
        """
        Stop the thrift server
        """
        self._server.stop()

        while self._thread.isAlive():
            time.sleep(1)

        # release socket resource
        self._server.close()
Example #2
0
class ThriftServer(object):
    """
    ThriftServer
    Register both RootScheduler and Host processors
    """
    def __init__(self,
                 address,
                 port,
                 hostHandler=None,
                 leafSchedulerHandler=None,
                 rootSchedulerHandler=None,
                 enable_ping=True):
        """
        :param address [str]: agent thrift server hostname
        :param port [int]: agent thrift server tcp port
        :param hostHandler [HostHandler]: HostHandler instance
        :param rootSchedulerHandler [RootSchedulerHandler]:
            RootSchedulerHandler instance
        :param enable_ping [bool]: Register AgentControl processor
        """
        self._address = address
        self._port = port
        self._hostHandler = hostHandler
        self._leafSchedulerHandler = leafSchedulerHandler
        self._rootSchedulerHandler = rootSchedulerHandler
        self._enable_ping = enable_ping

        if self._hostHandler is None and self._rootSchedulerHandler is None:
            raise Exception("Handlers not set.")

        self._server = None
        self._thread = None

        # setup logger
        self._logger = logging.getLogger(__name__)

    def _register_processer(self, service_name, mux_processor):
        """
        Registers processor
        """

        if service_name == "Host":
            _processor = Host.Processor(self._hostHandler)

        if service_name == "RootScheduler":
            _processor = RootScheduler.Processor(self._rootSchedulerHandler)

        if service_name == "AgentControl":
            _processor = AgentControl.Processor(AgentControlHandler())

        if service_name == "Scheduler":
            _processor = Scheduler.Processor(self._leafSchedulerHandler)

        mux_processor.registerProcessor(service_name, _processor, 1,
                                        0)  # unbounded queue

    def start_server(self):
        """
        Registers the host and root scheduler processors and
        starts the thrift server.
        """
        mux_processor = TMultiplexedProcessor()

        if self._hostHandler:
            self._register_processer("Host", mux_processor)

        if self._leafSchedulerHandler:
            self._register_processer("Scheduler", mux_processor)

        if self._rootSchedulerHandler:
            self._register_processer("RootScheduler", mux_processor)

        if self._enable_ping:
            self._register_processer("AgentControl", mux_processor)

        transport = TSocket.TServerSocket(self._address, self._port)

        protocol_factory = TCompactProtocol.TCompactProtocolFactory()

        self._server = TNonblockingServer(mux_processor, transport,
                                          protocol_factory, protocol_factory)

        self._thread = threading.Thread(target=self._server.serve)
        self._thread.daemon = True
        self._thread.start()
        self._server_started = True

        self._logger.info(
            "[ThriftServer] Thrift server started. Address: {0} Port: {1}".
            format(self._address, self._port))

    def stop_server(self):
        """
        Stop the thrift server
        """
        self._server.stop()

        while self._thread.isAlive():
            time.sleep(1)

        # release socket resource
        self._server.close()