Skip to content

Commit 628f106

Browse files
continue fixing
1 parent c34c99c commit 628f106

File tree

7 files changed

+100
-23
lines changed

7 files changed

+100
-23
lines changed

packages/models-library/src/models_library/errors.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
from typing import Any, TypedDict
1+
from typing import Any
2+
3+
from typing_extensions import TypedDict
24

35
Loc = tuple[int | str, ...]
46

services/director-v2/src/simcore_service_director_v2/models/comp_runs.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import datetime
22
from contextlib import suppress
3-
from typing import Any, ClassVar, TypedDict
43

54
from models_library.clusters import DEFAULT_CLUSTER_ID, ClusterID
65
from models_library.projects import ProjectID
76
from models_library.projects_nodes_io import NodeID
87
from models_library.projects_state import RunningState
98
from models_library.users import UserID
10-
from pydantic import field_validator, ConfigDict, BaseModel, PositiveInt
9+
from pydantic import BaseModel, ConfigDict, PositiveInt, field_validator
1110
from simcore_postgres_database.models.comp_pipeline import StateType
11+
from typing_extensions import TypedDict
1212

1313
from ..utils.db import DB_TO_RUNNING_STATE
1414

@@ -81,6 +81,7 @@ def convert_null_to_empty_metadata(cls, v):
8181
if v is None:
8282
v = RunMetadataDict()
8383
return v
84+
8485
model_config = ConfigDict(
8586
from_attributes=True,
8687
json_schema_extra={
@@ -118,5 +119,5 @@ def convert_null_to_empty_metadata(cls, v):
118119
"use_on_demand_clusters": False,
119120
},
120121
]
121-
}
122+
},
122123
)

services/director-v2/src/simcore_service_director_v2/models/comp_tasks.py

Lines changed: 82 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,14 @@
1515
from models_library.services_regex import SERVICE_KEY_RE
1616
from models_library.services_resources import BootMode
1717
from pydantic import (
18-
TypeAdapter, ValidationInfo, field_validator, ConfigDict, BaseModel,
18+
BaseModel,
1919
ByteSize,
20+
ConfigDict,
2021
Field,
2122
PositiveInt,
23+
TypeAdapter,
24+
ValidationInfo,
25+
field_validator,
2226
)
2327
from simcore_postgres_database.models.comp_pipeline import StateType
2428
from simcore_postgres_database.models.comp_tasks import NodeClass
@@ -37,7 +41,9 @@ class Image(BaseModel):
3741
default=None, deprecated=True, description="Use instead node_requirements"
3842
)
3943
node_requirements: NodeRequirements | None = Field(
40-
default=None, description="the requirements for the service to run on a node", validate_default=True
44+
default=None,
45+
description="the requirements for the service to run on a node",
46+
validate_default=True,
4147
)
4248
boot_mode: BootMode = BootMode.CPU
4349
command: list[str] = Field(
@@ -64,6 +70,7 @@ def migrate_from_requirements(cls, v, info: ValidationInfo):
6470
RAM=TypeAdapter(ByteSize).validate_python("128 MiB"),
6571
)
6672
return v
73+
6774
model_config = ConfigDict(
6875
from_attributes=True,
6976
json_schema_extra={
@@ -73,7 +80,9 @@ def migrate_from_requirements(cls, v, info: ValidationInfo):
7380
"tag": "1.3.1",
7481
"node_requirements": node_req_example,
7582
}
76-
for node_req_example in NodeRequirements.model_config["json_schema_extra"]["examples"]
83+
for node_req_example in NodeRequirements.model_config[
84+
"json_schema_extra"
85+
]["examples"]
7786
]
7887
+
7988
# old version
@@ -85,16 +94,14 @@ def migrate_from_requirements(cls, v, info: ValidationInfo):
8594
"requires_mpi": False,
8695
}
8796
]
88-
}
97+
},
8998
)
9099

91100

92101
# NOTE: for a long time defaultValue field was added to ServiceOutput wrongly in the DB.
93102
# this flags allows parsing of the outputs without error. This MUST not leave the director-v2!
94103
class _ServiceOutputOverride(ServiceOutput):
95-
model_config = ConfigDict(
96-
extra = "ignore"
97-
)
104+
model_config = ConfigDict(extra="ignore")
98105

99106

100107
_ServiceOutputsOverride = dict[ServicePortKey, _ServiceOutputOverride]
@@ -103,7 +110,7 @@ class _ServiceOutputOverride(ServiceOutput):
103110
class NodeSchema(BaseModel):
104111
inputs: ServiceInputsDict = Field(..., description="the inputs scheam")
105112
outputs: _ServiceOutputsOverride = Field(..., description="the outputs schema")
106-
model_config = ConfigDict(extra="ignore", extra="forbid", from_attributes=True)
113+
model_config = ConfigDict(extra="forbid", from_attributes=True)
107114

108115

109116
class CompTaskAtDB(BaseModel):
@@ -170,8 +177,73 @@ def backward_compatible_null_value(cls, v: HardwareInfo | None) -> HardwareInfo:
170177
return v
171178

