Skip to content

Commit 521808a

Browse files
committed
Move some code in dependencies
1 parent 3780338 commit 521808a

File tree

7 files changed

+167
-264
lines changed

7 files changed

+167
-264
lines changed
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
from typing import Annotated
2+
3+
from fastapi import Depends
4+
from models_library.functions import (
5+
FunctionJob,
6+
FunctionJobID,
7+
FunctionJobStatus,
8+
FunctionOutputs,
9+
RegisteredFunction,
10+
)
11+
from models_library.products import ProductName
12+
from models_library.users import UserID
13+
from simcore_service_api_server.api.dependencies.authentication import (
14+
get_current_user_id,
15+
get_product_name,
16+
)
17+
from simcore_service_api_server.api.dependencies.webserver_rpc import (
18+
get_wb_api_rpc_client,
19+
)
20+
from simcore_service_api_server.services_rpc.wb_api_server import WbApiRpcClient
21+
22+
23+
async def get_stored_job_outputs(
24+
function_job_id: FunctionJobID,
25+
wb_api_rpc: Annotated[WbApiRpcClient, Depends(get_wb_api_rpc_client)],
26+
user_id: Annotated[UserID, Depends(get_current_user_id)],
27+
product_name: Annotated[ProductName, Depends(get_product_name)],
28+
) -> FunctionOutputs:
29+
30+
return await wb_api_rpc.get_function_job_outputs(
31+
function_job_id=function_job_id, user_id=user_id, product_name=product_name
32+
)
33+
34+
35+
async def get_function_job_dependency(
36+
function_job_id: FunctionJobID,
37+
wb_api_rpc: Annotated[WbApiRpcClient, Depends(get_wb_api_rpc_client)],
38+
user_id: Annotated[UserID, Depends(get_current_user_id)],
39+
product_name: Annotated[ProductName, Depends(get_product_name)],
40+
) -> FunctionJob:
41+
return await wb_api_rpc.get_function_job(
42+
function_job_id=function_job_id, user_id=user_id, product_name=product_name
43+
)
44+
45+
46+
async def get_function_from_functionjob(
47+
function_job: Annotated[FunctionJob, Depends(get_function_job_dependency)],
48+
wb_api_rpc: Annotated[WbApiRpcClient, Depends(get_wb_api_rpc_client)],
49+
user_id: Annotated[UserID, Depends(get_current_user_id)],
50+
product_name: Annotated[ProductName, Depends(get_product_name)],
51+
) -> RegisteredFunction:
52+
return await wb_api_rpc.get_function(
53+
function_id=function_job.function_uid,
54+
user_id=user_id,
55+
product_name=product_name,
56+
)
57+
58+
59+
async def get_stored_job_status(
60+
function_job_id: FunctionJobID,
61+
wb_api_rpc: Annotated[WbApiRpcClient, Depends(get_wb_api_rpc_client)],
62+
user_id: Annotated[UserID, Depends(get_current_user_id)],
63+
product_name: Annotated[ProductName, Depends(get_product_name)],
64+
) -> FunctionJobStatus:
65+
return await wb_api_rpc.get_function_job_status(
66+
function_job_id=function_job_id, user_id=user_id, product_name=product_name
67+
)

services/api-server/src/simcore_service_api_server/api/routes/function_jobs_routes.py

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@
2020
from models_library.projects_state import RunningState
2121
from models_library.users import UserID
2222
from servicelib.fastapi.dependencies import get_app
23+
from simcore_service_api_server.api.dependencies.functions import (
24+
get_function_from_functionjob,
25+
get_function_job_dependency,
26+
get_stored_job_outputs,
27+
get_stored_job_status,
28+
)
2329
from sqlalchemy.ext.asyncio import AsyncEngine
2430

2531
from ..._service_jobs import JobService
@@ -172,25 +178,19 @@ async def delete_function_job(
172178
),
173179
)
174180
async def function_job_status(
175-
function_job_id: FunctionJobID,
181+
function_job: Annotated[
182+
RegisteredFunctionJob, Depends(get_function_job_dependency)
183+
],
184+
function: Annotated[RegisteredFunction, Depends(get_function_from_functionjob)],
185+
stored_job_status: Annotated[FunctionJobStatus, Depends(get_stored_job_status)],
176186
director2_api: Annotated[DirectorV2Api, Depends(get_api_client(DirectorV2Api))],
177187
user_id: Annotated[UserID, Depends(get_current_user_id)],
178188
product_name: Annotated[ProductName, Depends(get_product_name)],
179189
wb_api_rpc: Annotated[WbApiRpcClient, Depends(get_wb_api_rpc_client)],
180190
) -> FunctionJobStatus:
181191

