Skip to content

Commit c2b4983

Browse files
GitHKAndrei Neagu
authored andcommitted
🎨 pydantic2 migration: fixed unit-tests for agent (#6546)
Co-authored-by: Andrei Neagu <[email protected]>
1 parent 463488b commit c2b4983

File tree

15 files changed

+184
-96
lines changed

15 files changed

+184
-96
lines changed

packages/service-library/src/servicelib/rabbitmq/rpc_interfaces/agent/errors.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
from pydantic.errors import PydanticErrorMixin
1+
from common_library.errors_classes import OsparcErrorMixin
22

33

4-
class BaseAgentRPCError(PydanticErrorMixin, Exception):
4+
class BaseAgentRPCError(OsparcErrorMixin, Exception):
55
...
66

77

services/agent/requirements/_base.txt

Lines changed: 89 additions & 26 deletions
Large diffs are not rendered by default.

services/agent/requirements/_test.txt

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
aioboto3==13.1.1
1+
aioboto3==13.2.0
22
# via -r requirements/_test.in
3-
aiobotocore==2.13.1
3+
aiobotocore==2.15.2
44
# via aioboto3
55
aiofiles==24.1.0
66
# via
77
# -c requirements/_base.txt
88
# aioboto3
9-
aiohappyeyeballs==2.4.0
9+
aiohappyeyeballs==2.4.3
1010
# via
1111
# -c requirements/_base.txt
1212
# aiohttp
13-
aiohttp==3.10.6
13+
aiohttp==3.10.10
1414
# via
1515
# -c requirements/../../../requirements/constraints.txt
1616
# -c requirements/_base.txt
@@ -27,7 +27,7 @@ annotated-types==0.7.0
2727
# pydantic
2828
antlr4-python3-runtime==4.13.2
2929
# via moto
30-
anyio==4.6.0
30+
anyio==4.6.2.post1
3131
# via
3232
# -c requirements/_base.txt
3333
# httpx
@@ -45,12 +45,12 @@ aws-xray-sdk==2.14.0
4545
# via moto
4646
blinker==1.8.2
4747
# via flask
48-
boto3==1.34.131
48+
boto3==1.35.36
4949
# via
5050
# aiobotocore
5151
# aws-sam-translator
5252
# moto
53-
botocore==1.34.131
53+
botocore==1.35.36
5454
# via
5555
# aiobotocore
5656
# aws-xray-sdk
@@ -66,17 +66,17 @@ certifi==2024.8.30
6666
# requests
6767
cffi==1.17.1
6868
# via cryptography
69-
cfn-lint==1.15.1
69+
cfn-lint==1.16.1
7070
# via moto
71-
charset-normalizer==3.3.2
71+
charset-normalizer==3.4.0
7272
# via
7373
# -c requirements/_base.txt
7474
# requests
7575
click==8.1.7
7676
# via
7777
# -c requirements/_base.txt
7878
# flask
79-
coverage==7.6.1
79+
coverage==7.6.3
8080
# via
8181
# -r requirements/_test.in
8282
# pytest-cov
@@ -87,12 +87,7 @@ cryptography==43.0.1
8787
# moto
8888
docker==7.1.0
8989
# via moto
90-
ecdsa==0.19.0
91-
# via
92-
# moto
93-
# python-jose
94-
# sshpubkeys
95-
faker==30.0.0
90+
faker==30.4.0
9691
# via -r requirements/_test.in
9792
flask==3.0.3
9893
# via
@@ -105,13 +100,13 @@ frozenlist==1.4.1
105100
# -c requirements/_base.txt
106101
# aiohttp
107102
# aiosignal
108-
graphql-core==3.2.4
103+
graphql-core==3.2.5
109104
# via moto
110105
h11==0.14.0
111106
# via
112107
# -c requirements/_base.txt
113108
# httpcore
114-
httpcore==1.0.5
109+
httpcore==1.0.6
115110
# via
116111
# -c requirements/_base.txt
117112
# httpx
@@ -146,7 +141,7 @@ jsondiff==2.2.1
146141
# via moto
147142
jsonpatch==1.33
148143
# via cfn-lint
149-
jsonpath-ng==1.6.1
144+
jsonpath-ng==1.7.0
150145
# via moto
151146
jsonpointer==3.0.0
152147
# via jsonpatch
@@ -165,11 +160,11 @@ jsonschema-specifications==2023.7.1
165160
# openapi-schema-validator
166161
lazy-object-proxy==1.10.0
167162
# via openapi-spec-validator
168-
markupsafe==2.1.5
163+
markupsafe==3.0.1
169164
# via
170165
# jinja2
171166
# werkzeug
172-
moto==5.0.15
167+
moto==5.0.17
173168
# via -r requirements/_test.in
174169
mpmath==1.3.0
175170
# via sympy
@@ -178,7 +173,7 @@ multidict==6.1.0
178173
# -c requirements/_base.txt
179174
# aiohttp
180175
# yarl
181-
networkx==3.3
176+
networkx==3.4.1
182177
# via cfn-lint
183178
openapi-schema-validator==0.6.2
184179
# via openapi-spec-validator
@@ -194,6 +189,10 @@ pluggy==1.5.0
194189
# via pytest
195190
ply==3.11
196191
# via jsonpath-ng
192+
propcache==0.2.0
193+
# via
194+
# -c requirements/_base.txt
195+
# yarl
197196
py-partiql-parser==0.5.6
198197
# via moto
199198
pycparser==2.22
@@ -207,7 +206,7 @@ pydantic-core==2.23.4
207206
# via
208207
# -c requirements/_base.txt
209208
# pydantic
210-
pyparsing==3.1.4
209+
pyparsing==3.2.0
211210
# via moto
212211
pytest==8.3.3
213212
# via
@@ -232,7 +231,9 @@ python-dateutil==2.9.0.post0
232231
# faker
233232
# moto
234233
python-dotenv==1.0.1
235-
# via -r requirements/_test.in
234+
# via
235+
# -c requirements/_base.txt
236+
# -r requirements/_test.in
236237
pyyaml==6.0.2
237238
# via
238239
# -c requirements/../../../requirements/constraints.txt
@@ -266,9 +267,9 @@ rpds-py==0.20.0
266267
# -c requirements/_base.txt
267268
# jsonschema
268269
# referencing
269-
s3transfer==0.10.2
270+
s3transfer==0.10.3
270271
# via boto3
271-
setuptools==75.1.0
272+
setuptools==75.2.0
272273
# via
273274
# -c requirements/_base.txt
274275
# moto
@@ -290,7 +291,9 @@ typing-extensions==4.12.2
290291
# -c requirements/_base.txt
291292
# aws-sam-translator
292293
# cfn-lint
294+
# faker
293295
# pydantic
296+
# pydantic-core
294297
urllib3==2.2.3
295298
# via
296299
# -c requirements/../../../requirements/constraints.txt
@@ -308,9 +311,9 @@ wrapt==1.16.0
308311
# -c requirements/_base.txt
309312
# aiobotocore
310313
# aws-xray-sdk
311-
xmltodict==0.13.0
314+
xmltodict==0.14.2
312315
# via moto
313-
yarl==1.12.1
316+
yarl==1.15.3
314317
# via
315318
# -c requirements/_base.txt
316319
# aiohttp

services/agent/requirements/_tools.txt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
astroid==3.3.4
1+
astroid==3.3.5
22
# via pylint
3-
black==24.8.0
3+
black==24.10.0
44
# via -r requirements/../../../requirements/devenv.txt
5-
build==1.2.2
5+
build==1.2.2.post1
66
# via pip-tools
77
bump2version==1.0.1
88
# via -r requirements/../../../requirements/devenv.txt
@@ -14,9 +14,9 @@ click==8.1.7
1414
# -c requirements/_test.txt
1515
# black
1616
# pip-tools
17-
dill==0.3.8
17+
dill==0.3.9
1818
# via pylint
19-
distlib==0.3.8
19+
distlib==0.3.9
2020
# via virtualenv
2121
filelock==3.16.1
2222
# via virtualenv
@@ -53,11 +53,11 @@ platformdirs==4.3.6
5353
# black
5454
# pylint
5555
# virtualenv
56-
pre-commit==3.8.0
56+
pre-commit==4.0.1
5757
# via -r requirements/../../../requirements/devenv.txt
5858
pylint==3.3.1
5959
# via -r requirements/../../../requirements/devenv.txt
60-
pyproject-hooks==1.1.0
60+
pyproject-hooks==1.2.0
6161
# via
6262
# build
6363
# pip-tools
@@ -67,9 +67,9 @@ pyyaml==6.0.2
6767
# -c requirements/_base.txt
6868
# -c requirements/_test.txt
6969
# pre-commit
70-
ruff==0.6.7
70+
ruff==0.6.9
7171
# via -r requirements/../../../requirements/devenv.txt
72-
setuptools==75.1.0
72+
setuptools==75.2.0
7373
# via
7474
# -c requirements/_base.txt
7575
# -c requirements/_test.txt
@@ -81,7 +81,7 @@ typing-extensions==4.12.2
8181
# -c requirements/_base.txt
8282
# -c requirements/_test.txt
8383
# mypy
84-
virtualenv==20.26.5
84+
virtualenv==20.26.6
8585
# via pre-commit
8686
wheel==0.44.0
8787
# via pip-tools

services/agent/src/simcore_service_agent/core/settings.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
from datetime import timedelta
22

3+
from common_library.pydantic_networks_extension import AnyHttpUrlLegacy
34
from common_library.pydantic_validators import validate_numeric_string_as_timedelta
45
from models_library.basic_types import BootModeEnum, LogLevel
5-
from pydantic import AliasChoices, AnyHttpUrl, Field, field_validator
6+
from pydantic import AliasChoices, Field, field_validator
67
from settings_library.base import BaseCustomSettings
78
from settings_library.r_clone import S3Provider
89
from settings_library.rabbit import RabbitSettings
@@ -34,7 +35,7 @@ class ApplicationSettings(BaseCustomSettings, MixinLoggingSettings):
3435
AGENT_VOLUMES_CLEANUP_TARGET_SWARM_STACK_NAME: str = Field(
3536
..., description="Exactly the same as director-v2's `SWARM_STACK_NAME` env var"
3637
)
37-
AGENT_VOLUMES_CLEANUP_S3_ENDPOINT: AnyHttpUrl
38+
AGENT_VOLUMES_CLEANUP_S3_ENDPOINT: AnyHttpUrlLegacy
3839
AGENT_VOLUMES_CLEANUP_S3_ACCESS_KEY: str
3940
AGENT_VOLUMES_CLEANUP_S3_SECRET_KEY: str
4041
AGENT_VOLUMES_CLEANUP_S3_BUCKET: str

services/agent/src/simcore_service_agent/models/volumes.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from pathlib import Path
2+
from typing import Final
23

34
from models_library.api_schemas_directorv2.services import (
45
CHARS_IN_VOLUME_NAME_BEFORE_DIR_NAME,
@@ -7,7 +8,7 @@
78
from models_library.projects_nodes_io import NodeID
89
from models_library.services_types import RunID
910
from models_library.users import UserID
10-
from pydantic import BaseModel, Field
11+
from pydantic import BaseModel, ConfigDict, Field, TypeAdapter
1112

1213

1314
class DynamicServiceVolumeLabels(BaseModel):
@@ -22,7 +23,14 @@ class DynamicServiceVolumeLabels(BaseModel):
2223
def directory_name(self) -> str:
2324
return self.source[CHARS_IN_VOLUME_NAME_BEFORE_DIR_NAME:][::-1].strip("_")
2425

26+
model_config = ConfigDict(
27+
arbitrary_types_allowed=True,
28+
)
29+
2530

2631
class VolumeDetails(BaseModel):
2732
mountpoint: Path = Field(alias="Mountpoint")
2833
labels: DynamicServiceVolumeLabels = Field(alias="Labels")
34+
35+
36+
VolumeDetailsAdapter: Final[TypeAdapter[VolumeDetails]] = TypeAdapter(VolumeDetails)

services/agent/src/simcore_service_agent/services/docker_utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from simcore_service_agent.core.settings import ApplicationSettings
1616
from starlette import status
1717

18-
from ..models.volumes import VolumeDetails
18+
from ..models.volumes import VolumeDetails, VolumeDetailsAdapter
1919
from .backup import backup_volume
2020
from .instrumentation import get_instrumentation
2121

@@ -60,7 +60,7 @@ async def get_unused_dynamc_sidecar_volumes(docker: Docker) -> set[str]:
6060

6161
async def get_volume_details(docker: Docker, *, volume_name: str) -> VolumeDetails:
6262
volume_details = await DockerVolume(docker, volume_name).show()
63-
return VolumeDetails.parse_obj(volume_details)
63+
return VolumeDetailsAdapter.validate_python(volume_details)
6464

6565

6666
@contextmanager

services/autoscaling/tests/unit/test_core_settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# pylint: disable=no-member
12
# pylint: disable=redefined-outer-name
23
# pylint: disable=unused-argument
34
# pylint: disable=unused-variable

services/autoscaling/tests/unit/test_utils_docker.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# pylint: disable=no-member
12
# pylint: disable=redefined-outer-name
23
# pylint: disable=unused-argument
34
# pylint: disable=unused-variable
Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
11
from typing import Final
22

33
from aws_library.ec2._models import AWSTagKey, AWSTagValue
4-
from pydantic import parse_obj_as
4+
from pydantic import TypeAdapter
55

66
DOCKER_STACK_DEPLOY_COMMAND_NAME: Final[str] = "private cluster docker deploy"
7-
DOCKER_STACK_DEPLOY_COMMAND_EC2_TAG_KEY: Final[AWSTagKey] = parse_obj_as(
8-
AWSTagKey, "io.simcore.clusters-keeper.private_cluster_docker_deploy"
9-
)
7+
DOCKER_STACK_DEPLOY_COMMAND_EC2_TAG_KEY: Final[AWSTagKey] = TypeAdapter(
8+
AWSTagKey
9+
).validate_python("io.simcore.clusters-keeper.private_cluster_docker_deploy")
1010

11-
USER_ID_TAG_KEY: Final[AWSTagKey] = parse_obj_as(AWSTagKey, "user_id")
12-
WALLET_ID_TAG_KEY: Final[AWSTagKey] = parse_obj_as(AWSTagKey, "wallet_id")
13-
ROLE_TAG_KEY: Final[AWSTagKey] = parse_obj_as(AWSTagKey, "role")
14-
WORKER_ROLE_TAG_VALUE: Final[AWSTagValue] = parse_obj_as(AWSTagValue, "worker")
15-
MANAGER_ROLE_TAG_VALUE: Final[AWSTagValue] = parse_obj_as(AWSTagValue, "manager")
11+
USER_ID_TAG_KEY: Final[AWSTagKey] = TypeAdapter(AWSTagKey).validate_python("user_id")
12+
WALLET_ID_TAG_KEY: Final[AWSTagKey] = TypeAdapter(AWSTagKey).validate_python(
13+
"wallet_id"
14+
)
15+
ROLE_TAG_KEY: Final[AWSTagKey] = TypeAdapter(AWSTagKey).validate_python("role")
16+
WORKER_ROLE_TAG_VALUE: Final[AWSTagValue] = TypeAdapter(AWSTagValue).validate_python(
17+
"worker"
18+
)
19+
MANAGER_ROLE_TAG_VALUE: Final[AWSTagValue] = TypeAdapter(AWSTagValue).validate_python(
20+
"manager"
21+
)

0 commit comments

Comments
 (0)