PRD 0032: Decompose smolmachines launch and harden bringup sequencing #123

Merged
didericis merged 4 commits from prd-0032 into main 2026-06-02 02:31:37 -04:00
2 changed files with 12 additions and 11 deletions
Showing only changes of commit a81f0ffa49 - Show all commits
+7 -4
View File
@@ -32,7 +32,6 @@ from dataclasses import dataclass
from pathlib import Path
from typing import Mapping, Sequence
from ...log import die
_SMOLVM = "smolvm"
@@ -218,9 +217,13 @@ def wait_exec_ready(name: str, *, timeout: float = 5.0) -> None:
break
time.sleep(min(delay, remaining))
delay = min(delay * 2, 0.5)
die(
f"smolvm machine {name!r}: exec channel not ready after "
f"{timeout:.0f}s — VM may have failed to boot."
argv = ["smolvm", "machine", "exec", "--name", name, "--", "true"]
raise SmolvmError(
Outdated
Review

Will this crash the dashboard?

If so, this should be some kind of error we raise instead, and some other handler should decide whether or not it dies.

Will this crash the dashboard? If so, this should be some kind of error we raise instead, and some other handler should decide whether or not it dies.
argv,
subprocess.CompletedProcess(
args=argv, returncode=-1, stdout="",
stderr=f"exec channel not ready after {timeout:.0f}s — VM may have failed to boot.",
),
)
+5 -7
View File
@@ -228,7 +228,7 @@ class TestWaitExecReady(unittest.TestCase):
wait_exec_ready("vm-x")
self.assertEqual(3, m.call_count)
def test_dies_on_timeout(self):
def test_raises_smolvm_error_on_timeout(self):
# machine_exec always returns non-zero; monotonic advances past
# the deadline after the first sleep so the loop exits.
ticks = [0.0, 0.0, 10.0] # third call puts us past deadline
@@ -236,13 +236,11 @@ class TestWaitExecReady(unittest.TestCase):
return_value=SmolvmRunResult(1, "", "")), \
patch.object(smolvm_mod.time, "monotonic",
side_effect=ticks), \
patch.object(smolvm_mod.time, "sleep"), \
patch.object(smolvm_mod, "die",
side_effect=SystemExit("die")) as die_mock:
with self.assertRaises(SystemExit):
patch.object(smolvm_mod.time, "sleep"):
with self.assertRaises(SmolvmError) as cm:
wait_exec_ready("vm-x", timeout=5.0)
die_mock.assert_called_once()
self.assertIn("vm-x", die_mock.call_args.args[0])
self.assertIn("vm-x", str(cm.exception))
self.assertIn("not ready", str(cm.exception))
class TestIsAvailable(unittest.TestCase):