336 lines
11 KiB
Python
Raw Normal View History

2025-09-05 05:10:16 +02:00
#!/usr/bin/env python3
"""
Example usage of the Container Management API Client
"""
import asyncio
import sys
from container_client import ContainerClient, ContainerConfig
async def example_basic_operations():
"""Basic container operations example"""
print("=== Basic Container Operations ===\n")
async with ContainerClient("http://localhost:8080", "admin", "password") as client:
# Check API health
health = await client.health_check()
print(f"✓ API Status: {health.status}")
print(f"✓ Compose Version: {health.compose_version}\n")
# Create a container
print("Creating container...")
container = await client.create_container(
image="python:3.12-slim",
env={
"APP_NAME": "example_app",
"ENV": "development"
},
tags=["example", "test"],
resources={
"cpus": 0.5,
"memory": "512m"
}
)
print(f"✓ Created container: {container.cuid}\n")
# Upload a simple Python script
print("Uploading application code...")
files = {
"boot.py": b"""
import os
import time
print(f"Container {os.environ.get('CONTAINER_UID')} starting...")
print(f"App Name: {os.environ.get('APP_NAME')}")
print(f"Environment: {os.environ.get('ENV')}")
print("Ready!")
# Keep running
for i in range(5):
print(f"Working... {i+1}/5")
time.sleep(1)
print("Done!")
"""
}
await client.upload_zip(container.cuid, files=files)
print("✓ Code uploaded\n")
# Start the container
print("Starting container...")
await client.start_container(container.cuid)
await client.wait_for_status(container.cuid, "running", timeout=10)
print("✓ Container running\n")
# Execute the script and stream output
print("Executing application:")
print("-" * 40)
def print_output(data):
print(data, end="")
exit_code = await client.stream_output(
container.cuid,
"python /app/boot.py",
on_stdout=print_output
)
print("-" * 40)
print(f"✓ Exit code: {exit_code}\n")
# Get container status
status = await client.get_status(container.cuid)
print(f"Container Status: {status.status}")
print(f"Uptime: {status.uptime}\n")
# Clean up
print("Cleaning up...")
await client.stop_container(container.cuid)
await client.delete_container(container.cuid)
print("✓ Container deleted\n")
async def example_interactive_terminal():
"""Interactive terminal example"""
print("=== Interactive Terminal Example ===\n")
async with ContainerClient("http://localhost:8080", "admin", "password") as client:
# Create a container with development tools
print("Creating development container...")
container = await client.create_container(
image="python:3.12",
env={"PS1": "\\u@container:\\w$ "},
tags=["interactive", "development"]
)
print(f"✓ Created container: {container.cuid}\n")
# Upload some sample files
files = {
"boot.py": b"#!/usr/bin/env python3\nprint('Container ready for interactive use!')\n",
"hello.py": b"print('Hello from the container!')\n",
"data.txt": b"Sample data file\n"
}
await client.upload_zip(container.cuid, files=files)
# Start container
await client.start_container(container.cuid)
await client.wait_for_status(container.cuid, "running")
print("Entering interactive terminal...")
print("Commands to try:")
print(" - ls -la")
print(" - python hello.py")
print(" - cat data.txt")
print(" - python --version")
print("\nPress Ctrl+] to exit the terminal\n")
print("=" * 40)
# Enter interactive terminal
await client.enter_container(container.cuid)
# Clean up after terminal session
print("\n" + "=" * 40)
print("\nCleaning up...")
await client.stop_container(container.cuid)
await client.delete_container(container.cuid)
print("✓ Container deleted\n")
async def example_batch_operations():
"""Batch operations example"""
print("=== Batch Operations Example ===\n")
async with ContainerClient("http://localhost:8080", "admin", "password") as client:
# Create multiple containers at once
print("Creating 3 containers in parallel...")
configs = [
ContainerConfig(
image="alpine:latest",
env={"NAME": "Worker 1"},
tags=["worker", "batch"]
),
ContainerConfig(
image="alpine:latest",
env={"NAME": "Worker 2"},
tags=["worker", "batch"]
),
ContainerConfig(
image="alpine:latest",
env={"NAME": "Worker 3"},
tags=["worker", "batch"]
)
]
containers = await client.batch_create(configs)
print(f"✓ Created {len(containers)} containers\n")
# Prepare containers with a simple script
for i, container in enumerate(containers, 1):
files = {
"boot.py": f"""
import os
print(f"Worker {{os.environ.get('NAME')}} ready!")
""".encode()
}
await client.upload_zip(container.cuid, files=files)
await client.start_container(container.cuid)
print("Executing commands on all containers...")
# Execute commands in parallel
commands = {
containers[0].cuid: "echo 'Worker 1 processing...' && sleep 1 && echo 'Worker 1 done!'",
containers[1].cuid: "echo 'Worker 2 processing...' && sleep 1 && echo 'Worker 2 done!'",
containers[2].cuid: "echo 'Worker 3 processing...' && sleep 1 && echo 'Worker 3 done!'"
}
results = await client.batch_execute(commands, timeout=10)
print("\nResults:")
print("-" * 40)
for i, (cuid, (stdout, stderr, exit_code)) in enumerate(results.items(), 1):
print(f"Worker {i}:")
print(f" Output: {stdout.strip()}")
print(f" Exit Code: {exit_code}")
print("-" * 40)
# Clean up all containers
print("\nCleaning up all containers...")
cuids = [c.cuid for c in containers]
errors = await client.batch_delete(cuids)
failed = sum(1 for e in errors if e is not None)
if failed == 0:
print(f"✓ All {len(containers)} containers deleted\n")
else:
print(f"⚠ Deleted {len(containers) - failed} containers, {failed} failed\n")
async def example_file_operations():
"""File upload and download example"""
print("=== File Operations Example ===\n")
async with ContainerClient("http://localhost:8080", "admin", "password") as client:
# Create container
print("Creating container for file operations...")
container = await client.create_container(
image="python:3.12-slim",
tags=["files", "example"]
)
print(f"✓ Created container: {container.cuid}\n")
# Upload multiple files
print("Uploading application files...")
app_files = {
"app.py": b"""
import json
# Generate some data
data = {
'processed': True,
'items': [1, 2, 3, 4, 5],
'message': 'Data processed successfully'
}
# Save to file
with open('output.json', 'w') as f:
json.dump(data, f, indent=2)
print('Data saved to output.json')
""",
"config/settings.json": b'{"debug": true, "version": "1.0"}',
"data/input.txt": b"Sample input data\nLine 2\nLine 3",
"boot.py": b"print('Container ready!')"
}
await client.upload_zip(container.cuid, files=app_files)
print("✓ Files uploaded\n")
# Start container and run the app
await client.start_container(container.cuid)
print("Running application...")
stdout, stderr, exit_code = await client.execute_command(
container.cuid,
"python app.py"
)
print(f"Output: {stdout}")
# Download the generated file
print("\nDownloading generated file...")
content = await client.download_file(
container.cuid,
path="output.json"
)
import json
result = json.loads(content)
print(f"Downloaded content: {json.dumps(result, indent=2)}\n")
# Download entire directory as ZIP
print("Downloading entire container as ZIP...")
zip_data = await client.download_zip(
container.cuid,
path="",
save_to="container_backup.zip"
)
print(f"✓ Saved backup to container_backup.zip ({len(zip_data)} bytes)\n")
# Clean up
await client.stop_container(container.cuid)
await client.delete_container(container.cuid)
print("✓ Container deleted\n")
async def main():
"""Main function to run examples"""
examples = {
"1": ("Basic Operations", example_basic_operations),
"2": ("Interactive Terminal", example_interactive_terminal),
"3": ("Batch Operations", example_batch_operations),
"4": ("File Operations", example_file_operations)
}
print("\nContainer Management API Client Examples")
print("=" * 40)
print("\nAvailable examples:")
for key, (name, _) in examples.items():
print(f" {key}. {name}")
print(" 0. Run all examples")
print(" q. Quit")
choice = input("\nSelect an example (0-4 or q): ").strip().lower()
if choice == 'q':
print("Goodbye!")
return
elif choice == '0':
# Run all examples
for name, func in examples.values():
print(f"\n{'='*50}")
print(f"Running: {name}")
print('='*50 + "\n")
await func()
print("\nPress Enter to continue...")
input()
elif choice in examples:
name, func = examples[choice]
print(f"\n{'='*50}")
print(f"Running: {name}")
print('='*50 + "\n")
await func()
else:
print("Invalid choice!")
if __name__ == "__main__":
try:
asyncio.run(main())
except KeyboardInterrupt:
print("\n\nInterrupted by user")
except Exception as e:
print(f"\nError: {e}")
sys.exit(1)