182-
function, function_job = await get_function_from_functionjobid(
183-
wb_api_rpc=wb_api_rpc,
184-
function_job_id=function_job_id,
185-
user_id=user_id,
186-
product_name=product_name,
187-
)
188-
old_job_status = await wb_api_rpc.get_function_job_status(
189-
function_job_id=function_job.uid, user_id=user_id, product_name=product_name
190-
)
191-
192-
if old_job_status.status in (RunningState.SUCCESS, RunningState.FAILED):
193-
return old_job_status
192+
if stored_job_status.status in (RunningState.SUCCESS, RunningState.FAILED):
193+
return stored_job_status
194194

195195
if (
196196
function.function_class == FunctionClass.PROJECT
@@ -264,27 +264,20 @@ async def get_function_from_functionjobid(
264264
),
265265
)
266266
async def get_function_job_outputs(
267-
function_job_id: FunctionJobID,
267+
function_job: Annotated[
268+
RegisteredFunctionJob, Depends(get_function_job_dependency)
269+
],
270+
function: Annotated[RegisteredFunction, Depends(get_function_from_functionjob)],
268271
webserver_api: Annotated[AuthSession, Depends(get_webserver_session)],
269272
user_id: Annotated[UserID, Depends(get_current_user_id)],
270273
product_name: Annotated[ProductName, Depends(get_product_name)],
271274
storage_client: Annotated[StorageApi, Depends(get_api_client(StorageApi))],
272275
wb_api_rpc: Annotated[WbApiRpcClient, Depends(get_wb_api_rpc_client)],
273276
async_pg_engine: Annotated[AsyncEngine, Depends(get_db_asyncpg_engine)],
277+
stored_job_outputs: Annotated[FunctionOutputs, Depends(get_stored_job_outputs)],
274278
) -> FunctionOutputs:
275-
function, function_job = await get_function_from_functionjobid(
276-
wb_api_rpc=wb_api_rpc,
277-
function_job_id=function_job_id,
278-
user_id=user_id,
279-
product_name=product_name,
280-
)
281-
282-
old_job_outputs = await wb_api_rpc.get_function_job_outputs(
283-
function_job_id=function_job.uid, user_id=user_id, product_name=product_name
284-
)
285-
286-
if old_job_outputs is not None:
287-
return old_job_outputs
279+
if stored_job_outputs is not None:
280+
return stored_job_outputs
288281

