def process_requests( consumer: RequestDBConsumer, processor: ResponseDBProcessor, router: RequestRouter, session_manager: SessionManager, fluentd_client: FluentdClient, ) -> Optional[requests.Response]: """ Process SAS requests """ with session_manager.session_scope() as session: requests_map = consumer.get_pending_requests(session) requests_type = next(iter(requests_map)) requests_list = requests_map[requests_type] if not requests_list: logger.debug(f"Received no {requests_type} requests.") return None no_of_requests = len(requests_list) logger.info( f'Processing {no_of_requests} {requests_type} requests', ) bulked_sas_requests = merge_requests(requests_map) _log_requests_map(requests_map, fluentd_client) try: sas_response = router.post_to_sas(bulked_sas_requests) logger.info( f"Sent {bulked_sas_requests} to SAS and got the following response: {sas_response.content}", ) except RequestRouterError as e: logging.error(f"Error posting request to SAS: {e}") return None logger.info(f"About to process responses {sas_response=}") processor.process_response(requests_list, sas_response, session) session.commit() return sas_response
def run(): """ Top-level function for radio controller """ logger.info("Starting grpc server") config = get_config() scheduler = BackgroundScheduler() metricsd_client = get_metricsd_client() scheduler.add_job( process_metrics, args=[metricsd_client, config.SERVICE_HOSTNAME, "radio_controller"], trigger=IntervalTrigger( seconds=config.METRICS_PROCESSING_INTERVAL_SEC, ), max_instances=1, name="metrics_processing_job", ) scheduler.start() logger.info(f"grpc port is: {config.GRPC_PORT}") db_engine = create_engine( url=config.SQLALCHEMY_DB_URI, encoding=config.SQLALCHEMY_DB_ENCODING, echo=config.SQLALCHEMY_ECHO, future=config.SQLALCHEMY_FUTURE, pool_size=config.SQLALCHEMY_ENGINE_POOL_SIZE, max_overflow=config.SQLALCHEMY_ENGINE_MAX_OVERFLOW, ) session_manager = SessionManager(db_engine) with session_manager.session_scope() as session: cbsd_states = { state.name: state.id for state in session.query(DBCbsdState).all() } request_types = { req_type.name: req_type.id for req_type in session.query(DBRequestType).all() } server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) add_RadioControllerServicer_to_server( RadioControllerService( session_manager=session_manager, cbsd_states_map=cbsd_states, request_types_map=request_types, ), server, ) add_ActiveModeControllerServicer_to_server( ActiveModeControllerService(session_manager=session_manager), server, ) server.add_insecure_port(f"[::]:{config.GRPC_PORT}") server.start() logger.info(f"GRPC Server started on port {config.GRPC_PORT}") def handle_sigterm(*_): logger.info("Received shutdown signal") all_rpcs_done_event = server.stop(30) all_rpcs_done_event.wait(30) logger.info("Shut down gracefully") signal(SIGTERM, handle_sigterm) server.wait_for_termination()