Skip to content

Commit 944b4b6

Browse files
authored
fix(vm): close libvirt connections (#2392)
1 parent 6cfa3a8 commit 944b4b6

File tree

1 file changed

+38
-7
lines changed

1 file changed

+38
-7
lines changed

crates/vm-utils/src/vm_utils.rs

+38-7
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,37 @@ impl VmStatus {
158158
}
159159
}
160160

161+
struct AutocloseConnect(Connect);
162+
163+
impl AutocloseConnect {
164+
fn open(uri: &str) -> Result<Self, VmError> {
165+
Connect::open(Some(uri))
166+
.map(Self)
167+
.map_err(|err| VmError::FailedToConnect { err })
168+
}
169+
}
170+
171+
impl std::ops::Deref for AutocloseConnect {
172+
type Target = Connect;
173+
174+
fn deref(&self) -> &Self::Target {
175+
&self.0
176+
}
177+
}
178+
179+
impl Drop for AutocloseConnect {
180+
fn drop(&mut self) {
181+
match self.0.close() {
182+
Ok(_) => {}
183+
Err(err) => {
184+
tracing::warn!(target: "vm-utils","Failed to close connection properly: {err}");
185+
}
186+
}
187+
}
188+
}
189+
161190
pub fn create_domain(uri: &str, params: &CreateVMDomainParams) -> Result<(), VmError> {
162-
let conn = Connect::open(Some(uri)).map_err(|err| VmError::FailedToConnect { err })?;
191+
let conn = AutocloseConnect::open(uri)?;
163192
let domain = Domain::lookup_by_name(&conn, params.name.as_str()).ok();
164193

165194
match domain {
@@ -180,12 +209,13 @@ pub fn create_domain(uri: &str, params: &CreateVMDomainParams) -> Result<(), VmE
180209
tracing::info!(target: "vm-utils","Domain with name {} already exists. Skipping", params.name);
181210
}
182211
};
212+
183213
Ok(())
184214
}
185215

186216
pub fn remove_domain(uri: &str, name: &str) -> Result<(), VmError> {
187217
tracing::info!(target: "vm-utils","Removing domain with name {}", name);
188-
let conn = Connect::open(Some(uri)).map_err(|err| VmError::FailedToConnect { err })?;
218+
let conn = AutocloseConnect::open(uri)?;
189219
let domain = Domain::lookup_by_name(&conn, name).map_err(|err| VmError::VmNotFound {
190220
name: name.to_string(),
191221
err,
@@ -217,7 +247,7 @@ pub fn remove_domain(uri: &str, name: &str) -> Result<(), VmError> {
217247
}
218248
pub fn start_vm(uri: &str, name: &str) -> Result<u32, VmError> {
219249
tracing::info!(target: "vm-utils","Starting VM with name {name}");
220-
let conn = Connect::open(Some(uri)).map_err(|err| VmError::FailedToConnect { err })?;
250+
let conn = AutocloseConnect::open(uri)?;
221251
let domain = Domain::lookup_by_name(&conn, name).map_err(|err| VmError::VmNotFound {
222252
name: name.to_string(),
223253
err,
@@ -246,7 +276,7 @@ pub fn start_vm(uri: &str, name: &str) -> Result<u32, VmError> {
246276

247277
pub fn stop_vm(uri: &str, name: &str) -> Result<(), VmError> {
248278
tracing::info!(target: "vm-utils","Stopping VM with name {name}");
249-
let conn = Connect::open(Some(uri)).map_err(|err| VmError::FailedToConnect { err })?;
279+
let conn = AutocloseConnect::open(uri)?;
250280
let domain = Domain::lookup_by_name(&conn, name).map_err(|err| VmError::VmNotFound {
251281
name: name.to_string(),
252282
err,
@@ -261,7 +291,7 @@ pub fn stop_vm(uri: &str, name: &str) -> Result<(), VmError> {
261291

262292
pub fn reboot_vm(uri: &str, name: &str) -> Result<(), VmError> {
263293
tracing::info!(target: "vm-utils","Rebooting VM with name {name}");
264-
let conn = Connect::open(Some(uri)).map_err(|err| VmError::FailedToConnect { err })?;
294+
let conn = AutocloseConnect::open(uri)?;
265295
let domain = Domain::lookup_by_name(&conn, name).map_err(|err| VmError::VmNotFound {
266296
name: name.to_string(),
267297
err,
@@ -277,7 +307,7 @@ pub fn reboot_vm(uri: &str, name: &str) -> Result<(), VmError> {
277307

278308
pub fn reset_vm(uri: &str, name: &str) -> Result<(), VmError> {
279309
tracing::info!(target: "vm-utils","Resetting VM with name {name}");
280-
let conn = Connect::open(Some(uri)).map_err(|err| VmError::FailedToConnect { err })?;
310+
let conn = AutocloseConnect::open(uri)?;
281311
let domain = Domain::lookup_by_name(&conn, name).map_err(|err| VmError::VmNotFound {
282312
name: name.to_string(),
283313
err,
@@ -291,7 +321,7 @@ pub fn reset_vm(uri: &str, name: &str) -> Result<(), VmError> {
291321

292322
pub fn status_vm(uri: &str, name: &str) -> Result<VmStatus, VmError> {
293323
tracing::info!(target: "vm-utils","Getting info for VM with name {name}");
294-
let conn = Connect::open(Some(uri)).map_err(|err| VmError::FailedToConnect { err })?;
324+
let conn = AutocloseConnect::open(uri)?;
295325
let domain = Domain::lookup_by_name(&conn, name).map_err(|err| VmError::VmNotFound {
296326
name: name.to_string(),
297327
err,
@@ -529,6 +559,7 @@ mod tests {
529559
use super::*;
530560
use nonempty::nonempty;
531561
use std::fs;
562+
532563
const DEFAULT_URI: &str = "test:///default";
533564

534565
fn list_defined() -> Result<Vec<String>, VmError> {

0 commit comments

Comments
 (0)