use crate::DockerClient;
use crate::error::{DockerError, Result};
use bollard::models::*;
use bollard::volume::*;
use tracing::{debug, info};
pub struct Volumes<'a> {
client: &'a DockerClient,
}
impl<'a> Volumes<'a> {
pub(crate) fn new(client: &'a DockerClient) -> Self {
Self { client }
}
pub async fn create(&self, name: impl Into<String>) -> Result<Volume> {
let name = name.into();
info!("Creating volume: {}", name);
let config = CreateVolumeOptions {
name: name.clone(),
..Default::default()
};
self.client
.docker
.create_volume(config)
.await
.map_err(|e| DockerError::Other(format!("Failed to create volume: {}", e)))
}
pub async fn list(&self) -> Result<Vec<Volume>> {
let response = self
.client
.docker
.list_volumes(Some(
bollard::query_parameters::ListVolumesOptions::default(),
))
.await
.map_err(|e| DockerError::Other(format!("Failed to list volumes: {}", e)))?;
Ok(response.volumes.unwrap_or_default())
}
pub fn get(&self, name: impl Into<String>) -> VolumeRef<'a> {
VolumeRef::new(self.client, name.into())
}
pub async fn prune(&self) -> Result<VolumePruneResponse> {
info!("Pruning unused volumes...");
self.client
.docker
.prune_volumes(Some(
bollard::query_parameters::PruneVolumesOptions::default(),
))
.await
.map_err(|e| DockerError::Other(format!("Failed to prune volumes: {}", e)))
}
}
pub struct VolumeRef<'a> {
client: &'a DockerClient,
name: String,
}
impl<'a> VolumeRef<'a> {
pub(crate) fn new(client: &'a DockerClient, name: String) -> Self {
Self { client, name }
}
pub fn name(&self) -> &str {
&self.name
}
pub async fn inspect(&self) -> Result<Volume> {
debug!("Inspecting volume: {}", self.name);
self.client
.docker
.inspect_volume(&self.name)
.await
.map_err(|e| DockerError::VolumeNotFound(format!("{}: {}", self.name, e)))
}
pub async fn remove(&self, force: bool) -> Result<()> {
info!("Removing volume: {}", self.name);
let options = if force {
Some(RemoveVolumeOptions { force })
} else {
None
};
self.client
.docker
.remove_volume(&self.name, options)
.await
.map_err(|e| DockerError::Other(format!("Failed to remove volume: {}", e)))
}
}
impl DockerClient {
pub fn volumes(&self) -> Volumes<'_> {
Volumes::new(self)
}
}