diff options
author | Lars Wirzenius <liw@liw.fi> | 2021-03-24 21:12:01 +0200 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2021-03-24 21:12:01 +0200 |
commit | cc7f874e03a6050c47b592fe5ed7b3704eeedfcc (patch) | |
tree | f559a5da2ff8e3a9204805bba936cc413b1557c6 | |
parent | 2c7ee5f8f8f4e334cb854f1ccbfd7a96392d1dae (diff) | |
download | vmadm-cc7f874e03a6050c47b592fe5ed7b3704eeedfcc.tar.gz |
refactor: when deleting, ask all VMs to shut down at once, for speed
-rw-r--r-- | src/cmd/delete.rs | 5 | ||||
-rw-r--r-- | src/libvirt.rs | 18 |
2 files changed, 18 insertions, 5 deletions
diff --git a/src/cmd/delete.rs b/src/cmd/delete.rs index 66eb23f..fbb6ab5 100644 --- a/src/cmd/delete.rs +++ b/src/cmd/delete.rs @@ -10,7 +10,12 @@ use log::info; pub fn delete(specs: &[Specification]) -> Result<(), VirtError> { let libvirt = Libvirt::connect("qemu:///system")?; for spec in specs { + info!("asking virtual machine {} to shutdown", spec.name); + libvirt.trigger_shutdown(&spec.name)?; + } + for spec in specs { info!("deleting virtual machine {}", spec.name); + libvirt.shutdown(&spec.name)?; libvirt.delete(&spec.name, &spec.image)?; } Ok(()) diff --git a/src/libvirt.rs b/src/libvirt.rs index c93bd9f..7d8235d 100644 --- a/src/libvirt.rs +++ b/src/libvirt.rs @@ -95,9 +95,20 @@ impl Libvirt { Ok(()) } + pub fn trigger_shutdown(&self, name: &str) -> Result<(), VirtError> { + if let Some(domain) = self.get_domain(name)? { + debug!("asking {} to shut down", name); + if domain.is_active()? { + domain.shutdown()?; + } + } + Ok(()) + } + pub fn shutdown(&self, name: &str) -> Result<(), VirtError> { if let Some(domain) = self.get_domain(name)? { - domain.shutdown()?; + debug!("shutting down {}", name); + self.trigger_shutdown(name)?; wait_until_inactive(&domain, name); } Ok(()) @@ -105,10 +116,7 @@ impl Libvirt { pub fn delete(&self, name: &str, image: &Path) -> Result<(), VirtError> { if let Some(domain) = self.get_domain(name)? { - debug!("shutting down {}", name); - domain.shutdown().ok(); - - wait_until_inactive(&domain, name); + self.shutdown(name)?; debug!("undefine {}", name); domain.undefine()?; |