mirror of
https://github.com/containers/youki
synced 2024-05-17 21:16:30 +02:00
67 lines
1.7 KiB
Rust
67 lines
1.7 KiB
Rust
use std::path::Path;
|
|
|
|
use anyhow::Result;
|
|
|
|
use super::Controller;
|
|
use crate::common;
|
|
use oci_spec::{LinuxNetwork, LinuxResources};
|
|
|
|
pub struct NetworkClassifier {}
|
|
|
|
impl Controller for NetworkClassifier {
|
|
type Resource = LinuxNetwork;
|
|
|
|
fn apply(linux_resources: &LinuxResources, cgroup_root: &Path) -> Result<()> {
|
|
log::debug!("Apply NetworkClassifier cgroup config");
|
|
|
|
if let Some(network) = Self::needs_to_handle(linux_resources) {
|
|
Self::apply(cgroup_root, network)?;
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
|
|
fn needs_to_handle(linux_resources: &LinuxResources) -> Option<&Self::Resource> {
|
|
if let Some(network) = linux_resources.network.as_ref() {
|
|
return Some(network);
|
|
}
|
|
|
|
None
|
|
}
|
|
}
|
|
|
|
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};
|
|
|
|
#[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 = 0x100001;
|
|
let network = LinuxNetwork {
|
|
class_id: Some(id),
|
|
priorities: Some(vec![]),
|
|
};
|
|
|
|
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);
|
|
}
|
|
}
|