summaryrefslogtreecommitdiff
path: root/src/cmd/delete.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/delete.rs')
-rw-r--r--src/cmd/delete.rs43
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(())
+}