manta_server/server/common/
boot_parameters.rs

1//! Server-side helpers for resolving and filtering BSS boot
2//! parameters during handler-side orchestration.
3
4use manta_backend_dispatcher::types::{Group, bss::BootParameters};
5
6/// Get a vector of boot parameters that are restricted based on the groups available to the user.
7pub 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  /// Helper: create a Group with given label and member xnames.
33  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  /// Helper: create a BootParameters with given hosts.
46  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}