Skip to content

Commit 4ebe773

Browse files
committed
✨ Enhance job listing functionality by adding solver filters and updating job URLs
1 parent ae51eb2 commit 4ebe773

File tree

3 files changed

+65
-5
lines changed

3 files changed

+65
-5
lines changed

services/api-server/src/simcore_service_api_server/_service_solvers.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,27 +95,40 @@ async def list_jobs(
9595
*,
9696
user_id: UserID,
9797
product_name: ProductName,
98+
# filters
99+
solver_id: SolverKeyId | None = None,
100+
solver_version: VersionStr | None = None,
101+
# pagination
98102
offset: PageOffsetInt = 0,
99103
limit: PageLimitInt = DEFAULT_PAGINATION_LIMIT,
100104
) -> tuple[list[Job], PageMetaInfoLimitOffset]:
101105
"""Lists all solver jobs for a user with pagination"""
102106

103107
# NOTE: perhaps we should get comp_tasks instead of projects! or a combinatino of both?
104108
# I need inputs_checksum and job_parent_source_name!
109+
# FIXME: this is still buggy. soldve_id and solver_version need to be encoded!
110+
job_parent_resource_name_filter = "solvers"
111+
if solver_id:
112+
job_parent_resource_name_filter += f"/{solver_id}"
113+
if solver_version:
114+
job_parent_resource_name_filter += f"/{solver_version}"
115+
elif solver_version:
116+
msg = "solver_version is set but solver_id is not. Please provide both or none of them"
117+
raise ValueError(msg)
105118

106119
projects_page = await self._webserver_client.list_projects_marked_as_jobs(
107120
product_name=product_name,
108121
user_id=user_id,
109122
offset=offset,
110123
limit=limit,
111-
job_parent_resource_name_filter="solvers", # TODO: project shouldr eturn parent resource name and workbench
124+
job_parent_resource_name_filter=job_parent_resource_name_filter,
112125
)
113126

114127
jobs: list[Job] = []
115128

116129
for project_job in projects_page.data:
117130

118-
assert (
131+
assert ( # nosec
119132
len(project_job.workbench) == 1
120133
), "Expected only one solver node in workbench"
121134

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

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from pydantic.types import PositiveInt
1919
from servicelib.fastapi.requests_decorators import cancel_on_disconnect
2020
from servicelib.logging_utils import log_context
21+
from simcore_service_api_server.models.api_resources import parse_resources_ids
2122
from sqlalchemy.ext.asyncio import AsyncEngine
2223

2324
from ..._service_solvers import SolverService
@@ -35,6 +36,7 @@
3536
JobLog,
3637
JobMetadata,
3738
JobOutputs,
39+
update_job_urls,
3840
)
3941
from ...models.schemas.model_adapter import (
4042
PricingUnitGetLegacy,
@@ -131,11 +133,26 @@ async def list_all_solvers_jobs(
131133
user_id: Annotated[PositiveInt, Depends(get_current_user_id)],
132134
page_params: Annotated[PaginationParams, Depends()],
133135
solver_service: Annotated[SolverService, Depends(SolverService)],
134-
webserver_api: Annotated[AuthSession, Depends(get_webserver_session)],
135136
url_for: Annotated[Callable, Depends(get_reverse_url_mapper)],
136137
product_name: Annotated[str, Depends(get_product_name)],
137138
):
138-
raise NotImplementedError
139+
140+
jobs, meta = await solver_service.list_jobs(
141+
product_name=product_name,
142+
user_id=user_id,
143+
offset=page_params.offset,
144+
limit=page_params.limit,
145+
)
146+
147+
for job in jobs:
148+
solver_key, version, job_id = parse_resources_ids(job.resource_name)
149+
update_job_urls(job, solver_key, version, job_id, url_for)
150+
151+
return create_page(
152+
jobs,
153+
total=meta.total,
154+
params=page_params,
155+
)
139156

140157

141158
@router.get(

services/api-server/src/simcore_service_api_server/models/schemas/jobs.py

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
# - custom metadata
5151
#
5252
from .programs import Program, ProgramKeyId
53-
from .solvers import Solver
53+
from .solvers import Solver, SolverKeyId
5454

5555
JobID: TypeAlias = UUID
5656

@@ -371,6 +371,36 @@ def get_outputs_url(
371371
return None
372372

373373

374+
def update_job_urls(
375+
job: Job,
376+
solver_key: SolverKeyId,
377+
solver_version: VersionStr,
378+
job_id: JobID | str,
379+
url_for: Callable[..., HttpUrl],
380+
) -> Job:
381+
job.url = url_for(
382+
"get_job",
383+
solver_key=solver_key,
384+
version=solver_version,
385+
job_id=job_id,
386+
)
387+
388+
job.runner_url = url_for(
389+
"get_solver_release",
390+
solver_key=solver_key,
391+
version=solver_version,
392+
)
393+
394+
job.outputs_url = url_for(
395+
"get_job_outputs",
396+
solver_key=solver_key,
397+
version=solver_version,
398+
job_id=job_id,
399+
)
400+
401+
return job
402+
403+
374404
PercentageInt: TypeAlias = Annotated[int, Field(ge=0, le=100)]
375405

376406

0 commit comments

Comments
 (0)