44
55use clap:: Subcommand ;
66use serde:: Serialize ;
7+ use std:: collections:: BTreeSet ;
78
89use super :: get_admin_client;
910use crate :: exit_code:: ExitCode ;
@@ -59,6 +60,8 @@ struct ClusterOutput {
5960 mode : String ,
6061 deployment_id : String ,
6162 region : String ,
63+ rc_version : String ,
64+ rustfs_version : String ,
6265 servers : usize ,
6366 online_disks : usize ,
6467 offline_disks : usize ,
@@ -173,6 +176,8 @@ async fn execute_cluster(args: ClusterArgs, formatter: &Formatter) -> ExitCode {
173176 . region
174177 . clone ( )
175178 . unwrap_or_else ( || "us-east-1" . to_string ( ) ) ,
179+ rc_version : env ! ( "CARGO_PKG_VERSION" ) . to_string ( ) ,
180+ rustfs_version : cluster_rustfs_version ( & info) ,
176181 servers : info. servers . as_ref ( ) . map ( |s| s. len ( ) ) . unwrap_or ( 0 ) ,
177182 online_disks : info. online_disks ( ) ,
178183 offline_disks : info. offline_disks ( ) ,
@@ -212,6 +217,11 @@ fn print_cluster_info(info: &ClusterInfo, formatter: &Formatter) {
212217 formatter. style_name( deployment_id)
213218 ) ) ;
214219 formatter. println ( & format ! ( " Region: {}" , region) ) ;
220+ formatter. println ( & format ! ( " RC Version: {}" , env!( "CARGO_PKG_VERSION" ) ) ) ;
221+ formatter. println ( & format ! (
222+ " RustFS Version: {}" ,
223+ cluster_rustfs_version( info)
224+ ) ) ;
215225
216226 // Server info
217227 let server_count = info. servers . as_ref ( ) . map ( |s| s. len ( ) ) . unwrap_or ( 0 ) ;
@@ -511,6 +521,26 @@ fn value_or_unknown(value: &str) -> &str {
511521 if value. is_empty ( ) { "unknown" } else { value }
512522}
513523
524+ fn cluster_rustfs_version ( info : & ClusterInfo ) -> String {
525+ let versions = info
526+ . servers
527+ . as_ref ( )
528+ . map ( |servers| {
529+ servers
530+ . iter ( )
531+ . map ( |server| server. version . trim ( ) )
532+ . filter ( |version| !version. is_empty ( ) )
533+ . collect :: < BTreeSet < _ > > ( )
534+ } )
535+ . unwrap_or_default ( ) ;
536+
537+ if versions. is_empty ( ) {
538+ "unknown" . to_string ( )
539+ } else {
540+ versions. into_iter ( ) . collect :: < Vec < _ > > ( ) . join ( ", " )
541+ }
542+ }
543+
514544fn disk_capacity_summary ( disk : & DiskInfo ) -> String {
515545 if disk. total_space == 0 {
516546 return format ! (
@@ -578,6 +608,8 @@ mod tests {
578608 mode : "distributed" . to_string ( ) ,
579609 deployment_id : "deploy-1" . to_string ( ) ,
580610 region : "us-east-1" . to_string ( ) ,
611+ rc_version : "0.1.21" . to_string ( ) ,
612+ rustfs_version : "1.0.0" . to_string ( ) ,
581613 servers : 4 ,
582614 online_disks : 8 ,
583615 offline_disks : 1 ,
@@ -589,6 +621,8 @@ mod tests {
589621
590622 let value = serde_json:: to_value ( & output) . expect ( "serialize cluster output" ) ;
591623 assert ! ( value. get( "deploymentId" ) . is_some( ) ) ;
624+ assert ! ( value. get( "rcVersion" ) . is_some( ) ) ;
625+ assert ! ( value. get( "rustfsVersion" ) . is_some( ) ) ;
592626 assert ! ( value. get( "onlineDisks" ) . is_some( ) ) ;
593627 assert ! ( value. get( "usedCapacity" ) . is_some( ) ) ;
594628 }
@@ -687,6 +721,38 @@ mod tests {
687721 assert_eq ! ( count_online_disks( & disks) , 2 ) ;
688722 }
689723
724+ #[ test]
725+ fn test_cluster_rustfs_version_deduplicates_versions ( ) {
726+ let info = ClusterInfo {
727+ servers : Some ( vec ! [
728+ ServerInfo {
729+ version: "1.0.0" . to_string( ) ,
730+ ..Default :: default ( )
731+ } ,
732+ ServerInfo {
733+ version: "1.1.0" . to_string( ) ,
734+ ..Default :: default ( )
735+ } ,
736+ ServerInfo {
737+ version: "1.0.0" . to_string( ) ,
738+ ..Default :: default ( )
739+ } ,
740+ ServerInfo {
741+ version: String :: new( ) ,
742+ ..Default :: default ( )
743+ } ,
744+ ] ) ,
745+ ..Default :: default ( )
746+ } ;
747+
748+ assert_eq ! ( cluster_rustfs_version( & info) , "1.0.0, 1.1.0" ) ;
749+ }
750+
751+ #[ test]
752+ fn test_cluster_rustfs_version_defaults_to_unknown ( ) {
753+ assert_eq ! ( cluster_rustfs_version( & ClusterInfo :: default ( ) ) , "unknown" ) ;
754+ }
755+
690756 #[ test]
691757 fn test_disk_capacity_summary_includes_available_space ( ) {
692758 let disk = DiskInfo {
0 commit comments