diff --git a/src/saturn_engine/utils/declarative_config.py b/src/saturn_engine/utils/declarative_config.py index 5dafcf02..2577d028 100644 --- a/src/saturn_engine/utils/declarative_config.py +++ b/src/saturn_engine/utils/declarative_config.py @@ -13,7 +13,7 @@ class ObjectMetadata: labels: dict[str, str] = field(default_factory=dict) -@dataclasses.dataclass +@dataclasses.dataclass(kw_only=True) class BaseObject: metadata: ObjectMetadata apiVersion: str diff --git a/src/saturn_engine/worker_manager/config/declarative.py b/src/saturn_engine/worker_manager/config/declarative.py index abad9ece..fd0076c4 100644 --- a/src/saturn_engine/worker_manager/config/declarative.py +++ b/src/saturn_engine/worker_manager/config/declarative.py @@ -10,13 +10,21 @@ from saturn_engine.utils.declarative_config import load_uncompiled_objects_from_str from saturn_engine.utils.options import fromdict +from .declarative_dynamic_topology import DYNAMIC_TOPOLOGY_KIND from .declarative_dynamic_topology import DynamicTopology +from .declarative_executor import EXECUTOR_KIND from .declarative_executor import Executor +from .declarative_inventory import INVENTORY_KIND from .declarative_inventory import Inventory +from .declarative_job import JOB_KIND from .declarative_job import Job +from .declarative_job_definition import JOB_DEFINITION_KIND from .declarative_job_definition import JobDefinition +from .declarative_resource import RESOURCE_KIND +from .declarative_resource import RESOURCE_PROVIDER_KIND from .declarative_resource import Resource from .declarative_resource import ResourcesProvider +from .declarative_topic_item import TOPIC_ITEM_KIND from .declarative_topic_item import TopicItem from .static_definitions import StaticDefinitions @@ -37,28 +45,28 @@ def compile_static_definitions( definitions: StaticDefinitions = StaticDefinitions() for uncompiled_executor in objects_by_kind.pop( - "SaturnExecutor", + EXECUTOR_KIND, dict(), ).values(): executor: Executor = fromdict(uncompiled_executor.data, Executor) definitions.add(executor) for uncompiled_inventory in objects_by_kind.pop( - "SaturnInventory", + INVENTORY_KIND, dict(), ).values(): inventory: Inventory = fromdict(uncompiled_inventory.data, Inventory) definitions.add(inventory) for uncompiled_topic in objects_by_kind.pop( - "SaturnTopic", + TOPIC_ITEM_KIND, dict(), ).values(): topic_item: TopicItem = fromdict(uncompiled_topic.data, TopicItem) definitions.add(topic_item) for uncompiled_job_definition in objects_by_kind.pop( - "SaturnJobDefinition", + JOB_DEFINITION_KIND, dict(), ).values(): job_definition: JobDefinition = fromdict( @@ -67,21 +75,21 @@ def compile_static_definitions( definitions.add(job_definition) for uncompiled_job in objects_by_kind.pop( - "SaturnJob", + JOB_KIND, dict(), ).values(): job_data: Job = fromdict(uncompiled_job.data, Job) definitions.add(job_data) for uncompiled_resource in objects_by_kind.pop( - "SaturnResource", + RESOURCE_KIND, dict(), ).values(): resource: Resource = fromdict(uncompiled_resource.data, Resource) definitions.add(resource) for uncompied_resources_provider in objects_by_kind.pop( - "SaturnResourcesProvider", + RESOURCE_PROVIDER_KIND, dict(), ).values(): resources_provider = fromdict( @@ -90,7 +98,7 @@ def compile_static_definitions( definitions.add(resources_provider) for uncompiled_dynamic_topology in objects_by_kind.pop( - "SaturnDynamicTopology", + DYNAMIC_TOPOLOGY_KIND, dict(), ).values(): dynamic_topology: DynamicTopology = fromdict( diff --git a/src/saturn_engine/worker_manager/config/declarative_dynamic_topology.py b/src/saturn_engine/worker_manager/config/declarative_dynamic_topology.py index b76b90d5..877f05da 100644 --- a/src/saturn_engine/worker_manager/config/declarative_dynamic_topology.py +++ b/src/saturn_engine/worker_manager/config/declarative_dynamic_topology.py @@ -6,6 +6,8 @@ from saturn_engine.utils.declarative_config import BaseObject from saturn_engine.worker_manager.config.static_definitions import StaticDefinitions +DYNAMIC_TOPOLOGY_KIND: t.Final[str] = "SaturnDynamicTopology" + class DynamicTopologyModule(t.Protocol): def __call__(self, definitions: StaticDefinitions) -> None: ... @@ -16,9 +18,10 @@ class DynamicTopologySpec: module: str -@dataclasses.dataclass +@dataclasses.dataclass(kw_only=True) class DynamicTopology(BaseObject): spec: DynamicTopologySpec + kind: str = DYNAMIC_TOPOLOGY_KIND def update_static_definitions(self, definitions: StaticDefinitions) -> None: t.cast( diff --git a/src/saturn_engine/worker_manager/config/declarative_executor.py b/src/saturn_engine/worker_manager/config/declarative_executor.py index c048fc4c..03c2078f 100644 --- a/src/saturn_engine/worker_manager/config/declarative_executor.py +++ b/src/saturn_engine/worker_manager/config/declarative_executor.py @@ -1,4 +1,4 @@ -from typing import Any +import typing as t import dataclasses from dataclasses import field @@ -6,16 +6,19 @@ from saturn_engine.core import api from saturn_engine.utils.declarative_config import BaseObject +EXECUTOR_KIND: t.Final[str] = "SaturnExecutor" + @dataclasses.dataclass class ExecutorSpec: type: str - options: dict[str, Any] = field(default_factory=dict) + options: dict[str, t.Any] = field(default_factory=dict) -@dataclasses.dataclass +@dataclasses.dataclass(kw_only=True) class Executor(BaseObject): spec: ExecutorSpec + kind: str = EXECUTOR_KIND def to_core_object(self) -> api.ComponentDefinition: return api.ComponentDefinition( diff --git a/src/saturn_engine/worker_manager/config/declarative_inventory.py b/src/saturn_engine/worker_manager/config/declarative_inventory.py index 4efae717..6d5d4e73 100644 --- a/src/saturn_engine/worker_manager/config/declarative_inventory.py +++ b/src/saturn_engine/worker_manager/config/declarative_inventory.py @@ -1,4 +1,4 @@ -from typing import Any +import typing as t import dataclasses from dataclasses import field @@ -6,16 +6,19 @@ from saturn_engine.core import api from saturn_engine.utils.declarative_config import BaseObject +INVENTORY_KIND: t.Final[str] = "SaturnInventory" + @dataclasses.dataclass class InventorySpec: type: str - options: dict[str, Any] = field(default_factory=dict) + options: dict[str, t.Any] = field(default_factory=dict) -@dataclasses.dataclass +@dataclasses.dataclass(kw_only=True) class Inventory(BaseObject): spec: InventorySpec + kind: str = INVENTORY_KIND def to_core_object(self) -> api.ComponentDefinition: return api.ComponentDefinition( diff --git a/src/saturn_engine/worker_manager/config/declarative_job.py b/src/saturn_engine/worker_manager/config/declarative_job.py index d47db453..ec5b8ba6 100644 --- a/src/saturn_engine/worker_manager/config/declarative_job.py +++ b/src/saturn_engine/worker_manager/config/declarative_job.py @@ -10,6 +10,7 @@ from saturn_engine.worker_manager.config.static_definitions import StaticDefinitions DEFAULT_INPUT_NAME: t.Final[str] = "default" +JOB_KIND: t.Final[str] = "SaturnJob" @dataclasses.dataclass @@ -101,9 +102,10 @@ def to_core_objects( ) -@dataclasses.dataclass +@dataclasses.dataclass(kw_only=True) class Job(BaseObject): spec: JobSpec + kind: str = JOB_KIND def to_core_objects( self, diff --git a/src/saturn_engine/worker_manager/config/declarative_job_definition.py b/src/saturn_engine/worker_manager/config/declarative_job_definition.py index 138e8664..d1ffc3e8 100644 --- a/src/saturn_engine/worker_manager/config/declarative_job_definition.py +++ b/src/saturn_engine/worker_manager/config/declarative_job_definition.py @@ -8,6 +8,8 @@ from .static_definitions import StaticDefinitions +JOB_DEFINITION_KIND: t.Final[str] = "SaturnJobDefinition" + @dataclasses.dataclass class JobDefinitionSpec: @@ -15,9 +17,10 @@ class JobDefinitionSpec: minimalInterval: str -@dataclasses.dataclass +@dataclasses.dataclass(kw_only=True) class JobDefinition(BaseObject): spec: JobDefinitionSpec + kind: str = JOB_DEFINITION_KIND def to_core_objects( self, diff --git a/src/saturn_engine/worker_manager/config/declarative_resource.py b/src/saturn_engine/worker_manager/config/declarative_resource.py index be85ffe6..b1f88f0b 100644 --- a/src/saturn_engine/worker_manager/config/declarative_resource.py +++ b/src/saturn_engine/worker_manager/config/declarative_resource.py @@ -1,11 +1,13 @@ -from typing import Any -from typing import Optional +import typing as t import dataclasses from saturn_engine.core import api from saturn_engine.utils.declarative_config import BaseObject +RESOURCE_KIND: t.Final[str] = "SaturnResource" +RESOURCE_PROVIDER_KIND: t.Final[str] = "SaturnResourcesProvider" + @dataclasses.dataclass class ResourceRateLimitSpec: @@ -16,15 +18,16 @@ class ResourceRateLimitSpec: @dataclasses.dataclass class ResourceSpec: type: str - data: dict[str, Any] + data: dict[str, t.Any] default_delay: float = 0 - rate_limit: Optional[ResourceRateLimitSpec] = None + rate_limit: t.Optional[ResourceRateLimitSpec] = None concurrency: int = 1 -@dataclasses.dataclass +@dataclasses.dataclass(kw_only=True) class Resource(BaseObject): spec: ResourceSpec + kind: str = RESOURCE_KIND def to_core_object(self) -> api.ResourceItem: return api.ResourceItem( @@ -47,12 +50,13 @@ def to_core_object(self) -> api.ResourceItem: class ResourcesProviderSpec: type: str resource_type: str - options: dict[str, Any] + options: dict[str, t.Any] -@dataclasses.dataclass +@dataclasses.dataclass(kw_only=True) class ResourcesProvider(BaseObject): spec: ResourcesProviderSpec + kind: str = RESOURCE_PROVIDER_KIND def to_core_object(self) -> api.ResourcesProviderItem: return api.ResourcesProviderItem( diff --git a/src/saturn_engine/worker_manager/config/declarative_topic_item.py b/src/saturn_engine/worker_manager/config/declarative_topic_item.py index abd30994..f37cfe7d 100644 --- a/src/saturn_engine/worker_manager/config/declarative_topic_item.py +++ b/src/saturn_engine/worker_manager/config/declarative_topic_item.py @@ -1,4 +1,4 @@ -from typing import Any +import typing as t import dataclasses from dataclasses import field @@ -6,16 +6,19 @@ from saturn_engine.core import api from saturn_engine.utils.declarative_config import BaseObject +TOPIC_ITEM_KIND: t.Final[str] = "SaturnTopic" + @dataclasses.dataclass class TopicSpec: type: str - options: dict[str, Any] = field(default_factory=dict) + options: dict[str, t.Any] = field(default_factory=dict) -@dataclasses.dataclass +@dataclasses.dataclass(kw_only=True) class TopicItem(BaseObject): spec: TopicSpec + kind: str = TOPIC_ITEM_KIND def to_core_object(self) -> api.ComponentDefinition: return api.ComponentDefinition(