summaryrefslogtreecommitdiffstats
path: root/src/volume.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/volume.rs')
-rw-r--r--src/volume.rs85
1 files changed, 85 insertions, 0 deletions
diff --git a/src/volume.rs b/src/volume.rs
new file mode 100644
index 0000000..1a9048a
--- /dev/null
+++ b/src/volume.rs
@@ -0,0 +1,85 @@
+//! Create and manage persistent storage that can be attached to containers.
+//!
+//! API Reference: <https://docs.docker.com/engine/api/v1.41/#tag/Volume>
+
+use hyper::Body;
+
+use crate::{
+ builder::VolumeCreateOptions,
+ errors::Result,
+ rep::{Volume as VolumeRep, VolumeCreateInfo, Volumes as VolumesRep},
+ Docker,
+};
+
+/// Interface for docker volumes
+pub struct Volumes<'docker> {
+ docker: &'docker Docker,
+}
+
+impl<'docker> Volumes<'docker> {
+ /// Exports an interface for interacting with docker volumes
+ pub fn new(docker: &'docker Docker) -> Self {
+ Volumes { docker }
+ }
+
+ pub async fn create(
+ &self,
+ opts: &VolumeCreateOptions,
+ ) -> Result<VolumeCreateInfo> {
+ let body: Body = opts.serialize()?.into();
+ let path = vec!["/volumes/create".to_owned()];
+
+ self.docker
+ .post_json(&path.join("?"), Some((body, mime::APPLICATION_JSON)))
+ .await
+ }
+
+ /// Lists the docker volumes on the current docker host
+ pub async fn list(&self) -> Result<Vec<VolumeRep>> {
+ let path = vec!["/volumes".to_owned()];
+
+ let volumes_rep = self.docker.get_json::<VolumesRep>(&path.join("?")).await?;
+ Ok(match volumes_rep.volumes {
+ Some(volumes) => volumes,
+ None => vec![],
+ })
+ }
+
+ /// Returns a reference to a set of operations available for a named volume
+ pub fn get(
+ &self,
+ name: &str,
+ ) -> Volume<'docker> {
+ Volume::new(self.docker, name)
+ }
+}
+
+/// Interface for accessing and manipulating a named docker volume
+pub struct Volume<'docker> {
+ docker: &'docker Docker,
+ name: String,
+}
+
+impl<'docker> Volume<'docker> {
+ /// Exports an interface for operations that may be performed against a named volume
+ pub fn new<S>(
+ docker: &'docker Docker,
+ name: S,
+ ) -> Self
+ where
+ S: Into<String>,
+ {
+ Volume {
+ docker,
+ name: name.into(),
+ }
+ }
+
+ /// Deletes a volume
+ pub async fn delete(&self) -> Result<()> {
+ self.docker
+ .delete(&format!("/volumes/{}", self.name)[..])
+ .await?;
+ Ok(())
+ }
+}