Skip to main content

libcgroups/v1/
network_priority.rs

1use std::path::Path;
2
3use oci_spec::runtime::LinuxNetwork;
4
5use super::controller::Controller;
6use crate::common::{self, ControllerOpt, WrappedIoError};
7
8pub struct NetworkPriority {}
9
10impl Controller for NetworkPriority {
11    type Error = WrappedIoError;
12    type Resource = LinuxNetwork;
13
14    fn apply(controller_opt: &ControllerOpt, cgroup_root: &Path) -> Result<(), Self::Error> {
15        tracing::debug!("Apply NetworkPriority cgroup config");
16
17        if let Some(network) = Self::needs_to_handle(controller_opt) {
18            Self::apply(cgroup_root, network)?;
19        }
20
21        Ok(())
22    }
23
24    fn needs_to_handle<'a>(controller_opt: &'a ControllerOpt) -> Option<&'a Self::Resource> {
25        controller_opt.resources.network().as_ref()
26    }
27}
28
29impl NetworkPriority {
30    fn apply(root_path: &Path, network: &LinuxNetwork) -> Result<(), WrappedIoError> {
31        if let Some(ni_priorities) = network.priorities() {
32            let priorities: String = ni_priorities.iter().map(|p| p.to_string()).collect();
33            common::write_cgroup_file_str(root_path.join("net_prio.ifpriomap"), priorities.trim())?;
34        }
35
36        Ok(())
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use oci_spec::runtime::{LinuxInterfacePriorityBuilder, LinuxNetworkBuilder};
43
44    use super::*;
45    use crate::test::set_fixture;
46
47    #[test]
48    fn test_apply_network_priorities() {
49        let tmp = tempfile::tempdir().unwrap();
50        set_fixture(tmp.path(), "net_prio.ifpriomap", "").expect("set fixture for priority map");
51        let priorities = vec![
52            LinuxInterfacePriorityBuilder::default()
53                .name("a")
54                .priority(1u32)
55                .build()
56                .unwrap(),
57            LinuxInterfacePriorityBuilder::default()
58                .name("b")
59                .priority(2u32)
60                .build()
61                .unwrap(),
62        ];
63        let priorities_string = priorities.iter().map(|p| p.to_string()).collect::<String>();
64        let network = LinuxNetworkBuilder::default()
65            .priorities(priorities)
66            .build()
67            .unwrap();
68
69        NetworkPriority::apply(tmp.path(), &network).expect("apply network priorities");
70
71        let content = std::fs::read_to_string(tmp.path().join("net_prio.ifpriomap"))
72            .expect("Read classID contents");
73        assert_eq!(priorities_string.trim(), content);
74    }
75}