Kaydet (Commit) 790ed552 authored tarafından Joffrey F's avatar Joffrey F

Merge branch 'irachex-filters'

...@@ -492,7 +492,8 @@ class Client(requests.Session): ...@@ -492,7 +492,8 @@ class Client(requests.Session):
json=True) json=True)
def containers(self, quiet=False, all=False, trunc=True, latest=False, 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 = { params = {
'limit': 1 if latest else limit, 'limit': 1 if latest else limit,
'all': 1 if all else 0, 'all': 1 if all else 0,
...@@ -501,6 +502,8 @@ class Client(requests.Session): ...@@ -501,6 +502,8 @@ class Client(requests.Session):
'since': since, 'since': since,
'before': before 'before': before
} }
if filters:
params['filters'] = utils.convert_filters(filters)
u = self._url("/containers/json") u = self._url("/containers/json")
res = self._result(self._get(u, params=params), True) res = self._result(self._get(u, params=params), True)
...@@ -615,7 +618,8 @@ class Client(requests.Session): ...@@ -615,7 +618,8 @@ class Client(requests.Session):
res = self._get(self._url("/images/{0}/history".format(image))) res = self._get(self._url("/images/{0}/history".format(image)))
return self._result(res, True) 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 viz:
if utils.compare_version('1.7', self._version) >= 0: if utils.compare_version('1.7', self._version) >= 0:
raise Exception('Viz output is not supported in API >= 1.7!') raise Exception('Viz output is not supported in API >= 1.7!')
...@@ -625,6 +629,8 @@ class Client(requests.Session): ...@@ -625,6 +629,8 @@ class Client(requests.Session):
'only_ids': 1 if quiet else 0, 'only_ids': 1 if quiet else 0,
'all': 1 if all 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), res = self._result(self._get(self._url("/images/json"), params=params),
True) True)
if quiet: if quiet:
......
from .utils import ( from .utils import (
compare_version, convert_port_bindings, convert_volume_binds, 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 ) # flake8: noqa
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
import io import io
import os import os
import os.path import os.path
import json
import tarfile import tarfile
import tempfile import tempfile
from distutils.version import StrictVersion from distutils.version import StrictVersion
...@@ -279,3 +280,14 @@ def kwargs_from_env(ssl_version=None, assert_hostname=None): ...@@ -279,3 +280,14 @@ def kwargs_from_env(ssl_version=None, assert_hostname=None):
ssl_version=ssl_version, ssl_version=ssl_version,
assert_hostname=assert_hostname) assert_hostname=assert_hostname)
return params 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)
...@@ -184,6 +184,19 @@ class DockerClientTest(Cleanup, unittest.TestCase): ...@@ -184,6 +184,19 @@ class DockerClientTest(Cleanup, unittest.TestCase):
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS 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): def test_list_containers(self):
try: try:
self.client.containers(all=True) self.client.containers(all=True)
......
import os
import os.path
import unittest import unittest
from docker.errors import DockerException
from docker.utils import parse_repository_tag, parse_host, kwargs_from_env
from docker.client import Client from docker.client import Client
from docker.errors import DockerException
import os from docker.utils import (
import os.path parse_repository_tag, parse_host, convert_filters, kwargs_from_env
)
class UtilsTest(unittest.TestCase): class UtilsTest(unittest.TestCase):
...@@ -80,8 +81,20 @@ class UtilsTest(unittest.TestCase): ...@@ -80,8 +81,20 @@ class UtilsTest(unittest.TestCase):
self.assertEquals(kwargs['base_url'], client.base_url) self.assertEquals(kwargs['base_url'], client.base_url)
self.assertEquals(kwargs['tls'].verify, client.verify) self.assertEquals(kwargs['tls'].verify, client.verify)
self.assertEquals(kwargs['tls'].cert, client.cert) self.assertEquals(kwargs['tls'].cert, client.cert)
except TypeError, e: except TypeError as e:
self.fail(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__': if __name__ == '__main__':
unittest.main() unittest.main()
...@@ -6,6 +6,7 @@ skipsdist=True ...@@ -6,6 +6,7 @@ skipsdist=True
usedevelop=True usedevelop=True
commands = commands =
{envbindir}/coverage run -p tests/test.py {envbindir}/coverage run -p tests/test.py
{envbindir}/coverage run -p tests/utils_test.py
deps = deps =
-r{toxinidir}/requirements.txt -r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt -r{toxinidir}/test-requirements.txt
...@@ -14,6 +15,7 @@ deps = ...@@ -14,6 +15,7 @@ deps =
usedevelop=True usedevelop=True
commands = commands =
{envbindir}/coverage run -p tests/test.py {envbindir}/coverage run -p tests/test.py
{envbindir}/coverage run -p tests/utils_test.py
deps = deps =
-r{toxinidir}/requirements.txt -r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt -r{toxinidir}/test-requirements.txt
...@@ -22,6 +24,7 @@ deps = ...@@ -22,6 +24,7 @@ deps =
usedevelop=True usedevelop=True
commands = commands =
{envbindir}/coverage run -p tests/test.py {envbindir}/coverage run -p tests/test.py
{envbindir}/coverage run -p tests/utils_test.py
{envbindir}/coverage combine {envbindir}/coverage combine
{envbindir}/coverage report {envbindir}/coverage report
{envbindir}/coverage html {envbindir}/coverage html
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment