From c0dc28246c18708acc545e6dbc3e389f660fa007 Mon Sep 17 00:00:00 2001 From: Olivier Le Thanh Duong Date: Fri, 13 Dec 2024 10:03:04 +0100 Subject: [PATCH] Add VmClient.operate Variation on perform_operation that allow a raw response. Move from the aleph-client code introduced in https://github.com/aleph-im/aleph-client/pull/304 --- src/aleph/sdk/client/vm_client.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/aleph/sdk/client/vm_client.py b/src/aleph/sdk/client/vm_client.py index 83b00dc9..f41c6ac1 100644 --- a/src/aleph/sdk/client/vm_client.py +++ b/src/aleph/sdk/client/vm_client.py @@ -5,6 +5,7 @@ from urllib.parse import urlparse import aiohttp +from aiohttp.client import _RequestContextManager from aleph_message.models import Chain, ItemHash from eth_account.messages import encode_defunct from jwcrypto import jwk @@ -127,6 +128,32 @@ async def perform_operation( logger.error(f"HTTP error during operation {operation}: {str(e)}") return None, str(e) + def operate( + self, vm_id: ItemHash, operation: str, method: str = "POST" + ) -> _RequestContextManager: + """Request a CRN an operation for a VM (eg reboot, logs) + + This operation is authenticated via the user wallet. + Use as an async context manager. + e.g `async with client.operate(vm_id=item_hash, operation="logs", method="GET") as response:` + """ + + async def authenticated_request(): + if not self.pubkey_signature_header: + self.pubkey_signature_header = ( + await self._generate_pubkey_signature_header() + ) + + url, header = await self._generate_header( + vm_id=vm_id, operation=operation, method=method + ) + resp = await self.session._request( + method=method, str_or_url=url, headers=header + ) + return resp + + return _RequestContextManager(authenticated_request()) + async def get_logs(self, vm_id: ItemHash) -> AsyncGenerator[str, None]: if not self.pubkey_signature_header: self.pubkey_signature_header = (