289282
if (
290283
function.function_class == FunctionClass.PROJECT

services/api-server/src/simcore_service_api_server/api/routes/functions_routes.py

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
from models_library.users import UserID
3737
from servicelib.fastapi.dependencies import get_reverse_url_mapper
3838
from simcore_service_api_server._service_jobs import JobService
39+
from simcore_service_api_server.api.dependencies.functions import get_stored_job_status
3940

4041
from ..._service_solvers import SolverService
4142
from ...models.pagination import Page, PaginationParams
@@ -365,11 +366,12 @@ async def validate_function_inputs(
365366
)
366367
async def run_function( # noqa: PLR0913
367368
request: Request,
369+
function_id: FunctionID,
370+
to_run_function: Annotated[RegisteredFunction, Depends(get_function)],
368371
wb_api_rpc: Annotated[WbApiRpcClient, Depends(get_wb_api_rpc_client)],
369372
webserver_api: Annotated[AuthSession, Depends(get_webserver_session)],
370373
url_for: Annotated[Callable, Depends(get_reverse_url_mapper)],
371374
director2_api: Annotated[DirectorV2Api, Depends(get_api_client(DirectorV2Api))],
372-
function_id: FunctionID,
373375
function_inputs: FunctionInputs,
374376
user_id: Annotated[UserID, Depends(get_current_user_id)],
375377
product_name: Annotated[str, Depends(get_product_name)],
@@ -378,7 +380,6 @@ async def run_function( # noqa: PLR0913
378380
x_simcore_parent_project_uuid: Annotated[ProjectID | Literal["null"], Header()],
379381
x_simcore_parent_node_id: Annotated[NodeID | Literal["null"], Header()],
380382
) -> RegisteredFunctionJob:
381-
382383
parent_project_uuid = (
383384
x_simcore_parent_project_uuid
384385
if isinstance(x_simcore_parent_project_uuid, ProjectID)
@@ -390,8 +391,6 @@ async def run_function( # noqa: PLR0913
390391
else None
391392
)
392393

393-
# Make sure the user is allowed to execute any function
394-
# (read/write right is checked in the other endpoint called in this method)
395394
user_api_access_rights = await wb_api_rpc.get_functions_user_api_access_rights(
396395
user_id=user_id, product_name=product_name
397396
)
@@ -400,8 +399,7 @@ async def run_function( # noqa: PLR0913
400399
user_id=user_id,
401400
function_id=function_id,
402401
)
403-
# Make sure the user is allowed to execute this particular function
404-
# (read/write right is checked in the other endpoint called in this method)
402+
405403
user_permissions: FunctionUserAccessRights = (
406404
await wb_api_rpc.get_function_user_permissions(
407405
function_id=function_id, user_id=user_id, product_name=product_name
@@ -415,10 +413,6 @@ async def run_function( # noqa: PLR0913
415413

416414
from .function_jobs_routes import function_job_status
417415

418-
to_run_function = await wb_api_rpc.get_function(
419-
function_id=function_id, user_id=user_id, product_name=product_name
420-
)
421-
422416
joined_inputs = _join_inputs(
423417
to_run_function.default_inputs,
424418
function_inputs,
@@ -443,10 +437,17 @@ async def run_function( # noqa: PLR0913
443437
):
444438
for cached_function_job in cached_function_jobs:
445439
job_status = await function_job_status(
440+
function=to_run_function,
441+
function_job=cached_function_job,
442+
stored_job_status=await get_stored_job_status(
443+
function_job_id=cached_function_job.uid,
444+
user_id=user_id,
445+
product_name=product_name,
446+
wb_api_rpc=wb_api_rpc,
447+
),
446448
wb_api_rpc=wb_api_rpc,
447-
director2_api=director2_api,
448-
function_job_id=cached_function_job.uid,
449449
user_id=user_id,
450+
director2_api=director2_api,
450451
product_name=product_name,
451452
)
452453
if job_status.status == RunningState.SUCCESS:
@@ -563,9 +564,10 @@ async def delete_function(
563564
),
564565
)
565566
async def map_function( # noqa: PLR0913
567+
request: Request,
566568
function_id: FunctionID,
569+
to_run_function: Annotated[RegisteredFunction, Depends(get_function)],
567570
function_inputs_list: FunctionInputsList,
568-
request: Request,
569571
wb_api_rpc: Annotated[WbApiRpcClient, Depends(get_wb_api_rpc_client)],
570572
webserver_api: Annotated[AuthSession, Depends(get_webserver_session)],
571573
url_for: Annotated[Callable, Depends(get_reverse_url_mapper)],
@@ -577,11 +579,11 @@ async def map_function( # noqa: PLR0913
577579
x_simcore_parent_project_uuid: Annotated[ProjectID | Literal["null"], Header()],
578580
x_simcore_parent_node_id: Annotated[NodeID | Literal["null"], Header()],
579581
) -> RegisteredFunctionJobCollection:
580-
function_jobs = []
581582
function_jobs = [
582583
await run_function(
583584
wb_api_rpc=wb_api_rpc,
584585
function_id=function_id,
586+
to_run_function=to_run_function,
585587
function_inputs=function_inputs,
586588
product_name=product_name,
587589
user_id=user_id,

services/api-server/tests/unit/api_functions/conftest.py

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -142,19 +142,17 @@ def mock_registered_solver_function(
142142
sample_output_schema: JSONFunctionOutputSchema,
143143
) -> RegisteredFunction:
144144
return RegisteredSolverFunction(
145-
**{
146-
"title": "test_function",
147-
"function_class": FunctionClass.SOLVER,
148-
"description": "A test function",
149-
"input_schema": sample_input_schema,
150-
"output_schema": sample_output_schema,
151-
"default_inputs": None,
152-
"uid": f"{uuid4()}",
153-
"created_at": datetime.datetime.now(datetime.UTC),
154-
"modified_at": datetime.datetime.now(datetime.UTC),
155-
"solver_key": "simcore/services/comp/ans-model",
156-
"solver_version": "1.0.1",
157-
}
145+
title="test_function",
146+
function_class=FunctionClass.SOLVER,
147+
description="A test function",
148+
input_schema=sample_input_schema,
149+
output_schema=sample_output_schema,
150+
default_inputs=None,
151+
uid=uuid4(),
152+
created_at=datetime.datetime.now(datetime.UTC),
153+
modified_at=datetime.datetime.now(datetime.UTC),
154+
solver_key="simcore/services/comp/ans-model",
155+
solver_version="1.0.1",
158156
)
159157

160158

0 commit comments

Comments
 (0)