1313 AlephMessage ,
1414 ForgetContent ,
1515 ForgetMessage ,
16+ InstanceContent ,
17+ InstanceMessage ,
1618 ItemType ,
1719 MessageType ,
1820 PostContent ,
2729 FunctionEnvironment ,
2830 MachineResources ,
2931)
32+ from aleph_message .models .execution .instance import RootfsVolume
3033from aleph_message .models .execution .program import CodeContent , FunctionRuntime
31- from aleph_message .models .execution .volume import MachineVolume
34+ from aleph_message .models .execution .volume import MachineVolume , ParentVolume
3235from aleph_message .status import MessageStatus
3336from pydantic .json import pydantic_encoder
3437
@@ -463,7 +466,7 @@ async def create_program(
463466 if runtime == settings .DEFAULT_RUNTIME_ID
464467 else "" ,
465468 ),
466- volumes = volumes ,
469+ volumes = [ MachineVolume . parse_obj ( volume ) for volume in volumes ] ,
467470 time = time .time (),
468471 metadata = metadata ,
469472 )
@@ -479,6 +482,76 @@ async def create_program(
479482 sync = sync ,
480483 )
481484
485+ async def create_instance (
486+ self ,
487+ rootfs : str ,
488+ rootfs_size : int ,
489+ rootfs_name : str ,
490+ environment_variables : Optional [Mapping [str , str ]] = None ,
491+ storage_engine : StorageEnum = StorageEnum .storage ,
492+ channel : Optional [str ] = None ,
493+ address : Optional [str ] = None ,
494+ sync : bool = False ,
495+ memory : Optional [int ] = None ,
496+ vcpus : Optional [int ] = None ,
497+ timeout_seconds : Optional [float ] = None ,
498+ allow_amend : bool = False ,
499+ internet : bool = True ,
500+ aleph_api : bool = True ,
501+ encoding : Encoding = Encoding .zip ,
502+ volumes : Optional [List [Mapping ]] = None ,
503+ volume_persistence : str = "host" ,
504+ ssh_keys : Optional [List [str ]] = None ,
505+ metadata : Optional [Mapping [str , Any ]] = None ,
506+ ) -> Tuple [InstanceMessage , MessageStatus ]:
507+ address = address or settings .ADDRESS_TO_USE or self .account .get_address ()
508+
509+ volumes = volumes if volumes is not None else []
510+ memory = memory or settings .DEFAULT_VM_MEMORY
511+ vcpus = vcpus or settings .DEFAULT_VM_VCPUS
512+ timeout_seconds = timeout_seconds or settings .DEFAULT_VM_TIMEOUT
513+
514+ content = InstanceContent (
515+ address = address ,
516+ allow_amend = allow_amend ,
517+ environment = FunctionEnvironment (
518+ reproducible = False ,
519+ internet = internet ,
520+ aleph_api = aleph_api ,
521+ ),
522+ variables = environment_variables ,
523+ resources = MachineResources (
524+ vcpus = vcpus ,
525+ memory = memory ,
526+ seconds = timeout_seconds ,
527+ ),
528+ rootfs = RootfsVolume (
529+ parent = ParentVolume (
530+ ref = rootfs ,
531+ use_latest = True ,
532+ ),
533+ name = rootfs_name ,
534+ size_mib = rootfs_size ,
535+ persistence = "host" ,
536+ use_latest = True ,
537+ comment = "Official Aleph Debian root filesystem"
538+ if rootfs == settings .DEFAULT_RUNTIME_ID
539+ else "" ,
540+ ),
541+ volumes = [MachineVolume .parse_obj (volume ) for volume in volumes ],
542+ time = time .time (),
543+ authorized_keys = ssh_keys ,
544+ metadata = metadata ,
545+ )
546+
547+ return await self .submit (
548+ content = content .dict (exclude_none = True ),
549+ message_type = MessageType .instance ,
550+ channel = channel ,
551+ storage_engine = storage_engine ,
552+ sync = sync ,
553+ )
554+
482555 async def forget (
483556 self ,
484557 hashes : List [str ],
0 commit comments