Skip to content

Commit d4b1b86

Browse files
committed
include filters in RPC API
1 parent fa00523 commit d4b1b86

File tree

6 files changed

+57
-23
lines changed

6 files changed

+57
-23
lines changed

packages/models-library/src/models_library/rpc/webserver/projects.py

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,36 @@
22
from typing import Annotated, TypeAlias
33
from uuid import uuid4
44

5-
from pydantic import BaseModel, ConfigDict, Field
5+
from pydantic import BaseModel, ConfigDict, Field, StringConstraints
66
from pydantic.config import JsonDict
77

88
from ...projects import NodesDict, ProjectID
9-
from ...projects_filters import ListProjectsMarkedAsJobFilter
109
from ...projects_nodes import Node
1110
from ...rpc_pagination import PageRpc
1211

13-
# NOTE: for now these interfaces are identical
14-
ListProjectsMarkedAsJobRpcFilter: TypeAlias = ListProjectsMarkedAsJobFilter
12+
13+
class MetadataFilterItem(BaseModel):
14+
name: Annotated[
15+
str,
16+
StringConstraints(min_length=1, max_length=255),
17+
Field(description="Name fo the custom metadata field"),
18+
]
19+
pattern: Annotated[
20+
str,
21+
StringConstraints(min_length=1, max_length=255),
22+
Field(description="Exact value or glob pattern"),
23+
]
24+
25+
26+
class ListProjectsMarkedAsJobRpcFilter(BaseModel):
27+
# NOTE: add here any early validation of filters e.g. incompatible filters etc
28+
job_parent_resource_name_prefix: str | None
29+
any_of_metadata: Annotated[
30+
list[MetadataFilterItem] | None,
31+
Field(description="Searchs for matches of any of the custom metadata fields"),
32+
] = None
33+
34+
# TODO: update interface to list_projects_marked_as_jobs
1535

1636

1737
class ProjectJobRpcGet(BaseModel):

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from models_library.projects import ProjectID
1010
from models_library.rest_pagination import PageOffsetInt
1111
from models_library.rpc.webserver.projects import (
12+
ListProjectsMarkedAsJobRpcFilter,
1213
PageRpcProjectJobRpcGet,
1314
ProjectJobRpcGet,
1415
)
@@ -56,24 +57,24 @@ async def list_projects_marked_as_jobs(
5657
# pagination
5758
offset: PageOffsetInt = 0,
5859
limit: PageLimitInt = DEFAULT_NUMBER_OF_ITEMS_PER_PAGE,
59-
# filters
60-
job_parent_resource_name_prefix: str | None = None,
60+
filters: ListProjectsMarkedAsJobRpcFilter | None = None,
6161
) -> PageRpcProjectJobRpcGet:
6262
assert rpc_client
6363
assert product_name
6464
assert user_id
6565

66-
if job_parent_resource_name_prefix:
67-
assert not job_parent_resource_name_prefix.startswith("/")
68-
assert not job_parent_resource_name_prefix.endswith("%")
69-
assert not job_parent_resource_name_prefix.startswith("%")
66+
if filters and filters.job_parent_resource_name_prefix:
67+
assert not filters.job_parent_resource_name_prefix.startswith("/")
68+
assert not filters.job_parent_resource_name_prefix.endswith("%")
69+
assert not filters.job_parent_resource_name_prefix.startswith("%")
7070

