use dragonfly_client_config::dfinit::{Config, ContainerRuntimeConfig};
use dragonfly_client_core::Result;
use tracing::{info, instrument};
pub mod containerd;
pub mod crio;
pub mod docker;
pub mod podman;
#[derive(Debug, Clone)]
enum Engine {
Containerd(containerd::Containerd),
Docker(docker::Docker),
Crio(crio::CRIO),
Podman(podman::Podman),
}
pub struct ContainerRuntime {
engine: Option<Engine>,
}
impl ContainerRuntime {
#[instrument(skip_all)]
pub fn new(config: &Config) -> Self {
Self {
engine: Self::get_engine(config),
}
}
#[instrument(skip_all)]
pub async fn run(&self) -> Result<()> {
match &self.engine {
None => Ok(()),
Some(Engine::Containerd(containerd)) => containerd.run().await,
Some(Engine::Docker(docker)) => docker.run().await,
Some(Engine::Crio(crio)) => crio.run().await,
Some(Engine::Podman(podman)) => podman.run().await,
}
}
#[instrument(skip_all)]
fn get_engine(config: &Config) -> Option<Engine> {
if let Some(ref container_runtime_config) = config.container_runtime.config {
let engine = match container_runtime_config {
ContainerRuntimeConfig::Containerd(containerd) => Engine::Containerd(
containerd::Containerd::new(containerd.clone(), config.proxy.clone()),
),
ContainerRuntimeConfig::Docker(docker) => {
Engine::Docker(docker::Docker::new(docker.clone(), config.proxy.clone()))
}
ContainerRuntimeConfig::CRIO(crio) => {
Engine::Crio(crio::CRIO::new(crio.clone(), config.proxy.clone()))
}
ContainerRuntimeConfig::Podman(podman) => {
Engine::Podman(podman::Podman::new(podman.clone(), config.proxy.clone()))
}
};
info!("container runtime engine is {:?}", engine);
return Some(engine);
}
info!("container runtime engine is not set");
None
}
}
#[cfg(test)]
mod test {
use dragonfly_client_config::dfinit::Containerd;
use super::*;
#[tokio::test]
async fn should_return_ok_if_container_runtime_not_set() {
let runtime = ContainerRuntime::new(&Config {
..Default::default()
});
assert!(runtime.run().await.is_ok());
}
#[test]
fn should_get_engine_from_config() {
let runtime = ContainerRuntime::new(&Config {
container_runtime: dragonfly_client_config::dfinit::ContainerRuntime {
config: Some(ContainerRuntimeConfig::Containerd(Containerd {
..Default::default()
})),
},
..Default::default()
});
assert!(runtime.engine.is_some());
let runtime = ContainerRuntime::new(&Config {
container_runtime: dragonfly_client_config::dfinit::ContainerRuntime {
config: Some(ContainerRuntimeConfig::CRIO(Default::default())),
},
..Default::default()
});
assert!(runtime.engine.is_some());
}
}