summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2021-03-24 21:12:01 +0200
committerLars Wirzenius <liw@liw.fi>2021-03-24 21:12:01 +0200
commitcc7f874e03a6050c47b592fe5ed7b3704eeedfcc (patch)
treef559a5da2ff8e3a9204805bba936cc413b1557c6
parent2c7ee5f8f8f4e334cb854f1ccbfd7a96392d1dae (diff)
downloadvmadm-cc7f874e03a6050c47b592fe5ed7b3704eeedfcc.tar.gz
refactor: when deleting, ask all VMs to shut down at once, for speed
-rw-r--r--src/cmd/delete.rs5
-rw-r--r--src/libvirt.rs18
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()?;