From 7a36f3dffed6e46345820011ed2dba159e27fbe7 Mon Sep 17 00:00:00 2001 From: nicoche <78445450+nicoche@users.noreply.github.com> Date: Thu, 9 Apr 2026 22:53:26 +0200 Subject: [PATCH] examples: set appropriate exit code --- examples/01_create_sandbox.py | 7 +++++-- examples/01_create_sandbox_async.py | 8 ++++++-- examples/02_create_sandbox_with_timing.py | 7 +++++-- examples/02_create_sandbox_with_timing_async.py | 8 ++++++-- examples/03_basic_commands.py | 8 +++++--- examples/03_basic_commands_async.py | 6 ++++-- examples/04_streaming_output.py | 7 +++++-- examples/04_streaming_output_async.py | 8 ++++++-- examples/05_environment_variables.py | 8 ++++++-- examples/05_environment_variables_async.py | 9 +++++++-- examples/06_working_directory.py | 9 +++++++-- examples/06_working_directory_async.py | 10 ++++++++-- examples/07_file_operations.py | 9 +++++++-- examples/07_file_operations_async.py | 10 ++++++++-- examples/08_directory_operations.py | 9 +++++++-- examples/08_directory_operations_async.py | 10 ++++++++-- examples/09_binary_files.py | 9 +++++++-- examples/09_binary_files_async.py | 10 ++++++++-- examples/10_batch_operations.py | 9 +++++++-- examples/10_batch_operations_async.py | 10 ++++++++-- examples/11_upload_download.py | 9 +++++++-- examples/11_upload_download_async.py | 10 ++++++++-- examples/12_file_manipulation.py | 9 +++++++-- examples/12_file_manipulation_async.py | 10 ++++++++-- examples/13_background_processes.py | 9 +++++++-- examples/13_background_processes_async.py | 10 ++++++++-- examples/14_expose_port.py | 11 +++++++++-- examples/14_expose_port_async.py | 10 ++++++++-- examples/15_get_sandbox.py | 9 +++++++-- examples/15_get_sandbox_async.py | 10 ++++++++-- examples/16_create_sandbox_with_auto_delete_simple.py | 10 ++++++---- examples/17_create_sandbox_with_auto_delete.py | 9 +++++---- examples/18_create_sandbox_with_existing_app.py | 10 ++++++---- 33 files changed, 224 insertions(+), 73 deletions(-) diff --git a/examples/01_create_sandbox.py b/examples/01_create_sandbox.py index b3bd82f8..6ccad45d 100644 --- a/examples/01_create_sandbox.py +++ b/examples/01_create_sandbox.py @@ -2,6 +2,7 @@ """Create and manage a sandbox""" import os +import sys import random import string @@ -12,7 +13,7 @@ def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -32,12 +33,14 @@ def main(): result = sandbox.exec("echo 'Sandbox is ready!'") print(result.stdout.strip()) + return 0 except Exception as e: print(f"Error: {e}") + return 1 finally: if sandbox: sandbox.delete() if __name__ == "__main__": - main() + sys.exit(main()) diff --git a/examples/01_create_sandbox_async.py b/examples/01_create_sandbox_async.py index de86d918..dfcd6488 100644 --- a/examples/01_create_sandbox_async.py +++ b/examples/01_create_sandbox_async.py @@ -2,7 +2,9 @@ """Create and manage a sandbox (async variant)""" import asyncio +import sys import os +import sys import random import string @@ -13,7 +15,7 @@ async def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -33,12 +35,14 @@ async def main(): result = await sandbox.exec("echo 'Sandbox is ready!'") print(result.stdout.strip()) + return 0 except Exception as e: print(f"Error: {e}") + return 1 finally: if sandbox: await sandbox.delete() if __name__ == "__main__": - asyncio.run(main()) + sys.exit(asyncio.run(main())) diff --git a/examples/02_create_sandbox_with_timing.py b/examples/02_create_sandbox_with_timing.py index bff1d363..492779c5 100644 --- a/examples/02_create_sandbox_with_timing.py +++ b/examples/02_create_sandbox_with_timing.py @@ -3,6 +3,7 @@ import argparse import os +import sys import random import string import time @@ -74,7 +75,7 @@ def main(run_long_tests=False): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -135,10 +136,12 @@ def main(run_long_tests=False): tracker.record("Multiple health checks (5x)", multi_check_duration, "long_tests") print(f" ✓ took {multi_check_duration:.1f}s") + return 0 except Exception as e: print(f"\n✗ Error occurred: {e}") import traceback traceback.print_exc() + return 1 finally: if sandbox: print(" → Deleting sandbox...") @@ -165,4 +168,4 @@ def main(run_long_tests=False): ) args = parser.parse_args() - main(run_long_tests=args.long) + sys.exit(main(run_long_tests=args.long)) diff --git a/examples/02_create_sandbox_with_timing_async.py b/examples/02_create_sandbox_with_timing_async.py index 8f3b2b8d..b9e5a8f9 100644 --- a/examples/02_create_sandbox_with_timing_async.py +++ b/examples/02_create_sandbox_with_timing_async.py @@ -3,7 +3,9 @@ import argparse import asyncio +import sys import os +import sys import random import string import time @@ -78,7 +80,7 @@ async def main(run_long_tests=False): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -143,11 +145,13 @@ async def main(run_long_tests=False): ) print(f" ✓ took {multi_check_duration:.1f}s") + return 0 except Exception as e: print(f"\n✗ Error occurred: {e}") import traceback traceback.print_exc() + return 1 finally: if sandbox: print(" → Deleting sandbox...") @@ -174,4 +178,4 @@ async def main(run_long_tests=False): ) args = parser.parse_args() - asyncio.run(main(run_long_tests=args.long)) + sys.exit(asyncio.run(main(run_long_tests=args.long))) diff --git a/examples/03_basic_commands.py b/examples/03_basic_commands.py index 7b7bdf58..f4b5b48f 100644 --- a/examples/03_basic_commands.py +++ b/examples/03_basic_commands.py @@ -2,7 +2,7 @@ """Basic command execution""" import os - +import sys import random import string @@ -13,7 +13,7 @@ def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -43,12 +43,14 @@ def main(): ) print(result.stdout.strip()) + return 0 except Exception as e: print(f"Error: {e}") + return 1 finally: if sandbox: sandbox.delete() if __name__ == "__main__": - main() + sys.exit(main()) diff --git a/examples/03_basic_commands_async.py b/examples/03_basic_commands_async.py index a9ea8e82..e69bde63 100644 --- a/examples/03_basic_commands_async.py +++ b/examples/03_basic_commands_async.py @@ -14,7 +14,7 @@ async def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -44,12 +44,14 @@ async def main(): ) print(result.stdout.strip()) + return 0 except Exception as e: print(f"Error: {e}") + return 1 finally: if sandbox: await sandbox.delete() if __name__ == "__main__": - asyncio.run(main()) + sys.exit(asyncio.run(main())) diff --git a/examples/04_streaming_output.py b/examples/04_streaming_output.py index ae8a9f3c..2ede5c11 100644 --- a/examples/04_streaming_output.py +++ b/examples/04_streaming_output.py @@ -2,6 +2,7 @@ """Streaming command output""" import os +import sys import random @@ -13,7 +14,7 @@ def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -50,12 +51,14 @@ def main(): on_stdout=lambda data: print(data.strip()), ) + return 0 except Exception as e: print(f"Error: {e}") + return 1 finally: if sandbox: sandbox.delete() if __name__ == "__main__": - main() + sys.exit(main()) diff --git a/examples/04_streaming_output_async.py b/examples/04_streaming_output_async.py index e59062aa..2ce69628 100644 --- a/examples/04_streaming_output_async.py +++ b/examples/04_streaming_output_async.py @@ -2,7 +2,9 @@ """Streaming command output (async variant)""" import asyncio +import sys import os +import sys import random @@ -14,7 +16,7 @@ async def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -51,12 +53,14 @@ async def main(): on_stdout=lambda data: print(data.strip()), ) + return 0 except Exception as e: print(f"Error: {e}") + return 1 finally: if sandbox: await sandbox.delete() if __name__ == "__main__": - asyncio.run(main()) + sys.exit(asyncio.run(main())) diff --git a/examples/05_environment_variables.py b/examples/05_environment_variables.py index fb525d29..621abdca 100644 --- a/examples/05_environment_variables.py +++ b/examples/05_environment_variables.py @@ -2,6 +2,7 @@ """Environment variables in commands""" import os +import sys import random @@ -13,7 +14,7 @@ def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -37,12 +38,15 @@ def main(): ) print(result.stdout.strip()) + return 0 except Exception as e: print(f"Error: {e}") + return 1 + finally: if sandbox: sandbox.delete() if __name__ == "__main__": - main() + sys.exit(main()) diff --git a/examples/05_environment_variables_async.py b/examples/05_environment_variables_async.py index 670ca79c..a1182e51 100644 --- a/examples/05_environment_variables_async.py +++ b/examples/05_environment_variables_async.py @@ -2,7 +2,9 @@ """Environment variables in commands (async variant)""" import asyncio +import sys import os +import sys import random @@ -14,7 +16,7 @@ async def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -38,12 +40,15 @@ async def main(): ) print(result.stdout.strip()) + return 0 except Exception as e: print(f"Error: {e}") + return 1 + finally: if sandbox: await sandbox.delete() if __name__ == "__main__": - asyncio.run(main()) + sys.exit(asyncio.run(main())) diff --git a/examples/06_working_directory.py b/examples/06_working_directory.py index 0119e324..9e6b7054 100644 --- a/examples/06_working_directory.py +++ b/examples/06_working_directory.py @@ -2,6 +2,7 @@ """Working directory for commands""" import os +import sys import random @@ -13,7 +14,7 @@ def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -41,12 +42,16 @@ def main(): result = sandbox.exec("cat src/main.py", cwd="/tmp/my_project") print(result.stdout.strip()) + return 0 + except Exception as e: print(f"Error: {e}") + return 1 + finally: if sandbox: sandbox.delete() if __name__ == "__main__": - main() + sys.exit(main()) diff --git a/examples/06_working_directory_async.py b/examples/06_working_directory_async.py index aa6b7f93..4346ae2c 100644 --- a/examples/06_working_directory_async.py +++ b/examples/06_working_directory_async.py @@ -2,7 +2,9 @@ """Working directory for commands (async variant)""" import asyncio +import sys import os +import sys import random @@ -14,7 +16,7 @@ async def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -42,12 +44,16 @@ async def main(): result = await sandbox.exec("cat src/main.py", cwd="/tmp/my_project") print(result.stdout.strip()) + return 0 + except Exception as e: print(f"Error: {e}") + return 1 + finally: if sandbox: await sandbox.delete() if __name__ == "__main__": - asyncio.run(main()) + sys.exit(asyncio.run(main())) diff --git a/examples/07_file_operations.py b/examples/07_file_operations.py index 56f74bca..91c23b66 100644 --- a/examples/07_file_operations.py +++ b/examples/07_file_operations.py @@ -2,6 +2,7 @@ """Basic file operations""" import os +import sys import random @@ -13,7 +14,7 @@ def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -42,12 +43,16 @@ def main(): result = sandbox.exec("/tmp/script.py") print(result.stdout.strip()) + return 0 + except Exception as e: print(f"Error: {e}") + return 1 + finally: if sandbox: sandbox.delete() if __name__ == "__main__": - main() + sys.exit(main()) diff --git a/examples/07_file_operations_async.py b/examples/07_file_operations_async.py index 511daacc..19a7b224 100644 --- a/examples/07_file_operations_async.py +++ b/examples/07_file_operations_async.py @@ -2,7 +2,9 @@ """Basic file operations (async variant)""" import asyncio +import sys import os +import sys import random @@ -14,7 +16,7 @@ async def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -43,12 +45,16 @@ async def main(): result = await sandbox.exec("/tmp/script.py") print(result.stdout.strip()) + return 0 + except Exception as e: print(f"Error: {e}") + return 1 + finally: if sandbox: await sandbox.delete() if __name__ == "__main__": - asyncio.run(main()) + sys.exit(asyncio.run(main())) diff --git a/examples/08_directory_operations.py b/examples/08_directory_operations.py index 50368038..bf73a14c 100644 --- a/examples/08_directory_operations.py +++ b/examples/08_directory_operations.py @@ -2,6 +2,7 @@ """Directory operations""" import os +import sys import random @@ -13,7 +14,7 @@ def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -49,12 +50,16 @@ def main(): is_file = fs.is_file("/tmp/my_project/src/main.py") print(f"Exists: {exists}, Is dir: {is_dir}, Is file: {is_file}") + return 0 + except Exception as e: print(f"Error: {e}") + return 1 + finally: if sandbox: sandbox.delete() if __name__ == "__main__": - main() + sys.exit(main()) diff --git a/examples/08_directory_operations_async.py b/examples/08_directory_operations_async.py index 26314ca6..5b9d7bd4 100644 --- a/examples/08_directory_operations_async.py +++ b/examples/08_directory_operations_async.py @@ -2,7 +2,9 @@ """Directory operations (async variant)""" import asyncio +import sys import os +import sys import random @@ -14,7 +16,7 @@ async def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -50,12 +52,16 @@ async def main(): is_file = await fs.is_file("/tmp/my_project/src/main.py") print(f"Exists: {exists}, Is dir: {is_dir}, Is file: {is_file}") + return 0 + except Exception as e: print(f"Error: {e}") + return 1 + finally: if sandbox: await sandbox.delete() if __name__ == "__main__": - asyncio.run(main()) + sys.exit(asyncio.run(main())) diff --git a/examples/09_binary_files.py b/examples/09_binary_files.py index ffd9725c..84e9dd5a 100644 --- a/examples/09_binary_files.py +++ b/examples/09_binary_files.py @@ -2,6 +2,7 @@ """Binary file operations""" import os +import sys import random @@ -13,7 +14,7 @@ def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -37,12 +38,16 @@ def main(): print(f"Read back: {file_info.content}") assert binary_data == file_info.content + return 0 + except Exception as e: print(f"Error: {e}") + return 1 + finally: if sandbox: sandbox.delete() if __name__ == "__main__": - main() + sys.exit(main()) diff --git a/examples/09_binary_files_async.py b/examples/09_binary_files_async.py index ef837d25..eff894ad 100644 --- a/examples/09_binary_files_async.py +++ b/examples/09_binary_files_async.py @@ -2,7 +2,9 @@ """Binary file operations (async variant)""" import asyncio +import sys import os +import sys import random @@ -14,7 +16,7 @@ async def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -38,12 +40,16 @@ async def main(): print(f"Read back: {file_info.content}") assert binary_data == file_info.content + return 0 + except Exception as e: print(f"Error: {e}") + return 1 + finally: if sandbox: await sandbox.delete() if __name__ == "__main__": - asyncio.run(main()) + sys.exit(asyncio.run(main())) diff --git a/examples/10_batch_operations.py b/examples/10_batch_operations.py index bf7ca1ce..d005c500 100644 --- a/examples/10_batch_operations.py +++ b/examples/10_batch_operations.py @@ -2,6 +2,7 @@ """Batch file operations""" import os +import sys import random @@ -13,7 +14,7 @@ def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -53,12 +54,16 @@ def main(): fs.write_files(project_files) print("Created project structure") + return 0 + except Exception as e: print(f"Error: {e}") + return 1 + finally: if sandbox: sandbox.delete() if __name__ == "__main__": - main() + sys.exit(main()) diff --git a/examples/10_batch_operations_async.py b/examples/10_batch_operations_async.py index 93d5d018..2d6a8085 100644 --- a/examples/10_batch_operations_async.py +++ b/examples/10_batch_operations_async.py @@ -2,7 +2,9 @@ """Batch file operations (async variant)""" import asyncio +import sys import os +import sys import random @@ -14,7 +16,7 @@ async def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -54,12 +56,16 @@ async def main(): await fs.write_files(project_files) print("Created project structure") + return 0 + except Exception as e: print(f"Error: {e}") + return 1 + finally: if sandbox: await sandbox.delete() if __name__ == "__main__": - asyncio.run(main()) + sys.exit(asyncio.run(main())) diff --git a/examples/11_upload_download.py b/examples/11_upload_download.py index 561d7ff8..b4241172 100644 --- a/examples/11_upload_download.py +++ b/examples/11_upload_download.py @@ -2,6 +2,7 @@ """Upload and download files""" import os +import sys import tempfile @@ -14,7 +15,7 @@ def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -56,12 +57,16 @@ def main(): finally: os.unlink(download_path) + return 0 + except Exception as e: print(f"Error: {e}") + return 1 + finally: if sandbox: sandbox.delete() if __name__ == "__main__": - main() + sys.exit(main()) diff --git a/examples/11_upload_download_async.py b/examples/11_upload_download_async.py index 870b610f..3097dc7c 100644 --- a/examples/11_upload_download_async.py +++ b/examples/11_upload_download_async.py @@ -2,7 +2,9 @@ """Upload and download files (async variant)""" import asyncio +import sys import os +import sys import tempfile @@ -15,7 +17,7 @@ async def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -57,12 +59,16 @@ async def main(): finally: os.unlink(download_path) + return 0 + except Exception as e: print(f"Error: {e}") + return 1 + finally: if sandbox: await sandbox.delete() if __name__ == "__main__": - asyncio.run(main()) + sys.exit(asyncio.run(main())) diff --git a/examples/12_file_manipulation.py b/examples/12_file_manipulation.py index 8e761dac..294b636e 100644 --- a/examples/12_file_manipulation.py +++ b/examples/12_file_manipulation.py @@ -2,6 +2,7 @@ """File manipulation operations""" import os +import sys import random @@ -13,7 +14,7 @@ def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -53,12 +54,16 @@ def main(): fs.rm("/tmp/test_dir", recursive=True) print(f"Directory deleted: {not fs.exists('/tmp/test_dir')}") + return 0 + except Exception as e: print(f"Error: {e}") + return 1 + finally: if sandbox: sandbox.delete() if __name__ == "__main__": - main() + sys.exit(main()) diff --git a/examples/12_file_manipulation_async.py b/examples/12_file_manipulation_async.py index 53b6da16..46751608 100644 --- a/examples/12_file_manipulation_async.py +++ b/examples/12_file_manipulation_async.py @@ -2,7 +2,9 @@ """File manipulation operations (async variant)""" import asyncio +import sys import os +import sys import random @@ -14,7 +16,7 @@ async def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -59,12 +61,16 @@ async def main(): dir_deleted_check = not await fs.exists("/tmp/test_dir") print(f"Directory deleted: {dir_deleted_check}") + return 0 + except Exception as e: print(f"Error: {e}") + return 1 + finally: if sandbox: await sandbox.delete() if __name__ == "__main__": - asyncio.run(main()) + sys.exit(asyncio.run(main())) diff --git a/examples/13_background_processes.py b/examples/13_background_processes.py index 9def7a48..72dd6cd8 100755 --- a/examples/13_background_processes.py +++ b/examples/13_background_processes.py @@ -2,6 +2,7 @@ """Background process management""" import os +import sys import time @@ -14,7 +15,7 @@ def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -93,12 +94,16 @@ def main(): print(f" Status: {process.status}") print() + return 0 + except Exception as e: print(f"Error: {e}") + return 1 + finally: if sandbox: sandbox.delete() if __name__ == "__main__": - main() + sys.exit(main()) diff --git a/examples/13_background_processes_async.py b/examples/13_background_processes_async.py index f0abfa7c..b3db498f 100755 --- a/examples/13_background_processes_async.py +++ b/examples/13_background_processes_async.py @@ -2,7 +2,9 @@ """Background process management (async variant)""" import asyncio +import sys import os +import sys import random @@ -14,7 +16,7 @@ async def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -93,12 +95,16 @@ async def main(): print(f" Status: {process.status}") print() + return 0 + except Exception as e: print(f"Error: {e}") + return 1 + finally: if sandbox: await sandbox.delete() if __name__ == "__main__": - asyncio.run(main()) + sys.exit(asyncio.run(main())) diff --git a/examples/14_expose_port.py b/examples/14_expose_port.py index 8a5283db..ac118680 100755 --- a/examples/14_expose_port.py +++ b/examples/14_expose_port.py @@ -2,6 +2,7 @@ """Port exposure via TCP proxy""" import os +import sys import time import requests @@ -16,6 +17,7 @@ def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") + sys.exit(1) return sandbox = None @@ -67,6 +69,7 @@ def main(): except requests.RequestException as e: print(f"⚠ Request failed: {e}") print("Note: Port may still be propagating. Try again in a few seconds.") + return 1 # List processes to show the server is running print("\nRunning processes:") @@ -108,18 +111,22 @@ def main(): except requests.RequestException as e: print(f"⚠ Request failed: {e}") print("Note: Port may still be propagating. Try again in a few seconds.") + return 1 # Unexpose the port print("\nUnexposing port...") sandbox.unexpose_port() print("Port unexposed") + return 0 + except Exception as e: print(f"Error: {e}") + return 1 + finally: if sandbox: sandbox.delete() - if __name__ == "__main__": - main() + sys.exit(main()) diff --git a/examples/14_expose_port_async.py b/examples/14_expose_port_async.py index d6339c11..502b159e 100755 --- a/examples/14_expose_port_async.py +++ b/examples/14_expose_port_async.py @@ -2,7 +2,9 @@ """Port exposure via TCP proxy (async variant)""" import asyncio +import sys import os +import sys import requests @@ -16,7 +18,7 @@ async def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -120,12 +122,16 @@ async def main(): await sandbox.unexpose_port() print("Port unexposed") + return 0 + except Exception as e: print(f"Error: {e}") + return 1 + finally: if sandbox: await sandbox.delete() if __name__ == "__main__": - asyncio.run(main()) + sys.exit(asyncio.run(main())) diff --git a/examples/15_get_sandbox.py b/examples/15_get_sandbox.py index 20ec1c0b..57042d41 100644 --- a/examples/15_get_sandbox.py +++ b/examples/15_get_sandbox.py @@ -2,6 +2,7 @@ """Create a sandbox and then retrieve it by service ID""" import os +import sys import random @@ -13,7 +14,7 @@ def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 original_sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -61,8 +62,12 @@ def main(): result = retrieved_sandbox.exec("echo 'Hello from retrieved sandbox!'") print(f" Retrieved sandbox output: {result.stdout.strip()}") + return 0 + except Exception as e: print(f"Error: {e}") + return 1 + finally: # Cleanup: delete the sandbox (works from either instance) if original_sandbox: @@ -72,4 +77,4 @@ def main(): if __name__ == "__main__": - main() + sys.exit(main()) diff --git a/examples/15_get_sandbox_async.py b/examples/15_get_sandbox_async.py index 7f0eeff2..0d9f837b 100644 --- a/examples/15_get_sandbox_async.py +++ b/examples/15_get_sandbox_async.py @@ -2,7 +2,9 @@ """Create a sandbox and then retrieve it by service ID (async)""" import asyncio +import sys import os +import sys import random @@ -14,7 +16,7 @@ async def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 original_sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -64,8 +66,12 @@ async def main(): ) print(f" Retrieved sandbox output: {result.stdout.strip()}") + return 0 + except Exception as e: print(f"Error: {e}") + return 1 + finally: # Cleanup: delete the sandbox (works from either instance) if original_sandbox: @@ -75,4 +81,4 @@ async def main(): if __name__ == "__main__": - asyncio.run(main()) + sys.exit(asyncio.run(main())) diff --git a/examples/16_create_sandbox_with_auto_delete_simple.py b/examples/16_create_sandbox_with_auto_delete_simple.py index 1f7f06a4..67b4c97d 100644 --- a/examples/16_create_sandbox_with_auto_delete_simple.py +++ b/examples/16_create_sandbox_with_auto_delete_simple.py @@ -2,6 +2,7 @@ """Create a single sandbox with auto-delete lifecycle setting and wait for it to be deleted""" import os +import sys import time @@ -32,7 +33,7 @@ def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 sandbox = None suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) @@ -83,10 +84,11 @@ def main(): else: print(f"✗ Timeout waiting for sandbox to be deleted") + return 0 + except Exception as e: print(f"\n✗ Error occurred: {e}") - import traceback - traceback.print_exc() + return 1 finally: if sandbox: @@ -99,4 +101,4 @@ def main(): if __name__ == "__main__": - main() + sys.exit(main()) diff --git a/examples/17_create_sandbox_with_auto_delete.py b/examples/17_create_sandbox_with_auto_delete.py index b92c27cc..b2f02431 100644 --- a/examples/17_create_sandbox_with_auto_delete.py +++ b/examples/17_create_sandbox_with_auto_delete.py @@ -2,6 +2,7 @@ """Create sandboxes with auto-delete lifecycle settings and wait for them to be deleted""" import os +import sys import random import string import time @@ -113,7 +114,7 @@ def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 suffix = "".join(random.choices(string.ascii_lowercase + string.digits, k=8)) sandbox1 = None @@ -281,11 +282,11 @@ def main(): if sandbox2_delete_time: print(f" Sandbox 2 (idle_timeout + delete_after_inactivity): deleted after {sandbox2_delete_time:.1f}s") print(f" Expected: ~{idle_timeout_2 + delete_after_inactivity_2}s (idle + delete delay)") + return 0 except Exception as e: print(f"\n✗ Error occurred: {e}") - import traceback - traceback.print_exc() + return 1 finally: # Clean up any sandboxes that weren't auto-deleted @@ -311,4 +312,4 @@ def main(): if __name__ == "__main__": - main() + sys.exit(main()) diff --git a/examples/18_create_sandbox_with_existing_app.py b/examples/18_create_sandbox_with_existing_app.py index 5ba2e760..c46bffe9 100644 --- a/examples/18_create_sandbox_with_existing_app.py +++ b/examples/18_create_sandbox_with_existing_app.py @@ -2,6 +2,7 @@ """Create a sandbox using an existing app instead of creating a new one""" import os +import sys import random import string import time @@ -15,7 +16,7 @@ def main(): api_token = os.getenv("KOYEB_API_TOKEN") if not api_token: print("Error: KOYEB_API_TOKEN not set") - return + return 1 app_id = None sandbox = None @@ -82,10 +83,11 @@ def main(): print("Demo completed successfully!") + return 0 + except Exception as e: print(f"Error: {e}") - import traceback - traceback.print_exc() + return 1 finally: # Clean up: delete the app (which will also delete the sandbox service) @@ -100,4 +102,4 @@ def main(): if __name__ == "__main__": - main() + sys.exit(main())