diff options
author | Joffrey F <joffrey@docker.com> | 2014-11-03 20:08:22 +0100 |
---|---|---|
committer | Joffrey F <joffrey@docker.com> | 2014-11-03 20:08:22 +0100 |
commit | 790ed5525a917dbc5642382cc7b0b45e3643b657 (patch) | |
tree | a239e48d4bb7c57ffbf94ddad0be182d1e7264d6 | |
parent | 22ac1ec23483aeafd645c560cdf69655619b757f (diff) | |
parent | 265d500f638afb125c2e27d598f8ced33095ecd3 (diff) | |
download | docker-py-790ed5525a917dbc5642382cc7b0b45e3643b657.tar.gz |
Merge branch 'irachex-filters'
-rw-r--r-- | docker/client.py | 10 | ||||
-rw-r--r-- | docker/utils/__init__.py | 3 | ||||
-rw-r--r-- | docker/utils/utils.py | 12 | ||||
-rw-r--r-- | tests/test.py | 13 | ||||
-rw-r--r-- | tests/utils_test.py | 25 | ||||
-rw-r--r-- | tox.ini | 3 |
6 files changed, 57 insertions, 9 deletions
diff --git a/docker/client.py b/docker/client.py index 6611162..556b5cf 100644 --- a/docker/client.py +++ b/docker/client.py @@ -492,7 +492,8 @@ class Client(requests.Session): json=True) def containers(self, quiet=False, all=False, trunc=True, latest=False, - since=None, before=None, limit=-1, size=False): + since=None, before=None, limit=-1, size=False, + filters=None): params = { 'limit': 1 if latest else limit, 'all': 1 if all else 0, @@ -501,6 +502,8 @@ class Client(requests.Session): 'since': since, 'before': before } + if filters: + params['filters'] = utils.convert_filters(filters) u = self._url("/containers/json") res = self._result(self._get(u, params=params), True) @@ -615,7 +618,8 @@ class Client(requests.Session): res = self._get(self._url("/images/{0}/history".format(image))) return self._result(res, True) - def images(self, name=None, quiet=False, all=False, viz=False): + def images(self, name=None, quiet=False, all=False, viz=False, + filters=None): if viz: if utils.compare_version('1.7', self._version) >= 0: raise Exception('Viz output is not supported in API >= 1.7!') @@ -625,6 +629,8 @@ class Client(requests.Session): 'only_ids': 1 if quiet else 0, 'all': 1 if all else 0, } + if filters: + params['filters'] = utils.convert_filters(filters) res = self._result(self._get(self._url("/images/json"), params=params), True) if quiet: diff --git a/docker/utils/__init__.py b/docker/utils/__init__.py index 82b1a96..a80a654 100644 --- a/docker/utils/__init__.py +++ b/docker/utils/__init__.py @@ -1,4 +1,5 @@ from .utils import ( compare_version, convert_port_bindings, convert_volume_binds, - mkbuildcontext, ping, tar, parse_repository_tag, parse_host, kwargs_from_env + mkbuildcontext, ping, tar, parse_repository_tag, parse_host, + kwargs_from_env, convert_filters ) # flake8: noqa diff --git a/docker/utils/utils.py b/docker/utils/utils.py index 91e5e66..0853ac4 100644 --- a/docker/utils/utils.py +++ b/docker/utils/utils.py @@ -15,6 +15,7 @@ import io import os import os.path +import json import tarfile import tempfile from distutils.version import StrictVersion @@ -279,3 +280,14 @@ def kwargs_from_env(ssl_version=None, assert_hostname=None): ssl_version=ssl_version, assert_hostname=assert_hostname) return params + + +def convert_filters(filters): + result = {} + for k, v in six.iteritems(filters): + if isinstance(v, bool): + v = 'true' if v else 'false' + if not isinstance(v, list): + v = [v, ] + result[k] = v + return json.dumps(result) diff --git a/tests/test.py b/tests/test.py index b7fe0ab..c9a1b05 100644 --- a/tests/test.py +++ b/tests/test.py @@ -184,6 +184,19 @@ class DockerClientTest(Cleanup, unittest.TestCase): timeout=docker.client.DEFAULT_TIMEOUT_SECONDS ) + def test_images_filters(self): + try: + self.client.images(filters={'dangling': True}) + except Exception as e: + self.fail('Command should not raise exception: {0}'.format(e)) + + fake_request.assert_called_with( + url_prefix + 'images/json', + params={'filter': None, 'only_ids': 0, 'all': 0, + 'filters': '{"dangling": ["true"]}'}, + timeout=docker.client.DEFAULT_TIMEOUT_SECONDS + ) + def test_list_containers(self): try: self.client.containers(all=True) diff --git a/tests/utils_test.py b/tests/utils_test.py index 7532d83..7e482d5 100644 --- a/tests/utils_test.py +++ b/tests/utils_test.py @@ -1,11 +1,12 @@ +import os +import os.path import unittest -from docker.errors import DockerException -from docker.utils import parse_repository_tag, parse_host, kwargs_from_env from docker.client import Client - -import os -import os.path +from docker.errors import DockerException +from docker.utils import ( + parse_repository_tag, parse_host, convert_filters, kwargs_from_env +) class UtilsTest(unittest.TestCase): @@ -80,8 +81,20 @@ class UtilsTest(unittest.TestCase): self.assertEquals(kwargs['base_url'], client.base_url) self.assertEquals(kwargs['tls'].verify, client.verify) self.assertEquals(kwargs['tls'].cert, client.cert) - except TypeError, e: + except TypeError as e: self.fail(e) + def test_convert_filters(self): + tests = [ + ({'dangling': True}, '{"dangling": ["true"]}'), + ({'dangling': "true"}, '{"dangling": ["true"]}'), + ({'exited': 0}, '{"exited": [0]}'), + ({'exited': [0, 1]}, '{"exited": [0, 1]}'), + ] + + for filters, expected in tests: + self.assertEqual(convert_filters(filters), expected) + + if __name__ == '__main__': unittest.main() @@ -6,6 +6,7 @@ skipsdist=True usedevelop=True commands = {envbindir}/coverage run -p tests/test.py + {envbindir}/coverage run -p tests/utils_test.py deps = -r{toxinidir}/requirements.txt -r{toxinidir}/test-requirements.txt @@ -14,6 +15,7 @@ deps = usedevelop=True commands = {envbindir}/coverage run -p tests/test.py + {envbindir}/coverage run -p tests/utils_test.py deps = -r{toxinidir}/requirements.txt -r{toxinidir}/test-requirements.txt @@ -22,6 +24,7 @@ deps = usedevelop=True commands = {envbindir}/coverage run -p tests/test.py + {envbindir}/coverage run -p tests/utils_test.py {envbindir}/coverage combine {envbindir}/coverage report {envbindir}/coverage html |