diff options
Diffstat (limited to 'src/cmd/delete.rs')
-rw-r--r-- | src/cmd/delete.rs | 55 |
1 files changed, 5 insertions, 50 deletions
diff --git a/src/cmd/delete.rs b/src/cmd/delete.rs index a9a0660..66eb23f 100644 --- a/src/cmd/delete.rs +++ b/src/cmd/delete.rs @@ -1,62 +1,17 @@ //! The `delete` sub-command. +use crate::libvirt::{Libvirt, VirtError}; use crate::spec::Specification; -use log::{debug, info}; -use std::thread; -use std::time::Duration; -use virt::connect::Connect; - -/// Errors from this module. -#[derive(Debug, thiserror::Error)] -pub enum DeleteError { - /// Error creating virtual machine. - #[error(transparent)] - VirtError(#[from] virt::error::Error), - - /// Error doing I/O. - #[error(transparent)] - IoError(#[from] std::io::Error), -} +use log::info; /// Delete VMs corresponding to specifications. /// /// Delete the VM corresponding to each specification provided by the caller. -pub fn delete(specs: &[Specification]) -> Result<(), DeleteError> { +pub fn delete(specs: &[Specification]) -> Result<(), VirtError> { + let libvirt = Libvirt::connect("qemu:///system")?; for spec in specs { info!("deleting virtual machine {}", spec.name); - - debug!("connecting to libvirtd"); - let conn = Connect::open("qemu:///system")?; - - debug!("listing all domains"); - let domains = conn.list_all_domains(0)?; - - for domain in domains { - debug!("considering {}", domain.get_name()?); - if domain.get_name()? == spec.name { - debug!("shutdown {}", spec.name); - domain.shutdown().ok(); - - let briefly = Duration::from_millis(1000); - loop { - thread::sleep(briefly); - match domain.is_active() { - Ok(true) => (), - Ok(false) => break, - Err(err) => { - debug!("is_active: {}", err); - } - } - debug!("{} is still running", spec.name); - } - - debug!("undefine {}", spec.name); - domain.undefine()?; - - debug!("removing image file {}", spec.image.display()); - std::fs::remove_file(&spec.image)?; - } - } + libvirt.delete(&spec.name, &spec.image)?; } Ok(()) } |