diff --git a/src/aleph/vm/orchestrator/utils.py b/src/aleph/vm/orchestrator/utils.py index 3a9f7bb0d..16419ff33 100644 --- a/src/aleph/vm/orchestrator/utils.py +++ b/src/aleph/vm/orchestrator/utils.py @@ -4,6 +4,7 @@ from typing import Any, TypedDict import aiohttp +from aleph_message.models import InstanceContent, ProgramContent from aleph.vm.conf import settings @@ -106,3 +107,20 @@ def get_compatible_gpus() -> list[Any]: if not LAST_AGGREGATE_SETTINGS: return [] return LAST_AGGREGATE_SETTINGS["compatible_gpus"] + + +def get_execution_disk_size(message: InstanceContent | ProgramContent) -> int: + disk_size_mib = 0 + + # For Programs the disk size depends on the runtime + # TODO: Find the real size of the runtime and for the code volumes + if isinstance(message, InstanceContent): + disk_size_mib = message.rootfs.size_mib + + # For volumes, only the persistent and ephemeral volumes have a size field + # TODO: Find the real size of Inmutable volumes + for volume in message.volumes: + if getattr(volume, "size_mib", None): + disk_size_mib += volume.size_mib + + return disk_size_mib diff --git a/src/aleph/vm/orchestrator/views/__init__.py b/src/aleph/vm/orchestrator/views/__init__.py index feafab4d1..219ebce45 100644 --- a/src/aleph/vm/orchestrator/views/__init__.py +++ b/src/aleph/vm/orchestrator/views/__init__.py @@ -46,6 +46,7 @@ from aleph.vm.orchestrator.utils import ( format_cost, get_community_wallet_address, + get_execution_disk_size, is_after_community_wallet_start, update_aggregate_settings, ) @@ -220,6 +221,11 @@ async def list_executions_v2(request: web.Request) -> web.Response: if execution.vm and execution.vm.tap_interface else {} ), + "resources": { + "vcpus": execution.message.resources.vcpus, + "memory": execution.message.resources.memory, + "disk_mib": get_execution_disk_size(execution.message), + }, "status": execution.times, "running": execution.is_running, } diff --git a/tests/supervisor/test_views.py b/tests/supervisor/test_views.py index b2b63c5bb..39747815c 100644 --- a/tests/supervisor/test_views.py +++ b/tests/supervisor/test_views.py @@ -389,6 +389,11 @@ async def test_v2_executions_list_one_vm(aiohttp_client, mock_app_with_pool, moc assert await response.json() == { "decadecadecadecadecadecadecadecadecadecadecadecadecadecadecadeca": { "networking": {}, + "resources": { + "vcpus": 1, + "memory": 256, + "disk_mib": 1000, + }, "status": { "defined_at": str(execution.times.defined_at), "preparing_at": None, @@ -464,6 +469,11 @@ async def test_v2_executions_list_vm_network(aiohttp_client, mocker, mock_app_wi "ipv6_ip": "fc00:1:2:3:3:deca:deca:dec1", "mapped_ports": {}, }, + "resources": { + "vcpus": 1, + "memory": 256, + "disk_mib": 1000, + }, "status": { "defined_at": str(execution.times.defined_at), "preparing_at": None,