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)