Skip to content

Commit 4d59a64

Browse files
committed
refactoring
1 parent 8fdc1e9 commit 4d59a64

File tree

7 files changed

+97
-75
lines changed

7 files changed

+97
-75
lines changed

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

Lines changed: 6 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ async def create_solver_or_program_job(
2929
) -> Job:
3030
# creates NEW job as prototype
3131
pre_job = Job.create_job_from_solver_or_program(
32-
solver_or_program=solver_or_program, inputs=inputs
32+
solver_or_program_name=solver_or_program.name, inputs=inputs
3333
)
3434
_logger.debug("Creating Job '%s'", pre_job.name)
3535

@@ -46,54 +46,13 @@ async def create_solver_or_program_job(
4646
assert new_project.uuid == pre_job.id # nosec
4747

4848
# for consistency, it rebuild job
49-
50-
# create urls
51-
url = None
52-
runner_url = None
53-
outputs_url = None
54-
if isinstance(solver_or_program, Solver):
55-
url = url_for(
56-
"get_job",
57-
solver_key=solver_or_program.id,
58-
version=solver_or_program.version,
59-
job_id=pre_job.id,
60-
)
61-
runner_url = url_for(
62-
"get_solver_release",
63-
solver_key=solver_or_program.id,
64-
version=solver_or_program.version,
65-
)
66-
outputs_url = url_for(
67-
"get_job_outputs",
68-
solver_key=solver_or_program.id,
69-
version=solver_or_program.version,
70-
job_id=pre_job.id,
71-
)
72-
7349
job = create_job_from_project(
74-
solver_key=solver_or_program.id,
75-
solver_version=solver_or_program.version,
76-
project=new_project,
77-
url=url,
78-
runner_url=runner_url,
79-
outputs_url=outputs_url,
50+
solver_or_program=solver_or_program, project=new_project, url_for=url_for
8051
)
8152
assert job.id == pre_job.id # nosec
8253
assert job.name == pre_job.name # nosec
83-
resource_name = ""
84-
if isinstance(solver_or_program, Program):
85-
resource_name = Job.compose_resource_name(
86-
parent_name=Program.compose_resource_name(
87-
solver_or_program.id, solver_or_program.version
88-
),
89-
job_id=job.id,
90-
)
91-
if isinstance(solver_or_program, Solver):
92-
resource_name = Job.compose_resource_name(
93-
parent_name=Solver.compose_resource_name(
94-
solver_or_program.id, solver_or_program.version
95-
),
96-
job_id=job.id,
97-
)
98-
assert job.name == resource_name
54+
assert job.name == Job.compose_resource_name(
55+
parent_name=solver_or_program.resource_name,
56+
job_id=job.id,
57+
)
9958
return job

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

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,9 @@ async def list_jobs(
147147

148148
jobs: deque[Job] = deque()
149149
for prj in projects_page.data:
150-
job = create_job_from_project(solver_key, version, prj, url_for)
150+
job = create_job_from_project(
151+
solver_or_program=solver, project=prj, url_for=url_for
152+
)
151153
assert job.id == prj.uuid # nosec
152154
assert job.name == prj.name # nosec
153155

@@ -191,7 +193,7 @@ async def get_jobs_page(
191193
)
192194

193195
jobs: list[Job] = [
194-
create_job_from_project(solver_key, version, prj, url_for)
196+
create_job_from_project(solver_or_program=solver, project=prj, url_for=url_for)
195197
for prj in projects_page.data
196198
]
197199

@@ -211,17 +213,28 @@ async def get_job(
211213
solver_key: SolverKeyId,
212214
version: VersionStr,
213215
job_id: JobID,
216+
user_id: Annotated[PositiveInt, Depends(get_current_user_id)],
217+
product_name: Annotated[str, Depends(get_product_name)],
214218
webserver_api: Annotated[AuthSession, Depends(get_webserver_session)],
219+
catalog_client: Annotated[CatalogApi, Depends(get_api_client(CatalogApi))],
215220
url_for: Annotated[Callable, Depends(get_reverse_url_mapper)],
216221
):
217222
"""Gets job of a given solver"""
218223
_logger.debug(
219224
"Getting Job '%s'", _compose_job_resource_name(solver_key, version, job_id)
220225
)
221226

227+
solver = await catalog_client.get_solver(
228+
user_id=user_id,
229+
name=solver_key,
230+
version=version,
231+
product_name=product_name,
232+
)
222233
project: ProjectGet = await webserver_api.get_project(project_id=job_id)
223234

224-
job = create_job_from_project(solver_key, version, project, url_for)
235+
job = create_job_from_project(
236+
solver_or_program=solver, project=project, url_for=url_for
237+
)
225238
assert job.id == job_id # nosec
226239
return job # nosec
227240

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@
2525
from starlette.datastructures import Headers
2626

2727
from ...models.schemas.files import File
28-
from ...models.schemas.programs import Program
29-
from ...models.schemas.solvers import Solver
3028
from .._utils_pydantic import UriSchema
3129
from ..api_resources import (
3230
RelativeResourceName,
@@ -257,10 +255,10 @@ def create_now(
257255

258256
@classmethod
259257
def create_job_from_solver_or_program(
260-
cls, *, solver_or_program: Solver | Program, inputs: JobInputs
258+
cls, *, solver_or_program_name: str, inputs: JobInputs
261259
):
262260
return Job.create_now(
263-
parent_name=solver_or_program.name,
261+
parent_name=solver_or_program_name,
264262
inputs_checksum=inputs.compute_checksum(),
265263
)
266264

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import urllib.parse
2+
from collections.abc import Callable
23
from typing import Annotated
34

45
import packaging.version
@@ -8,6 +9,7 @@
89
from pydantic import BaseModel, ConfigDict, Field, HttpUrl, StringConstraints
910

1011
from ...models._utils_pydantic import UriSchema
12+
from ...models.schemas.jobs import JobID
1113
from ..api_resources import compose_resource_name
1214
from ..basic_types import VersionStr
1315

@@ -106,10 +108,24 @@ def name(self) -> str:
106108
"""API standards notation (see api_resources.py)"""
107109
return self.resource_name
108110

111+
def get_url(self, url_for: Callable[..., HttpUrl], job_id: JobID) -> HttpUrl | None:
112+
# missing endpoint
113+
return None
114+
115+
def get_runner_url(self, url_for: Callable[..., HttpUrl]) -> HttpUrl | None:
116+
# missing endpoint
117+
return None
118+
119+
def get_outputs_url(
120+
self, url_for: Callable[..., HttpUrl], job_id: JobID
121+
) -> HttpUrl | None:
122+
# missing endpoint
123+
return None
124+
109125
@classmethod
110126
def compose_resource_name(
111127
cls, program_key: ProgramKeyId, program_version: VersionStr
112128
) -> str:
113129
return compose_resource_name(
114-
"solvers", program_key, "releases", program_version
130+
"programs", program_key, "releases", program_version
115131
)

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import urllib.parse
2+
from collections.abc import Callable
23
from typing import Annotated, Any, Literal
34

45
import packaging.version
@@ -7,6 +8,7 @@
78
from models_library.services_regex import COMPUTATIONAL_SERVICE_KEY_RE
89
from packaging.version import Version
910
from pydantic import BaseModel, ConfigDict, Field, HttpUrl, StringConstraints
11+
from simcore_service_api_server.models.schemas.jobs import JobID
1012

1113
from ...models._utils_pydantic import UriSchema
1214
from ..api_resources import compose_resource_name
@@ -107,6 +109,31 @@ def name(self) -> str:
107109
"""API standards notation (see api_resources.py)"""
108110
return self.resource_name
109111

112+
def get_url(self, url_for: Callable[..., HttpUrl], job_id: JobID) -> HttpUrl:
113+
return url_for(
114+
"get_job",
115+
solver_key=self.id,
116+
version=self.version,
117+
job_id=job_id,
118+
)
119+
120+
def get_runner_url(self, url_for: Callable[..., HttpUrl]) -> HttpUrl:
121+
return url_for(
122+
"get_solver_release",
123+
solver_key=self.id,
124+
version=self.version,
125+
)
126+
127+
def get_outputs_url(
128+
self, url_for: Callable[..., HttpUrl], job_id: JobID
129+
) -> HttpUrl:
130+
return url_for(
131+
"get_job_outputs",
132+
solver_key=self.id,
133+
version=self.version,
134+
job_id=job_id,
135+
)
136+
110137
@classmethod
111138
def compose_resource_name(cls, solver_key, solver_version) -> str:
112139
return compose_resource_name("solvers", solver_key, "releases", solver_version)

services/api-server/src/simcore_service_api_server/services_http/solver_job_models_converters.py

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,18 @@
55

66
import urllib.parse
77
import uuid
8+
from collections.abc import Callable
89
from datetime import UTC, datetime
910
from functools import lru_cache
1011

1112
import arrow
1213
from models_library.api_schemas_webserver.projects import ProjectCreateNew, ProjectGet
1314
from models_library.api_schemas_webserver.projects_ui import StudyUI
1415
from models_library.basic_types import KeyIDStr
16+
from models_library.projects import Project
1517
from models_library.projects_nodes import InputID
1618
from pydantic import HttpUrl, TypeAdapter
1719

18-
from ..models.basic_types import VersionStr
1920
from ..models.domain.projects import InputTypes, Node, SimCoreFileLink
2021
from ..models.schemas.files import File
2122
from ..models.schemas.jobs import (
@@ -26,7 +27,7 @@
2627
PercentageInt,
2728
)
2829
from ..models.schemas.programs import Program
29-
from ..models.schemas.solvers import Solver, SolverKeyId
30+
from ..models.schemas.solvers import Solver
3031
from .director_v2 import ComputationTaskGet
3132

3233
# UTILS ------
@@ -176,12 +177,10 @@ def create_new_project_for_job(
176177

177178

178179
def create_job_from_project(
179-
solver_key: SolverKeyId,
180-
solver_version: VersionStr,
181-
project: ProjectGet,
182-
url: HttpUrl | None,
183-
runner_url: HttpUrl | None,
184-
outputs_url: HttpUrl | None,
180+
*,
181+
solver_or_program: Solver | Program,
182+
project: ProjectGet | Project,
183+
url_for: Callable[..., HttpUrl],
185184
) -> Job:
186185
"""
187186
Given a project, creates a job
@@ -192,8 +191,8 @@ def create_job_from_project(
192191
raise ValidationError
193192
"""
194193
assert len(project.workbench) == 1 # nosec
195-
assert solver_version in project.name # nosec
196-
assert urllib.parse.quote_plus(solver_key) in project.name # nosec
194+
assert solver_or_program.version in project.name # nosec
195+
assert urllib.parse.quote_plus(solver_or_program.id) in project.name # nosec
197196

198197
# get solver node
199198
node_id = next(iter(project.workbench.keys()))
@@ -203,7 +202,7 @@ def create_job_from_project(
203202
)
204203

205204
# create solver's job
206-
solver_name = Solver.compose_resource_name(solver_key, solver_version)
205+
solver_or_program_name = solver_or_program.resource_name
207206

208207
job_id = project.uuid
209208

@@ -212,10 +211,10 @@ def create_job_from_project(
212211
name=project.name,
213212
inputs_checksum=job_inputs.compute_checksum(),
214213
created_at=project.creation_date, # type: ignore[arg-type]
215-
runner_name=solver_name,
216-
url=url,
217-
runner_url=runner_url,
218-
outputs_url=outputs_url,
214+
runner_name=solver_or_program_name,
215+
url=solver_or_program.get_url(url_for=url_for, job_id=job_id),
216+
runner_url=solver_or_program.get_runner_url(url_for=url_for),
217+
outputs_url=solver_or_program.get_outputs_url(url_for=url_for, job_id=job_id),
219218
)
220219

221220
return job

services/api-server/tests/unit/test_services_solver_job_models_converters.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from faker import Faker
77
from models_library.projects import Project
88
from models_library.projects_nodes import InputsDict, InputTypes, SimCoreFileLink
9-
from pydantic import RootModel, TypeAdapter, create_model
9+
from pydantic import HttpUrl, RootModel, TypeAdapter, create_model
1010
from simcore_service_api_server.models.schemas.files import File
1111
from simcore_service_api_server.models.schemas.jobs import ArgumentTypes, Job, JobInputs
1212
from simcore_service_api_server.models.schemas.solvers import Solver
@@ -48,7 +48,9 @@ def test_create_project_model_for_job(faker: Faker):
4848

4949
print(inputs.model_dump_json(indent=2))
5050

51-
job = Job.create_job_from_solver_or_program(solver_or_program=solver, inputs=inputs)
51+
job = Job.create_job_from_solver_or_program(
52+
solver_or_program_name=solver.name, inputs=inputs
53+
)
5254

5355
# body of create project!
5456
createproject_body = create_new_project_for_job(solver, job, inputs)
@@ -197,11 +199,19 @@ def test_create_job_from_project(faker: Faker):
197199
solver_key = "simcore/services/comp/itis/sleeper"
198200
solver_version = "2.0.2"
199201

200-
def fake_url_for(*args, **kwargs):
201-
return faker.url()
202+
def fake_url_for(*args, **kwargs) -> HttpUrl:
203+
return HttpUrl(faker.url())
204+
205+
solver = Solver(
206+
id=solver_key,
207+
version=solver_version,
208+
title=faker.text(),
209+
maintainer=faker.name(),
210+
url=None,
211+
)
202212

203213
job = create_job_from_project(
204-
solver_key, solver_version, project, url_for=fake_url_for
214+
solver_or_program=solver, project=project, url_for=fake_url_for
205215
)
206216

207217
assert job.id == project.uuid

0 commit comments

Comments
 (0)