summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoffrey F <joffrey@docker.com>2014-11-03 20:08:22 +0100
committerJoffrey F <joffrey@docker.com>2014-11-03 20:08:22 +0100
commit790ed5525a917dbc5642382cc7b0b45e3643b657 (patch)
treea239e48d4bb7c57ffbf94ddad0be182d1e7264d6
parent22ac1ec23483aeafd645c560cdf69655619b757f (diff)
parent265d500f638afb125c2e27d598f8ced33095ecd3 (diff)
downloaddocker-py-790ed5525a917dbc5642382cc7b0b45e3643b657.tar.gz
Merge branch 'irachex-filters'
-rw-r--r--docker/client.py10
-rw-r--r--docker/utils/__init__.py3
-rw-r--r--docker/utils/utils.py12
-rw-r--r--tests/test.py13
-rw-r--r--tests/utils_test.py25
-rw-r--r--tox.ini3
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()
diff --git a/tox.ini b/tox.ini
index 77be554..35b9bd6 100644
--- a/tox.ini
+++ b/tox.ini
@@ -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