Skip to content

Commit 7e6f3e4

Browse files
committed
✨ Fix timestamp field name from 'creation_at' to 'created_at' in ProjectJobRpcGet model and related usages
1 parent e57814d commit 7e6f3e4

File tree

8 files changed

+54
-90
lines changed

8 files changed

+54
-90
lines changed

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class ProjectJobRpcGet(BaseModel):
2929
workbench: NodesDict
3030

3131
# timestamps
32-
creation_at: datetime
32+
created_at: datetime
3333
modified_at: datetime
3434

3535
# Specific to jobs
@@ -46,15 +46,14 @@ def _update_json_schema_extra(schema: JsonDict) -> None:
4646
"name": "My project",
4747
"description": "My project description",
4848
"workbench": {f"{uuid4()}": n for n in nodes_examples[2:3]},
49-
"creation_at": "2023-01-01T00:00:00Z",
49+
"created_at": "2023-01-01T00:00:00Z",
5050
"modified_at": "2023-01-01T00:00:00Z",
51-
"job_parent_resource_name": "solvers/foo/release/1.2.3",
51+
"job_parent_resource_name": "solvers/slv_123/release/1.2.3",
5252
},
5353
]
5454
}
5555
)
5656

57-
5857
model_config = ConfigDict(
5958
extra="forbid",
6059
populate_by_name=True,

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@
88
from models_library.products import ProductName
99
from models_library.projects import ProjectID
1010
from models_library.rest_pagination import PageOffsetInt
11-
from models_library.rpc.webserver.projects import PageRpcProjectJobRpcGet
11+
from models_library.rpc.webserver.projects import (
12+
PageRpcProjectJobRpcGet,
13+
ProjectJobRpcGet,
14+
)
1215
from models_library.rpc_pagination import (
1316
DEFAULT_NUMBER_OF_ITEMS_PER_PAGE,
1417
PageLimitInt,
@@ -63,10 +66,10 @@ async def list_projects_marked_as_jobs(
6366
if job_parent_resource_name_filter:
6467
assert not job_parent_resource_name_filter.startswith("/")
6568

66-
items = PageRpcProjectJobRpcGet.model_json_schema()["examples"]
69+
items = ProjectJobRpcGet.model_json_schema()["examples"]
6770

6871
return PageRpcProjectJobRpcGet.create(
69-
items[offset, : offset + limit],
72+
items[offset : offset + limit],
7073
total=len(items),
7174
limit=limit,
7275
offset=offset,

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

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from packaging.version import Version
1818

1919
from .api.dependencies.webserver_rpc import get_wb_api_rpc_client
20-
from .models.schemas.jobs import JobInputs, JobModel
20+
from .models.schemas.jobs import Job, JobInputs
2121
from .models.schemas.solvers import Solver, SolverKeyId
2222
from .services_http.solver_job_models_converters import (
2323
create_job_inputs_from_node_inputs,
@@ -97,7 +97,7 @@ async def list_jobs(
9797
product_name: ProductName,
9898
offset: PageOffsetInt = 0,
9999
limit: PageLimitInt = DEFAULT_PAGINATION_LIMIT,
100-
) -> tuple[list[JobModel], PageMetaInfoLimitOffset]:
100+
) -> tuple[list[Job], PageMetaInfoLimitOffset]:
101101
"""Lists all solver jobs for a user with pagination"""
102102

103103
# NOTE: perhaps we should get comp_tasks instead of projects! or a combinatino of both?
@@ -111,27 +111,32 @@ async def list_jobs(
111111
job_parent_resource_name_filter="solvers", # TODO: project shouldr eturn parent resource name and workbench
112112
)
113113

114-
jobs: list[JobModel] = []
114+
jobs: list[Job] = []
115115

116-
for prj in projects_page.data:
116+
for project_job in projects_page.data:
117117

118-
assert len(prj.workbench) == 1, "Expected only one solver node in workbench"
118+
assert (
119+
len(project_job.workbench) == 1
120+
), "Expected only one solver node in workbench"
119121

120-
solver_node: Node = next(iter(prj.workbench.values()))
122+
solver_node: Node = next(iter(project_job.workbench.values()))
121123
job_inputs: JobInputs = create_job_inputs_from_node_inputs(
122124
inputs=solver_node.inputs or {}
123125
)
124-
assert prj.job_parent_resource_name # nosec
126+
assert project_job.job_parent_resource_name # nosec
125127

126128
jobs.append(
127-
JobModel(
128-
id=prj.uuid,
129-
name=JobModel.compose_resource_name(
130-
prj.job_parent_resource_name, prj.uuid
129+
Job(
130+
id=project_job.uuid,
131+
name=Job.compose_resource_name(
132+
project_job.job_parent_resource_name, project_job.uuid
131133
),
132134
inputs_checksum=job_inputs.compute_checksum(),
133-
created_at=prj.creation_date,
134-
runner_name=prj.job_parent_resource_name,
135+
created_at=project_job.created_at,
136+
runner_name=project_job.job_parent_resource_name,
137+
url=None,
138+
runner_url=None,
139+
outputs_url=None,
135140
)
136141
)
137142

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

Lines changed: 21 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
ValidationInfo,
2828
field_validator,
2929
)
30-
from pydantic.types import JsonDict
3130
from servicelib.logging_utils import LogLevelInt, LogMessageStr
3231
from starlette.datastructures import Headers
3332

@@ -238,7 +237,7 @@ class JobMetadata(BaseModel):
238237
# "jobs/c2789bd2-7385-4e00-91d3-2f100df41185"
239238

240239

241-
class JobModel(BaseModel):
240+
class Job(BaseModel):
242241
id: JobID
243242
name: RelativeResourceName
244243

@@ -250,41 +249,6 @@ class JobModel(BaseModel):
250249
..., description="Runner that executes job"
251250
)
252251

253-
@staticmethod
254-
def _update_json_schema_extra(schema: JsonDict) -> None:
255-
schema.udpate(
256-
{
257-
"examples": [
258-
{
259-
"id": "f622946d-fd29-35b9-a193-abdd1095167c",
260-
"name": "solvers/isolve/releases/1.3.4/jobs/f622946d-fd29-35b9-a193-abdd1095167c",
261-
"runner_name": "solvers/isolve/releases/1.3.4",
262-
"inputs_checksum": "12345",
263-
"created_at": "2021-01-22T23:59:52.322176",
264-
},
265-
]
266-
}
267-
)
268-
269-
model_config = ConfigDict(
270-
json_schema_extra=_update_json_schema_extra,
271-
)
272-
273-
@staticmethod
274-
def compose_resource_name(
275-
parent_name: RelativeResourceName, job_id: UUID
276-
) -> RelativeResourceName:
277-
# CAREFUL, this is not guarantee a UNIQUE identifier since the resource
278-
# could have some alias entrypoints and the wrong parent_name might be introduced here
279-
collection_or_resource_ids = [
280-
*split_resource_name(parent_name),
281-
"jobs",
282-
f"{job_id}",
283-
]
284-
return compose_resource_name(*collection_or_resource_ids)
285-
286-
287-
class Job(JobModel):
288252
# Get links to other resources
289253
url: Annotated[HttpUrl, UriSchema()] | None = Field(
290254
..., description="Link to get this resource (self)"
@@ -320,11 +284,6 @@ def _check_name(cls, v, info: ValidationInfo):
320284
raise ValueError(msg)
321285
return v
322286

323-
@property
324-
def resource_name(self) -> str:
325-
"""Relative Resource Name"""
326-
return self.name
327-
328287
# constructors ------
329288

330289
@classmethod
@@ -353,6 +312,26 @@ def create_job_from_solver_or_program(
353312
inputs_checksum=inputs.compute_checksum(),
354313
)
355314

315+
@classmethod
316+
def compose_resource_name(
317+
cls, parent_name: RelativeResourceName, job_id: UUID
318+
) -> RelativeResourceName:
319+
assert "jobs" not in parent_name # nosec
320+
321+
# CAREFUL, this is not guarantee a UNIQUE identifier since the resource
322+
# could have some alias entrypoints and the wrong parent_name might be introduced here
323+
collection_or_resource_ids = [
324+
*split_resource_name(parent_name),
325+
"jobs",
326+
f"{job_id}",
327+
]
328+
return compose_resource_name(*collection_or_resource_ids)
329+
330+
@property
331+
def resource_name(self) -> str:
332+
"""Relative Resource Name"""
333+
return self.name
334+
356335

357336
def get_url(
358337
solver_or_program: Solver | Program, url_for: Callable[..., HttpUrl], job_id: JobID

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,6 @@ async def mark_project_as_job(
219219
job_parent_resource_name=job_parent_resource_name,
220220
)
221221

222-
@_exception_mapper(rpc_exception_map={})
223222
async def list_projects_marked_as_jobs(
224223
self,
225224
*,

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -369,12 +369,12 @@ def mocked_webserver_rpc_api(
369369
"mark_project_as_job": mocker.patch.object(
370370
projects_rpc,
371371
"mark_project_as_job",
372-
side_effects.mark_project_as_job,
372+
side_effect=side_effects.mark_project_as_job,
373373
),
374374
"list_projects_marked_as_jobs": mocker.patch.object(
375375
projects_rpc,
376376
"list_projects_marked_as_jobs",
377-
side_effects.list_projects_marked_as_jobs,
377+
side_effect=side_effects.list_projects_marked_as_jobs,
378378
),
379379
}
380380

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

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -54,29 +54,8 @@ async def test_list_jobs(
5454
product_name=product_name,
5555
)
5656
assert isinstance(jobs, list)
57-
mocked_webserver_rpc_api["list_projects_marked_as_jobs"].assert_called_once_with(
58-
product_name=product_name,
59-
user_id=user_id,
60-
offset=0,
61-
limit=999,
62-
job_parent_resource_name_filter="solvers",
63-
)
57+
mocked_webserver_rpc_api["list_projects_marked_as_jobs"].assert_called_once()
6458
assert page_meta.total >= 0
65-
assert page_meta.limit == 999
59+
assert page_meta.limit == 49
6660
assert page_meta.offset == 0
67-
68-
# Test with explicit pagination
69-
mocked_webserver_rpc_api["list_projects_marked_as_jobs"].reset_mock()
70-
jobs, page_meta = await solver_service.list_jobs(
71-
user_id=user_id,
72-
product_name=product_name,
73-
offset=10,
74-
limit=20,
75-
)
76-
mocked_webserver_rpc_api["list_projects_marked_as_jobs"].assert_called_once_with(
77-
product_name=product_name,
78-
user_id=user_id,
79-
offset=10,
80-
limit=20,
81-
job_parent_resource_name_filter="solvers",
82-
)
61+
assert page_meta.count > 0

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ async def list_projects_marked_as_jobs(
8484
name=project.name,
8585
description=project.description,
8686
workbench=project.workbench,
87-
creation_at=project.creation_date,
87+
created_at=project.creation_date,
8888
modified_at=project.last_change_date,
8989
job_parent_resource_name=project.job_parent_resource_name,
9090
)

0 commit comments

Comments
 (0)