1
0
Fork 0
mirror of https://github.com/containers/youki synced 2024-05-05 23:26:32 +02:00
youki/cgroups/src/v1/network_classifier.rs
2021-09-27 15:46:57 -07:00

66 lines
1.9 KiB
Rust

use std::path::Path;
use anyhow::{Context, Result};
use super::Controller;
use crate::common::{self, ControllerOpt};
use oci_spec::runtime::LinuxNetwork;
pub struct NetworkClassifier {}
impl Controller for NetworkClassifier {
type Resource = LinuxNetwork;
fn apply(controller_opt: &ControllerOpt, cgroup_root: &Path) -> Result<()> {
log::debug!("Apply NetworkClassifier cgroup config");
if let Some(network) = Self::needs_to_handle(controller_opt) {
Self::apply(cgroup_root, network)
.context("failed to apply network classifier resource restrictions")?;
}
Ok(())
}
fn needs_to_handle<'a>(controller_opt: &'a ControllerOpt) -> Option<&'a Self::Resource> {
controller_opt.resources.network().as_ref()
}
}
impl NetworkClassifier {
fn apply(root_path: &Path, network: &LinuxNetwork) -> Result<()> {
if let Some(class_id) = network.class_id() {
common::write_cgroup_file(root_path.join("net_cls.classid"), class_id)?;
}
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::test::{create_temp_dir, set_fixture};
use oci_spec::runtime::LinuxNetworkBuilder;
#[test]
fn test_apply_network_classifier() {
let tmp = create_temp_dir("test_apply_network_classifier")
.expect("create temp directory for test");
set_fixture(&tmp, "net_cls.classid", "0").expect("set fixture for classID");
let id = 0x100001u32;
let network = LinuxNetworkBuilder::default()
.class_id(id)
.priorities(vec![])
.build()
.unwrap();
NetworkClassifier::apply(&tmp, &network).expect("apply network classID");
let content =
std::fs::read_to_string(tmp.join("net_cls.classid")).expect("Read classID contents");
assert_eq!(id.to_string(), content);
}
}