use std::fmt;
use std::path::PathBuf;
use serde::Serialize;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum VmStatus {
Created,
Running,
Stopped,
Destroyed,
}
impl fmt::Display for VmStatus {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Created => f.write_str("created"),
Self::Running => f.write_str("running"),
Self::Stopped => f.write_str("stopped"),
Self::Destroyed => f.write_str("destroyed"),
}
}
}
#[derive(Debug, Clone, Serialize)]
pub struct VmView {
pub vm_id: String,
pub status: VmStatus,
pub snapshots: Vec<String>,
}
#[derive(Debug, Clone, Default)]
pub struct VmSpec {
pub kernel: Option<PathBuf>,
pub rootfs: Option<PathBuf>,
pub rootfs_read_only: Option<bool>,
pub vcpu_count: Option<u8>,
pub mem_size_mib: Option<u32>,
pub boot_args: Option<String>,
pub rootfs_rate_limit: Option<RateLimiter>,
pub network_interfaces: Vec<NetworkInterface>,
pub restore_from: Option<SnapshotRef>,
pub track_dirty_pages: Option<bool>,
}
#[derive(Debug, Clone, Default)]
pub struct RateLimiter {
pub bandwidth: Option<TokenBucket>,
pub ops: Option<TokenBucket>,
}
#[derive(Debug, Clone)]
pub struct TokenBucket {
pub size: u64,
pub one_time_burst: Option<u64>,
pub refill_time_ms: u64,
}
#[derive(Debug, Clone)]
pub struct NetworkInterface {
pub iface_id: String,
pub host_dev_name: String,
pub guest_mac: Option<String>,
pub rx_rate_limiter: Option<RateLimiter>,
pub tx_rate_limiter: Option<RateLimiter>,
}
#[derive(Debug, Clone)]
pub struct SnapshotRef {
pub vm_id: String,
pub snapshot_id: String,
pub resume_immediately: bool,
pub network_overrides: Vec<NetworkInterface>,
}