use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum Hipervisor {
VMware,
VirtualBox,
HyperV,
Qemu,
Desconocido,
}
impl Hipervisor {
pub fn desde_formato(formato: &str) -> Self {
match formato.to_ascii_lowercase().as_str() {
"vmdk" => Hipervisor::VMware,
"vdi" => Hipervisor::VirtualBox,
"vpc" | "vhd" | "vhdx" => Hipervisor::HyperV,
"qcow" | "qcow2" | "qed" => Hipervisor::Qemu,
_ => Hipervisor::Desconocido,
}
}
pub fn nombre(&self) -> &'static str {
match self {
Hipervisor::VMware => "VMware",
Hipervisor::VirtualBox => "VirtualBox",
Hipervisor::HyperV => "Hyper-V / Virtual PC",
Hipervisor::Qemu => "QEMU / KVM",
Hipervisor::Desconocido => "Desconocido (imagen raw u otro)",
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InfoImagen {
pub ruta: PathBuf,
pub formato: String,
pub tamano_virtual: u64,
pub tamano_real: u64,
pub hipervisor: Hipervisor,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Estadisticas {
pub modo_acceso: String,
pub peticiones_nbd: u64,
pub bytes_leidos: u64,
pub duracion_ms: u64,
}
pub fn formatear_bytes(bytes: u64) -> String {
const UNIDADES: [&str; 5] = ["B", "KiB", "MiB", "GiB", "TiB"];
let mut valor = bytes as f64;
let mut idx = 0;
while valor >= 1024.0 && idx < UNIDADES.len() - 1 {
valor /= 1024.0;
idx += 1;
}
if idx == 0 {
format!("{} {}", bytes, UNIDADES[idx])
} else {
format!("{:.1} {}", valor, UNIDADES[idx])
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_formatear_bytes() {
assert_eq!(formatear_bytes(500), "500 B");
assert_eq!(formatear_bytes(1024), "1.0 KiB");
assert_eq!(formatear_bytes(1024 * 1024), "1.0 MiB");
assert_eq!(formatear_bytes(1024 * 1024 * 1024 * 2), "2.0 GiB");
}
#[test]
fn test_hipervisor_desde_formato() {
assert_eq!(Hipervisor::desde_formato("vmdk"), Hipervisor::VMware);
assert_eq!(Hipervisor::desde_formato("vdi"), Hipervisor::VirtualBox);
assert_eq!(Hipervisor::desde_formato("vhdx"), Hipervisor::HyperV);
assert_eq!(Hipervisor::desde_formato("qcow2"), Hipervisor::Qemu);
assert_eq!(Hipervisor::desde_formato("raw"), Hipervisor::Desconocido);
}
}