Skip to content

Commit 3fdfac0

Browse files
🎨 New rpc client in the api-server to avoid cross-service calls with the web-server variants (🚨) (#8431)
Co-authored-by: Mads Bisgaard <[email protected]>
1 parent de343ac commit 3fdfac0

File tree

78 files changed

+2329
-1204
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

78 files changed

+2329
-1204
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from ..rabbitmq_basic_types import RPCNamespace
66

7-
WEBSERVER_RPC_NAMESPACE: Final[RPCNamespace] = TypeAdapter(
7+
DEFAULT_WEBSERVER_RPC_NAMESPACE: Final[RPCNamespace] = TypeAdapter(
8+
# NOTE: deprecated! Use app.state.settings.WEBSERVER_RPC_NAMESPACE
89
RPCNamespace
910
).validate_python("webserver")

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from models_library.basic_types import IDStr
55
from models_library.resource_tracker import PricingPlanId
6-
from pydantic import BaseModel, ConfigDict, HttpUrl, PositiveInt
6+
from pydantic import BaseModel, ConfigDict, HttpUrl, NonNegativeInt, PositiveInt
77
from pydantic.config import JsonDict
88
from typing_extensions import TypedDict
99

@@ -94,7 +94,7 @@ class LicensedItemRpcGet(BaseModel):
9494

9595
class LicensedItemRpcGetPage(NamedTuple):
9696
items: list[LicensedItemRpcGet]
97-
total: PositiveInt
97+
total: NonNegativeInt
9898

9999

100100
# Rest
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
from ...api_schemas_webserver import DEFAULT_WEBSERVER_RPC_NAMESPACE
2+
3+
__all__: tuple[str, ...] = ("DEFAULT_WEBSERVER_RPC_NAMESPACE",)
4+
# nopycln" file
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from collections.abc import Callable
2+
from typing import Any, Protocol
3+
4+
from pytest_mock import MockType
5+
6+
7+
class HandlerMockFactory(Protocol):
8+
def __call__(
9+
self,
10+
handler_name: str,
11+
return_value: Any = None,
12+
exception: Exception | None = None,
13+
side_effect: Callable | None = None,
14+
) -> MockType: ...

packages/pytest-simcore/src/pytest_simcore/helpers/webserver_rpc_server.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,8 @@
2626
class WebserverRpcSideEffects:
2727
# pylint: disable=no-self-use
2828

29-
def __init__(
30-
self,
31-
project_job_rpc_get: ProjectJobRpcGet = ProjectJobRpcGet.model_validate(
32-
ProjectJobRpcGet.model_json_schema()["examples"][0]
33-
),
34-
):
35-
self.project_job_rpc_get = project_job_rpc_get
29+
def __init__(self, fake_project_job_rpc_get: ProjectJobRpcGet):
30+
self.fake_project_job_rpc_get = fake_project_job_rpc_get
3631

3732
@validate_call(config={"arbitrary_types_allowed": True})
3833
async def mark_project_as_job(
@@ -112,7 +107,7 @@ async def get_project_marked_as_job(
112107
assert job_parent_resource_name
113108

114109
# Return a valid example from the schema
115-
_data = self.project_job_rpc_get.model_dump()
110+
_data = self.fake_project_job_rpc_get.model_dump()
116111
_data["uuid"] = str(project_uuid)
117112
_data["job_parent_resource_name"] = job_parent_resource_name
118113
return ProjectJobRpcGet.model_validate(_data)

packages/service-library/src/servicelib/rabbitmq/rpc_interfaces/webserver/auth/api_keys.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import logging
2+
import warnings
23

3-
from models_library.api_schemas_webserver import WEBSERVER_RPC_NAMESPACE
4+
from models_library.api_schemas_webserver import DEFAULT_WEBSERVER_RPC_NAMESPACE
45
from models_library.basic_types import IDStr
56
from models_library.rabbitmq_basic_types import RPCMethodName
67
from models_library.rpc.webserver.auth.api_keys import ApiKeyCreate, ApiKeyGet
@@ -12,6 +13,13 @@
1213

1314
_logger = logging.getLogger(__name__)
1415

16+
warnings.warn(
17+
f"The '{__name__}' module is deprecated and will be removed in a future release. "
18+
"Please use 'rpc_interfaces.webserver.v1' instead.",
19+
DeprecationWarning,
20+
stacklevel=2,
21+
)
22+
1523

1624
@log_decorator(_logger, level=logging.DEBUG)
1725
async def create_api_key(
@@ -22,7 +30,7 @@ async def create_api_key(
2230
api_key: ApiKeyCreate,
2331
) -> ApiKeyGet:
2432
result: ApiKeyGet = await rabbitmq_rpc_client.request(
25-
WEBSERVER_RPC_NAMESPACE,
33+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
2634
TypeAdapter(RPCMethodName).validate_python("create_api_key"),
2735
user_id=user_id,
2836
product_name=product_name,
@@ -42,7 +50,7 @@ async def get_api_key(
4250
api_key_id: IDStr,
4351
) -> ApiKeyGet:
4452
result: ApiKeyGet = await rabbitmq_rpc_client.request(
45-
WEBSERVER_RPC_NAMESPACE,
53+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
4654
TypeAdapter(RPCMethodName).validate_python("get_api_key"),
4755
user_id=user_id,
4856
product_name=product_name,
@@ -61,7 +69,7 @@ async def delete_api_key_by_key(
6169
api_key: str,
6270
) -> None:
6371
result = await rabbitmq_rpc_client.request(
64-
WEBSERVER_RPC_NAMESPACE,
72+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
6573
TypeAdapter(RPCMethodName).validate_python("delete_api_key_by_key"),
6674
user_id=user_id,
6775
product_name=product_name,

packages/service-library/src/servicelib/rabbitmq/rpc_interfaces/webserver/functions/functions_rpc_interface.py

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import logging
2+
import warnings
23
from typing import Annotated, Literal
34

4-
from models_library.api_schemas_webserver import WEBSERVER_RPC_NAMESPACE
5+
from models_library.api_schemas_webserver import DEFAULT_WEBSERVER_RPC_NAMESPACE
56
from models_library.api_schemas_webserver.functions import (
67
Function,
78
FunctionID,
@@ -42,6 +43,14 @@
4243
_FUNCTION_RPC_TIMEOUT_SEC: Annotated[int, PositiveInt] = 30
4344

4445

46+
warnings.warn(
47+
f"The '{__name__}' module is deprecated and will be removed in a future release. "
48+
"Please use 'rpc_interfaces.webserver.v1' instead.",
49+
DeprecationWarning,
50+
stacklevel=2,
51+
)
52+
53+
4554
@log_decorator(_logger, level=logging.DEBUG)
4655
async def register_function(
4756
rabbitmq_rpc_client: RabbitMQRPCClient,
@@ -51,7 +60,7 @@ async def register_function(
5160
function: Function,
5261
) -> RegisteredFunction:
5362
result = await rabbitmq_rpc_client.request(
54-
WEBSERVER_RPC_NAMESPACE,
63+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
5564
TypeAdapter(RPCMethodName).validate_python("register_function"),
5665
function=function,
5766
user_id=user_id,
@@ -72,7 +81,7 @@ async def get_function(
7281
function_id: FunctionID,
7382
) -> RegisteredFunction:
7483
result = await rabbitmq_rpc_client.request(
75-
WEBSERVER_RPC_NAMESPACE,
84+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
7685
TypeAdapter(RPCMethodName).validate_python("get_function"),
7786
function_id=function_id,
7887
user_id=user_id,
@@ -91,7 +100,7 @@ async def get_function_input_schema(
91100
product_name: ProductName,
92101
) -> FunctionInputSchema:
93102
result = await rabbitmq_rpc_client.request(
94-
WEBSERVER_RPC_NAMESPACE,
103+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
95104
TypeAdapter(RPCMethodName).validate_python("get_function_input_schema"),
96105
function_id=function_id,
97106
user_id=user_id,
@@ -110,7 +119,7 @@ async def get_function_output_schema(
110119
product_name: ProductName,
111120
) -> FunctionOutputSchema:
112121
result = await rabbitmq_rpc_client.request(
113-
WEBSERVER_RPC_NAMESPACE,
122+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
114123
TypeAdapter(RPCMethodName).validate_python("get_function_output_schema"),
115124
function_id=function_id,
116125
user_id=user_id,
@@ -129,7 +138,7 @@ async def delete_function(
129138
product_name: ProductName,
130139
) -> None:
131140
result = await rabbitmq_rpc_client.request(
132-
WEBSERVER_RPC_NAMESPACE,
141+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
133142
TypeAdapter(RPCMethodName).validate_python("delete_function"),
134143
function_id=function_id,
135144
user_id=user_id,
@@ -155,7 +164,7 @@ async def list_functions(
155164
) -> tuple[list[RegisteredFunction], PageMetaInfoLimitOffset]:
156165
result: tuple[list[RegisteredFunction], PageMetaInfoLimitOffset] = (
157166
await rabbitmq_rpc_client.request(
158-
WEBSERVER_RPC_NAMESPACE,
167+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
159168
TypeAdapter(RPCMethodName).validate_python("list_functions"),
160169
pagination_offset=pagination_offset,
161170
pagination_limit=pagination_limit,
@@ -187,7 +196,7 @@ async def list_function_jobs(
187196
) -> tuple[list[RegisteredFunctionJob], PageMetaInfoLimitOffset]:
188197
result: tuple[list[RegisteredFunctionJob], PageMetaInfoLimitOffset] = (
189198
await rabbitmq_rpc_client.request(
190-
WEBSERVER_RPC_NAMESPACE,
199+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
191200
TypeAdapter(RPCMethodName).validate_python("list_function_jobs"),
192201
user_id=user_id,
193202
product_name=product_name,
@@ -220,7 +229,7 @@ async def list_function_jobs_with_status(
220229
PageMetaInfoLimitOffset,
221230
]:
222231
result = await rabbitmq_rpc_client.request(
223-
WEBSERVER_RPC_NAMESPACE,
232+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
224233
TypeAdapter(RPCMethodName).validate_python("list_function_jobs_with_status"),
225234
user_id=user_id,
226235
product_name=product_name,
@@ -250,7 +259,7 @@ async def list_function_job_collections(
250259
filters: FunctionJobCollectionsListFilters | None = None,
251260
) -> tuple[list[RegisteredFunctionJobCollection], PageMetaInfoLimitOffset]:
252261
result = await rabbitmq_rpc_client.request(
253-
WEBSERVER_RPC_NAMESPACE,
262+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
254263
TypeAdapter(RPCMethodName).validate_python("list_function_job_collections"),
255264
pagination_offset=pagination_offset,
256265
pagination_limit=pagination_limit,
@@ -274,7 +283,7 @@ async def update_function_title(
274283
title: str,
275284
) -> RegisteredFunction:
276285
result = await rabbitmq_rpc_client.request(
277-
WEBSERVER_RPC_NAMESPACE,
286+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
278287
TypeAdapter(RPCMethodName).validate_python("update_function_title"),
279288
function_id=function_id,
280289
title=title,
@@ -295,7 +304,7 @@ async def update_function_description(
295304
description: str,
296305
) -> RegisteredFunction:
297306
result = await rabbitmq_rpc_client.request(
298-
WEBSERVER_RPC_NAMESPACE,
307+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
299308
TypeAdapter(RPCMethodName).validate_python("update_function_description"),
300309
function_id=function_id,
301310
description=description,
@@ -316,7 +325,7 @@ async def run_function(
316325
product_name: ProductName,
317326
) -> RegisteredFunctionJob:
318327
result = await rabbitmq_rpc_client.request(
319-
WEBSERVER_RPC_NAMESPACE,
328+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
320329
TypeAdapter(RPCMethodName).validate_python("run_function"),
321330
function_id=function_id,
322331
inputs=inputs,
@@ -338,7 +347,7 @@ async def register_function_job(
338347
function_job: FunctionJob,
339348
) -> RegisteredFunctionJob:
340349
result = await rabbitmq_rpc_client.request(
341-
WEBSERVER_RPC_NAMESPACE,
350+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
342351
TypeAdapter(RPCMethodName).validate_python("register_function_job"),
343352
function_job=function_job,
344353
user_id=user_id,
@@ -360,7 +369,7 @@ async def patch_registered_function_job(
360369
registered_function_job_patch: RegisteredFunctionJobPatch,
361370
) -> RegisteredFunctionJob:
362371
result = await rabbitmq_rpc_client.request(
363-
WEBSERVER_RPC_NAMESPACE,
372+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
364373
TypeAdapter(RPCMethodName).validate_python("patch_registered_function_job"),
365374
user_id=user_id,
366375
product_name=product_name,
@@ -382,7 +391,7 @@ async def get_function_job(
382391
product_name: ProductName,
383392
) -> RegisteredFunctionJob:
384393
result = await rabbitmq_rpc_client.request(
385-
WEBSERVER_RPC_NAMESPACE,
394+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
386395
TypeAdapter(RPCMethodName).validate_python("get_function_job"),
387396
function_job_id=function_job_id,
388397
user_id=user_id,
@@ -402,7 +411,7 @@ async def get_function_job_status(
402411
product_name: ProductName,
403412
) -> FunctionJobStatus:
404413
result = await rabbitmq_rpc_client.request(
405-
WEBSERVER_RPC_NAMESPACE,
414+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
406415
TypeAdapter(RPCMethodName).validate_python("get_function_job_status"),
407416
function_job_id=function_job_id,
408417
user_id=user_id,
@@ -421,7 +430,7 @@ async def get_function_job_outputs(
421430
product_name: ProductName,
422431
) -> FunctionOutputs:
423432
result = await rabbitmq_rpc_client.request(
424-
WEBSERVER_RPC_NAMESPACE,
433+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
425434
TypeAdapter(RPCMethodName).validate_python("get_function_job_outputs"),
426435
function_job_id=function_job_id,
427436
user_id=user_id,
@@ -442,7 +451,7 @@ async def update_function_job_status(
442451
check_write_permissions: bool = True,
443452
) -> FunctionJobStatus:
444453
result = await rabbitmq_rpc_client.request(
445-
WEBSERVER_RPC_NAMESPACE,
454+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
446455
TypeAdapter(RPCMethodName).validate_python("update_function_job_status"),
447456
function_job_id=function_job_id,
448457
job_status=job_status,
@@ -465,7 +474,7 @@ async def update_function_job_outputs(
465474
check_write_permissions: bool = True,
466475
) -> FunctionOutputs:
467476
result = await rabbitmq_rpc_client.request(
468-
WEBSERVER_RPC_NAMESPACE,
477+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
469478
TypeAdapter(RPCMethodName).validate_python("update_function_job_outputs"),
470479
function_job_id=function_job_id,
471480
outputs=outputs,
@@ -486,7 +495,7 @@ async def delete_function_job(
486495
function_job_id: FunctionJobID,
487496
) -> None:
488497
result: None = await rabbitmq_rpc_client.request(
489-
WEBSERVER_RPC_NAMESPACE,
498+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
490499
TypeAdapter(RPCMethodName).validate_python("delete_function_job"),
491500
function_job_id=function_job_id,
492501
user_id=user_id,
@@ -506,7 +515,7 @@ async def find_cached_function_jobs(
506515
inputs: FunctionInputs,
507516
) -> list[RegisteredFunctionJob] | None:
508517
result = await rabbitmq_rpc_client.request(
509-
WEBSERVER_RPC_NAMESPACE,
518+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
510519
TypeAdapter(RPCMethodName).validate_python("find_cached_function_jobs"),
511520
function_id=function_id,
512521
inputs=inputs,
@@ -528,7 +537,7 @@ async def register_function_job_collection(
528537
function_job_collection: FunctionJobCollection,
529538
) -> RegisteredFunctionJobCollection:
530539
result = await rabbitmq_rpc_client.request(
531-
WEBSERVER_RPC_NAMESPACE,
540+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
532541
TypeAdapter(RPCMethodName).validate_python("register_function_job_collection"),
533542
function_job_collection=function_job_collection,
534543
user_id=user_id,
@@ -547,7 +556,7 @@ async def get_function_job_collection(
547556
product_name: ProductName,
548557
) -> RegisteredFunctionJobCollection:
549558
result = await rabbitmq_rpc_client.request(
550-
WEBSERVER_RPC_NAMESPACE,
559+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
551560
TypeAdapter(RPCMethodName).validate_python("get_function_job_collection"),
552561
function_job_collection_id=function_job_collection_id,
553562
user_id=user_id,
@@ -566,7 +575,7 @@ async def delete_function_job_collection(
566575
function_job_collection_id: FunctionJobCollectionID,
567576
) -> None:
568577
result = await rabbitmq_rpc_client.request(
569-
WEBSERVER_RPC_NAMESPACE,
578+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
570579
TypeAdapter(RPCMethodName).validate_python("delete_function_job_collection"),
571580
function_job_collection_id=function_job_collection_id,
572581
user_id=user_id,
@@ -585,7 +594,7 @@ async def get_function_user_permissions(
585594
function_id: FunctionID,
586595
) -> FunctionUserAccessRights:
587596
result = await rabbitmq_rpc_client.request(
588-
WEBSERVER_RPC_NAMESPACE,
597+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
589598
TypeAdapter(RPCMethodName).validate_python("get_function_user_permissions"),
590599
function_id=function_id,
591600
user_id=user_id,
@@ -603,7 +612,7 @@ async def get_functions_user_api_access_rights(
603612
product_name: ProductName,
604613
) -> FunctionUserApiAccessRights:
605614
result = await rabbitmq_rpc_client.request(
606-
WEBSERVER_RPC_NAMESPACE,
615+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
607616
TypeAdapter(RPCMethodName).validate_python(
608617
"get_functions_user_api_access_rights"
609618
),
@@ -632,7 +641,7 @@ async def set_group_permissions(
632641
]
633642
]:
634643
result = await rabbitmq_rpc_client.request(
635-
WEBSERVER_RPC_NAMESPACE,
644+
DEFAULT_WEBSERVER_RPC_NAMESPACE,
636645
TypeAdapter(RPCMethodName).validate_python("set_group_permissions"),
637646
user_id=user_id,
638647
product_name=product_name,

0 commit comments

Comments
 (0)