Reuse dead VM names in sandbox auto-naming
This commit is contained in:
parent
f3c5e2ce48
commit
ea0deb8e70
@ -25,11 +25,19 @@ async def _agent_responding(record) -> bool:
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def _auto_name(taken: list[str]) -> str:
|
def _auto_name(registry) -> str:
|
||||||
if "sandbox" not in taken:
|
"""First 'sandbox[-N]' name that is unregistered or belongs to a dead VM
|
||||||
|
(launch_vm reclaims dead names, so reusing them is safe and keeps names
|
||||||
|
predictable)."""
|
||||||
|
|
||||||
|
def usable(candidate: str) -> bool:
|
||||||
|
record = registry.get(candidate)
|
||||||
|
return record is None or not registry.is_process_alive(record)
|
||||||
|
|
||||||
|
if usable("sandbox"):
|
||||||
return "sandbox"
|
return "sandbox"
|
||||||
i = 2
|
i = 2
|
||||||
while f"sandbox-{i}" in taken:
|
while not usable(f"sandbox-{i}"):
|
||||||
i += 1
|
i += 1
|
||||||
return f"sandbox-{i}"
|
return f"sandbox-{i}"
|
||||||
|
|
||||||
@ -57,7 +65,7 @@ async def sandbox_vm(
|
|||||||
raise ToolError(f"Bad base image: {e}") from e
|
raise ToolError(f"Bad base image: {e}") from e
|
||||||
|
|
||||||
if name is None:
|
if name is None:
|
||||||
name = _auto_name(state.registry.names())
|
name = _auto_name(state.registry)
|
||||||
elif not valid_vm_name(name):
|
elif not valid_vm_name(name):
|
||||||
raise ToolError(
|
raise ToolError(
|
||||||
f"Invalid VM name {name!r}: use letters, digits, '.', '_', '-' (max 48 chars)."
|
f"Invalid VM name {name!r}: use letters, digits, '.', '_', '-' (max 48 chars)."
|
||||||
|
|||||||
@ -99,13 +99,24 @@ async def test_sandbox_vm_creates_overlay_and_waits(dirs, base_image, fake_launc
|
|||||||
assert data["overlay"] == str(overlay)
|
assert data["overlay"] == str(overlay)
|
||||||
|
|
||||||
|
|
||||||
async def test_sandbox_auto_names_avoid_collisions(dirs, base_image, fake_launch, agent_up):
|
async def test_sandbox_auto_names_avoid_live_collisions(
|
||||||
|
dirs, base_image, fake_launch, agent_up, all_pids_alive
|
||||||
|
):
|
||||||
write_registry(dirs, seeded_record(dirs, "sandbox"))
|
write_registry(dirs, seeded_record(dirs, "sandbox"))
|
||||||
async with Client(mcp) as client:
|
async with Client(mcp) as client:
|
||||||
data = result_data(await client.call_tool("sandbox_vm", {"base_image": str(base_image)}))
|
data = result_data(await client.call_tool("sandbox_vm", {"base_image": str(base_image)}))
|
||||||
assert data["name"] == "sandbox-2"
|
assert data["name"] == "sandbox-2"
|
||||||
|
|
||||||
|
|
||||||
|
async def test_sandbox_auto_name_reuses_dead(
|
||||||
|
dirs, base_image, fake_launch, agent_up, all_pids_dead
|
||||||
|
):
|
||||||
|
write_registry(dirs, seeded_record(dirs, "sandbox"))
|
||||||
|
async with Client(mcp) as client:
|
||||||
|
data = result_data(await client.call_tool("sandbox_vm", {"base_image": str(base_image)}))
|
||||||
|
assert data["name"] == "sandbox"
|
||||||
|
|
||||||
|
|
||||||
async def test_sandbox_agent_timeout_reports_hint(dirs, base_image, fake_launch, monkeypatch):
|
async def test_sandbox_agent_timeout_reports_hint(dirs, base_image, fake_launch, monkeypatch):
|
||||||
async def never(record):
|
async def never(record):
|
||||||
return False
|
return False
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user