diff options
Diffstat (limited to 'src/cmd/delete.rs')
-rw-r--r-- | src/cmd/delete.rs | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/cmd/delete.rs b/src/cmd/delete.rs new file mode 100644 index 0000000..ee8f0e9 --- /dev/null +++ b/src/cmd/delete.rs @@ -0,0 +1,43 @@ +use crate::spec::Specification; +use log::{debug, info}; +use std::thread; +use std::time::Duration; +use virt::connect::Connect; + +pub fn delete(spec: &Specification) -> anyhow::Result<()> { + 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)?; + } + } + Ok(()) +} |