Usage Examples
This guide provides practical examples of common operations using the Cudo Compute SDK.
Basic Setup
All examples assume you've initialized the SDK:
import asyncio
from cudo_compute_sdk import CudoComputeSDK
async def main():
sdk = CudoComputeSDK(api_key="your-api-key")
try:
# Your code here
pass
finally:
await sdk.close()
asyncio.run(main())
Project Management
List All Projects
projects = await sdk.list_projects()
for project in projects:
print(f"Project: {project.id}")
Get Project Details
project = await sdk.get_project(project_id="my-project")
print(f"Project: {project.id}")
print(f"Resources: {project.resource_count}")
Create a New Project
project = await sdk.create_project(
project_id="ml-training-project",
billing_account_id="billing-account-123"
)
Virtual Machine Management
List VMs in a Project
vms = await sdk.list_vms(project_id="my-project")
for vm in vms:
print(f"VM: {vm.id}")
print(f" Status: {vm.state}")
print(f" vCPUs: {vm.vcpus}, Memory: {vm.memory_gib}GB")
print(f" GPUs: {vm.gpus}")
Get VM Details
vm = await sdk.get_vm(
project_id="my-project",
vm_id="my-vm-001"
)
print(f"VM State: {vm.state}")
print(f"Public IP: {vm.public_ip_address}")
Create a New VM
vm = await sdk.create_vm(
project_id="my-project",
vm_id="gpu-training-vm",
data_center_id="gb-bournemouth-1",
machine_type="standard",
boot_disk_image_id="ubuntu-2204-lts",
vcpus=8,
memory_gib=32,
gpus=1,
boot_disk_size_gib=100,
ssh_key_source="SSH_KEY_SOURCE_USER",
metadata={"purpose": "ml-training"}
)
print(f"Created VM: {vm.id}")
Start a VM
await sdk.start_vm(
project_id="my-project",
vm_id="my-vm-001"
)
Stop a VM
await sdk.stop_vm(
project_id="my-project",
vm_id="my-vm-001"
)
Restart a VM
await sdk.restart_vm(
project_id="my-project",
vm_id="my-vm-001"
)
Delete a VM
await sdk.terminate_vm(
project_id="my-project",
vm_id="my-vm-001"
)
Data Center & Machine Type Discovery
List Available Data Centers
data_centers = await sdk.list_data_centers()
for dc in data_centers:
print(f"Data Center: {dc.id}")
print(f" Region: {dc.region_name}")
print(f" Country: {dc.country_code}")
Get Available Machine Types for a Data Center
machine_types = await sdk.list_machine_types_for_data_center(
data_center_id="gb-bournemouth-1"
)
for mt in machine_types:
print(f"Machine Type: {mt.machine_type}")
print(f" vCPUs: {mt.vcpus}, Memory: {mt.memory_gib}GB")
print(f" GPUs: {mt.gpu_model if mt.gpu_model else 'None'}")
List Available VM Images
images = await sdk.list_images()
for image in images:
print(f"Image: {image.id}")
print(f" OS: {image.os_name} {image.os_version}")
Network Management
List Networks
networks = await sdk.list_networks(project_id="my-project")
for network in networks:
print(f"Network: {network.id}")
Create a Network
network = await sdk.create_network(
project_id="my-project",
network_id="ml-cluster-network"
)
Delete a Network
await sdk.delete_network(
project_id="my-project",
network_id="ml-cluster-network"
)
Security Groups
List Security Groups
security_groups = await sdk.list_security_groups(project_id="my-project")
for sg in security_groups:
print(f"Security Group: {sg.id}")
Create Security Group with Rules
# First create the security group
sg = await sdk.create_security_group(
project_id="my-project",
security_group_id="web-server-sg"
)
# Add rules
await sdk.create_security_group_rule(
project_id="my-project",
security_group_id="web-server-sg",
rule_id="allow-http",
direction="RULE_DIRECTION_INGRESS",
protocol="tcp",
ports="80",
source="0.0.0.0/0"
)
await sdk.create_security_group_rule(
project_id="my-project",
security_group_id="web-server-sg",
rule_id="allow-https",
direction="RULE_DIRECTION_INGRESS",
protocol="tcp",
ports="443",
source="0.0.0.0/0"
)
await sdk.create_security_group_rule(
project_id="my-project",
security_group_id="web-server-sg",
rule_id="allow-ssh",
direction="RULE_DIRECTION_INGRESS",
protocol="tcp",
ports="22",
source="0.0.0.0/0"
)
SSH Key Management
List SSH Keys
ssh_keys = await sdk.list_ssh_keys(project_id="my-project")
for key in ssh_keys:
print(f"SSH Key: {key.id}")
Add SSH Key
with open("~/.ssh/id_rsa.pub") as f:
public_key = f.read()
ssh_key = await sdk.create_ssh_key(
project_id="my-project",
ssh_key_id="my-workstation-key",
public_key=public_key
)
Delete SSH Key
await sdk.delete_ssh_key(
project_id="my-project",
ssh_key_id="my-workstation-key"
)
Storage Management
List Disks
disks = await sdk.list_disks(project_id="my-project")
for disk in disks:
print(f"Disk: {disk.id}")
print(f" Size: {disk.size_gib}GB")
Create a Disk
disk = await sdk.create_disk(
project_id="my-project",
disk_id="data-disk-01",
data_center_id="gb-bournemouth-1",
storage_class="network",
size_gib=500
)
Attach Disk to VM
await sdk.attach_disk_to_vm(
project_id="my-project",
vm_id="my-vm-001",
disk_id="data-disk-01"
)
Detach Disk from VM
await sdk.detach_disk_from_vm(
project_id="my-project",
vm_id="my-vm-001",
disk_id="data-disk-01"
)
Complete Example: ML Training Environment
Here's a complete example that sets up an ML training environment:
import asyncio
from cudo_compute_sdk import CudoComputeSDK
async def setup_ml_environment():
sdk = CudoComputeSDK(api_key="your-api-key")
try:
project_id = "ml-training-project"
# 1. Create network
print("Creating network...")
network = await sdk.create_network(
project_id=project_id,
network_id="ml-network"
)
# 2. Create security group
print("Creating security group...")
sg = await sdk.create_security_group(
project_id=project_id,
security_group_id="ml-sg"
)
# Allow SSH
await sdk.create_security_group_rule(
project_id=project_id,
security_group_id="ml-sg",
rule_id="allow-ssh",
direction="RULE_DIRECTION_INGRESS",
protocol="tcp",
ports="22",
source="0.0.0.0/0"
)
# Allow Jupyter
await sdk.create_security_group_rule(
project_id=project_id,
security_group_id="ml-sg",
rule_id="allow-jupyter",
direction="RULE_DIRECTION_INGRESS",
protocol="tcp",
ports="8888",
source="0.0.0.0/0"
)
# 3. Create storage disk
print("Creating storage disk...")
disk = await sdk.create_disk(
project_id=project_id,
disk_id="ml-data-disk",
data_center_id="gb-bournemouth-1",
storage_class="network",
size_gib=1000
)
# 4. Create GPU VM
print("Creating GPU VM...")
vm = await sdk.create_vm(
project_id=project_id,
vm_id="ml-training-gpu",
data_center_id="gb-bournemouth-1",
machine_type="gpu",
boot_disk_image_id="ubuntu-2204-lts-cuda",
vcpus=16,
memory_gib=64,
gpus=1,
boot_disk_size_gib=200,
ssh_key_source="SSH_KEY_SOURCE_USER",
security_group_ids=["ml-sg"],
storage_disk_ids=["ml-data-disk"],
start_script="""#!/bin/bash
apt-get update
apt-get install -y python3-pip
pip3 install jupyter torch torchvision
jupyter notebook --ip=0.0.0.0 --allow-root
"""
)
print(f"✓ ML environment created!")
print(f" VM ID: {vm.id}")
print(f" Public IP: {vm.public_ip_address}")
print(f" Access Jupyter at: http://{vm.public_ip_address}:8888")
finally:
await sdk.close()
asyncio.run(setup_ml_environment())
Best Practices
1. Always Close the SDK
Use try/finally or async context managers:
async def main():
sdk = CudoComputeSDK(api_key="...")
try:
# your code
pass
finally:
await sdk.close()
2. Handle Errors Gracefully
from httpx import HTTPStatusError
try:
vm = await sdk.get_vm(project_id="...", vm_id="...")
except HTTPStatusError as e:
if e.response.status_code == 404:
print("VM not found")
else:
raise
3. Use Environment Variables for API Keys
Never hardcode API keys in your source code.
4. Implement Retry Logic for Long Operations
import asyncio
async def wait_for_vm_running(sdk, project_id, vm_id, timeout=300):
start = asyncio.get_event_loop().time()
while True:
vm = await sdk.get_vm(project_id, vm_id)
if vm.state == "RUNNING":
return vm
if asyncio.get_event_loop().time() - start > timeout:
raise TimeoutError("VM did not start in time")
await asyncio.sleep(5)
Next Steps
- API Reference – Complete SDK method documentation
- Architecture – SDK design and internals
- Troubleshooting – Common issues and solutions