diff options
-rw-r--r-- | docker/api/volume.py | 22 | ||||
-rw-r--r-- | docker/models/volumes.py | 5 | ||||
-rw-r--r-- | tests/integration/api_image_test.py | 2 | ||||
-rw-r--r-- | tests/integration/api_volume_test.py | 8 |
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): |