use std::collections::HashSet;
use comfy_table::{Cell, Table};
use regex::Regex;
use serde_json::Value;
use crate::manta::get_nodes_status::NodeDetails;
#[deprecated(note = "Use crate::common::node_ops::validate_xnames instead")]
pub fn check_hsm_group_and_ansible_limit(
hsm_groups_nodes: &HashSet<String>,
ansible_limit_nodes: HashSet<String>,
) -> (HashSet<String>, HashSet<String>) {
(
ansible_limit_nodes
.intersection(hsm_groups_nodes)
.cloned()
.collect(),
ansible_limit_nodes
.difference(hsm_groups_nodes)
.cloned()
.collect(),
)
}
pub fn print_table(nodes_status: Vec<NodeDetails>) {
let mut table = Table::new();
table.set_header(vec![
"XNAME",
"NID",
"Power Status",
"Desired Configuration",
"Configuration Status",
"Enabled",
"Error Count",
"Image ID (Boot param)",
]);
for node_status in nodes_status {
table.add_row(vec![
Cell::new(node_status.xname),
Cell::new(node_status.nid),
Cell::new(node_status.power_status),
Cell::new(node_status.desired_configuration),
Cell::new(node_status.configuration_status),
Cell::new(node_status.enabled),
Cell::new(node_status.error_count),
Cell::new(node_status.boot_image_id),
]);
}
println!("{table}");
}
pub fn nodes_to_string_format_one_line(nodes: Option<&Vec<Value>>) -> String {
if let Some(nodes_content) = nodes {
nodes_to_string_format_discrete_columns(nodes, nodes_content.len() + 1)
} else {
"".to_string()
}
}
pub fn nodes_to_string_format_discrete_columns(
nodes: Option<&Vec<Value>>,
num_columns: usize,
) -> String {
let mut members: String;
match nodes {
Some(nodes) if !nodes.is_empty() => {
members = nodes[0].as_str().unwrap().to_string(); for (i, _) in nodes.iter().enumerate().skip(1) {
if i % num_columns == 0 {
members.push_str(",\n");
} else {
members.push(',');
}
members.push_str(nodes[i].as_str().unwrap());
}
}
_ => members = "".to_string(),
}
members
}
pub fn string_vec_to_multi_line_string(nodes: Option<&Vec<String>>, num_columns: usize) -> String {
let mut members: String;
match nodes {
Some(nodes) if !nodes.is_empty() => {
members = nodes.first().unwrap().to_string(); for (i, _) in nodes.iter().enumerate().skip(1) {
if i % num_columns == 0 {
members.push_str(",\n");
} else {
members.push(',');
}
members.push_str(&nodes[i]);
}
}
_ => members = "".to_string(),
}
members
}
pub fn validate_xname_format(xname: &str) -> bool {
let xname_re = Regex::new(r"^x\d{4}c[0-7]s([0-9]|[1-5][0-9]|6[0-4])b[0-1]n[0-7]$").unwrap();
xname_re.is_match(xname)
}
pub async fn validate_xnames(
shasta_token: &str,
shasta_base_url: &str,
shasta_root_cert: &[u8],
xnames: &[&str],
hsm_group_name: Option<&String>,
) -> bool {
let hsm_group_members: Vec<_> = if hsm_group_name.is_some() {
crate::shasta::hsm::http_client::get_hsm_group(
shasta_token,
shasta_base_url,
shasta_root_cert,
hsm_group_name.unwrap(),
)
.await
.unwrap()["members"]["ids"]
.as_array()
.unwrap()
.to_vec()
.iter()
.map(|xname| xname.as_str().unwrap().to_string())
.collect::<Vec<_>>()
} else {
Vec::new()
};
if xnames.iter().any(|&xname| {
!validate_xname_format(xname)
|| (!hsm_group_members.is_empty() && !hsm_group_members.contains(&xname.to_string()))
}) {
return false;
}
true
}