diff --git a/dev/docker-compose.yml b/dev/docker-compose.yml index ba7f2e1..f1143ee 100644 --- a/dev/docker-compose.yml +++ b/dev/docker-compose.yml @@ -8,6 +8,9 @@ services: volumes: - caddy_data:/data - caddy_config:/config + labels: + - "beekeper.enable" + - "beekeper.pre_command=caddy stop" volumes: caddy_data: diff --git a/src/docker/bollard.rs b/src/docker/bollard.rs index bc4a00f..e29e568 100644 --- a/src/docker/bollard.rs +++ b/src/docker/bollard.rs @@ -1,4 +1,4 @@ -use bollard::Docker; +use bollard::{Docker, query_parameters::ListServicesOptions}; use std::sync::Arc; use tokio::sync::Mutex; @@ -40,6 +40,28 @@ impl crate::docker::DockerAdapter for BollardAdapter { Err(anyhow::anyhow!("Docker client is not connected")) } } + + async fn find_enabled_services(&self) -> anyhow::Result> { + let client = self.client.lock().await; + let docker = client.as_ref().ok_or_else(|| anyhow::anyhow!("Docker client is not connected"))?; + + let services = docker.list_services(None::).await?; + let mut enabled_services = Vec::new(); + + for service in services { + if let Some(spec) = service.spec { + let enabled = spec.labels + .map(|hash| hash.contains_key("beekeper.enable")) + .is_some(); + + if enabled && let Some(name) = spec.name { + enabled_services.push(name); + } + } + } + + Ok(enabled_services) + } } impl Default for BollardAdapter { diff --git a/src/docker/mod.rs b/src/docker/mod.rs index b400a0f..dca6439 100644 --- a/src/docker/mod.rs +++ b/src/docker/mod.rs @@ -2,11 +2,11 @@ mod bollard; pub use bollard::BollardAdapter; -pub struct Docker { +pub struct Docker where T: DockerAdapter { adapter: T, } -impl Docker { +impl Docker where T: DockerAdapter { pub fn new(adapter: T) -> Self { Self { adapter } } @@ -18,9 +18,14 @@ impl Docker { pub async fn version(&self) -> anyhow::Result { self.adapter.version().await } + + pub async fn find_enabled_services(&self) -> anyhow::Result> { + self.adapter.find_enabled_services().await + } } pub trait DockerAdapter { async fn connect_docker(&self, docker_host: Option) -> anyhow::Result<()>; async fn version(&self) -> anyhow::Result; + async fn find_enabled_services(&self) -> anyhow::Result>; } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 80d58f8..986d755 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,6 +17,9 @@ async fn main() -> anyhow::Result<()> { let docker_conn = connect_docker(envs.docker_host).await?; println!("Docker version: {}", docker_conn.version().await?); + let enabled_services = docker_conn.find_enabled_services().await?; + println!("Enabled services: {:?}", enabled_services); + Ok(()) }