7171
items = [
7272
item
7373
for item in ProjectJobRpcGet.model_json_schema()["examples"]
74-
if job_parent_resource_name_prefix is None
74+
if filters is None
75+
or filters.job_parent_resource_name_prefix is None
7576
or item.get("job_parent_resource_name").startswith(
76-
job_parent_resource_name_prefix
77+
filters.job_parent_resource_name_prefix
7778
)
7879
]
7980

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66
from models_library.projects import ProjectID
77
from models_library.rabbitmq_basic_types import RPCMethodName
88
from models_library.rest_pagination import PageOffsetInt
9-
from models_library.rpc.webserver.projects import PageRpcProjectJobRpcGet
9+
from models_library.rpc.webserver.projects import (
10+
ListProjectsMarkedAsJobRpcFilter,
11+
PageRpcProjectJobRpcGet,
12+
)
1013
from models_library.rpc_pagination import (
1114
DEFAULT_NUMBER_OF_ITEMS_PER_PAGE,
1215
PageLimitInt,
@@ -51,8 +54,7 @@ async def list_projects_marked_as_jobs(
5154
# pagination
5255
offset: PageOffsetInt = 0,
5356
limit: PageLimitInt = DEFAULT_NUMBER_OF_ITEMS_PER_PAGE,
54-
# filters
55-
job_parent_resource_name_prefix: str | None = None,
57+
filters: ListProjectsMarkedAsJobRpcFilter | None = None,
5658
) -> PageRpcProjectJobRpcGet:
5759
result = await rpc_client.request(
5860
WEBSERVER_RPC_NAMESPACE,
@@ -61,7 +63,7 @@ async def list_projects_marked_as_jobs(
6163
user_id=user_id,
6264
offset=offset,
6365
limit=limit,
64-
job_parent_resource_name_prefix=job_parent_resource_name_prefix,
66+
filters=filters,
6567
)
6668
assert TypeAdapter(PageRpcProjectJobRpcGet).validate_python(result) # nosec
6769
return cast(PageRpcProjectJobRpcGet, result)

services/api-server/src/simcore_service_api_server/services_rpc/wb_api_server.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from models_library.resource_tracker_licensed_items_checkouts import (
1212
LicensedItemCheckoutID,
1313
)
14+
from models_library.rpc.webserver.projects import ListProjectsMarkedAsJobRpcFilter
1415
from models_library.services_types import ServiceRunID
1516
from models_library.users import UserID
1617
from models_library.wallets import WalletID
@@ -228,13 +229,17 @@ async def list_projects_marked_as_jobs(
228229
limit: int = 50,
229230
job_parent_resource_name_prefix: str | None = None,
230231
):
232+
filters = ListProjectsMarkedAsJobRpcFilter(
233+
job_parent_resource_name_prefix=job_parent_resource_name_prefix
234+
)
235+
231236
return await projects_rpc.list_projects_marked_as_jobs(
232237
rpc_client=self._client,
233238
product_name=product_name,
234239
user_id=user_id,
235240
offset=offset,
236241
limit=limit,
237-
job_parent_resource_name_prefix=job_parent_resource_name_prefix,
242+
filters=filters,
238243
)
239244

240245

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

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,6 @@ async def list_projects_marked_as_jobs(
6666
# pagination
6767
offset: PageOffsetInt,
6868
limit: PageLimitInt,
69-
# filters
70-
# TODO: replace by ListProjectsMarkedAsJobsFilter
71-
job_parent_resource_name_prefix: str | None,
7269
filters: ListProjectsMarkedAsJobRpcFilter | None = None,
7370
) -> PageRpcProjectJobRpcGet:
7471

@@ -78,8 +75,17 @@ async def list_projects_marked_as_jobs(
7875
user_id=user_id,
7976
offset=offset,
8077
limit=limit,
81-
filter_by_job_parent_resource_name_prefix=job_parent_resource_name_prefix,
82-
filter_by_metadata_any_of=filters.any_of_metadata if filters else None,
78+
filter_by_job_parent_resource_name_prefix=(
79+
filters.job_parent_resource_name_prefix if filters else None
80+
),
81+
filter_by_any_custom_metadata=(
82+
[
83+
{custom_metadata.name: custom_metadata.pattern}
84+
for custom_metadata in filters.any_of_metadata
85+
]
86+
if filters and filters.any_of_metadata
87+
else None
88+
),
8389
)
8490

8591
job_projects = [

services/web/server/tests/unit/with_dbs/02/test_projects_rpc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ async def test_rpc_client_list_my_projects_marked_as_jobs(
114114
rpc_client=rpc_client,
115115
product_name=product_name,
116116
user_id=user_id,
117-
job_parent_resource_name_prefix="solvers/solver123",
117+
filters={"job_parent_resource_name_prefix": "solvers/solver123"},
118118
)
119119

120120
assert page.meta.total == 1

0 commit comments

Comments
 (0)