mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-08 03:01:47 +00:00
singularity working
This commit is contained in:
parent
4d619bcd21
commit
fd1c3da305
23 changed files with 1444 additions and 38 deletions
108
test_singularity_sandbox.py
Normal file
108
test_singularity_sandbox.py
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
#!/usr/bin/env python3
|
||||
"""
|
||||
Test script for Singularity/Apptainer sandbox integration.
|
||||
|
||||
This tests the SlotPool with driver="singularity" using the raw_exec Nomad driver.
|
||||
"""
|
||||
|
||||
import asyncio
|
||||
import sys
|
||||
import os
|
||||
|
||||
# Add parent to path for imports
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
from atropos.slots.pool import SlotPool, SlotPoolConfig
|
||||
|
||||
|
||||
async def test_singularity_sandbox():
|
||||
"""Test the Singularity sandbox deployment and basic execution."""
|
||||
|
||||
# Configure for Singularity
|
||||
config = SlotPoolConfig(
|
||||
nomad_address="http://localhost:4646",
|
||||
job_id="atropos-sandbox-singularity",
|
||||
driver="singularity",
|
||||
singularity_image="/root/Hermes-Agent/atropos/atropos-sandbox.sif",
|
||||
slots_per_container=5,
|
||||
min_containers=1,
|
||||
max_containers=2,
|
||||
cpu=500,
|
||||
memory=512,
|
||||
purge_job_on_start=True, # Clean start for testing
|
||||
)
|
||||
|
||||
print(f"Testing Singularity sandbox with config:")
|
||||
print(f" driver: {config.driver}")
|
||||
print(f" singularity_image: {config.singularity_image}")
|
||||
print(f" job_id: {config.job_id}")
|
||||
print()
|
||||
|
||||
pool = SlotPool(config)
|
||||
|
||||
try:
|
||||
print("Starting SlotPool...")
|
||||
await pool.start()
|
||||
|
||||
stats = pool.get_stats()
|
||||
print(f"Pool started! Stats: {stats}")
|
||||
print()
|
||||
|
||||
# Acquire a slot
|
||||
print("Acquiring slot...")
|
||||
slot = await pool.acquire("test-trajectory-001")
|
||||
print(f"Acquired slot: {slot.slot_id} (alloc={slot.alloc_id[:8]})")
|
||||
print()
|
||||
|
||||
# Execute a simple command
|
||||
print("Executing 'echo hello from singularity'...")
|
||||
result = await pool.execute(
|
||||
slot,
|
||||
"bash",
|
||||
{"command": "echo 'Hello from Singularity sandbox!' && uname -a"}
|
||||
)
|
||||
print(f"Result: {result}")
|
||||
print()
|
||||
|
||||
# Test file write
|
||||
print("Testing file write...")
|
||||
write_result = await pool.execute(
|
||||
slot,
|
||||
"write_file",
|
||||
{"path": "test.txt", "content": "Test file from Singularity!"}
|
||||
)
|
||||
print(f"Write result: {write_result}")
|
||||
|
||||
# Test file read
|
||||
print("Testing file read...")
|
||||
read_result = await pool.execute(
|
||||
slot,
|
||||
"read_file",
|
||||
{"path": "test.txt"}
|
||||
)
|
||||
print(f"Read result: {read_result}")
|
||||
print()
|
||||
|
||||
# Release slot
|
||||
print("Releasing slot...")
|
||||
await pool.release(slot)
|
||||
|
||||
print("✅ All tests passed!")
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Error: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return False
|
||||
|
||||
finally:
|
||||
print("\nStopping pool...")
|
||||
await pool.stop(purge_job=True)
|
||||
print("Pool stopped.")
|
||||
|
||||
return True
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
success = asyncio.run(test_singularity_sandbox())
|
||||
sys.exit(0 if success else 1)
|
||||
Loading…
Add table
Add a link
Reference in a new issue