From a24b114af3aec0430fd27f8bbf460cfa396ae274 Mon Sep 17 00:00:00 2001 From: Joffrey F Date: Wed, 25 Jan 2017 15:46:58 -0800 Subject: [PATCH] Add 'force' parameter in remove_volume Signed-off-by: Joffrey F --- docker/api/volume.py | 18 ++++++++++++++---- docker/models/volumes.py | 15 ++++++++++++--- tests/integration/api_volume_test.py | 7 +++++++ 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/docker/api/volume.py b/docker/api/volume.py index 9c6d5f83..5de089e3 100644 --- a/docker/api/volume.py +++ b/docker/api/volume.py @@ -115,17 +115,27 @@ class VolumeApiMixin(object): return self._result(self._get(url), True) @utils.minimum_version('1.21') - def remove_volume(self, name): + def remove_volume(self, name, force=False): """ Remove a volume. Similar to the ``docker volume rm`` command. Args: name (str): The volume's name + force (bool): Force removal of volumes that were already removed + out of band by the volume driver plugin. Raises: - - ``docker.errors.APIError``: If volume failed to remove. + :py:class:`docker.errors.APIError` + If volume failed to remove. """ - url = self._url('/volumes/{0}', name) + params = {} + if force: + if utils.version_lt(self._version, '1.25'): + raise errors.InvalidVersion( + 'force removal was introduced in API 1.25' + ) + params = {'force': force} + + url = self._url('/volumes/{0}', name, params=params) resp = self._delete(url) self._raise_for_status(resp) diff --git a/docker/models/volumes.py b/docker/models/volumes.py index 5a315412..5fb0d1c5 100644 --- a/docker/models/volumes.py +++ b/docker/models/volumes.py @@ -10,9 +10,18 @@ class Volume(Model): """The name of the volume.""" return self.attrs['Name'] - def remove(self): - """Remove this volume.""" - return self.client.api.remove_volume(self.id) + def remove(self, force=False): + """ + Remove this volume. + + Args: + force (bool): Force removal of volumes that were already removed + out of band by the volume driver plugin. + Raises: + :py:class:`docker.errors.APIError` + If volume failed to remove. + """ + return self.client.api.remove_volume(self.id, force=force) class VolumeCollection(Collection): diff --git a/tests/integration/api_volume_test.py b/tests/integration/api_volume_test.py index bc97f462..4bfc672b 100644 --- a/tests/integration/api_volume_test.py +++ b/tests/integration/api_volume_test.py @@ -49,6 +49,13 @@ class TestVolumes(BaseAPIIntegrationTest): self.client.create_volume(name) self.client.remove_volume(name) + @requires_api_version('1.25') + def test_force_remove_volume(self): + name = 'shootthebullet' + self.tmp_volumes.append(name) + self.client.create_volume(name) + self.client.remove_volume(name, force=True) + def test_remove_nonexistent_volume(self): name = 'shootthebullet' with pytest.raises(docker.errors.NotFound):