rust_cni/
namespace.rs

1use std::{collections::HashMap, sync::Arc};
2
3use crate::libcni::{
4    self,
5    api::{RuntimeConf, CNI},
6};
7pub struct Network {
8    pub cni: Arc<dyn CNI>,
9    pub config: libcni::api::NetworkConfigList,
10    pub ifname: String,
11}
12
13impl Network {
14    pub fn attach(&self, ns: &Namespace) -> Result<(), String> {
15        let _ = self
16            .cni
17            .add_network_list(self.config.clone(), ns.config(self.ifname.clone()));
18        Ok(())
19    }
20    pub fn remove(&self, ns: &Namespace) -> Result<(), String> {
21        let _ = self
22            .cni
23            .delete_network_list(self.config.clone(), ns.config(self.ifname.clone()));
24        Ok(())
25    }
26    pub fn check(&self, ns: &Namespace) -> Result<(), String> {
27        let _ = self
28            .cni
29            .check_network_list(self.config.clone(), ns.config(self.ifname.clone()));
30        Ok(())
31    }
32}
33#[derive(Clone, Default)]
34pub struct Namespace {
35    id: String,
36    path: String,
37    capability_args: HashMap<String, String>,
38    args: HashMap<String, String>,
39}
40
41impl Namespace {
42    pub fn new(id: String, path: String) -> Self {
43        Self {
44            id,
45            path,
46            capability_args: HashMap::default(),
47            args: HashMap::default(),
48        }
49    }
50
51    pub fn config(&self, ifname: String) -> libcni::api::RuntimeConf {
52        let args = self
53            .args
54            .iter()
55            .map(|(key, val)| [key.clone(), val.clone()])
56            .collect();
57        RuntimeConf {
58            container_id: self.id.clone(),
59            net_ns: self.path.clone(),
60            if_name: ifname,
61            args,
62            capability_args: self.capability_args.clone(),
63            cache_dir: String::default(),
64        }
65    }
66}