switchboard_container_utils/manager/
docker.rs

1use crate::manager::*;
2use async_trait::async_trait;
3use std::sync::Arc;
4
5/// DockerManager provides utilities for managing a set of docker containers.
6/// It includes functions for creating, starting, stopping, and removing containers,
7/// as well as querying their status and retrieving their logs.
8///
9/// # Examples
10///
11/// ```
12/// use switchboard_container_utils::manager::{ContainerManager, DockerManager};
13/// use bollard::Docker;
14///
15/// let manager = Arc::new(DockerManager::new(
16///     Arc::new(Docker::connect_with_unix_defaults().unwrap()),
17///     Some(Config {
18///         ..get_default_docker_config()
19///     }),
20/// ));
21/// ```
22#[derive(Clone, Debug)]
23pub struct DockerManager {
24    pub docker: Arc<Docker>,
25    // We store the default config so a simulation runner can override the entrypoint for all containers easier
26    pub docker_default_config: Config<String>,
27    pub docker_credentials: DockerCredentials,
28}
29
30impl DockerManager {
31    pub fn new(docker: Arc<Docker>, default_docker_config: Option<Config<String>>) -> Self {
32        Self {
33            docker,
34            docker_credentials: DockerCredentials {
35                username: Some(std::env::var("DOCKER_USER").unwrap_or(String::new())),
36                password: Some(std::env::var("DOCKER_KEY").unwrap_or(String::new())),
37                ..Default::default()
38            },
39            docker_default_config: default_docker_config.unwrap_or(get_default_docker_config()),
40        }
41    }
42}
43
44#[async_trait]
45impl ContainerManager for DockerManager {
46    fn docker(&self) -> &Arc<Docker> {
47        &self.docker
48    }
49
50    fn docker_credentials(&self) -> &DockerCredentials {
51        &self.docker_credentials
52    }
53
54    fn docker_default_config(&self) -> &Config<String> {
55        &self.docker_default_config
56    }
57}