Skip to content

Commit 688f10d

Browse files
author
Andrei Neagu
committed
added validator for docker_node_id
1 parent e41d9c5 commit 688f10d

File tree

12 files changed

+52
-22
lines changed

12 files changed

+52
-22
lines changed

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,15 @@ def from_key(cls, key: str) -> "DockerLabelKey":
3737
str, StringConstraints(pattern=DOCKER_GENERIC_TAG_KEY_RE)
3838
]
3939

40-
DockerPlacementConstraint: TypeAlias = Annotated[str, StringConstraints(strip_whitespace = True, pattern = re.compile(r"^(?!-)(?![.])(?!.*--)(?!.*[.][.])[a-zA-Z0-9.-]*(?<!-)(?<![.])(!=|==)[a-zA-Z0-9_. -]*$"))]
40+
DockerPlacementConstraint: TypeAlias = Annotated[
41+
str,
42+
StringConstraints(
43+
strip_whitespace=True,
44+
pattern=re.compile(
45+
r"^(?!-)(?![.])(?!.*--)(?!.*[.][.])[a-zA-Z0-9.-]*(?<!-)(?<![.])(!=|==)[a-zA-Z0-9_. -]*$"
46+
),
47+
),
48+
]
4149

4250
_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX: Final[str] = "io.simcore.runtime."
4351
_BACKWARDS_COMPATIBILITY_SIMCORE_RUNTIME_DOCKER_LABELS_MAP: Final[dict[str, str]] = {
@@ -218,3 +226,8 @@ def from_docker_task(cls, docker_task: Task) -> "StandardSimcoreDockerLabels":
218226
]
219227
},
220228
)
229+
230+
231+
DockerNodeID: TypeAlias = Annotated[
232+
str, StringConstraints(strip_whitespace=True, pattern=re.compile(r"^[a-z0-9]$"))
233+
]

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from datetime import timedelta
33
from typing import Final
44

5+
from models_library.docker import DockerNodeID
56
from models_library.projects_nodes_io import NodeID
67
from models_library.rabbitmq_basic_types import RPCMethodName, RPCNamespace
78
from pydantic import NonNegativeInt, TypeAdapter
@@ -17,7 +18,7 @@
1718
async def force_container_cleanup(
1819
rabbitmq_rpc_client: RabbitMQRPCClient,
1920
*,
20-
docker_node_id: str,
21+
docker_node_id: DockerNodeID,
2122
swarm_stack_name: str,
2223
node_id: NodeID,
2324
) -> None:

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from datetime import timedelta
33
from typing import Final
44

