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}