manta_server/server/common/
boot_parameters.rs1use manta_backend_dispatcher::types::{Group, bss::BootParameters};
5
6pub fn get_restricted_boot_parameters(
8 group_available_vec: &[Group],
9 boot_parameter_vec: &[BootParameters],
10) -> Vec<BootParameters> {
11 let group_members: Vec<String> = group_available_vec
12 .iter()
13 .flat_map(manta_backend_dispatcher::types::Group::get_members)
14 .collect();
15
16 boot_parameter_vec
17 .iter()
18 .filter(|boot_param| {
19 group_members
20 .iter()
21 .any(|gma| boot_param.hosts.contains(gma))
22 })
23 .cloned()
24 .collect::<Vec<BootParameters>>()
25}
26
27#[cfg(test)]
28mod tests {
29 use super::*;
30 use manta_backend_dispatcher::types::Member;
31
32 fn make_group(label: &str, member_ids: Vec<&str>) -> Group {
34 Group {
35 label: label.to_string(),
36 description: None,
37 tags: None,
38 members: Some(Member {
39 ids: Some(member_ids.into_iter().map(String::from).collect()),
40 }),
41 exclusive_group: None,
42 }
43 }
44
45 fn make_boot_params(hosts: Vec<&str>) -> BootParameters {
47 BootParameters {
48 hosts: hosts.into_iter().map(String::from).collect(),
49 ..Default::default()
50 }
51 }
52
53 #[test]
54 fn filters_boot_params_by_group_membership() {
55 let groups =
56 vec![make_group("grp1", vec!["x1000c0s0b0n0", "x1000c0s0b0n1"])];
57 let boot_params = vec![
58 make_boot_params(vec!["x1000c0s0b0n0"]),
59 make_boot_params(vec!["x9999c0s0b0n0"]),
60 make_boot_params(vec!["x1000c0s0b0n1"]),
61 ];
62 let result = get_restricted_boot_parameters(&groups, &boot_params);
63 assert_eq!(result.len(), 2);
64 assert_eq!(result[0].hosts, vec!["x1000c0s0b0n0"]);
65 assert_eq!(result[1].hosts, vec!["x1000c0s0b0n1"]);
66 }
67
68 #[test]
69 fn returns_empty_when_no_group_members_match() {
70 let groups = vec![make_group("grp1", vec!["x1000c0s0b0n0"])];
71 let boot_params = vec![make_boot_params(vec!["x9999c0s0b0n0"])];
72 let result = get_restricted_boot_parameters(&groups, &boot_params);
73 assert!(result.is_empty());
74 }
75
76 #[test]
77 fn returns_empty_when_groups_are_empty() {
78 let boot_params = vec![make_boot_params(vec!["x1000c0s0b0n0"])];
79 let result = get_restricted_boot_parameters(&[], &boot_params);
80 assert!(result.is_empty());
81 }
82
83 #[test]
84 fn returns_empty_when_boot_params_are_empty() {
85 let groups = vec![make_group("grp1", vec!["x1000c0s0b0n0"])];
86 let result = get_restricted_boot_parameters(&groups, &[]);
87 assert!(result.is_empty());
88 }
89
90 #[test]
91 fn aggregates_members_across_multiple_groups() {
92 let groups = vec![
93 make_group("grp1", vec!["x1000c0s0b0n0"]),
94 make_group("grp2", vec!["x2000c0s0b0n0"]),
95 ];
96 let boot_params = vec![
97 make_boot_params(vec!["x1000c0s0b0n0"]),
98 make_boot_params(vec!["x2000c0s0b0n0"]),
99 make_boot_params(vec!["x3000c0s0b0n0"]),
100 ];
101 let result = get_restricted_boot_parameters(&groups, &boot_params);
102 assert_eq!(result.len(), 2);
103 }
104}