use serde::{Deserialize, Serialize};
use std::hash::Hash;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ResourceUnit {
CPU,
MemoryMB,
StorageMB,
NetworkEgressMB,
NetworkIngressMB,
GPU,
Request,
Invocation,
ExecutionTimeMS,
StorageIOPS,
Custom(String),
}
impl core::fmt::Display for ResourceUnit {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
ResourceUnit::CPU => write!(f, "CPU"),
ResourceUnit::MemoryMB => write!(f, "MemoryMB"),
ResourceUnit::StorageMB => write!(f, "StorageMB"),
ResourceUnit::NetworkEgressMB => write!(f, "NetworkEgressMB"),
ResourceUnit::NetworkIngressMB => write!(f, "NetworkIngressMB"),
ResourceUnit::GPU => write!(f, "GPU"),
ResourceUnit::Request => write!(f, "Request"),
ResourceUnit::Invocation => write!(f, "Invocation"),
ResourceUnit::ExecutionTimeMS => write!(f, "ExecutionTimeMS"),
ResourceUnit::StorageIOPS => write!(f, "StorageIOPS"),
ResourceUnit::Custom(name) => write!(f, "{name}"),
}
}
}
#[derive(Debug, thiserror::Error)]
#[error("Failed to parse resource unit")]
pub struct ParseResourceUnitError;
impl core::str::FromStr for ResourceUnit {
type Err = ParseResourceUnitError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_uppercase().as_str() {
"CPU" => Ok(ResourceUnit::CPU),
"MEMORYMB" => Ok(ResourceUnit::MemoryMB),
"STORAGEMB" => Ok(ResourceUnit::StorageMB),
"NETWORKEGRESSMB" => Ok(ResourceUnit::NetworkEgressMB),
"NETWORKINGRESSMB" => Ok(ResourceUnit::NetworkIngressMB),
"GPU" => Ok(ResourceUnit::GPU),
"REQUEST" => Ok(ResourceUnit::Request),
"INVOCATION" => Ok(ResourceUnit::Invocation),
"EXECUTIONTIMEMS" => Ok(ResourceUnit::ExecutionTimeMS),
"STORAGEIOPS" => Ok(ResourceUnit::StorageIOPS),
_ => Err(ParseResourceUnitError),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub enum CloudProvider {
AWS,
GCP,
Azure,
DigitalOcean,
Vultr,
Linode,
LambdaLabs,
RunPod,
VastAi,
CoreWeave,
Paperspace,
Fluidstack,
TensorDock,
Akash,
IoNet,
PrimeIntellect,
Render,
BittensorLium,
Hetzner,
Crusoe,
Generic,
DockerLocal,
DockerRemote(String),
BareMetal(Vec<String>),
}
impl core::fmt::Display for CloudProvider {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
CloudProvider::AWS => write!(f, "AWS"),
CloudProvider::GCP => write!(f, "GCP"),
CloudProvider::Azure => write!(f, "Azure"),
CloudProvider::DigitalOcean => write!(f, "DigitalOcean"),
CloudProvider::Vultr => write!(f, "Vultr"),
CloudProvider::Linode => write!(f, "Linode"),
CloudProvider::LambdaLabs => write!(f, "Lambda Labs"),
CloudProvider::RunPod => write!(f, "RunPod"),
CloudProvider::VastAi => write!(f, "Vast.ai"),
CloudProvider::CoreWeave => write!(f, "CoreWeave"),
CloudProvider::Paperspace => write!(f, "Paperspace"),
CloudProvider::Fluidstack => write!(f, "Fluidstack"),
CloudProvider::TensorDock => write!(f, "TensorDock"),
CloudProvider::Akash => write!(f, "Akash"),
CloudProvider::IoNet => write!(f, "io.net"),
CloudProvider::PrimeIntellect => write!(f, "Prime Intellect"),
CloudProvider::Render => write!(f, "Render"),
CloudProvider::BittensorLium => write!(f, "Bittensor Lium"),
CloudProvider::Hetzner => write!(f, "Hetzner"),
CloudProvider::Crusoe => write!(f, "Crusoe"),
CloudProvider::Generic => write!(f, "Generic"),
CloudProvider::DockerLocal => write!(f, "Docker (Local)"),
CloudProvider::DockerRemote(host) => write!(f, "Docker (Remote: {host})"),
CloudProvider::BareMetal(hosts) => write!(f, "Bare Metal ({} hosts)", hosts.len()),
}
}
}