Skip to content

Commit bb4d81e

Browse files
authored
feat(admin): add cluster version info (#228)
1 parent 1ed3168 commit bb4d81e

1 file changed

Lines changed: 66 additions & 0 deletions

File tree

  • crates/cli/src/commands/admin

crates/cli/src/commands/admin/info.rs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
55
use clap::Subcommand;
66
use serde::Serialize;
7+
use std::collections::BTreeSet;
78

89
use super::get_admin_client;
910
use 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+
514544
fn 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

Comments
 (0)