use crate::{
Result,
netlink::{Connection, Route, link::VethLink},
};
use super::LabNamespace;
pub struct LabVeth<'a> {
local_name: String,
peer_name: String,
peer_ns: Option<&'a LabNamespace>,
}
impl<'a> LabVeth<'a> {
pub fn new(local_name: impl Into<String>, peer_name: impl Into<String>) -> Self {
Self {
local_name: local_name.into(),
peer_name: peer_name.into(),
peer_ns: None,
}
}
pub fn peer_in(mut self, peer_ns: &'a LabNamespace) -> Self {
self.peer_ns = Some(peer_ns);
self
}
pub fn local_name(&self) -> &str {
&self.local_name
}
pub fn peer_name(&self) -> &str {
&self.peer_name
}
pub async fn create_in(self, ns: &LabNamespace) -> Result<Self> {
let conn: Connection<Route> = ns.connection()?;
let mut link = VethLink::new(&self.local_name, &self.peer_name);
if let Some(peer_ns) = self.peer_ns {
link = link.peer_netns(peer_ns.name())?;
}
conn.add_link(link).await?;
Ok(self)
}
}