diff --git a/src/aleph/sdk/client/authenticated_http.py b/src/aleph/sdk/client/authenticated_http.py index 78b006fd..6b5b2ea8 100644 --- a/src/aleph/sdk/client/authenticated_http.py +++ b/src/aleph/sdk/client/authenticated_http.py @@ -37,7 +37,7 @@ from ..conf import settings from ..exceptions import BroadcastError, InsufficientFundsError, InvalidMessageError from ..types import Account, StorageEnum -from ..utils import extended_json_encoder +from ..utils import extended_json_encoder, parse_volume from .abstract import AuthenticatedAlephClient from .http import AlephHttpClient @@ -450,7 +450,7 @@ async def create_program( triggers = {"http": True, "persistent": persistent} volumes: List[MachineVolume] = [ - MachineVolume.parse_obj(volume) for volume in volumes + parse_volume(volume) for volume in volumes ] content = ProgramContent( @@ -482,7 +482,7 @@ async def create_program( if runtime == settings.DEFAULT_RUNTIME_ID else "", ), - volumes=[MachineVolume.parse_obj(volume) for volume in volumes], + volumes=[parse_volume(volume) for volume in volumes], time=time.time(), metadata=metadata, ) @@ -555,7 +555,7 @@ async def create_instance( if rootfs == settings.DEFAULT_RUNTIME_ID else "", ), - volumes=[MachineVolume.parse_obj(volume) for volume in volumes], + volumes=[parse_volume(volume) for volume in volumes], time=time.time(), authorized_keys=ssh_keys, metadata=metadata, diff --git a/src/aleph/sdk/utils.py b/src/aleph/sdk/utils.py index 5b338f88..63fc121e 100644 --- a/src/aleph/sdk/utils.py +++ b/src/aleph/sdk/utils.py @@ -5,11 +5,12 @@ from enum import Enum from pathlib import Path from shutil import make_archive -from typing import Any, Iterable, Optional, Protocol, Tuple, Type, TypeVar, Union +from typing import Any, Iterable, Optional, Protocol, Tuple, Type, TypeVar, Union, get_args, Mapping from zipfile import BadZipFile, ZipFile from aleph_message.models import MessageType from aleph_message.models.execution.program import Encoding +from aleph_message.models.execution.volume import MachineVolume, ImmutableVolume, PersistentVolume, EphemeralVolume from pydantic.json import pydantic_encoder from aleph.sdk.conf import settings @@ -150,3 +151,15 @@ def extended_json_encoder(obj: Any) -> Any: return obj.hour * 3600 + obj.minute * 60 + obj.second + obj.microsecond / 1e6 else: return pydantic_encoder(obj) + + +def parse_volume(volume_dict: Union[Mapping, MachineVolume]) -> MachineVolume: + if isinstance(volume_dict, MachineVolume): + return volume_dict + for volume_type in get_args(MachineVolume): + try: + return volume_type.parse_obj(volume_dict) + except ValueError: + continue + else: + raise ValueError(f"Could not parse volume: {volume_dict}")