172179
def to_db_model(self, **exclusion_rules) -> dict[str, Any]:
173-
comp_task_dict = self.model_dump(by_alias=True, exclude_unset=True, **exclusion_rules)
180+
comp_task_dict = self.model_dump(
181+
by_alias=True, exclude_unset=True, **exclusion_rules
182+
)
174183
if "state" in comp_task_dict:
175184
comp_task_dict["state"] = RUNNING_STATE_TO_DB[comp_task_dict["state"]].value
176185
return comp_task_dict
177-
model_config = ConfigDict(extra="forbid", from_attributes=True)
186+
187+
model_config = ConfigDict(
188+
extra="forbid",
189+
from_attributes=True,
190+
json_schema_extra={
191+
"examples": [
192+
# DB model
193+
{
194+
"task_id": 324,
195+
"project_id": "341351c4-23d1-4366-95d0-bc01386001a7",
196+
"node_id": "7f62be0e-1298-4fe4-be76-66b6e859c260",
197+
"job_id": None,
198+
"internal_id": 3,
199+
"schema": {
200+
"inputs": {
201+
"input_1": {
202+
"label": "input_files",
203+
"description": "Any input files. One or serveral files compressed in a zip will be downloaded in an inputs folder.",
204+
"type": "data:*/*",
205+
"displayOrder": 1.0,
206+
}
207+
},
208+
"outputs": {
209+
"output_1": {
210+
"label": "Output files",
211+
"description": "Output files uploaded from the outputs folder",
212+
"type": "data:*/*",
213+
"displayOrder": 1.0,
214+
}
215+
},
216+
},
217+
"inputs": {
218+
"input_1": {
219+
"nodeUuid": "48a7ac7a-cfc3-44a6-ba9b-5a1a578b922c",
220+
"output": "output_1",
221+
}
222+
},
223+
"outputs": {
224+
"output_1": {
225+
"store": 0,
226+
"path": "341351c4-23d1-4366-95d0-bc01386001a7/7f62be0e-1298-4fe4-be76-66b6e859c260/output_1.zip",
227+
}
228+
},
229+
"image": image_example,
230+
"submit": "2021-03-01 13:07:34.19161",
231+
"node_class": "INTERACTIVE",
232+
"state": "NOT_STARTED",
233+
"progress": 0.44,
234+
"last_heartbeat": None,
235+
"created": "2022-05-20 13:28:31.139+00",
236+
"modified": "2023-06-23 15:58:32.833081+00",
237+
"pricing_info": {
238+
"pricing_plan_id": 1,
239+
"pricing_unit_id": 1,
240+
"pricing_unit_cost_id": 1,
241+
},
242+
"hardware_info": HardwareInfo.model_config["json_schema_extra"][
243+
"examples"
244+
][0],
245+
}
246+
for image_example in Image.model_config["json_schema_extra"]["examples"]
247+
]
248+
},
249+
)

services/director-v2/tests/unit/test_models_schemas_dynamic_services_scheduler.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from pathlib import Path
66

77
import pytest
8-
from pydantic import parse_file_as
8+
from pydantic import TypeAdapter
99
from simcore_service_director_v2.models.dynamic_services_scheduler import SchedulerData
1010

1111

@@ -20,13 +20,13 @@ def test_regression_as_label_data(scheduler_data: SchedulerData) -> None:
2020
# old tested implementation
2121
scheduler_data_copy = deepcopy(scheduler_data)
2222
scheduler_data_copy.compose_spec = json.dumps(scheduler_data_copy.compose_spec)
23-
json_encoded = scheduler_data_copy.json()
23+
json_encoded = scheduler_data_copy.model_dump_json()
2424

2525
# using pydantic's internals
2626
label_data = scheduler_data.as_label_data()
2727

28-
parsed_json_encoded = SchedulerData.parse_raw(json_encoded)
29-
parsed_label_data = SchedulerData.parse_raw(label_data)
28+
parsed_json_encoded = SchedulerData.model_validate_json(json_encoded)
29+
parsed_label_data = SchedulerData.model_validate_json(label_data)
3030
assert parsed_json_encoded == parsed_label_data
3131

3232

@@ -35,4 +35,6 @@ def test_ensure_legacy_format_compatibility(legacy_scheduler_data_format: Path):
3535

3636
# PRs applying changes to the legacy format:
3737
# - https://github.com/ITISFoundation/osparc-simcore/pull/3610
38-
assert parse_file_as(list[SchedulerData], legacy_scheduler_data_format)
38+
assert TypeAdapter(list[SchedulerData]).validate_json(
39+
legacy_scheduler_data_format.read_text()
40+
)

services/director-v2/tests/unit/test_modules_dynamic_sidecar_client_api_thin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from httpx import Response
1212
from models_library.services_creation import CreateServiceMetricsAdditionalParams
1313
from models_library.sidecar_volumes import VolumeCategory, VolumeStatus
14-
from pydantic import AnyHttpUrl, parse_obj_as
14+
from pydantic import AnyHttpUrl, TypeAdapter, parse_obj_as
1515
from pytest_simcore.helpers.typing_env import EnvVarsDict
1616
from respx import MockRouter, Route
1717
from respx.types import SideEffectTypes

services/director-v2/tests/unit/test_modules_dynamic_sidecar_docker_compose_specs.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ async def test_inject_resource_limits_and_reservations(
156156
[
157157
pytest.param(
158158
json.loads(
159-
SimcoreServiceLabels.Config.schema_extra["examples"][2][
159+
SimcoreServiceLabels.model_config["json_schema_extra"]["examples"][2][
160160
"simcore.service.compose-spec"
161161
]
162162
),

services/director-v2/tests/unit/test_utils_comp_scheduler.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ def test_get_resource_tracking_run_id(
7878
@pytest.mark.parametrize(
7979
"task",
8080
[
81-
CompTaskAtDB.parse_obj(example)
82-
for example in CompTaskAtDB.Config.schema_extra["examples"]
81+
CompTaskAtDB.model_validate(example)
82+
for example in CompTaskAtDB.model_config["json_schema_extra"]["examples"]
8383
],
8484
ids=str,
8585
)

0 commit comments

Comments
 (0)