From 577da79a472c5cc73a52882db9145c406d7f36e1 Mon Sep 17 00:00:00 2001 From: rovle Date: Thu, 5 Mar 2026 11:03:39 -0800 Subject: [PATCH] fix(daytona): make disk cap visible and use SDK enum for sandbox state - Replace logger.warning with warnings.warn for the disk cap so users actually see it (logger was suppressed by CLI's log level config) - Use SandboxState enum instead of string literals in _ensure_sandbox_ready Signed-off-by: rovle --- tests/tools/test_daytona_environment.py | 9 +++++++++ tools/environments/daytona.py | 11 +++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/tests/tools/test_daytona_environment.py b/tests/tools/test_daytona_environment.py index a7fe71e26..c27edd102 100644 --- a/tests/tools/test_daytona_environment.py +++ b/tests/tools/test_daytona_environment.py @@ -27,11 +27,20 @@ def _patch_daytona_imports(monkeypatch): """Patch the daytona SDK so DaytonaEnvironment can be imported without it.""" import types as _types + import enum + + class _SandboxState(str, enum.Enum): + STARTED = "started" + STOPPED = "stopped" + ARCHIVED = "archived" + ERROR = "error" + daytona_mod = _types.ModuleType("daytona") daytona_mod.Daytona = MagicMock daytona_mod.CreateSandboxFromImageParams = MagicMock daytona_mod.DaytonaError = type("DaytonaError", (Exception,), {}) daytona_mod.Resources = MagicMock(name="Resources") + daytona_mod.SandboxState = _SandboxState monkeypatch.setitem(__import__("sys").modules, "daytona", daytona_mod) return daytona_mod diff --git a/tools/environments/daytona.py b/tools/environments/daytona.py index adc89fe01..43716fa80 100644 --- a/tools/environments/daytona.py +++ b/tools/environments/daytona.py @@ -9,6 +9,7 @@ import logging import math import threading import uuid +import warnings from typing import Optional from tools.environments.base import BaseEnvironment @@ -43,10 +44,12 @@ class DaytonaEnvironment(BaseEnvironment): CreateSandboxFromImageParams, DaytonaError, Resources, + SandboxState, ) self._persistent = persistent_filesystem self._task_id = task_id + self._SandboxState = SandboxState self._daytona = Daytona() self._sandbox = None self._lock = threading.Lock() @@ -54,7 +57,11 @@ class DaytonaEnvironment(BaseEnvironment): memory_gib = max(1, math.ceil(memory / 1024)) disk_gib = max(1, math.ceil(disk / 1024)) if disk_gib > 10: - logger.warning("Daytona: capping disk from %dGB to 10GB (platform limit)", disk_gib) + warnings.warn( + f"Daytona: requested disk ({disk_gib}GB) exceeds platform limit (10GB). " + f"Capping to 10GB. Set container_disk: 10240 in config to silence this.", + stacklevel=2, + ) disk_gib = 10 resources = Resources(cpu=cpu, memory=memory_gib, disk=disk_gib) @@ -99,7 +106,7 @@ class DaytonaEnvironment(BaseEnvironment): def _ensure_sandbox_ready(self): """Restart sandbox if it was stopped (e.g., by a previous interrupt).""" self._sandbox.refresh_data() - if self._sandbox.state in ("stopped", "archived"): + if self._sandbox.state in (self._SandboxState.STOPPED, self._SandboxState.ARCHIVED): self._sandbox.start() logger.info("Daytona: restarted sandbox %s", self._sandbox.id)