chore: initial commit for phase04
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
use anyhow::Result;
|
||||
use bollard::Docker;
|
||||
use bollard::network::CreateNetworkOptions;
|
||||
use tracing::info;
|
||||
|
||||
use crate::config::DockerConfig;
|
||||
|
||||
/// Manages the Docker client and network setup.
|
||||
#[derive(Clone)]
|
||||
pub struct DockerManager {
|
||||
client: Docker,
|
||||
network_name: String,
|
||||
}
|
||||
|
||||
impl DockerManager {
|
||||
pub async fn new(config: &DockerConfig) -> Result<Self> {
|
||||
let client = Docker::connect_with_socket(
|
||||
&config.socket,
|
||||
120, // timeout
|
||||
bollard::API_DEFAULT_VERSION,
|
||||
)?;
|
||||
|
||||
// Verify connection
|
||||
let version = client.version().await?;
|
||||
info!(
|
||||
docker_version = version.version.as_deref().unwrap_or("unknown"),
|
||||
"Connected to Docker"
|
||||
);
|
||||
|
||||
let manager = Self {
|
||||
client,
|
||||
network_name: config.network.clone(),
|
||||
};
|
||||
|
||||
manager.ensure_network(&config.network_subnet).await?;
|
||||
|
||||
Ok(manager)
|
||||
}
|
||||
|
||||
pub fn client(&self) -> &Docker {
|
||||
&self.client
|
||||
}
|
||||
|
||||
pub fn network_name(&self) -> &str {
|
||||
&self.network_name
|
||||
}
|
||||
|
||||
async fn ensure_network(&self, subnet: &str) -> Result<()> {
|
||||
let networks = self.client.list_networks::<String>(None).await?;
|
||||
let exists = networks
|
||||
.iter()
|
||||
.any(|n| n.name.as_deref() == Some(&self.network_name));
|
||||
|
||||
if !exists {
|
||||
info!(network = %self.network_name, "Creating Docker network");
|
||||
let ipam_config = bollard::models::IpamConfig {
|
||||
subnet: Some(subnet.to_string()),
|
||||
..Default::default()
|
||||
};
|
||||
let ipam = bollard::models::Ipam {
|
||||
config: Some(vec![ipam_config]),
|
||||
..Default::default()
|
||||
};
|
||||
self.client
|
||||
.create_network(CreateNetworkOptions {
|
||||
name: self.network_name.clone(),
|
||||
driver: "bridge".to_string(),
|
||||
ipam,
|
||||
..Default::default()
|
||||
})
|
||||
.await?;
|
||||
info!(network = %self.network_name, "Docker network created");
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user