//! Virtual machine image handling. use std::fs::copy; use std::path::{Path, PathBuf}; use std::process::Command; use std::result::Result; /// Errors from this module. #[derive(Debug, thiserror::Error)] pub enum ImageError { /// Error resizing image. #[error("qemu-img resize failed: {0}")] ResizeError(String), /// I/O error. #[error(transparent)] IoError(#[from] std::io::Error), /// Error parsing a string as UTF8. #[error(transparent)] StringError(#[from] std::string::FromUtf8Error), } /// A virtual machine image. #[derive(Debug, Clone)] pub struct VirtualMachineImage { filename: PathBuf, } impl VirtualMachineImage { /// Create new image from a base image. pub fn new_from_base(base_image: &Path, image: &Path) -> Result { copy(base_image, image)?; Ok(Self { filename: image.to_path_buf(), }) } /// Filename of the image. pub fn filename(&self) -> &Path { &self.filename } /// Change size of image. pub fn resize(&self, new_size: u64) -> Result<(), ImageError> { let r = Command::new("qemu-img") .arg("resize") .arg(self.filename()) .arg(format!("{}", new_size)) .output()?; if !r.status.success() { let stderr = String::from_utf8(r.stderr)?; return Err(ImageError::ResizeError(stderr)); } Ok(()) } }