@@ -158,8 +158,37 @@ impl VmStatus {
158
158
}
159
159
}
160
160
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
+
161
190
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) ?;
163
192
let domain = Domain :: lookup_by_name ( & conn, params. name . as_str ( ) ) . ok ( ) ;
164
193
165
194
match domain {
@@ -180,12 +209,13 @@ pub fn create_domain(uri: &str, params: &CreateVMDomainParams) -> Result<(), VmE
180
209
tracing:: info!( target: "vm-utils" , "Domain with name {} already exists. Skipping" , params. name) ;
181
210
}
182
211
} ;
212
+
183
213
Ok ( ( ) )
184
214
}
185
215
186
216
pub fn remove_domain ( uri : & str , name : & str ) -> Result < ( ) , VmError > {
187
217
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) ?;
189
219
let domain = Domain :: lookup_by_name ( & conn, name) . map_err ( |err| VmError :: VmNotFound {
190
220
name : name. to_string ( ) ,
191
221
err,
@@ -217,7 +247,7 @@ pub fn remove_domain(uri: &str, name: &str) -> Result<(), VmError> {
217
247
}
218
248
pub fn start_vm ( uri : & str , name : & str ) -> Result < u32 , VmError > {
219
249
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) ?;
221
251
let domain = Domain :: lookup_by_name ( & conn, name) . map_err ( |err| VmError :: VmNotFound {
222
252
name : name. to_string ( ) ,
223
253
err,
@@ -246,7 +276,7 @@ pub fn start_vm(uri: &str, name: &str) -> Result<u32, VmError> {
246
276
247
277
pub fn stop_vm ( uri : & str , name : & str ) -> Result < ( ) , VmError > {
248
278
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) ?;
250
280
let domain = Domain :: lookup_by_name ( & conn, name) . map_err ( |err| VmError :: VmNotFound {
251
281
name : name. to_string ( ) ,
252
282
err,
@@ -261,7 +291,7 @@ pub fn stop_vm(uri: &str, name: &str) -> Result<(), VmError> {
261
291
262
292
pub fn reboot_vm ( uri : & str , name : & str ) -> Result < ( ) , VmError > {
263
293
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) ?;
265
295
let domain = Domain :: lookup_by_name ( & conn, name) . map_err ( |err| VmError :: VmNotFound {
266
296
name : name. to_string ( ) ,
267
297
err,
@@ -277,7 +307,7 @@ pub fn reboot_vm(uri: &str, name: &str) -> Result<(), VmError> {
277
307
278
308
pub fn reset_vm ( uri : & str , name : & str ) -> Result < ( ) , VmError > {
279
309
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) ?;
281
311
let domain = Domain :: lookup_by_name ( & conn, name) . map_err ( |err| VmError :: VmNotFound {
282
312
name : name. to_string ( ) ,
283
313
err,
@@ -291,7 +321,7 @@ pub fn reset_vm(uri: &str, name: &str) -> Result<(), VmError> {
291
321
292
322
pub fn status_vm ( uri : & str , name : & str ) -> Result < VmStatus , VmError > {
293
323
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) ?;
295
325
let domain = Domain :: lookup_by_name ( & conn, name) . map_err ( |err| VmError :: VmNotFound {
296
326
name : name. to_string ( ) ,
297
327
err,
@@ -529,6 +559,7 @@ mod tests {
529
559
use super :: * ;
530
560
use nonempty:: nonempty;
531
561
use std:: fs;
562
+
532
563
const DEFAULT_URI : & str = "test:///default" ;
533
564
534
565
fn list_defined ( ) -> Result < Vec < String > , VmError > {
0 commit comments