fbnet/command_runner/command_server.py (48 lines of code) (raw):
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright (c) Facebook, Inc. and its affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
from fbnet.command_runner_asyncio.CommandRunner.Command import Processor
from thrift.server.TAsyncioServer import ThriftServerProtocolFactory
from thrift.server.TServer import TServerEventHandler
from thrift.Thrift import TProcessorEventHandler
from .base_service import ServiceTask
from .command_handler import CommandHandler
from .options import Option
class CommandServer(ServiceTask):
"""
Command server for thrift commands.
"""
PORT = Option(
"-p", "--port", help="TCP port for FCR service", type=int, default=5000
)
def __init__(self, service, loop=None):
super().__init__(service, "CommandServer")
self._handler = None
self._server = None
self._backlog = 100
def _get_processor_class(self):
return Processor
async def run(self):
# Wait for FBNet to finish its run
await self.service.device_db.wait_for_data()
event_handler = self._create_thrift_event_handler()
thrift_handler = self._create_thrift_handler(event_handler)
self._handler = thrift_handler
processor = self._get_processor_class()(self._handler, loop=self.loop)
processor.setEventHandler(event_handler)
pfactory = ThriftServerProtocolFactory(
processor, self._create_server_event_handler(), loop=self.loop
)
self._server = await self.loop.create_server(
pfactory, port=self.PORT, backlog=self._backlog
)
self.logger.info("server started: %d ", self.PORT)
# Wait for the server to be closed. Typically this will never close.
await self._server.wait_closed()
self.logger.info("server done: %d", self.PORT)
self._server = None
def _create_thrift_handler(self, event_handler):
return CommandHandler(self.service)
def _create_server_event_handler(self):
return TServerEventHandler()
def _create_thrift_event_handler(self):
return TProcessorEventHandler()
async def cleanup(self):
# Let the handler cleanup any relevent state
self._handler.cleanup()
self.close()
def close(self):
# close the server port
if self._server:
self.logger.info("closing the server")
self._server.close()