From c3e27c60be864059d7423b24feb4fb41766c6db5 Mon Sep 17 00:00:00 2001 From: Sylvain Tremblay Date: Sat, 14 Feb 2026 15:32:01 -0500 Subject: [PATCH] feat: improve output related to storage in the discovery process --- harmony/src/domain/hardware/mod.rs | 11 ++++++-- harmony/src/modules/inventory/discovery.rs | 31 +++++++++++++++++++--- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/harmony/src/domain/hardware/mod.rs b/harmony/src/domain/hardware/mod.rs index 5b590e70..2d7a0347 100644 --- a/harmony/src/domain/hardware/mod.rs +++ b/harmony/src/domain/hardware/mod.rs @@ -108,11 +108,18 @@ impl PhysicalHost { }; let storage_summary = if drive_count > 1 { + let drive_sizes = self + .storage + .iter() + .map(|d| format_storage(d.size_bytes)) + .collect::>() + .join(", "); + format!( - "{} Storage ({}x {})", + "{} Storage ({} Disks [{}])", format_storage(total_storage_bytes), drive_count, - first_drive_model + drive_sizes ) } else { format!( diff --git a/harmony/src/modules/inventory/discovery.rs b/harmony/src/modules/inventory/discovery.rs index 8603d41e..bd3f7186 100644 --- a/harmony/src/modules/inventory/discovery.rs +++ b/harmony/src/modules/inventory/discovery.rs @@ -82,17 +82,40 @@ impl Interpret for DiscoverHostForRoleInterpret { self.score.role, choice.summary() ); - let disk_names: Vec = - choice.storage.iter().map(|s| s.name.clone()).collect(); + let mut disk_choices: Vec<(String, String)> = vec![]; + + for s in choice.storage.iter() { + let size_gb: f64 = s.size_bytes as f64 / 1_000_000_000.0; + let (size, unit) = if size_gb >= 1000.0 { + (size_gb / 1000.0, "TB") + } else { + (size_gb, "GB") + }; + let drive_type = if s.rotational { "rotational" } else { "SSD" }; + let smart_str = s.smart_status.as_deref().unwrap_or("N/A"); + let display = format!( + "{} : [{}] - {:.0} {} ({}) - {} - Smart: {}", + s.name, s.model, size, unit, drive_type, s.interface_type, smart_str + ); + disk_choices.push((display, s.name.clone())); + } + + let display_refs: Vec<&str> = + disk_choices.iter().map(|(d, _)| d.as_str()).collect(); let disk_choice = inquire::Select::new( &format!("Select the disk to use on host {}:", choice.summary()), - disk_names, + display_refs, ) .prompt(); match disk_choice { - Ok(disk_name) => { + Ok(selected_display) => { + let disk_name = disk_choices + .iter() + .find(|(d, _)| d.as_str() == selected_display) + .map(|(_, name)| name.clone()) + .unwrap(); info!("Selected disk {} for node {}", disk_name, choice.summary()); host_repo .save_role_mapping(&self.score.role, &choice, &disk_name) -- 2.39.5