Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions ado/core/actuatorconfiguration/resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# SPDX-License-Identifier: MIT

import uuid
from typing import Annotated, Any
from typing import Annotated, Any, Literal

import pydantic

Expand Down Expand Up @@ -33,7 +33,9 @@ def _identifier_from_data(data: dict[str, Any]) -> str:
return f"{data['kind'].value}-{data['config'].actuatorIdentifier}-{str(uuid.uuid4())[:8]}"

version: str = "v1"
kind: CoreResourceKinds = CoreResourceKinds.ACTUATORCONFIGURATION
kind: Annotated[
Literal[CoreResourceKinds.ACTUATORCONFIGURATION], pydantic.Field()
] = CoreResourceKinds.ACTUATORCONFIGURATION
config: ActuatorConfiguration
identifier: Annotated[
Defaultable[str],
Expand Down
4 changes: 2 additions & 2 deletions ado/core/datacontainer/resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

import typing
import uuid
from typing import Annotated
from typing import Annotated, Literal

import pydantic

Expand Down Expand Up @@ -188,7 +188,7 @@ def _identifier_from_data(data: dict[str, typing.Any]) -> str:
return f"{data['kind'].value}-{str(uuid.uuid4())[:8]}"

version: Annotated[str, pydantic.Field()] = "v1"
kind: Annotated[CoreResourceKinds, pydantic.Field()] = (
kind: Annotated[Literal[CoreResourceKinds.DATACONTAINER], pydantic.Field()] = (
CoreResourceKinds.DATACONTAINER
)
config: Annotated[DataContainer, pydantic.Field(description="A collection of data")]
Expand Down
6 changes: 4 additions & 2 deletions ado/core/discoveryspace/resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# SPDX-License-Identifier: MIT
import typing
import uuid
from typing import Annotated
from typing import Annotated, Literal

import pydantic
import rich.box
Expand Down Expand Up @@ -44,7 +44,9 @@ class DiscoverySpaceProvenanceInfo(ProvenanceInfo):

class DiscoverySpaceResource(ADOResource):
version: str = "v2"
kind: CoreResourceKinds = CoreResourceKinds.DISCOVERYSPACE
kind: Annotated[Literal[CoreResourceKinds.DISCOVERYSPACE], pydantic.Field()] = (
CoreResourceKinds.DISCOVERYSPACE
)
config: DiscoverySpaceConfiguration

identifier: Annotated[
Expand Down
6 changes: 4 additions & 2 deletions ado/core/operation/resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import enum
import typing
import uuid
from typing import Annotated
from typing import Annotated, Literal

import pydantic

Expand Down Expand Up @@ -81,7 +81,9 @@ class OperationProvenanceInfo(ProvenanceInfo):

class OperationResource(ADOResource):
version: Annotated[str, pydantic.Field()] = "v1"
kind: Annotated[CoreResourceKinds, pydantic.Field()] = CoreResourceKinds.OPERATION
kind: Annotated[Literal[CoreResourceKinds.OPERATION], pydantic.Field()] = (
CoreResourceKinds.OPERATION
)
operationType: Annotated[
DiscoveryOperationEnum, pydantic.Field(description="The type of this operation")
]
Expand Down
3 changes: 1 addition & 2 deletions ado/core/resources.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,9 @@
from ado.utilities.pydantic import Defaultable


class CoreResourceKinds(enum.Enum):
class CoreResourceKinds(str, enum.Enum):
OPERATION = "operation"
DISCOVERYSPACE = "discoveryspace"
# ACTUATOR = "actuator" AP - REMOVING IT AS REPLACED BY ACTUATORCONFIGURATION
ACTUATORCONFIGURATION = "actuatorconfiguration"
SAMPLESTORE = "samplestore"
DATACONTAINER = "datacontainer"
Expand Down
6 changes: 4 additions & 2 deletions ado/core/samplestore/resource.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Copyright IBM Corporation 2025, 2026
# SPDX-License-Identifier: MIT
from typing import Annotated
from typing import Annotated, Literal

import pydantic

Expand Down Expand Up @@ -32,7 +32,9 @@ def _generate_sample_store_identifier() -> str:
return identifier

version: str = "v2"
kind: CoreResourceKinds = CoreResourceKinds.SAMPLESTORE
kind: Annotated[Literal[CoreResourceKinds.SAMPLESTORE], pydantic.Field()] = (
CoreResourceKinds.SAMPLESTORE
)
config: SampleStoreConfiguration
identifier: Annotated[
Defaultable[str],
Expand Down
11 changes: 11 additions & 0 deletions tests/core/test_actuatorconfigs.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import pathlib
import re

import pydantic
import pytest
import yaml

Expand Down Expand Up @@ -176,3 +177,13 @@ def test_ml_multi_cloud_operation_base_get(
operation_configuration.get_actuatorconfigurations(
project_context=valid_ado_project_context
)


def test_actuator_configuration_resource_wrong_kind_raises_validation_error(
ml_multi_cloud_correct_actuatorconfiguration: ActuatorConfigurationResource,
) -> None:
"""ActuatorConfigurationResource rejects a kind value other than ACTUATORCONFIGURATION."""
data = ml_multi_cloud_correct_actuatorconfiguration.model_dump()
data["kind"] = CoreResourceKinds.OPERATION
with pytest.raises(pydantic.ValidationError):
ActuatorConfigurationResource.model_validate(data)
14 changes: 14 additions & 0 deletions tests/core/test_datacontainer.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
# Copyright IBM Corporation 2025, 2026
# SPDX-License-Identifier: MIT

import pydantic
import pytest

import ado.core
import ado.utilities.location
from ado.core import DataContainerResource
from ado.core.datacontainer.resource import DataContainer, TabularData
from ado.core.resources import CoreResourceKinds
from ado.utilities.location import SQLStoreConfiguration


Expand Down Expand Up @@ -73,3 +77,13 @@ def test_datacontainer_rich_print(

assert hasattr(data_container_resource, "__rich__")
Console().print(data_container_resource)


def test_datacontainer_resource_wrong_kind_raises_validation_error(
data_container_resource: DataContainerResource,
) -> None:
"""DataContainerResource rejects a kind value other than DATACONTAINER."""
data = data_container_resource.model_dump()
data["kind"] = CoreResourceKinds.OPERATION
with pytest.raises(pydantic.ValidationError):
DataContainerResource.model_validate(data)
10 changes: 10 additions & 0 deletions tests/core/test_operation.py
Original file line number Diff line number Diff line change
Expand Up @@ -241,3 +241,13 @@ def test_script_operation_resource_identifier() -> None:
assert operation.operationType == DiscoveryOperationEnum.CHARACTERIZE
assert operation.operatorIdentifier == "script-inline-script-0.1.0"
assert operation.identifier.startswith("operation-script-inline-script-0.1.0-")


def test_operation_resource_wrong_kind_raises_validation_error(
operation_resource: OperationResource,
) -> None:
"""OperationResource rejects a kind value other than OPERATION."""
data = operation_resource.model_dump()
data["kind"] = CoreResourceKinds.DISCOVERYSPACE
with pytest.raises(pydantic.ValidationError):
OperationResource.model_validate(data)
11 changes: 11 additions & 0 deletions tests/core/test_space.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import re
from collections.abc import Callable

import pydantic
import pytest
import yaml

Expand Down Expand Up @@ -540,3 +541,13 @@ def test_operation_context_failure_lifecycle(pfas_space: DiscoverySpace) -> None
assert lifecycle_statuses[0].event == OperationResourceEventEnum.STARTED
assert lifecycle_statuses[-1].event == OperationResourceEventEnum.FINISHED
assert lifecycle_statuses[-1].exit_state == OperationExitStateEnum.FAIL


def test_discovery_space_resource_wrong_kind_raises_validation_error(
discovery_space_resource: DiscoverySpaceResource,
) -> None:
"""DiscoverySpaceResource rejects a kind value other than DISCOVERYSPACE."""
data = discovery_space_resource.model_dump()
data["kind"] = CoreResourceKinds.OPERATION
with pytest.raises(pydantic.ValidationError):
DiscoverySpaceResource.model_validate(data)