Skip to content

Commit edb3e95

Browse files
committed
✨ Refactor RPC route registration to use a higher-order function for improved flexibility
1 parent 87fc3e7 commit edb3e95

File tree

4 files changed

+39
-10
lines changed

4 files changed

+39
-10
lines changed

packages/models-library/src/models_library/api_schemas_webserver/__init__.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,14 @@
77
WEBSERVER_RPC_NAMESPACE: Final[RPCNamespace] = TypeAdapter(
88
RPCNamespace
99
).validate_python("webserver")
10+
11+
12+
def get_webserver_rpc_namespace(webserver_host: str) -> RPCNamespace:
13+
"""
14+
Returns the RPC namespace to select among the different webserver services
15+
16+
e.g. webserver, wb-api-server, wb-garbage-collector, etc.
17+
18+
On the service side, this is defined in settings.WEBSERVER_HOST
19+
"""
20+
return TypeAdapter(RPCNamespace).validate_python(webserver_host)

services/web/server/src/simcore_service_webserver/functions/_controller/_functions_rpc.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from aiohttp import web
2-
from models_library.api_schemas_webserver import WEBSERVER_RPC_NAMESPACE
32
from models_library.functions import (
43
Function,
54
FunctionID,
@@ -31,7 +30,7 @@
3130
from models_library.users import UserID
3231
from servicelib.rabbitmq import RPCRouter
3332

34-
from ...rabbitmq import get_rabbitmq_rpc_server
33+
from ...rabbitmq import create_register_rpc_routes_on_startup
3534
from .. import _functions_repository, _functions_service
3635

3736
router = RPCRouter()
@@ -352,6 +351,4 @@ async def get_function_output_schema(
352351
)
353352

354353

355-
async def register_rpc_routes_on_startup(app: web.Application):
356-
rpc_server = get_rabbitmq_rpc_server(app)
357-
await rpc_server.register_router(router, WEBSERVER_RPC_NAMESPACE, app)
354+
register_rpc_routes_on_startup = create_register_rpc_routes_on_startup(router)

services/web/server/src/simcore_service_webserver/projects/_controller/projects_rpc.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from aiohttp import web
2-
from models_library.api_schemas_webserver import WEBSERVER_RPC_NAMESPACE
32
from models_library.products import ProductName
43
from models_library.projects import ProjectID
54
from models_library.rest_pagination import PageLimitInt, PageOffsetInt
@@ -16,7 +15,7 @@
1615
ProjectNotFoundRpcError,
1716
)
1817

19-
from ...rabbitmq import get_rabbitmq_rpc_server
18+
from ...rabbitmq import create_register_rpc_routes_on_startup
2019
from .. import _jobs_service
2120
from ..exceptions import ProjectInvalidRightsError, ProjectNotFoundError
2221

@@ -111,6 +110,4 @@ async def list_projects_marked_as_jobs(
111110
return page
112111

113112

114-
async def register_rpc_routes_on_startup(app: web.Application):
115-
rpc_server = get_rabbitmq_rpc_server(app)
116-
await rpc_server.register_router(router, WEBSERVER_RPC_NAMESPACE, app)
113+
register_rpc_routes_on_startup = create_register_rpc_routes_on_startup(router)

services/web/server/src/simcore_service_webserver/rabbitmq.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from typing import Final, cast
44

55
from aiohttp import web
6+
from models_library.api_schemas_webserver import get_webserver_rpc_namespace
67
from models_library.errors import RABBITMQ_CLIENT_UNHEALTHY_MSG
78
from servicelib.aiohttp.application_keys import (
89
APP_RABBITMQ_CLIENT_KEY,
@@ -13,9 +14,11 @@
1314
from servicelib.rabbitmq import (
1415
RabbitMQClient,
1516
RabbitMQRPCClient,
17+
RPCRouter,
1618
wait_till_rabbitmq_responsive,
1719
)
1820

21+
from .application_settings import get_application_settings
1922
from .rabbitmq_settings import RabbitSettings, get_plugin_settings
2023
from .rest.healthcheck import HealthCheck, HealthCheckError
2124

@@ -94,3 +97,24 @@ def get_rabbitmq_client(app: web.Application) -> RabbitMQClient:
9497

9598
def get_rabbitmq_rpc_server(app: web.Application) -> RabbitMQRPCClient:
9699
return cast(RabbitMQRPCClient, app[APP_RABBITMQ_RPC_SERVER_KEY])
100+
101+
102+
def create_register_rpc_routes_on_startup(router: RPCRouter):
103+
"""
104+
This high-order function allows for more flexible router registration
105+
by accepting a router instance and returning an on-startup event handler.
106+
107+
Args:
108+
router: The RPCRouter instance containing the routes to register
109+
110+
"""
111+
112+
async def _on_startup(app: web.Application):
113+
rpc_server = get_rabbitmq_rpc_server(app)
114+
settings = get_application_settings(app)
115+
116+
assert settings.WEBSERVER_HOST # nosec
117+
rpc_namespace = get_webserver_rpc_namespace(settings.WEBSERVER_HOST)
118+
await rpc_server.register_router(router, rpc_namespace, app)
119+
120+
return _on_startup

0 commit comments

Comments
 (0)