libcgroups/v1/
network_priority.rs1use 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}