diff --git a/packages/models-library/src/models_library/boot_options.py b/packages/models-library/src/models_library/boot_options.py index 8b26f70c210d..096a958a6a92 100644 --- a/packages/models-library/src/models_library/boot_options.py +++ b/packages/models-library/src/models_library/boot_options.py @@ -1,4 +1,5 @@ from pydantic import BaseModel, ConfigDict, ValidationInfo, field_validator +from pydantic.config import JsonDict from typing_extensions import ( # https://docs.pydantic.dev/latest/api/standard_library_types/#typeddict TypedDict, ) @@ -26,42 +27,46 @@ def ensure_default_included(cls, v, info: ValidationInfo): raise ValueError(msg) return v - model_config = ConfigDict( - json_schema_extra={ - "examples": [ - { - "label": "Boot mode", - "description": "Start it in web page mode", - "default": "0", - "items": { - "0": { - "label": "Non Voila", - "description": "Tooltip for non Voila boot mode", - }, - "1": { - "label": "Voila", - "description": "Tooltip for Voila boot mode", + @staticmethod + def _update_json_schema_extra(schema: JsonDict) -> None: + schema.update( + { + "examples": [ + { + "label": "Boot mode", + "description": "Start it in web page mode", + "default": "0", + "items": { + "0": { + "label": "Non Voila", + "description": "Tooltip for non Voila boot mode", + }, + "1": { + "label": "Voila", + "description": "Tooltip for Voila boot mode", + }, }, }, - }, - { - "label": "Application theme", - "description": "Select a theme for the application", - "default": "b", - "items": { - "a": { - "label": "Clear", - "description": "Using white background", - }, - "b": { - "label": "Dark", - "description": "Using black and gray tones", + { + "label": "Application theme", + "description": "Select a theme for the application", + "default": "b", + "items": { + "a": { + "label": "Clear", + "description": "Using white background", + }, + "b": { + "label": "Dark", + "description": "Using black and gray tones", + }, }, }, - }, - ] - } - ) + ] + } + ) + + model_config = ConfigDict(json_schema_extra=_update_json_schema_extra) BootOptions = dict[EnvVarKey, BootOption] diff --git a/packages/models-library/src/models_library/docker.py b/packages/models-library/src/models_library/docker.py index ae23ba7eec4d..13719609436b 100644 --- a/packages/models-library/src/models_library/docker.py +++ b/packages/models-library/src/models_library/docker.py @@ -1,25 +1,12 @@ -import contextlib import re -from typing import Annotated, Any, Final, TypeAlias +from typing import Annotated, TypeAlias from pydantic import ( - BaseModel, - ByteSize, - ConfigDict, - Field, StringConstraints, - TypeAdapter, - ValidationError, - model_validator, ) from .basic_regex import DOCKER_GENERIC_TAG_KEY_RE, DOCKER_LABEL_KEY_REGEX from .basic_types import ConstrainedStr -from .generated_models.docker_rest_api import Task -from .products import ProductName -from .projects import ProjectID -from .projects_nodes_io import NodeID -from .users import UserID class DockerLabelKey(ConstrainedStr): @@ -47,192 +34,6 @@ def from_key(cls, key: str) -> "DockerLabelKey": ), ] -_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX: Final[str] = "io.simcore.runtime." -_BACKWARDS_COMPATIBILITY_SIMCORE_RUNTIME_DOCKER_LABELS_MAP: Final[dict[str, str]] = { - "node_id": f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}node-id", - "product_name": f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}product-name", - "project_id": f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}project-id", - "simcore_user_agent": f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}simcore-user-agent", - "study_id": f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}project-id", - "user_id": f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}user-id", - "uuid": f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}node-id", - "mem_limit": f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}memory-limit", - "swarm_stack_name": f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}swarm-stack-name", -} -_UNDEFINED_LABEL_VALUE_STR: Final[str] = "undefined" -_UNDEFINED_LABEL_VALUE_INT: Final[str] = "0" - - -DOCKER_TASK_EC2_INSTANCE_TYPE_PLACEMENT_CONSTRAINT_KEY: Final[DockerLabelKey] = ( - TypeAdapter(DockerLabelKey).validate_python("ec2-instance-type") -) - - -def to_simcore_runtime_docker_label_key(key: str) -> DockerLabelKey: - return DockerLabelKey( - f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}{key.replace('_', '-').lower()}" - ) - - -class StandardSimcoreDockerLabels(BaseModel): - """ - Represents the standard label on oSparc created containers (not yet services) - In order to create this object in code, please use model_construct() method! - """ - - user_id: UserID = Field(..., alias=f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}user-id") # type: ignore[literal-required] - project_id: ProjectID = Field( # type: ignore[literal-required] - ..., alias=f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}project-id" - ) - node_id: NodeID = Field(..., alias=f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}node-id") # type: ignore[literal-required] - - product_name: ProductName = Field( # type: ignore[literal-required] - ..., alias=f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}product-name" - ) - simcore_user_agent: str = Field( # type: ignore[literal-required] - ..., alias=f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}simcore-user-agent" - ) - - swarm_stack_name: str = Field( # type: ignore[literal-required] - ..., alias=f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}swarm-stack-name" - ) - - memory_limit: ByteSize = Field( # type: ignore[literal-required] - ..., alias=f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}memory-limit" - ) - cpu_limit: float = Field( # type: ignore[literal-required] - ..., alias=f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}cpu-limit" - ) - - @model_validator(mode="before") - @classmethod - def _backwards_compatibility(cls, values: dict[str, Any]) -> dict[str, Any]: - # NOTE: this is necessary for dy-sidecar and legacy service until they are adjusted - if mapped_values := { - _BACKWARDS_COMPATIBILITY_SIMCORE_RUNTIME_DOCKER_LABELS_MAP[k]: v - for k, v in values.items() - if k in _BACKWARDS_COMPATIBILITY_SIMCORE_RUNTIME_DOCKER_LABELS_MAP - }: - # these values were sometimes omitted, so let's provide some defaults - for key in ["product-name", "simcore-user-agent", "swarm-stack-name"]: - mapped_values.setdefault( - f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}{key}", - _UNDEFINED_LABEL_VALUE_STR, - ) - - mapped_values.setdefault( - f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}memory-limit", - values.get("memory_limit", _UNDEFINED_LABEL_VALUE_INT), - ) - - def _convert_nano_cpus_to_cpus(nano_cpu: str) -> str: - with contextlib.suppress(ValidationError): - return f"{TypeAdapter(float).validate_python(nano_cpu) / (1.0 * 10**9):.2f}" - return _UNDEFINED_LABEL_VALUE_INT - - mapped_values.setdefault( - f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}cpu-limit", - values.get( - "cpu_limit", - _convert_nano_cpus_to_cpus( - values.get( - "nano_cpus_limit", - _UNDEFINED_LABEL_VALUE_INT, - ) - ), - ), - ) - return mapped_values - return values - - def to_simcore_runtime_docker_labels(self) -> dict[DockerLabelKey, str]: - """returns a dictionary of strings as required by docker""" - return { - to_simcore_runtime_docker_label_key(k): f"{v}" - for k, v in sorted(self.model_dump().items()) - } - - @classmethod - def from_docker_task(cls, docker_task: Task) -> "StandardSimcoreDockerLabels": - assert docker_task.spec # nosec - assert docker_task.spec.container_spec # nosec - task_labels = docker_task.spec.container_spec.labels or {} - return cls.model_validate(task_labels) - - model_config = ConfigDict( - populate_by_name=True, - json_schema_extra={ - "examples": [ - # legacy service labels - { - "study_id": "29f393fc-1410-47b3-b4b9-61dfce21a2a6", - "swarm_stack_name": "devel-simcore", - "user_id": "5", - "uuid": "1f963626-66e1-43f1-a777-33955c08b909", - }, - # legacy container labels - { - "mem_limit": "1073741824", - "nano_cpus_limit": "4000000000", - "node_id": "1f963626-66e1-43f1-a777-33955c08b909", - "simcore_user_agent": "puppeteer", - "study_id": "29f393fc-1410-47b3-b4b9-61dfce21a2a6", - "swarm_stack_name": "devel-simcore", - "user_id": "5", - }, - # dy-sidecar service labels - { - "study_id": "29f393fc-1410-47b3-b4b9-61dfce21a2a6", - "swarm_stack_name": "devel-simcore", - "user_id": "5", - "uuid": "1f963626-66e1-43f1-a777-33955c08b909", - }, - # dy-sidecar container labels - { - "mem_limit": "1073741824", - "nano_cpus_limit": "4000000000", - "study_id": "29f393fc-1410-47b3-b4b9-61dfce21a2a6", - "user_id": "5", - "uuid": "1f963626-66e1-43f1-a777-33955c08b909", - }, - # dy-proxy service labels - { - "dynamic-type": "dynamic-sidecar", - "study_id": "29f393fc-1410-47b3-b4b9-61dfce21a2a6", - "swarm_stack_name": "devel-simcore", - "type": "dependency-v2", - "user_id": "5", - "uuid": "1f963626-66e1-43f1-a777-33955c08b909", - }, - # dy-proxy container labels - { - "study_id": "29f393fc-1410-47b3-b4b9-61dfce21a2a6", - "user_id": "5", - "uuid": "1f963626-66e1-43f1-a777-33955c08b909", - }, - # dy-sidecar user-services labels - { - "product_name": "osparc", - "simcore_user_agent": "puppeteer", - "study_id": "29f393fc-1410-47b3-b4b9-61dfce21a2a6", - "user_id": "5", - "uuid": "1f963626-66e1-43f1-a777-33955c08b909", - }, - # modern both dynamic-sidecar services and computational services - { - "io.simcore.runtime.cpu-limit": "2.4", - "io.simcore.runtime.memory-limit": "1073741824", - "io.simcore.runtime.node-id": "1f963626-66e1-43f1-a777-33955c08b909", - "io.simcore.runtime.product-name": "osparc", - "io.simcore.runtime.project-id": "29f393fc-1410-47b3-b4b9-61dfce21a2a6", - "io.simcore.runtime.simcore-user-agent": "puppeteer", - "io.simcore.runtime.swarm-stack-name": "devel-osparc", - "io.simcore.runtime.user-id": "5", - }, - ] - }, - ) - DockerNodeID: TypeAlias = Annotated[ str, StringConstraints(strip_whitespace=True, pattern=re.compile(r"[a-zA-Z0-9]")) diff --git a/packages/models-library/src/models_library/services_metadata_published.py b/packages/models-library/src/models_library/services_metadata_published.py index 51fba05b7f42..8163a91c365e 100644 --- a/packages/models-library/src/models_library/services_metadata_published.py +++ b/packages/models-library/src/models_library/services_metadata_published.py @@ -76,8 +76,12 @@ } }, "boot-options": { - "example_service_defined_boot_mode": BootOption.model_config["json_schema_extra"]["examples"][0], # type: ignore [index] - "example_service_defined_theme_selection": BootOption.model_config["json_schema_extra"]["examples"][1], # type: ignore [index] + "example_service_defined_boot_mode": BootOption.model_json_schema()["examples"][ + 0 + ], + "example_service_defined_theme_selection": BootOption.model_json_schema()[ + "examples" + ][1], }, "min-visible-inputs": 2, } diff --git a/packages/models-library/src/models_library/services_metadata_runtime.py b/packages/models-library/src/models_library/services_metadata_runtime.py new file mode 100644 index 000000000000..b2b9cc01e765 --- /dev/null +++ b/packages/models-library/src/models_library/services_metadata_runtime.py @@ -0,0 +1,204 @@ +import contextlib +from typing import Any, Final + +from pydantic import ( + BaseModel, + ByteSize, + ConfigDict, + Field, + TypeAdapter, + ValidationError, + model_validator, +) + +from .docker import DockerLabelKey +from .generated_models.docker_rest_api import Task +from .products import ProductName +from .projects import ProjectID +from .projects_nodes_io import NodeID +from .users import UserID + +DOCKER_TASK_EC2_INSTANCE_TYPE_PLACEMENT_CONSTRAINT_KEY: Final[DockerLabelKey] = ( + TypeAdapter(DockerLabelKey).validate_python("ec2-instance-type") +) + +_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX: Final[str] = "io.simcore.runtime." +_BACKWARDS_COMPATIBILITY_SIMCORE_RUNTIME_DOCKER_LABELS_MAP: Final[dict[str, str]] = { + "node_id": f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}node-id", + "product_name": f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}product-name", + "project_id": f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}project-id", + "simcore_user_agent": f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}simcore-user-agent", + "study_id": f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}project-id", + "user_id": f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}user-id", + "uuid": f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}node-id", + "mem_limit": f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}memory-limit", + "swarm_stack_name": f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}swarm-stack-name", +} +_UNDEFINED_LABEL_VALUE_STR: Final[str] = "undefined" +_UNDEFINED_LABEL_VALUE_INT: Final[str] = "0" + + +def to_simcore_runtime_docker_label_key(key: str) -> DockerLabelKey: + return DockerLabelKey( + f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}{key.replace('_', '-').lower()}" + ) + + +class SimcoreContainerLabels(BaseModel): + """ + Represents the standard label on oSparc created containers (not yet services) + In order to create this object in code, please use model_construct() method! + """ + + user_id: UserID = Field(..., alias=f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}user-id") # type: ignore[literal-required] + project_id: ProjectID = Field( # type: ignore[literal-required] + ..., alias=f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}project-id" + ) + node_id: NodeID = Field(..., alias=f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}node-id") # type: ignore[literal-required] + + product_name: ProductName = Field( # type: ignore[literal-required] + ..., alias=f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}product-name" + ) + simcore_user_agent: str = Field( # type: ignore[literal-required] + ..., alias=f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}simcore-user-agent" + ) + + swarm_stack_name: str = Field( # type: ignore[literal-required] + ..., alias=f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}swarm-stack-name" + ) + + memory_limit: ByteSize = Field( # type: ignore[literal-required] + ..., alias=f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}memory-limit" + ) + cpu_limit: float = Field( # type: ignore[literal-required] + ..., alias=f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}cpu-limit" + ) + + @model_validator(mode="before") + @classmethod + def _backwards_compatibility(cls, values: dict[str, Any]) -> dict[str, Any]: + # NOTE: this is necessary for dy-sidecar and legacy service until they are adjusted + if mapped_values := { + _BACKWARDS_COMPATIBILITY_SIMCORE_RUNTIME_DOCKER_LABELS_MAP[k]: v + for k, v in values.items() + if k in _BACKWARDS_COMPATIBILITY_SIMCORE_RUNTIME_DOCKER_LABELS_MAP + }: + # these values were sometimes omitted, so let's provide some defaults + for key in ["product-name", "simcore-user-agent", "swarm-stack-name"]: + mapped_values.setdefault( + f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}{key}", + _UNDEFINED_LABEL_VALUE_STR, + ) + + mapped_values.setdefault( + f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}memory-limit", + values.get("memory_limit", _UNDEFINED_LABEL_VALUE_INT), + ) + + def _convert_nano_cpus_to_cpus(nano_cpu: str) -> str: + with contextlib.suppress(ValidationError): + return f"{TypeAdapter(float).validate_python(nano_cpu) / (1.0 * 10**9):.2f}" + return _UNDEFINED_LABEL_VALUE_INT + + mapped_values.setdefault( + f"{_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX}cpu-limit", + values.get( + "cpu_limit", + _convert_nano_cpus_to_cpus( + values.get( + "nano_cpus_limit", + _UNDEFINED_LABEL_VALUE_INT, + ) + ), + ), + ) + return mapped_values + return values + + def to_simcore_runtime_docker_labels(self) -> dict[DockerLabelKey, str]: + """returns a dictionary of strings as required by docker""" + return { + to_simcore_runtime_docker_label_key(k): f"{v}" + for k, v in sorted(self.model_dump().items()) + } + + @classmethod + def from_docker_task(cls, docker_task: Task) -> "SimcoreContainerLabels": + assert docker_task.spec # nosec + assert docker_task.spec.container_spec # nosec + task_labels = docker_task.spec.container_spec.labels or {} + return cls.model_validate(task_labels) + + model_config = ConfigDict( + populate_by_name=True, + json_schema_extra={ + "examples": [ + # legacy service labels + { + "study_id": "29f393fc-1410-47b3-b4b9-61dfce21a2a6", + "swarm_stack_name": "devel-simcore", + "user_id": "5", + "uuid": "1f963626-66e1-43f1-a777-33955c08b909", + }, + # legacy container labels + { + "mem_limit": "1073741824", + "nano_cpus_limit": "4000000000", + "node_id": "1f963626-66e1-43f1-a777-33955c08b909", + "simcore_user_agent": "puppeteer", + "study_id": "29f393fc-1410-47b3-b4b9-61dfce21a2a6", + "swarm_stack_name": "devel-simcore", + "user_id": "5", + }, + # dy-sidecar service labels + { + "study_id": "29f393fc-1410-47b3-b4b9-61dfce21a2a6", + "swarm_stack_name": "devel-simcore", + "user_id": "5", + "uuid": "1f963626-66e1-43f1-a777-33955c08b909", + }, + # dy-sidecar container labels + { + "mem_limit": "1073741824", + "nano_cpus_limit": "4000000000", + "study_id": "29f393fc-1410-47b3-b4b9-61dfce21a2a6", + "user_id": "5", + "uuid": "1f963626-66e1-43f1-a777-33955c08b909", + }, + # dy-proxy service labels + { + "dynamic-type": "dynamic-sidecar", + "study_id": "29f393fc-1410-47b3-b4b9-61dfce21a2a6", + "swarm_stack_name": "devel-simcore", + "type": "dependency-v2", + "user_id": "5", + "uuid": "1f963626-66e1-43f1-a777-33955c08b909", + }, + # dy-proxy container labels + { + "study_id": "29f393fc-1410-47b3-b4b9-61dfce21a2a6", + "user_id": "5", + "uuid": "1f963626-66e1-43f1-a777-33955c08b909", + }, + # dy-sidecar user-services labels + { + "product_name": "osparc", + "simcore_user_agent": "puppeteer", + "study_id": "29f393fc-1410-47b3-b4b9-61dfce21a2a6", + "user_id": "5", + "uuid": "1f963626-66e1-43f1-a777-33955c08b909", + }, + # modern both dynamic-sidecar services and computational services + { + "io.simcore.runtime.cpu-limit": "2.4", + "io.simcore.runtime.memory-limit": "1073741824", + "io.simcore.runtime.node-id": "1f963626-66e1-43f1-a777-33955c08b909", + "io.simcore.runtime.product-name": "osparc", + "io.simcore.runtime.project-id": "29f393fc-1410-47b3-b4b9-61dfce21a2a6", + "io.simcore.runtime.simcore-user-agent": "puppeteer", + "io.simcore.runtime.swarm-stack-name": "devel-osparc", + "io.simcore.runtime.user-id": "5", + }, + ] + }, + ) diff --git a/packages/models-library/tests/test_docker.py b/packages/models-library/tests/test_docker.py index ae1c636a9e22..bcbbff12c360 100644 --- a/packages/models-library/tests/test_docker.py +++ b/packages/models-library/tests/test_docker.py @@ -9,10 +9,12 @@ import pytest from faker import Faker from models_library.docker import ( - _SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX, DockerGenericTag, DockerLabelKey, - StandardSimcoreDockerLabels, +) +from models_library.services_metadata_runtime import ( + _SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX, + SimcoreContainerLabels, ) from pydantic import ByteSize, TypeAdapter, ValidationError @@ -104,13 +106,11 @@ def test_docker_generic_tag(image_name: str, valid: bool): @pytest.mark.parametrize( "obj_data", - StandardSimcoreDockerLabels.model_config["json_schema_extra"]["examples"], + SimcoreContainerLabels.model_config["json_schema_extra"]["examples"], ids=str, ) def test_simcore_service_docker_label_keys(obj_data: dict[str, Any]): - simcore_service_docker_label_keys = StandardSimcoreDockerLabels.model_validate( - obj_data - ) + simcore_service_docker_label_keys = SimcoreContainerLabels.model_validate(obj_data) exported_dict = simcore_service_docker_label_keys.to_simcore_runtime_docker_labels() assert all( isinstance(v, str) for v in exported_dict.values() @@ -118,15 +118,15 @@ def test_simcore_service_docker_label_keys(obj_data: dict[str, Any]): assert all( key.startswith(_SIMCORE_RUNTIME_DOCKER_LABEL_PREFIX) for key in exported_dict ) - re_imported_docker_label_keys = TypeAdapter( - StandardSimcoreDockerLabels - ).validate_python(exported_dict) + re_imported_docker_label_keys = TypeAdapter(SimcoreContainerLabels).validate_python( + exported_dict + ) assert re_imported_docker_label_keys assert simcore_service_docker_label_keys == re_imported_docker_label_keys def test_simcore_service_docker_label_keys_construction(): - simcore_service_docker_label_keys = StandardSimcoreDockerLabels( + simcore_service_docker_label_keys = SimcoreContainerLabels( user_id=8268, project_id=UUID("5ea24ce0-0e4d-4ee6-a3f1-e4799752a684"), node_id=UUID("c17c6279-23c6-412f-8826-867323a7711a"), diff --git a/packages/models-library/tests/test_services.py b/packages/models-library/tests/test_services.py index c7b7562eaa63..fca51e57e334 100644 --- a/packages/models-library/tests/test_services.py +++ b/packages/models-library/tests/test_services.py @@ -29,7 +29,7 @@ def minimal_service_common_data() -> dict[str, Any]: def test_create_minimal_service_common_data( - minimal_service_common_data: dict[str, Any] + minimal_service_common_data: dict[str, Any], ): service = ServiceBaseDisplay(**minimal_service_common_data) @@ -67,7 +67,7 @@ def test_node_with_thumbnail(minimal_service_common_data: dict[str, Any]): ) -@pytest.mark.parametrize("pattern", (SERVICE_KEY_RE, SERVICE_ENCODED_KEY_RE)) +@pytest.mark.parametrize("pattern", [SERVICE_KEY_RE, SERVICE_ENCODED_KEY_RE]) @pytest.mark.parametrize( "service_key", [ @@ -182,9 +182,9 @@ def _find_pattern_entry(obj: dict[str, Any], key: str) -> Any: def test_boot_option_wrong_default() -> None: - for example in [deepcopy(x) for x in BootOption.model_config["json_schema_extra"]["examples"]]: - with pytest.raises(ValueError): - example["default"] = "__undefined__" + for example in [deepcopy(x) for x in BootOption.model_json_schema()["examples"]]: + example["default"] = "__undefined__" + with pytest.raises(ValueError): # noqa: PT011 assert BootOption(**example) @@ -202,7 +202,8 @@ def test_service_docker_data_labels_convesion(): convension_breaking_fields: set[tuple[str, str]] = set() fields_with_aliases: list[tuple[str, str]] = [ - (name, info.alias) for name, info in ServiceMetaDataPublished.model_fields.items() + (name, info.alias) + for name, info in ServiceMetaDataPublished.model_fields.items() if info.alias is not None ] diff --git a/services/autoscaling/src/simcore_service_autoscaling/modules/cluster_scaling/_provider_computational.py b/services/autoscaling/src/simcore_service_autoscaling/modules/cluster_scaling/_provider_computational.py index d5d28f997108..92be7fe1f4be 100644 --- a/services/autoscaling/src/simcore_service_autoscaling/modules/cluster_scaling/_provider_computational.py +++ b/services/autoscaling/src/simcore_service_autoscaling/modules/cluster_scaling/_provider_computational.py @@ -5,11 +5,11 @@ from aws_library.ec2 import EC2InstanceData, EC2Tags, Resources from fastapi import FastAPI from models_library.clusters import ClusterAuthentication -from models_library.docker import ( +from models_library.docker import DockerLabelKey +from models_library.generated_models.docker_rest_api import Node +from models_library.services_metadata_runtime import ( DOCKER_TASK_EC2_INSTANCE_TYPE_PLACEMENT_CONSTRAINT_KEY, - DockerLabelKey, ) -from models_library.generated_models.docker_rest_api import Node from pydantic import AnyUrl, ByteSize from servicelib.utils import logged_gather from types_aiobotocore_ec2.literals import InstanceTypeType diff --git a/services/autoscaling/src/simcore_service_autoscaling/utils/rabbitmq.py b/services/autoscaling/src/simcore_service_autoscaling/utils/rabbitmq.py index 0bcad456561e..e00ab3d4eb6e 100644 --- a/services/autoscaling/src/simcore_service_autoscaling/utils/rabbitmq.py +++ b/services/autoscaling/src/simcore_service_autoscaling/utils/rabbitmq.py @@ -4,7 +4,6 @@ from aws_library.ec2 import Resources from dask_task_models_library.container_tasks.utils import parse_dask_job_id from fastapi import FastAPI -from models_library.docker import StandardSimcoreDockerLabels from models_library.generated_models.docker_rest_api import Task as DockerTask from models_library.progress_bar import ProgressReport from models_library.projects import ProjectID @@ -15,6 +14,7 @@ ProgressType, RabbitAutoscalingStatusMessage, ) +from models_library.services_metadata_runtime import SimcoreContainerLabels from models_library.users import UserID from servicelib.logging_utils import log_catch @@ -27,7 +27,7 @@ def _get_task_ids(task: DockerTask | DaskTask) -> tuple[UserID, ProjectID, NodeID]: if isinstance(task, DockerTask): - labels = StandardSimcoreDockerLabels.from_docker_task(task) + labels = SimcoreContainerLabels.from_docker_task(task) return labels.user_id, labels.project_id, labels.node_id _service_key, _service_version, user_id, project_id, node_id = parse_dask_job_id( task.task_id diff --git a/services/autoscaling/src/simcore_service_autoscaling/utils/utils_docker.py b/services/autoscaling/src/simcore_service_autoscaling/utils/utils_docker.py index ac3ff4325c5f..90c0c3807519 100644 --- a/services/autoscaling/src/simcore_service_autoscaling/utils/utils_docker.py +++ b/services/autoscaling/src/simcore_service_autoscaling/utils/utils_docker.py @@ -15,7 +15,6 @@ import yaml from aws_library.ec2 import EC2InstanceData, Resources from models_library.docker import ( - DOCKER_TASK_EC2_INSTANCE_TYPE_PLACEMENT_CONSTRAINT_KEY, DockerGenericTag, DockerLabelKey, ) @@ -27,6 +26,9 @@ Task, TaskState, ) +from models_library.services_metadata_runtime import ( + DOCKER_TASK_EC2_INSTANCE_TYPE_PLACEMENT_CONSTRAINT_KEY, +) from pydantic import ByteSize, TypeAdapter, ValidationError from servicelib.docker_utils import to_datetime from servicelib.logging_utils import log_context diff --git a/services/autoscaling/tests/unit/conftest.py b/services/autoscaling/tests/unit/conftest.py index 97e852b44d66..74c2a0bedc0e 100644 --- a/services/autoscaling/tests/unit/conftest.py +++ b/services/autoscaling/tests/unit/conftest.py @@ -36,7 +36,6 @@ from models_library.docker import ( DockerGenericTag, DockerLabelKey, - StandardSimcoreDockerLabels, ) from models_library.generated_models.docker_rest_api import ( Availability, @@ -52,6 +51,7 @@ Service, TaskSpec, ) +from models_library.services_metadata_runtime import SimcoreContainerLabels from pydantic import ByteSize, NonNegativeInt, PositiveInt, TypeAdapter from pytest_mock import MockType from pytest_mock.plugin import MockerFixture @@ -812,8 +812,8 @@ def host_memory_total() -> ByteSize: @pytest.fixture def osparc_docker_label_keys( faker: Faker, -) -> StandardSimcoreDockerLabels: - return StandardSimcoreDockerLabels.model_validate( +) -> SimcoreContainerLabels: + return SimcoreContainerLabels.model_validate( { "user_id": faker.pyint(), "project_id": faker.uuid4(), diff --git a/services/autoscaling/tests/unit/test_models.py b/services/autoscaling/tests/unit/test_models.py index f2271889ddb2..9360f8072296 100644 --- a/services/autoscaling/tests/unit/test_models.py +++ b/services/autoscaling/tests/unit/test_models.py @@ -8,8 +8,9 @@ import aiodocker import pytest -from models_library.docker import DockerLabelKey, StandardSimcoreDockerLabels +from models_library.docker import DockerLabelKey from models_library.generated_models.docker_rest_api import Service, Task +from models_library.services_metadata_runtime import SimcoreContainerLabels from pydantic import TypeAdapter, ValidationError @@ -28,7 +29,7 @@ async def test_get_simcore_service_docker_labels_from_task_with_missing_labels_r assert service_tasks assert len(service_tasks) == 1 with pytest.raises(ValidationError): - StandardSimcoreDockerLabels.from_docker_task(service_tasks[0]) + SimcoreContainerLabels.from_docker_task(service_tasks[0]) async def test_get_simcore_service_docker_labels( @@ -37,7 +38,7 @@ async def test_get_simcore_service_docker_labels( [dict[str, Any], dict[DockerLabelKey, str], str], Awaitable[Service] ], task_template: dict[str, Any], - osparc_docker_label_keys: StandardSimcoreDockerLabels, + osparc_docker_label_keys: SimcoreContainerLabels, ): service_with_labels = await create_service( task_template, @@ -52,7 +53,7 @@ async def test_get_simcore_service_docker_labels( ) assert service_tasks assert len(service_tasks) == 1 - task_ownership = StandardSimcoreDockerLabels.from_docker_task(service_tasks[0]) + task_ownership = SimcoreContainerLabels.from_docker_task(service_tasks[0]) assert task_ownership assert task_ownership.user_id == osparc_docker_label_keys.user_id assert task_ownership.project_id == osparc_docker_label_keys.project_id diff --git a/services/autoscaling/tests/unit/test_modules_cluster_scaling_computational.py b/services/autoscaling/tests/unit/test_modules_cluster_scaling_computational.py index dfafec0b21f6..6e18508c52f5 100644 --- a/services/autoscaling/tests/unit/test_modules_cluster_scaling_computational.py +++ b/services/autoscaling/tests/unit/test_modules_cluster_scaling_computational.py @@ -26,7 +26,6 @@ ) from faker import Faker from fastapi import FastAPI -from models_library.docker import DOCKER_TASK_EC2_INSTANCE_TYPE_PLACEMENT_CONSTRAINT_KEY from models_library.generated_models.docker_rest_api import ( Availability, ) @@ -36,6 +35,9 @@ NodeStatus, ) from models_library.rabbitmq_messages import RabbitAutoscalingStatusMessage +from models_library.services_metadata_runtime import ( + DOCKER_TASK_EC2_INSTANCE_TYPE_PLACEMENT_CONSTRAINT_KEY, +) from pydantic import ByteSize, TypeAdapter from pytest_mock import MockerFixture, MockType from pytest_simcore.helpers.autoscaling import ( diff --git a/services/autoscaling/tests/unit/test_modules_cluster_scaling_dynamic.py b/services/autoscaling/tests/unit/test_modules_cluster_scaling_dynamic.py index 9dc439d694a8..c1108a54ffad 100644 --- a/services/autoscaling/tests/unit/test_modules_cluster_scaling_dynamic.py +++ b/services/autoscaling/tests/unit/test_modules_cluster_scaling_dynamic.py @@ -23,10 +23,8 @@ from aws_library.ec2 import EC2InstanceBootSpecific, EC2InstanceData, Resources from fastapi import FastAPI from models_library.docker import ( - DOCKER_TASK_EC2_INSTANCE_TYPE_PLACEMENT_CONSTRAINT_KEY, DockerGenericTag, DockerLabelKey, - StandardSimcoreDockerLabels, ) from models_library.generated_models.docker_rest_api import ( Availability, @@ -37,6 +35,10 @@ Task, ) from models_library.rabbitmq_messages import RabbitAutoscalingStatusMessage +from models_library.services_metadata_runtime import ( + DOCKER_TASK_EC2_INSTANCE_TYPE_PLACEMENT_CONSTRAINT_KEY, + SimcoreContainerLabels, +) from pydantic import ByteSize, TypeAdapter from pytest_mock import MockType from pytest_mock.plugin import MockerFixture @@ -273,7 +275,7 @@ async def create_services_batch( task_template: dict[str, Any], create_task_reservations: Callable[[int, int], dict[str, Any]], service_monitored_labels: dict[DockerLabelKey, str], - osparc_docker_label_keys: StandardSimcoreDockerLabels, + osparc_docker_label_keys: SimcoreContainerLabels, ) -> Callable[[_ScaleUpParams], Awaitable[list[Service]]]: async def _(scale_up_params: _ScaleUpParams) -> list[Service]: return await asyncio.gather( diff --git a/services/autoscaling/tests/unit/test_utils_docker.py b/services/autoscaling/tests/unit/test_utils_docker.py index cae93f3402ec..34b64d6861a2 100644 --- a/services/autoscaling/tests/unit/test_utils_docker.py +++ b/services/autoscaling/tests/unit/test_utils_docker.py @@ -18,7 +18,6 @@ from deepdiff import DeepDiff from faker import Faker from models_library.docker import ( - DOCKER_TASK_EC2_INSTANCE_TYPE_PLACEMENT_CONSTRAINT_KEY, DockerGenericTag, DockerLabelKey, ) @@ -31,6 +30,9 @@ Service, Task, ) +from models_library.services_metadata_runtime import ( + DOCKER_TASK_EC2_INSTANCE_TYPE_PLACEMENT_CONSTRAINT_KEY, +) from pydantic import ByteSize, TypeAdapter from pytest_mock.plugin import MockerFixture from pytest_simcore.helpers.monkeypatch_envs import EnvVarsDict diff --git a/services/autoscaling/tests/unit/test_utils_rabbitmq.py b/services/autoscaling/tests/unit/test_utils_rabbitmq.py index f9949d1d1121..006155b1e0fa 100644 --- a/services/autoscaling/tests/unit/test_utils_rabbitmq.py +++ b/services/autoscaling/tests/unit/test_utils_rabbitmq.py @@ -14,7 +14,7 @@ from dask_task_models_library.container_tasks.utils import generate_dask_job_id from faker import Faker from fastapi import FastAPI -from models_library.docker import DockerLabelKey, StandardSimcoreDockerLabels +from models_library.docker import DockerLabelKey from models_library.generated_models.docker_rest_api import Service, Task from models_library.progress_bar import ProgressReport from models_library.projects import ProjectID @@ -24,6 +24,7 @@ ProgressRabbitMessageNode, ProgressType, ) +from models_library.services_metadata_runtime import SimcoreContainerLabels from models_library.services_types import ServiceKey, ServiceVersion from models_library.users import UserID from pydantic import TypeAdapter @@ -208,7 +209,7 @@ async def test_post_task_log_message_docker( mocked_redis_server: None, initialized_app: FastAPI, running_service_tasks: Callable[[dict[DockerLabelKey, str]], Awaitable[list[Task]]], - osparc_docker_label_keys: StandardSimcoreDockerLabels, + osparc_docker_label_keys: SimcoreContainerLabels, faker: Faker, logs_rabbitmq_consumer: AsyncMock, ): @@ -288,7 +289,7 @@ async def test_post_task_progress_message_docker( mocked_redis_server: None, initialized_app: FastAPI, running_service_tasks: Callable[[dict[DockerLabelKey, str]], Awaitable[list[Task]]], - osparc_docker_label_keys: StandardSimcoreDockerLabels, + osparc_docker_label_keys: SimcoreContainerLabels, faker: Faker, progress_rabbitmq_consumer: AsyncMock, ): diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_api/_core.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_api/_core.py index 8a7e5d152d4d..d47c22571728 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_api/_core.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_api/_core.py @@ -11,11 +11,12 @@ from models_library.api_schemas_directorv2.services import ( DYNAMIC_SIDECAR_SERVICE_PREFIX, ) -from models_library.docker import DockerNodeID, to_simcore_runtime_docker_label_key +from models_library.docker import DockerNodeID from models_library.projects import ProjectID from models_library.projects_networks import DockerNetworkName from models_library.projects_nodes_io import NodeID from models_library.services_enums import ServiceState +from models_library.services_metadata_runtime import to_simcore_runtime_docker_label_key from servicelib.utils import logged_gather from starlette import status from tenacity import TryAgain, retry diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_compose_specs.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_compose_specs.py index 7ed0736d3cdb..9d3ec4f41a36 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_compose_specs.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_compose_specs.py @@ -4,7 +4,7 @@ from common_library.json_serialization import json_dumps from fastapi.applications import FastAPI -from models_library.docker import DockerGenericTag, StandardSimcoreDockerLabels +from models_library.docker import DockerGenericTag from models_library.products import ProductName from models_library.projects import ProjectID from models_library.projects_nodes_io import NodeID @@ -14,6 +14,7 @@ SimcoreServiceLabels, ) from models_library.services import ServiceKey, ServiceVersion +from models_library.services_metadata_runtime import SimcoreContainerLabels from models_library.services_resources import ( DEFAULT_SINGLE_SERVICE_NAME, ResourcesDict, @@ -129,7 +130,7 @@ def _update_paths_mappings( env_vars["DY_SIDECAR_PATH_INPUTS"] = f"{path_mappings.inputs_path}" env_vars["DY_SIDECAR_PATH_OUTPUTS"] = f"{path_mappings.outputs_path}" env_vars["DY_SIDECAR_STATE_PATHS"] = ( - f"{json_dumps( { f'{p}' for p in path_mappings.state_paths } )}" + f"{json_dumps({f'{p}' for p in path_mappings.state_paths})}" ) service_content["environment"] = _EnvironmentSection.export_as_list(env_vars) @@ -202,7 +203,7 @@ def _update_resource_limits_and_reservations( ] resource_limits = [ - f"{CPU_RESOURCE_LIMIT_KEY}={int(nano_cpu_limits*_NANO)}", + f"{CPU_RESOURCE_LIMIT_KEY}={int(nano_cpu_limits * _NANO)}", f"{MEM_RESOURCE_LIMIT_KEY}={mem_limits}", ] @@ -241,7 +242,7 @@ def _update_container_labels( spec_service_key, default_limits ) - label_keys = StandardSimcoreDockerLabels.model_validate( + label_keys = SimcoreContainerLabels.model_validate( { "user_id": user_id, "project_id": project_id, diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_service_specs/proxy.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_service_specs/proxy.py index d13c33fc1cc6..df08de3192c0 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_service_specs/proxy.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_service_specs/proxy.py @@ -1,6 +1,6 @@ from typing import Any -from models_library.docker import StandardSimcoreDockerLabels +from models_library.services_metadata_runtime import SimcoreContainerLabels from models_library.services_resources import ( CPU_10_PERCENT, CPU_100_PERCENT, @@ -116,7 +116,7 @@ def get_dynamic_proxy_spec( ), "dynamic_type": "dynamic-sidecar", # tagged as dynamic service } - | StandardSimcoreDockerLabels( + | SimcoreContainerLabels( user_id=scheduler_data.user_id, project_id=scheduler_data.project_id, node_id=scheduler_data.node_uuid, @@ -134,7 +134,7 @@ def get_dynamic_proxy_spec( "Hosts": [], "Image": f"caddy:{proxy_settings.DYNAMIC_SIDECAR_CADDY_VERSION}", "Init": True, - "Labels": StandardSimcoreDockerLabels( + "Labels": SimcoreContainerLabels( user_id=scheduler_data.user_id, project_id=scheduler_data.project_id, node_id=scheduler_data.node_uuid, diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_service_specs/settings.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_service_specs/settings.py index 6aa056503126..5dae32951c97 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_service_specs/settings.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_service_specs/settings.py @@ -7,13 +7,13 @@ from models_library.boot_options import BootOption from models_library.docker import ( DockerPlacementConstraint, - to_simcore_runtime_docker_label_key, ) from models_library.service_settings_labels import ( SimcoreServiceLabels, SimcoreServiceSettingLabelEntry, SimcoreServiceSettingsLabel, ) +from models_library.services_metadata_runtime import to_simcore_runtime_docker_label_key from models_library.services_resources import ( CPU_100_PERCENT, DEFAULT_SINGLE_SERVICE_NAME, diff --git a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_service_specs/sidecar.py b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_service_specs/sidecar.py index dd05734f237f..001c66671502 100644 --- a/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_service_specs/sidecar.py +++ b/services/director-v2/src/simcore_service_director_v2/modules/dynamic_sidecar/docker_service_specs/sidecar.py @@ -8,14 +8,16 @@ from models_library.basic_types import BootModeEnum, PortInt from models_library.callbacks_mapping import CallbacksMapping from models_library.docker import ( - DOCKER_TASK_EC2_INSTANCE_TYPE_PLACEMENT_CONSTRAINT_KEY, DockerLabelKey, DockerPlacementConstraint, - StandardSimcoreDockerLabels, - to_simcore_runtime_docker_label_key, ) from models_library.resource_tracker import HardwareInfo from models_library.service_settings_labels import SimcoreServiceSettingsLabel +from models_library.services_metadata_runtime import ( + DOCKER_TASK_EC2_INSTANCE_TYPE_PLACEMENT_CONSTRAINT_KEY, + SimcoreContainerLabels, + to_simcore_runtime_docker_label_key, +) from pydantic import ByteSize, TypeAdapter from servicelib.rabbitmq import RabbitMQRPCClient from servicelib.rabbitmq.rpc_interfaces.efs_guardian import efs_manager @@ -460,18 +462,16 @@ async def get_dynamic_sidecar_spec( # pylint:disable=too-many-arguments# noqa: scheduler_data.product_name is not None ), "ONLY for legacy. This function should not be called with product_name==None" # nosec - standard_simcore_docker_labels: dict[DockerLabelKey, str] = ( - StandardSimcoreDockerLabels( - user_id=scheduler_data.user_id, - project_id=scheduler_data.project_id, - node_id=scheduler_data.node_uuid, - product_name=scheduler_data.product_name, - simcore_user_agent=scheduler_data.request_simcore_user_agent, - swarm_stack_name=dynamic_services_scheduler_settings.SWARM_STACK_NAME, - memory_limit=ByteSize(0), # this should get overwritten - cpu_limit=0, # this should get overwritten - ).to_simcore_runtime_docker_labels() - ) + standard_simcore_docker_labels: dict[DockerLabelKey, str] = SimcoreContainerLabels( + user_id=scheduler_data.user_id, + project_id=scheduler_data.project_id, + node_id=scheduler_data.node_uuid, + product_name=scheduler_data.product_name, + simcore_user_agent=scheduler_data.request_simcore_user_agent, + swarm_stack_name=dynamic_services_scheduler_settings.SWARM_STACK_NAME, + memory_limit=ByteSize(0), # this should get overwritten + cpu_limit=0, # this should get overwritten + ).to_simcore_runtime_docker_labels() service_labels: dict[str, str] = ( { diff --git a/services/director-v2/src/simcore_service_director_v2/utils/dask.py b/services/director-v2/src/simcore_service_director_v2/utils/dask.py index 367e5302e0a2..0d29f9e58918 100644 --- a/services/director-v2/src/simcore_service_director_v2/utils/dask.py +++ b/services/director-v2/src/simcore_service_director_v2/utils/dask.py @@ -20,11 +20,12 @@ from fastapi import FastAPI from models_library.api_schemas_directorv2.computations import TaskLogFileGet from models_library.api_schemas_directorv2.services import NodeRequirements -from models_library.docker import DockerLabelKey, StandardSimcoreDockerLabels +from models_library.docker import DockerLabelKey from models_library.errors import ErrorDict from models_library.projects import ProjectID from models_library.projects_nodes_io import NodeID, NodeIDStr from models_library.services import ServiceKey, ServiceVersion +from models_library.services_metadata_runtime import SimcoreContainerLabels from models_library.services_types import ServiceRunID from models_library.users import UserID from models_library.wallets import WalletID @@ -294,7 +295,7 @@ def compute_task_labels( ValidationError """ product_name = run_metadata.get("product_name", UNDEFINED_DOCKER_LABEL) - standard_simcore_labels = StandardSimcoreDockerLabels.model_validate( + standard_simcore_labels = SimcoreContainerLabels.model_validate( { "user_id": user_id, "project_id": project_id, diff --git a/services/director-v2/tests/unit/test_modules_dask_client.py b/services/director-v2/tests/unit/test_modules_dask_client.py index 909c3c238de7..902c98b1e7e6 100644 --- a/services/director-v2/tests/unit/test_modules_dask_client.py +++ b/services/director-v2/tests/unit/test_modules_dask_client.py @@ -41,11 +41,11 @@ from fastapi.applications import FastAPI from models_library.api_schemas_directorv2.services import NodeRequirements from models_library.clusters import ClusterTypeInModel, NoAuthentication -from models_library.docker import to_simcore_runtime_docker_label_key from models_library.projects import ProjectID from models_library.projects_nodes_io import NodeID from models_library.projects_state import RunningState from models_library.resource_tracker import HardwareInfo +from models_library.services_metadata_runtime import to_simcore_runtime_docker_label_key from models_library.services_types import ServiceRunID from models_library.users import UserID from pydantic import AnyUrl, ByteSize, TypeAdapter diff --git a/services/director-v2/tests/unit/test_modules_dynamic_sidecar_docker_compose_specs.py b/services/director-v2/tests/unit/test_modules_dynamic_sidecar_docker_compose_specs.py index 947261733950..c10b69c3ca1d 100644 --- a/services/director-v2/tests/unit/test_modules_dynamic_sidecar_docker_compose_specs.py +++ b/services/director-v2/tests/unit/test_modules_dynamic_sidecar_docker_compose_specs.py @@ -8,13 +8,13 @@ import pytest import yaml -from models_library.docker import to_simcore_runtime_docker_label_key from models_library.projects import ProjectID from models_library.projects_nodes_io import NodeID from models_library.service_settings_labels import ( ComposeSpecLabelDict, SimcoreServiceLabels, ) +from models_library.services_metadata_runtime import to_simcore_runtime_docker_label_key from models_library.services_resources import ( DEFAULT_SINGLE_SERVICE_NAME, ResourcesDict, @@ -131,7 +131,7 @@ async def test_inject_resource_limits_and_reservations( assert spec["deploy"]["resources"]["limits"]["memory"] == f"{memory.limit}" assert ( - f"{CPU_RESOURCE_LIMIT_KEY}={int(float(cpu.limit)*10**9)}" + f"{CPU_RESOURCE_LIMIT_KEY}={int(float(cpu.limit) * 10**9)}" in spec["environment"] ) assert f"{MEM_RESOURCE_LIMIT_KEY}={memory.limit}" in spec["environment"] @@ -143,7 +143,7 @@ async def test_inject_resource_limits_and_reservations( assert spec["cpus"] == max(cpu.limit, cpu.reservation) assert ( - f"{CPU_RESOURCE_LIMIT_KEY}={int(max(cpu.limit, cpu.reservation)*10**9)}" + f"{CPU_RESOURCE_LIMIT_KEY}={int(max(cpu.limit, cpu.reservation) * 10**9)}" in spec["environment"] ) assert f"{MEM_RESOURCE_LIMIT_KEY}={memory.limit}" in spec["environment"] diff --git a/services/director-v2/tests/unit/with_dbs/test_modules_dynamic_sidecar_docker_api.py b/services/director-v2/tests/unit/with_dbs/test_modules_dynamic_sidecar_docker_api.py index 06a791cc745c..31cdb5519ce0 100644 --- a/services/director-v2/tests/unit/with_dbs/test_modules_dynamic_sidecar_docker_api.py +++ b/services/director-v2/tests/unit/with_dbs/test_modules_dynamic_sidecar_docker_api.py @@ -14,10 +14,11 @@ import pytest from aiodocker.utils import clean_filters from faker import Faker -from models_library.docker import DockerNodeID, to_simcore_runtime_docker_label_key +from models_library.docker import DockerNodeID from models_library.projects import ProjectID from models_library.projects_nodes_io import NodeID from models_library.services_enums import ServiceState +from models_library.services_metadata_runtime import to_simcore_runtime_docker_label_key from models_library.users import UserID from pydantic import TypeAdapter from pytest_simcore.helpers.monkeypatch_envs import EnvVarsDict diff --git a/services/director-v2/tests/unit/with_dbs/test_modules_dynamic_sidecar_docker_service_specs.py b/services/director-v2/tests/unit/with_dbs/test_modules_dynamic_sidecar_docker_service_specs.py index 0bd3ccc48a05..3029c2e70a34 100644 --- a/services/director-v2/tests/unit/with_dbs/test_modules_dynamic_sidecar_docker_service_specs.py +++ b/services/director-v2/tests/unit/with_dbs/test_modules_dynamic_sidecar_docker_service_specs.py @@ -15,16 +15,16 @@ from fastapi.encoders import jsonable_encoder from models_library.aiodocker_api import AioDockerServiceSpec from models_library.callbacks_mapping import CallbacksMapping -from models_library.docker import ( - DOCKER_TASK_EC2_INSTANCE_TYPE_PLACEMENT_CONSTRAINT_KEY, - to_simcore_runtime_docker_label_key, -) from models_library.resource_tracker import HardwareInfo, PricingInfo from models_library.service_settings_labels import ( SimcoreServiceLabels, SimcoreServiceSettingsLabel, ) from models_library.services import ServiceKeyVersion, ServiceRunID +from models_library.services_metadata_runtime import ( + DOCKER_TASK_EC2_INSTANCE_TYPE_PLACEMENT_CONSTRAINT_KEY, + to_simcore_runtime_docker_label_key, +) from models_library.wallets import WalletInfo from pytest_simcore.helpers.monkeypatch_envs import setenvs_from_dict from pytest_simcore.helpers.typing_env import EnvVarsDict diff --git a/services/director-v2/tests/unit/with_dbs/test_utils_dask.py b/services/director-v2/tests/unit/with_dbs/test_utils_dask.py index e7924b6ab4e3..88459999d1c8 100644 --- a/services/director-v2/tests/unit/with_dbs/test_utils_dask.py +++ b/services/director-v2/tests/unit/with_dbs/test_utils_dask.py @@ -33,10 +33,10 @@ FileUploadLinks, FileUploadSchema, ) -from models_library.docker import to_simcore_runtime_docker_label_key from models_library.projects import ProjectID from models_library.projects_nodes_io import NodeID, SimCoreFileLink, SimcoreS3FileID from models_library.services import ServiceRunID +from models_library.services_metadata_runtime import to_simcore_runtime_docker_label_key from models_library.users import UserID from pydantic import ByteSize, TypeAdapter from pydantic.networks import AnyUrl diff --git a/services/director/src/simcore_service_director/registry_proxy.py b/services/director/src/simcore_service_director/registry_proxy.py index 9e4c95e864e1..8490e4d2c6ef 100644 --- a/services/director/src/simcore_service_director/registry_proxy.py +++ b/services/director/src/simcore_service_director/registry_proxy.py @@ -416,7 +416,7 @@ async def get_image_labels( # default to x86_64 architecture _logger.info( "Image %s:%s is a docker image with multiple architectures. " - "Currently defaulting to x86_64 architecture", + "Currently defaulting to first architecture", image, tag, )