1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
use std::path::PathBuf;
use crate::{config::NetworkConfig, Cni, Command};
/// An alternate representation of plugin inputs.
///
/// This can be obtained from [`Cni`] with the [`Cni::into_inputs()`] method.
#[derive(Clone, Debug)]
pub struct Inputs {
/// The command given to the plugin.
pub command: Command,
/// The container ID, as provided by the runtime.
///
/// The spec says:
/// > A unique plaintext identifier for a container, allocated by the
/// > runtime. Not empty.
///
/// In practice, this may not be the ID of an actual container, but
/// rather the ID of the logical container grouping this network applies
/// to. E.g. a Pod, Alloc, etc.
pub container_id: String,
/// The name of the interface to create, delete, check, or manage inside the container.
pub ifname: String,
/// The container’s “isolation domain.”
///
/// If using network namespaces, then a path to the network namespace.
///
/// Optional for DEL.
pub netns: Option<PathBuf>,
/// List of paths to search for CNI plugin executables.
///
/// This is in the same format as the host system’s `PATH` variable: e.g.
/// separated by `:` on unix, and by `;` on Windows.
pub path: Vec<PathBuf>,
/// The input network configuration.
pub config: NetworkConfig,
}
impl Cni {
/// Converts this enum into an alternate representation which holds the Command separately from the inputs.
///
/// This is useful to deduplicate prep work between command implementations.
pub fn into_inputs(self) -> Option<Inputs> {
let command = match &self {
Cni::Add { .. } => Command::Add,
Cni::Del { .. } => Command::Del,
Cni::Check { .. } => Command::Check,
Cni::Version(_) => return None,
};
match self {
Cni::Add {
container_id,
ifname,
netns,
path,
config,
}
| Cni::Check {
container_id,
ifname,
netns,
path,
config,
} => Some(Inputs {
command,
container_id,
ifname,
netns: Some(netns),
path,
config,
}),
Cni::Del {
container_id,
ifname,
netns,
path,
config,
} => Some(Inputs {
command,
container_id,
ifname,
netns,
path,
config,
}),
Cni::Version(_) => unreachable!(),
}
}
}