diff --git a/webservice/webservice.py b/webservice/webservice.py index 8375f31c4960566f647113a7a8f3eb20de1ce742..de19d5a2545ce55ef540d4cb016e908e3c0fefd8 100644 --- a/webservice/webservice.py +++ b/webservice/webservice.py @@ -49,25 +49,31 @@ async def init_job_db(config): return conn -async def init_md_client(config): - """ Initialize an MDC client connection +async def init_md_client(config: Dict[str, Dict[str, str]]) -> MetadataClient: + """Initialize an MDC client connection. :param config: the configuration parsed from the webservice YAML config :return: an MDC client connection """ - # FIXME: this blocks the even loop, should use asyncio.Task - # FIXME: calls to this coro should be shielded # TODO: could the client be a global? This would recuce passing it around - mdconf = config['metadata-client'] - client_conn = MetadataClient(client_id=mdconf['user-id'], - client_secret=mdconf['user-secret'], - user_email=mdconf['user-email'], - token_url=mdconf['token-url'], - refresh_url=mdconf['refresh-url'], - auth_url=mdconf['auth-url'], - scope=mdconf['scope'], - base_api_url=mdconf['base-api-url']) - return client_conn + + # During MetadataClient initialisation, this object requests authentication from MyMDC + # As such, it is needed to run the initialisation in a thread. + def _init_client(): + mdconf = config['metadata-client'] + client_conn = MetadataClient(client_id=mdconf['user-id'], + client_secret=mdconf['user-secret'], + user_email=mdconf['user-email'], + token_url=mdconf['token-url'], + refresh_url=mdconf['refresh-url'], + auth_url=mdconf['auth-url'], + scope=mdconf['scope'], + base_api_url=mdconf['base-api-url']) + return client_conn + + loop = get_event_loop() + client = await shield(loop.run_in_executor(None, _init_client)) + return client def init_config_repo(config):