diff --git a/Cargo.lock b/Cargo.lock index 0cf4e44..d2707fe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -484,7 +484,7 @@ dependencies = [ [[package]] name = "libzetta" -version = "0.4.2" +version = "0.4.3" dependencies = [ "bitflags", "cavity", diff --git a/src/log.rs b/src/log.rs index ac01cc9..a0f967a 100644 --- a/src/log.rs +++ b/src/log.rs @@ -1,8 +1,8 @@ -use std::ops::Deref; use once_cell::sync::OnceCell; use slog::{Drain, Logger as SlogLogger}; use slog_stdlog::StdLog; use std::borrow::Borrow; +use std::ops::Deref; static GLOBAL_LOGGER: OnceCell = OnceCell::new(); diff --git a/src/zpool/mod.rs b/src/zpool/mod.rs index 131968d..d48d65f 100644 --- a/src/zpool/mod.rs +++ b/src/zpool/mod.rs @@ -416,10 +416,7 @@ pub trait ZpoolEngine { fn import_from_dir>(&self, name: N, dir: PathBuf) -> ZpoolResult<()>; /// Get the detailed status of the given pools. - fn status>(&self, name: N) -> ZpoolResult; - - /// Get a status of each active (imported) pool in the system - fn all(&self) -> ZpoolResult>; + fn status>(&self, name: N, opts: StatusOptions) -> ZpoolResult; /// Query status with options fn status_all(&self, opts: StatusOptions) -> ZpoolResult>; diff --git a/src/zpool/open3.rs b/src/zpool/open3.rs index 285d14c..3d8a75e 100644 --- a/src/zpool/open3.rs +++ b/src/zpool/open3.rs @@ -267,10 +267,15 @@ impl ZpoolEngine for ZpoolOpen3 { } } - fn status>(&self, name: N) -> ZpoolResult { + fn status>(&self, name: N, opts: StatusOptions) -> ZpoolResult { let mut z = self.zpool(); z.arg("status"); - z.arg("-P"); + if opts.full_paths { + z.arg("-P"); + } + if opts.resolve_links { + z.arg("-L"); + } z.arg(name.as_ref()); debug!(self.logger, "executing"; "cmd" => format_args!("{:?}", z)); let out = z.output()?; @@ -287,14 +292,6 @@ impl ZpoolEngine for ZpoolOpen3 { Ok(zpool) } - fn all(&self) -> ZpoolResult> { - let mut z = self.zpool(); - z.arg("status"); - debug!(self.logger, "executing"; "cmd" => format_args!("{:?}", z)); - let out = z.output()?; - self.zpools_from_import(out) - } - fn status_all(&self, opts: StatusOptions) -> ZpoolResult> { let mut z = self.zpool(); z.arg("status"); @@ -565,8 +562,14 @@ mod test { let stdout = include_str!("fixtures/status_with_block_device_nested"); let zpools: Vec = StdoutParser::parse(Rule::zpools, stdout.as_ref()) .map_err(|_| ZpoolError::ParseError) - .map(|pairs| pairs.map(Zpool::from_pest_pair).collect()).unwrap(); - let drives = &zpools[0].vdevs().iter().flat_map(|vdev| vdev.disks().iter()).map(|drive| drive.path().display().to_string()).collect::>(); + .map(|pairs| pairs.map(Zpool::from_pest_pair).collect()) + .unwrap(); + let drives = &zpools[0] + .vdevs() + .iter() + .flat_map(|vdev| vdev.disks().iter()) + .map(|drive| drive.path().display().to_string()) + .collect::>(); let expected: Vec = [ "/dev/diskid/DISK-ZCT2K2R6", @@ -575,8 +578,10 @@ mod test { "/dev/diskid/DISK-ZCT2QWL9", "/dev/diskid/DISK-ZCT2QXEL", "/dev/diskid/DISK-ZCT2RH0W", - ].iter().map(|d| d.to_string()).collect(); + ] + .iter() + .map(|d| d.to_string()) + .collect(); assert_eq!(&expected, drives); } - } diff --git a/tests/test_zpool.rs b/tests/test_zpool.rs index 15152ee..3a33e9e 100644 --- a/tests/test_zpool.rs +++ b/tests/test_zpool.rs @@ -17,6 +17,7 @@ use rand::Rng; use libzetta::{ slog::*, zpool::{ + open3::{StatusOptions, StatusOptionsBuilder}, CreateMode, CreateVdevRequest, CreateZpoolRequestBuilder, DestroyMode, ExportMode, FailMode, Health, OfflineMode, OnlineMode, Zpool, ZpoolEngine, ZpoolError, ZpoolErrorKind, ZpoolOpen3, ZpoolPropertiesWriteBuilder, @@ -436,7 +437,7 @@ fn test_status() { .unwrap(); zpool.create(topo.clone()).unwrap(); - let result = zpool.status(&name).unwrap(); + let result = zpool.status(&name, StatusOptions::default()).unwrap(); assert_eq!(&name, result.name()); assert_eq!(&result, &topo); }); @@ -454,7 +455,7 @@ fn test_all() { zpool.create(topo.clone()).unwrap(); let result: Vec = zpool - .all() + .status_all(StatusOptions::default()) .unwrap() .iter() .cloned() @@ -473,7 +474,7 @@ fn test_all_empty() { let zpool = ZpoolOpen3::default(); let result: Vec = zpool - .all() + .status_all(StatusOptions::default()) .unwrap() .iter() .cloned() @@ -556,13 +557,13 @@ fn test_zpool_take_device_from_mirror_offline() { let result = zpool.take_offline(&name, &vdev0_path, OfflineMode::UntilReboot); assert!(result.is_ok()); - let z = zpool.status(&name).unwrap(); + let z = zpool.status(&name, StatusOptions::default()).unwrap(); assert_eq!(&Health::Degraded, z.health()); let result = zpool.bring_online(&name, &vdev0_path, OnlineMode::Simple); assert!(result.is_ok()); - let z = zpool.status(&name).unwrap(); + let z = zpool.status(&name, StatusOptions::default()).unwrap(); assert_eq!(&Health::Online, z.health()); }); } @@ -586,13 +587,13 @@ fn test_zpool_take_device_from_mirror_offline_expand() { let result = zpool.take_offline(&name, &vdev0_path, OfflineMode::UntilReboot); assert!(result.is_ok()); - let z = zpool.status(&name).unwrap(); + let z = zpool.status(&name, StatusOptions::default()).unwrap(); assert_eq!(&Health::Degraded, z.health()); let result = zpool.bring_online(&name, &vdev0_path, OnlineMode::Expand); assert!(result.is_ok()); - let z = zpool.status(&name).unwrap(); + let z = zpool.status(&name, StatusOptions::default()).unwrap(); assert_eq!(&Health::Online, z.health()); }); } @@ -613,7 +614,7 @@ fn test_zpool_attach_then_detach_single() { zpool.attach(&name, &vdev0_path, &vdev1_path).unwrap(); - let z = zpool.status(&name).unwrap(); + let z = zpool.status(&name, StatusOptions::default()).unwrap(); let topo_actual = CreateZpoolRequestBuilder::default() .name(name.clone()) .create_mode(CreateMode::Force) @@ -626,7 +627,7 @@ fn test_zpool_attach_then_detach_single() { assert_eq!(&z, &topo_actual); zpool.detach(&name, &vdev1_path).unwrap(); - let z = zpool.status(&name).unwrap(); + let z = zpool.status(&name, StatusOptions::default()).unwrap(); assert_eq!(&z, &topo); let err = zpool.detach(&name, &vdev0_path).unwrap_err(); @@ -662,7 +663,7 @@ fn test_zpool_add_naked() { assert!(result.is_ok()); - let z = zpool.status(&name).unwrap(); + let z = zpool.status(&name, StatusOptions::default()).unwrap(); assert_eq!(topo_expected, z); }); @@ -695,7 +696,7 @@ fn test_zpool_add_naked_force() { assert!(result.is_ok()); - let z = zpool.status(&name).unwrap(); + let z = zpool.status(&name, StatusOptions::default()).unwrap(); assert_eq!(topo_expected, z); }); @@ -739,7 +740,7 @@ fn test_zpool_add_mirror() { assert!(result.is_ok()); - let z = zpool.status(&name).unwrap(); + let z = zpool.status(&name, StatusOptions::default()).unwrap(); assert_eq!(topo_expected, z); }); @@ -806,7 +807,7 @@ fn test_zpool_remove_zil() { .build() .unwrap(); - let result = zpool.status(&name).unwrap(); + let result = zpool.status(&name, StatusOptions::default()).unwrap(); assert_eq!(topo, result); }); @@ -838,7 +839,11 @@ fn test_zpool_add_cache() { assert!(result.is_ok()); - let z = zpool.status(&name).unwrap(); + let opts = StatusOptionsBuilder::default() + .full_paths(true) + .build() + .unwrap(); + let z = zpool.status(&name, opts).unwrap(); assert_eq!(topo_expected, z); }); } @@ -858,7 +863,12 @@ fn test_create_with_spare() { .build() .unwrap(); zpool.create(topo.clone()).unwrap(); - let z = zpool.status(&name).unwrap(); + + let opts = StatusOptionsBuilder::default() + .full_paths(true) + .build() + .unwrap(); + let z = zpool.status(&name, opts).unwrap(); assert_eq!(topo, z); }); } @@ -889,7 +899,11 @@ fn test_zpool_add_spare() { assert!(result.is_ok()); - let z = zpool.status(&name).unwrap(); + let opts = StatusOptionsBuilder::default() + .full_paths(true) + .build() + .unwrap(); + let z = zpool.status(&name, opts).unwrap(); assert_eq!(topo_expected, z); }); } @@ -931,7 +945,11 @@ fn test_zpool_replace_disk() { let wait_time = time::Duration::from_secs(13); thread::sleep(wait_time); - let z = zpool.status(&name).unwrap(); + let opts = StatusOptionsBuilder::default() + .full_paths(true) + .build() + .unwrap(); + let z = zpool.status(&name, opts).unwrap(); assert_eq!(topo_expected, z); }); }