use bollard::models::Volume;
use bollard::query_parameters::ListVolumesOptions;
use super::{DockerClient, describe};
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct VolumeInfo {
pub name: String,
pub driver: String,
pub mountpoint: String,
pub scope: String,
pub created: Option<i64>,
}
impl From<Volume> for VolumeInfo {
fn from(v: Volume) -> Self {
Self {
name: v.name,
driver: v.driver,
mountpoint: v.mountpoint,
scope: v.scope.map(|s| s.to_string()).unwrap_or_default(),
created: v.created_at.map(|t| t.unix_timestamp()),
}
}
}
impl DockerClient {
pub async fn list_volumes(&self) -> Result<Vec<VolumeInfo>, String> {
let mut list: Vec<VolumeInfo> = self
.docker
.list_volumes(None::<ListVolumesOptions>)
.await
.map_err(describe)?
.volumes
.unwrap_or_default()
.into_iter()
.map(VolumeInfo::from)
.collect();
list.sort_by_cached_key(|v| v.name.to_lowercase());
Ok(list)
}
}