Skip to content

Commit 3c12ac2

Browse files
wvangeitpcrespov
andauthored
Add functions rest api inside webserver ✨ ♻️ (#7693)
Co-authored-by: Pedro Crespo-Valero <[email protected]>
1 parent c4a6124 commit 3c12ac2

File tree

29 files changed

+1437
-181
lines changed

29 files changed

+1437
-181
lines changed

api/specs/web-server/_functions.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# pylint: disable=protected-access
2+
# pylint: disable=redefined-outer-name
3+
# pylint: disable=too-many-arguments
4+
# pylint: disable=unused-argument
5+
# pylint: disable=unused-variable
6+
7+
8+
from typing import Annotated
9+
10+
from fastapi import APIRouter, Depends, status
11+
from models_library.api_schemas_webserver.functions import (
12+
FunctionToRegister,
13+
RegisteredFunctionGet,
14+
)
15+
from models_library.generics import Envelope
16+
from simcore_service_webserver._meta import API_VTAG
17+
from simcore_service_webserver.functions._controller._functions_rest_schemas import (
18+
FunctionPathParams,
19+
)
20+
21+
router = APIRouter(
22+
prefix=f"/{API_VTAG}",
23+
tags=[
24+
"functions",
25+
],
26+
)
27+
28+
29+
@router.post(
30+
"/functions",
31+
response_model=Envelope[RegisteredFunctionGet],
32+
)
33+
async def register_function(
34+
_body: FunctionToRegister,
35+
) -> Envelope[RegisteredFunctionGet]: ...
36+
37+
38+
@router.get(
39+
"/functions/{function_id}",
40+
response_model=Envelope[RegisteredFunctionGet],
41+
)
42+
async def get_function(
43+
_path: Annotated[FunctionPathParams, Depends()],
44+
): ...
45+
46+
47+
@router.delete(
48+
"/functions/{function_id}",
49+
status_code=status.HTTP_204_NO_CONTENT,
50+
)
51+
async def delete_function(
52+
_path: Annotated[FunctionPathParams, Depends()],
53+
): ...

api/specs/web-server/openapi.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
"_computations",
3636
"_exporter",
3737
"_folders",
38+
"_functions",
3839
"_long_running_tasks",
3940
"_long_running_tasks_legacy",
4041
"_licensed_items",
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# pylint: disable=unused-import
2+
3+
from ..functions import (
4+
Function,
5+
FunctionClass,
6+
FunctionClassSpecificData,
7+
FunctionID,
8+
FunctionIDNotFoundError,
9+
FunctionInputs,
10+
FunctionInputSchema,
11+
FunctionInputsList,
12+
FunctionInputsValidationError,
13+
FunctionJob,
14+
FunctionJobClassSpecificData,
15+
FunctionJobCollection,
16+
FunctionJobCollectionID,
17+
FunctionJobCollectionIDNotFoundError,
18+
FunctionJobCollectionStatus,
19+
FunctionJobID,
20+
FunctionJobIDNotFoundError,
21+
FunctionJobStatus,
22+
FunctionOutputs,
23+
FunctionOutputSchema,
24+
FunctionSchemaClass,
25+
JSONFunctionInputSchema,
26+
JSONFunctionOutputSchema,
27+
ProjectFunction,
28+
ProjectFunctionJob,
29+
RegisteredFunction,
30+
RegisteredFunctionJob,
31+
RegisteredFunctionJobCollection,
32+
RegisteredProjectFunction,
33+
RegisteredProjectFunctionJob,
34+
SolverFunction,
35+
SolverFunctionJob,
36+
UnsupportedFunctionClassError,
37+
UnsupportedFunctionFunctionJobClassCombinationError,
38+
)
39+
40+
__all__ = [
41+
"Function",
42+
"FunctionClass",
43+
"FunctionClassSpecificData",
44+
"FunctionID",
45+
"FunctionIDNotFoundError",
46+
"FunctionInputSchema",
47+
"FunctionInputs",
48+
"FunctionInputsList",
49+
"FunctionInputsValidationError",
50+
"FunctionJob",
51+
"FunctionJobClassSpecificData",
52+
"FunctionJobCollection",
53+
"FunctionJobCollectionID",
54+
"FunctionJobCollectionIDNotFoundError",
55+
"FunctionJobCollectionStatus",
56+
"FunctionJobID",
57+
"FunctionJobIDNotFoundError",
58+
"FunctionJobStatus",
59+
"FunctionOutputSchema",
60+
"FunctionOutputs",
61+
"FunctionSchemaClass",
62+
"JSONFunctionInputSchema",
63+
"JSONFunctionOutputSchema",
64+
"ProjectFunction",
65+
"ProjectFunctionJob",
66+
"RegisteredFunction",
67+
"RegisteredFunctionJob",
68+
"RegisteredFunctionJobCollection",
69+
"RegisteredProjectFunction",
70+
"RegisteredProjectFunctionJob",
71+
"SolverFunction",
72+
"SolverFunctionJob",
73+
"UnsupportedFunctionClassError",
74+
"UnsupportedFunctionFunctionJobClassCombinationError",
75+
]
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
from typing import Annotated, TypeAlias
2+
3+
from pydantic import Field
4+
5+
from ..functions import (
6+
Function,
7+
FunctionBase,
8+
FunctionClass,
9+
FunctionClassSpecificData,
10+
FunctionID,
11+
FunctionIDNotFoundError,
12+
FunctionInputs,
13+
FunctionInputSchema,
14+
FunctionInputsList,
15+
FunctionInputsValidationError,
16+
FunctionJob,
17+
FunctionJobClassSpecificData,
18+
FunctionJobCollection,
19+
FunctionJobCollectionID,
20+
FunctionJobCollectionIDNotFoundError,
21+
FunctionJobCollectionStatus,
22+
FunctionJobID,
23+
FunctionJobIDNotFoundError,
24+
FunctionJobStatus,
25+
FunctionOutputs,
26+
FunctionOutputSchema,
27+
FunctionSchemaClass,
28+
JSONFunctionInputSchema,
29+
JSONFunctionOutputSchema,
30+
ProjectFunction,
31+
ProjectFunctionJob,
32+
RegisteredFunction,
33+
RegisteredFunctionBase,
34+
RegisteredFunctionJob,
35+
RegisteredFunctionJobCollection,
36+
RegisteredProjectFunction,
37+
RegisteredProjectFunctionJob,
38+
RegisteredSolverFunction,
39+
SolverFunction,
40+
SolverFunctionJob,
41+
UnsupportedFunctionClassError,
42+
UnsupportedFunctionFunctionJobClassCombinationError,
43+
)
44+
from ._base import InputSchema, OutputSchema
45+
46+
__all__ = [
47+
"Function",
48+
"FunctionBase",
49+
"FunctionClass",
50+
"FunctionClassSpecificData",
51+
"FunctionClassSpecificData",
52+
"FunctionID",
53+
"FunctionID",
54+
"FunctionIDNotFoundError",
55+
"FunctionIDNotFoundError",
56+
"FunctionInputSchema",
57+
"FunctionInputs",
58+
"FunctionInputs",
59+
"FunctionInputsList",
60+
"FunctionInputsList",
61+
"FunctionInputsValidationError",
62+
"FunctionInputsValidationError",
63+
"FunctionJob",
64+
"FunctionJobClassSpecificData",
65+
"FunctionJobClassSpecificData",
66+
"FunctionJobCollection",
67+
"FunctionJobCollectionID",
68+
"FunctionJobCollectionID",
69+
"FunctionJobCollectionIDNotFoundError",
70+
"FunctionJobCollectionIDNotFoundError",
71+
"FunctionJobCollectionStatus",
72+
"FunctionJobCollectionStatus",
73+
"FunctionJobID",
74+
"FunctionJobID",
75+
"FunctionJobIDNotFoundError",
76+
"FunctionJobIDNotFoundError",
77+
"FunctionJobStatus",
78+
"FunctionJobStatus",
79+
"FunctionOutputSchema",
80+
"FunctionOutputs",
81+
"FunctionSchemaClass",
82+
"FunctionToRegister",
83+
"FunctionToRegister",
84+
"JSONFunctionInputSchema",
85+
"JSONFunctionOutputSchema",
86+
"ProjectFunction",
87+
"ProjectFunctionJob",
88+
"RegisteredFunction",
89+
"RegisteredFunctionBase",
90+
"RegisteredFunctionGet",
91+
"RegisteredFunctionJob",
92+
"RegisteredFunctionJobCollection",
93+
"RegisteredProjectFunction",
94+
"RegisteredProjectFunctionGet",
95+
"RegisteredProjectFunctionJob",
96+
"RegisteredSolverFunction",
97+
"RegisteredSolverFunctionGet",
98+
"SolverFunction",
99+
"SolverFunctionJob",
100+
"UnsupportedFunctionClassError",
101+
"UnsupportedFunctionFunctionJobClassCombinationError",
102+
]
103+
104+
105+
class RegisteredSolverFunctionGet(RegisteredSolverFunction, OutputSchema): ...
106+
107+
108+
class RegisteredProjectFunctionGet(RegisteredProjectFunction, OutputSchema): ...
109+
110+
111+
class SolverFunctionToRegister(SolverFunction, InputSchema): ...
112+
113+
114+
class ProjectFunctionToRegister(ProjectFunction, InputSchema): ...
115+
116+
117+
FunctionToRegister: TypeAlias = Annotated[
118+
ProjectFunctionToRegister | SolverFunctionToRegister,
119+
Field(discriminator="function_class"),
120+
]
121+
122+
RegisteredFunctionGet: TypeAlias = Annotated[
123+
RegisteredProjectFunctionGet | RegisteredSolverFunctionGet,
124+
Field(discriminator="function_class"),
125+
]
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from models_library.services_types import ServiceKey, ServiceVersion
99
from pydantic import BaseModel, Field
1010

11-
from ..projects import ProjectID
11+
from .projects import ProjectID
1212

1313
FunctionID: TypeAlias = UUID
1414
FunctionJobID: TypeAlias = UUID

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import logging
22

33
from models_library.api_schemas_webserver import WEBSERVER_RPC_NAMESPACE
4-
from models_library.api_schemas_webserver.functions_wb_schema import (
4+
from models_library.api_schemas_webserver.functions import (
55
Function,
66
FunctionID,
77
FunctionInputs,
@@ -124,13 +124,15 @@ async def list_function_jobs(
124124
*,
125125
pagination_limit: int,
126126
pagination_offset: int,
127+
filter_by_function_id: FunctionID | None = None,
127128
) -> tuple[list[RegisteredFunctionJob], PageMetaInfoLimitOffset]:
128129
result: tuple[list[RegisteredFunctionJob], PageMetaInfoLimitOffset] = (
129130
await rabbitmq_rpc_client.request(
130131
WEBSERVER_RPC_NAMESPACE,
131132
TypeAdapter(RPCMethodName).validate_python("list_function_jobs"),
132133
pagination_offset=pagination_offset,
133134
pagination_limit=pagination_limit,
135+
filter_by_function_id=filter_by_function_id,
134136
)
135137
)
136138
return TypeAdapter(

services/api-server/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.7.1
1+
0.8.0

0 commit comments

Comments
 (0)