Skip to content

Commit

Permalink
Add parse_volume to fix parsing of MachineVolume types
Browse files Browse the repository at this point in the history
  • Loading branch information
MHHukiewitz committed Jan 22, 2024
1 parent ef520a0 commit d7edea2
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 5 deletions.
8 changes: 4 additions & 4 deletions src/aleph/sdk/client/authenticated_http.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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,
)
Expand Down Expand Up @@ -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,
Expand Down
15 changes: 14 additions & 1 deletion src/aleph/sdk/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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}")

0 comments on commit d7edea2

Please sign in to comment.