5+
from models_library.docker import DockerNodeID
56
from models_library.projects_nodes_io import NodeID
67
from models_library.rabbitmq_basic_types import RPCMethodName, RPCNamespace
78
from pydantic import NonNegativeInt, TypeAdapter
@@ -17,7 +18,7 @@
1718
async def remove_volumes_without_backup_for_service(
1819
rabbitmq_rpc_client: RabbitMQRPCClient,
1920
*,
20-
docker_node_id: str,
21+
docker_node_id: DockerNodeID,
2122
swarm_stack_name: str,
2223
node_id: NodeID,
2324
) -> None:
@@ -42,7 +43,7 @@ async def remove_volumes_without_backup_for_service(
4243
async def backup_and_remove_volumes_for_all_services(
4344
rabbitmq_rpc_client: RabbitMQRPCClient,
4445
*,
45-
docker_node_id: str,
46+
docker_node_id: DockerNodeID,
4647
swarm_stack_name: str,
4748
) -> None:
4849
result = await rabbitmq_rpc_client.request(

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from datetime import timedelta
22

33
from models_library.basic_types import BootModeEnum, LogLevel
4+
from models_library.docker import DockerNodeID
45
from pydantic import AliasChoices, AnyHttpUrl, Field, field_validator
56
from servicelib.logging_utils_filtering import LoggerName, MessageSubstring
67
from settings_library.base import BaseCustomSettings
@@ -79,7 +80,9 @@ class ApplicationSettings(BaseCustomSettings, MixinLoggingSettings):
7980

8081
AGENT_PROMETHEUS_INSTRUMENTATION_ENABLED: bool = True
8182

82-
AGENT_DOCKER_NODE_ID: str = Field(..., description="used by the rabbitmq module")
83+
AGENT_DOCKER_NODE_ID: DockerNodeID = Field(
84+
..., description="used by the rabbitmq module"
85+
)
8386

8487
AGENT_RABBITMQ: RabbitSettings = Field(
8588
description="settings for service/rabbitmq",

services/agent/src/simcore_service_agent/services/instrumentation/_models.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from dataclasses import dataclass, field
22
from typing import Final
33

4+
from models_library.docker import DockerNodeID
45
from prometheus_client import CollectorRegistry, Counter
56
from servicelib.instrumentation import MetricsBase, get_metrics_namespace
67

@@ -34,10 +35,10 @@ def __post_init__(self) -> None:
3435
registry=self.registry,
3536
)
3637

37-
def remove_volumes(self, docker_node_id: str) -> None:
38+
def remove_volumes(self, docker_node_id: DockerNodeID) -> None:
3839
self.volumes_removed.labels(docker_node_id=docker_node_id).inc()
3940

40-
def backedup_volumes(self, docker_node_id: str) -> None:
41+
def backedup_volumes(self, docker_node_id: DockerNodeID) -> None:
4142
self.volumes_backedup.labels(docker_node_id=docker_node_id).inc()
4243

4344

services/agent/tests/conftest.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import pytest
66
from faker import Faker
77
from models_library.basic_types import BootModeEnum
8+
from models_library.docker import DockerNodeID
89
from moto.server import ThreadedMotoServer
910
from pydantic import HttpUrl, TypeAdapter
1011
from pytest_simcore.helpers.monkeypatch_envs import EnvVarsDict, setenvs_from_dict
@@ -25,8 +26,8 @@ def swarm_stack_name() -> str:
2526

2627

2728
@pytest.fixture
28-
def docker_node_id() -> str:
29-
return "test-node-id"
29+
def docker_node_id() -> DockerNodeID:
30+
return TypeAdapter(DockerNodeID).validate_python("testnodeid")
3031

3132

3233
@pytest.fixture
@@ -40,7 +41,7 @@ def mock_environment(
4041
mocked_s3_server_url: HttpUrl,
4142
bucket: str,
4243
swarm_stack_name: str,
43-
docker_node_id: str,
44+
docker_node_id: DockerNodeID,
4445
) -> EnvVarsDict:
4546
return setenvs_from_dict(
4647
monkeypatch,

services/agent/tests/unit/test_api_rpc__containers.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import pytest_mock
99
from faker import Faker
1010
from fastapi import FastAPI
11+
from models_library.docker import DockerNodeID
1112
from models_library.projects_nodes_io import NodeID
1213
from servicelib.rabbitmq import RabbitMQRPCClient
1314
from servicelib.rabbitmq.rpc_interfaces.agent import containers
@@ -40,7 +41,7 @@ def mocked_force_container_cleanup(mocker: pytest_mock.MockerFixture) -> AsyncMo
4041
async def test_force_container_cleanup(
4142
rpc_client: RabbitMQRPCClient,
4243
swarm_stack_name: str,
43-
docker_node_id: str,
44+
docker_node_id: DockerNodeID,
4445
node_id: NodeID,
4546
mocked_force_container_cleanup: AsyncMock,
4647
):

services/agent/tests/unit/test_api_rpc__volumes.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import pytest
99
import pytest_mock
1010
from fastapi import FastAPI
11+
from models_library.docker import DockerNodeID
1112
from servicelib.rabbitmq import RabbitMQRPCClient
1213
from servicelib.rabbitmq.rpc_interfaces.agent import volumes
1314

@@ -41,7 +42,7 @@ def mocked_remove_all_volumes(mocker: pytest_mock.MockerFixture) -> AsyncMock:
4142
async def test_backup_and_remove_volumes_for_all_services(
4243
rpc_client: RabbitMQRPCClient,
4344
swarm_stack_name: str,
44-
docker_node_id: str,
45+
docker_node_id: DockerNodeID,
4546
mocked_remove_all_volumes: AsyncMock,
4647
):
4748
assert mocked_remove_all_volumes.call_count == 0

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
)
2121
from models_library.basic_types import PortInt
2222
from models_library.callbacks_mapping import CallbacksMapping
23+
from models_library.docker import DockerNodeID
2324
from models_library.generated_models.docker_rest_api import ContainerState, Status2
2425
from models_library.projects_nodes_io import NodeID
2526
from models_library.resource_tracker import HardwareInfo, PricingInfo
@@ -299,7 +300,7 @@ def compose_spec_submitted(self) -> bool:
299300
default=None, description="used for starting the proxy"
300301
)
301302

302-
docker_node_id: str | None = Field(
303+
docker_node_id: DockerNodeID | None = Field(
303304
default=None,
304305
description=(
305306
"contains node id of the docker node where all services "

services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_api/_core.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from models_library.api_schemas_directorv2.services import (
1313
DYNAMIC_SIDECAR_SERVICE_PREFIX,
1414
)
15-
from models_library.docker import to_simcore_runtime_docker_label_key
15+
from models_library.docker import DockerNodeID, to_simcore_runtime_docker_label_key
1616
from models_library.projects import ProjectID
1717
from models_library.projects_networks import DockerNetworkName
1818
from models_library.projects_nodes_io import NodeID
@@ -170,7 +170,7 @@ async def _get_service_latest_task(service_id: str) -> Mapping[str, Any]:
170170
async def get_dynamic_sidecar_placement(
171171
service_id: str,
172172
dynamic_services_scheduler_settings: DynamicServicesSchedulerSettings,
173-
) -> str:
173+
) -> DockerNodeID:
174174
"""
175175
Waits until the service has a task in `running` state and
176176
returns it's `docker_node_id`.
@@ -205,7 +205,7 @@ async def _get_task_data_when_service_running(service_id: str) -> Mapping[str, A
205205

206206
task = await _get_task_data_when_service_running(service_id=service_id)
207207

208-
docker_node_id: None | str = task.get("NodeID", None)
208+
docker_node_id: DockerNodeID | None = task.get("NodeID", None)
209209
if not docker_node_id:
210210
msg = f"Could not find an assigned NodeID for service_id={service_id}. Last task inspect result: {task}"
211211
raise DynamicSidecarError(msg=msg)
@@ -494,7 +494,9 @@ async def update_scheduler_data_label(scheduler_data: SchedulerData) -> None:
494494
)
495495

496496

497-
async def constrain_service_to_node(service_name: str, docker_node_id: str) -> None:
497+
async def constrain_service_to_node(
498+
service_name: str, docker_node_id: DockerNodeID
499+
) -> None:
498500
await _update_service_spec(
499501
service_name,
500502
update_in_service_spec={

0 commit comments

Comments
 (0)