manta_server/service/
cluster.rs

1//! Cluster-scoped node detail queries using HSM group membership.
2
3use csm_rs::node::types::NodeDetails;
4use manta_backend_dispatcher::error::Error;
5use manta_backend_dispatcher::interfaces::hsm::group::GroupTrait;
6
7use crate::server::common::app_context::InfraContext;
8use crate::server::common::authorization::get_groups_names_available;
9pub use manta_shared::shared::params::cluster::GetClusterParams;
10
11/// Fetch node details for all nodes in the specified HSM groups.
12pub async fn get_cluster_nodes(
13  infra: &InfraContext<'_>,
14  token: &str,
15  params: &GetClusterParams,
16) -> Result<Vec<NodeDetails>, Error> {
17  let target_hsm_group_vec = get_groups_names_available(
18    infra.backend,
19    token,
20    params.hsm_group_name.as_deref(),
21    params.settings_hsm_group_name.as_deref(),
22  )
23  .await?;
24
25  let mut hsm_groups_node_list = infra
26    .backend
27    .get_member_vec_from_group_name_vec(token, &target_hsm_group_vec)
28    .await?;
29
30  hsm_groups_node_list.sort();
31
32  let mut node_details_list = csm_rs::node::utils::get_node_details(
33    token,
34    infra.shasta_base_url,
35    infra.shasta_root_cert,
36    infra.socks5_proxy,
37    hsm_groups_node_list,
38  )
39  .await
40  .map_err(|e: csm_rs::error::Error| -> Error { e.into() })?;
41
42  // Apply status filter
43  if let Some(ref status) = params.status_filter {
44    node_details_list.retain(|nd| {
45      nd.power_status.eq_ignore_ascii_case(status)
46        || nd.configuration_status.eq_ignore_ascii_case(status)
47    });
48  }
49
50  node_details_list.sort_by(|a, b| a.xname.cmp(&b.xname));
51
52  Ok(node_details_list)
53}