Files
beekeper/src/docker/bollard.rs
qpismont 9b7d07cdae
All checks were successful
ci/woodpecker/push/test/1 Pipeline was successful
ci/woodpecker/push/test/2 Pipeline was successful
Implement find_enabled_services method in DockerAdapter; update Docker struct and main function to retrieve and display enabled services.
2025-11-13 22:19:42 +00:00

73 lines
2.0 KiB
Rust

use bollard::{Docker, query_parameters::ListServicesOptions};
use std::sync::Arc;
use tokio::sync::Mutex;
pub struct BollardAdapter {
client: Arc<Mutex<Option<Docker>>>,
}
impl BollardAdapter {
pub fn new() -> Self {
Self {
client: Arc::new(Mutex::new(None)),
}
}
}
impl crate::docker::DockerAdapter for BollardAdapter {
async fn connect_docker(&self, docker_host: Option<String>) -> anyhow::Result<()> {
let docker = match docker_host {
Some(host) => Docker::connect_with_http(&host, 60, bollard::API_DEFAULT_VERSION)?,
None => Docker::connect_with_socket_defaults()?,
};
docker.ping().await?;
let mut client = self.client.lock().await;
*client = Some(docker);
Ok(())
}
async fn version(&self) -> anyhow::Result<String> {
let client = self.client.lock().await;
if let Some(docker) = &*client {
let version_info = docker.version().await?;
let version = version_info.version;
version.ok_or_else(|| anyhow::anyhow!("Version not available"))
} else {
Err(anyhow::anyhow!("Docker client is not connected"))
}
}
async fn find_enabled_services(&self) -> anyhow::Result<Vec<String>> {
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::<ListServicesOptions>).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 {
fn default() -> Self {
Self::new()
}
}