Quickstart Example

This example demonstrates basic NoxRunner usage.

  1#!/usr/bin/env python3
  2"""
  3Quick Start Example for Sandbox Manager Python API
  4
  5This example demonstrates the basic usage of the Sandbox Manager API.
  6"""
  7
  8import time
  9
 10from noxrunner import NoxRunnerClient, NoxRunnerError
 11
 12
 13def main():
 14    # Initialize client
 15    base_url = "http://127.0.0.1:8080"
 16    print(f"Connecting to Sandbox Manager at {base_url}")
 17
 18    client = NoxRunnerClient(base_url)
 19
 20    # 1. Health check
 21    print("\n1. Health Check")
 22    if client.health_check():
 23        print("   ✓ Manager is healthy")
 24    else:
 25        print("   ✗ Manager is not healthy")
 26        return 1
 27
 28    # 2. Create sandbox
 29    session_id = f"quickstart-{int(time.time())}"
 30    print(f"\n2. Creating Sandbox: {session_id}")
 31    try:
 32        result = client.create_sandbox(session_id, ttl_seconds=900)
 33        print(f"   ✓ Created: {result.get('podName')}")
 34        print(f"   Expires at: {result.get('expiresAt')}")
 35    except NoxRunnerError as e:
 36        print(f"   ✗ Failed: {e}")
 37        return 1
 38
 39    # 3. Wait for pod ready
 40    print("\n3. Waiting for Pod to be Ready")
 41    if client.wait_for_pod_ready(session_id, timeout=30):
 42        print("   ✓ Pod is ready")
 43    else:
 44        print("   ✗ Pod did not become ready")
 45        return 1
 46
 47    # 4. Execute a simple command
 48    print("\n4. Executing Command: python3 --version")
 49    try:
 50        result = client.exec(session_id, ["python3", "--version"])
 51        print(f"   Exit code: {result.get('exitCode')}")
 52        print(f"   Output: {result.get('stdout', '').strip()}")
 53    except NoxRunnerError as e:
 54        print(f"   ✗ Failed: {e}")
 55        return 1
 56
 57    # 5. Upload a Python script
 58    print("\n5. Uploading Python Script")
 59    script = """#!/usr/bin/env python3
 60import sys
 61import os
 62
 63print("Hello from sandbox!")
 64print(f"Python version: {sys.version}")
 65print(f"Working directory: {os.getcwd()}")
 66print(f"Files in workspace:")
 67for item in os.listdir('.'):
 68    print(f"  - {item}")
 69"""
 70    try:
 71        client.upload_files(session_id, {"hello.py": script})
 72        print("   ✓ Script uploaded")
 73    except NoxRunnerError as e:
 74        print(f"   ✗ Failed: {e}")
 75        return 1
 76
 77    # 6. Execute the uploaded script
 78    print("\n6. Executing Uploaded Script")
 79    try:
 80        result = client.exec(session_id, ["python3", "hello.py"])
 81        print("   Output:")
 82        print(result.get("stdout", ""))
 83    except NoxRunnerError as e:
 84        print(f"   ✗ Failed: {e}")
 85        return 1
 86
 87    # 7. Upload multiple files
 88    print("\n7. Uploading Multiple Files")
 89    files = {
 90        "data.txt": "Line 1\nLine 2\nLine 3\n",
 91        "config.json": '{"name": "test", "value": 42}\n',
 92        "README.md": "# Test Project\n\nThis is a test.\n",
 93    }
 94    try:
 95        client.upload_files(session_id, files)
 96        print(f"   ✓ Uploaded {len(files)} files")
 97    except NoxRunnerError as e:
 98        print(f"   ✗ Failed: {e}")
 99        return 1
100
101    # 8. List files
102    print("\n8. Listing Files")
103    try:
104        result = client.exec(session_id, ["ls", "-la"])
105        print("   Files:")
106        print(result.get("stdout", ""))
107    except NoxRunnerError as e:
108        print(f"   ✗ Failed: {e}")
109        return 1
110
111    # 9. Read a file
112    print("\n9. Reading File Content")
113    try:
114        result = client.exec(session_id, ["cat", "data.txt"])
115        print("   Content:")
116        print(result.get("stdout", ""))
117    except NoxRunnerError as e:
118        print(f"   ✗ Failed: {e}")
119        return 1
120
121    # 10. Extend TTL
122    print("\n10. Extending TTL")
123    try:
124        if client.touch(session_id):
125            print("   ✓ TTL extended")
126        else:
127            print("   ✗ Failed to extend TTL")
128    except NoxRunnerError as e:
129        print(f"   ✗ Failed: {e}")
130
131    # 11. Download files
132    print("\n11. Downloading Files")
133    try:
134        tar_data = client.download_files(session_id)
135        print(f"   ✓ Downloaded {len(tar_data)} bytes")
136
137        # Download and extract to local directory (recommended)
138        import tempfile
139        from pathlib import Path
140
141        with tempfile.TemporaryDirectory() as tmpdir:
142            client.download_workspace(session_id, tmpdir)
143            files = list(Path(tmpdir).glob("*"))
144            print(f"   ✓ Extracted {len(files)} files to temporary directory")
145    except NoxRunnerError as e:
146        print(f"   ✗ Failed: {e}")
147        return 1
148
149    # 12. Cleanup
150    print("\n12. Cleaning Up")
151    try:
152        if client.delete_sandbox(session_id):
153            print("   ✓ Sandbox deleted")
154        else:
155            print("   ✗ Failed to delete sandbox")
156    except NoxRunnerError as e:
157        print(f"   ✗ Failed: {e}")
158        return 1
159
160    print("\n" + "=" * 50)
161    print("Quick Start Example Completed Successfully!")
162    print("=" * 50)
163    return 0
164
165
166if __name__ == "__main__":
167    try:
168        exit(main())
169    except KeyboardInterrupt:
170        print("\n\nInterrupted by user")
171        exit(130)
172    except Exception as e:
173        print(f"\n\nUnexpected error: {e}")
174        import traceback
175
176        traceback.print_exc()
177        exit(1)