summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docker/api/volume.py22
-rw-r--r--docker/models/volumes.py5
-rw-r--r--tests/integration/api_image_test.py2
-rw-r--r--tests/integration/api_volume_test.py8
4 files changed, 36 insertions, 1 deletions
diff --git a/docker/api/volume.py b/docker/api/volume.py
index 5de089e..76565c7 100644
--- a/docker/api/volume.py
+++ b/docker/api/volume.py
@@ -114,6 +114,28 @@ class VolumeApiMixin(object):
url = self._url('/volumes/{0}', name)
return self._result(self._get(url), True)
+ @utils.minimum_version('1.25')
+ def prune_volumes(self, filters=None):
+ """
+ Delete unused volumes
+
+ Args:
+ filters (dict): Filters to process on the prune list.
+
+ Returns:
+ (dict): A dict containing a list of deleted volume IDs and
+ the amount of disk space reclaimed in bytes.
+
+ Raises:
+ :py:class:`docker.errors.APIError`
+ If the server returns an error.
+ """
+ params = {}
+ if filters:
+ params['filters'] = utils.convert_filters(filters)
+ url = self._url('/volumes/prune')
+ return self._result(self._post(url, params=params), True)
+
@utils.minimum_version('1.21')
def remove_volume(self, name, force=False):
"""
diff --git a/docker/models/volumes.py b/docker/models/volumes.py
index 5fb0d1c..426e002 100644
--- a/docker/models/volumes.py
+++ b/docker/models/volumes.py
@@ -1,3 +1,4 @@
+from ..api import APIClient
from .resource import Model, Collection
@@ -91,3 +92,7 @@ class VolumeCollection(Collection):
if not resp.get('Volumes'):
return []
return [self.prepare_model(obj) for obj in resp['Volumes']]
+
+ def prune(self, filters=None):
+ return self.client.api.prune_volumes(filters=filters)
+ prune.__doc__ = APIClient.prune_volumes.__doc__
diff --git a/tests/integration/api_image_test.py b/tests/integration/api_image_test.py
index 0f6753f..10e95fe 100644
--- a/tests/integration/api_image_test.py
+++ b/tests/integration/api_image_test.py
@@ -299,5 +299,5 @@ class PruneImagesTest(BaseAPIIntegrationTest):
self.tmp_imgs.append('hello-world')
img_id = self.client.inspect_image('hello-world')['Id']
result = self.client.prune_images()
- assert img_id in result['ImagesDeleted']
+ assert img_id in [img['Deleted'] for img in result['ImagesDeleted']]
assert result['SpaceReclaimed'] > 0
diff --git a/tests/integration/api_volume_test.py b/tests/integration/api_volume_test.py
index 4bfc672..5a4bb1e 100644
--- a/tests/integration/api_volume_test.py
+++ b/tests/integration/api_volume_test.py
@@ -56,6 +56,14 @@ class TestVolumes(BaseAPIIntegrationTest):
self.client.create_volume(name)
self.client.remove_volume(name, force=True)
+ @requires_api_version('1.25')
+ def test_prune_volumes(self):
+ name = 'hopelessmasquerade'
+ self.client.create_volume(name)
+ self.tmp_volumes.append(name)
+ result = self.client.prune_volumes()
+ assert name in result['VolumesDeleted']
+
def test_remove_nonexistent_volume(self):
name = 'shootthebullet'
with pytest.raises(docker.errors.NotFound):