diff options
author | Joffrey F <f.joffrey@gmail.com> | 2016-09-16 12:09:14 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-09-16 12:09:14 -0700 |
commit | fc481c4cd15321251bb1eedbb5ea67187c606ace (patch) | |
tree | d5b0d43f1c83d38b2c0d41cb955a77eeb94a4b62 | |
parent | e833881577855a67aaddea7a4aa71e9bc3d737cd (diff) | |
parent | 64fba723ddd1f186548a3a7f49ca952265ac1121 (diff) | |
download | docker-py-1.10.3.tar.gz |
Merge pull request #1220 from docker/1.10.3-release1.10.3
1.10.3 release
-rw-r--r-- | docker/auth/auth.py | 13 | ||||
-rw-r--r-- | docker/client.py | 15 | ||||
-rw-r--r-- | docker/constants.py | 1 | ||||
-rw-r--r-- | docker/transport/npipeconn.py | 10 | ||||
-rw-r--r-- | docker/transport/unixconn.py | 20 | ||||
-rw-r--r-- | docker/version.py | 2 | ||||
-rw-r--r-- | docs/change_log.md | 17 | ||||
-rw-r--r-- | tests/unit/auth_test.py | 26 |
8 files changed, 86 insertions, 18 deletions
diff --git a/docker/auth/auth.py b/docker/auth/auth.py index ea15def..dc0baea 100644 --- a/docker/auth/auth.py +++ b/docker/auth/auth.py @@ -174,6 +174,15 @@ def parse_auth(entries, raise_on_error=False): 'Invalid configuration for registry {0}'.format(registry) ) return {} + if 'identitytoken' in entry: + log.debug('Found an IdentityToken entry for registry {0}'.format( + registry + )) + conf[registry] = { + 'IdentityToken': entry['identitytoken'] + } + continue # Other values are irrelevant if we have a token, skip. + if 'auth' not in entry: # Starting with engine v1.11 (API 1.23), an empty dictionary is # a valid value in the auths config. @@ -182,13 +191,15 @@ def parse_auth(entries, raise_on_error=False): 'Auth data for {0} is absent. Client might be using a ' 'credentials store instead.' ) - return {} + conf[registry] = {} + continue username, password = decode_auth(entry['auth']) log.debug( 'Found entry (registry={0}, username={1})' .format(repr(registry), repr(username)) ) + conf[registry] = { 'username': username, 'password': password, diff --git a/docker/client.py b/docker/client.py index 6e8b278..47ad09e 100644 --- a/docker/client.py +++ b/docker/client.py @@ -40,7 +40,8 @@ class Client( api.VolumeApiMixin): def __init__(self, base_url=None, version=None, timeout=constants.DEFAULT_TIMEOUT_SECONDS, tls=False, - user_agent=constants.DEFAULT_USER_AGENT): + user_agent=constants.DEFAULT_USER_AGENT, + num_pools=constants.DEFAULT_NUM_POOLS): super(Client, self).__init__() if tls and not base_url: @@ -58,7 +59,9 @@ class Client( base_url, constants.IS_WINDOWS_PLATFORM, tls=bool(tls) ) if base_url.startswith('http+unix://'): - self._custom_adapter = UnixAdapter(base_url, timeout) + self._custom_adapter = UnixAdapter( + base_url, timeout, num_pools=num_pools + ) self.mount('http+docker://', self._custom_adapter) self._unmount('http://', 'https://') self.base_url = 'http+docker://localunixsocket' @@ -68,7 +71,9 @@ class Client( 'The npipe:// protocol is only supported on Windows' ) try: - self._custom_adapter = NpipeAdapter(base_url, timeout) + self._custom_adapter = NpipeAdapter( + base_url, timeout, num_pools=num_pools + ) except NameError: raise errors.DockerException( 'Install pypiwin32 package to enable npipe:// support' @@ -80,7 +85,9 @@ class Client( if isinstance(tls, TLSConfig): tls.configure_client(self) elif tls: - self._custom_adapter = ssladapter.SSLAdapter() + self._custom_adapter = ssladapter.SSLAdapter( + num_pools=num_pools + ) self.mount('https://', self._custom_adapter) self.base_url = base_url diff --git a/docker/constants.py b/docker/constants.py index cf5a39a..0c9a020 100644 --- a/docker/constants.py +++ b/docker/constants.py @@ -15,3 +15,4 @@ INSECURE_REGISTRY_DEPRECATION_WARNING = \ IS_WINDOWS_PLATFORM = (sys.platform == 'win32') DEFAULT_USER_AGENT = "docker-py/{0}".format(version) +DEFAULT_NUM_POOLS = 25 diff --git a/docker/transport/npipeconn.py b/docker/transport/npipeconn.py index 736ddf6..917fa8b 100644 --- a/docker/transport/npipeconn.py +++ b/docker/transport/npipeconn.py @@ -1,6 +1,7 @@ import six import requests.adapters +from .. import constants from .npipesocket import NpipeSocket if six.PY3: @@ -33,9 +34,9 @@ class NpipeHTTPConnection(httplib.HTTPConnection, object): class NpipeHTTPConnectionPool(urllib3.connectionpool.HTTPConnectionPool): - def __init__(self, npipe_path, timeout=60): + def __init__(self, npipe_path, timeout=60, maxsize=10): super(NpipeHTTPConnectionPool, self).__init__( - 'localhost', timeout=timeout + 'localhost', timeout=timeout, maxsize=maxsize ) self.npipe_path = npipe_path self.timeout = timeout @@ -47,11 +48,12 @@ class NpipeHTTPConnectionPool(urllib3.connectionpool.HTTPConnectionPool): class NpipeAdapter(requests.adapters.HTTPAdapter): - def __init__(self, base_url, timeout=60): + def __init__(self, base_url, timeout=60, + num_pools=constants.DEFAULT_NUM_POOLS): self.npipe_path = base_url.replace('npipe://', '') self.timeout = timeout self.pools = RecentlyUsedContainer( - 10, dispose_func=lambda p: p.close() + num_pools, dispose_func=lambda p: p.close() ) super(NpipeAdapter, self).__init__() diff --git a/docker/transport/unixconn.py b/docker/transport/unixconn.py index e09b6bf..b7905a0 100644 --- a/docker/transport/unixconn.py +++ b/docker/transport/unixconn.py @@ -2,6 +2,8 @@ import six import requests.adapters import socket +from .. import constants + if six.PY3: import http.client as httplib else: @@ -12,6 +14,7 @@ try: except ImportError: import urllib3 + RecentlyUsedContainer = urllib3._collections.RecentlyUsedContainer @@ -32,28 +35,31 @@ class UnixHTTPConnection(httplib.HTTPConnection, object): class UnixHTTPConnectionPool(urllib3.connectionpool.HTTPConnectionPool): - def __init__(self, base_url, socket_path, timeout=60): + def __init__(self, base_url, socket_path, timeout=60, maxsize=10): super(UnixHTTPConnectionPool, self).__init__( - 'localhost', timeout=timeout + 'localhost', timeout=timeout, maxsize=maxsize ) self.base_url = base_url self.socket_path = socket_path self.timeout = timeout def _new_conn(self): - return UnixHTTPConnection(self.base_url, self.socket_path, - self.timeout) + return UnixHTTPConnection( + self.base_url, self.socket_path, self.timeout + ) class UnixAdapter(requests.adapters.HTTPAdapter): - def __init__(self, socket_url, timeout=60): + def __init__(self, socket_url, timeout=60, + num_pools=constants.DEFAULT_NUM_POOLS): socket_path = socket_url.replace('http+unix://', '') if not socket_path.startswith('/'): socket_path = '/' + socket_path self.socket_path = socket_path self.timeout = timeout - self.pools = RecentlyUsedContainer(10, - dispose_func=lambda p: p.close()) + self.pools = RecentlyUsedContainer( + num_pools, dispose_func=lambda p: p.close() + ) super(UnixAdapter, self).__init__() def get_connection(self, url, proxies=None): diff --git a/docker/version.py b/docker/version.py index 730a834..2bf8436 100644 --- a/docker/version.py +++ b/docker/version.py @@ -1,2 +1,2 @@ -version = "1.10.2" +version = "1.10.3" version_info = tuple([int(d) for d in version.split("-")[0].split(".")]) diff --git a/docs/change_log.md b/docs/change_log.md index 237770f..e32df1e 100644 --- a/docs/change_log.md +++ b/docs/change_log.md @@ -1,6 +1,23 @@ Change Log ========== +1.10.3 +------ + +[List of PRs / issues for this release](https://github.com/docker/docker-py/issues?q=milestone%3A1.10.3+is%3Aclosed) + +### Bugfixes + +* Fixed an issue where identity tokens in configuration files weren't handled + by the library. + +### Miscellaneous + +* Increased the default number of connection pools from 10 to 25. This number + can now be configured using the `num_pools` parameter in the `Client` + constructor. + + 1.10.2 ------ diff --git a/tests/unit/auth_test.py b/tests/unit/auth_test.py index 4ea4047..f395133 100644 --- a/tests/unit/auth_test.py +++ b/tests/unit/auth_test.py @@ -460,4 +460,28 @@ class LoadConfigTest(base.Cleanup, base.BaseTestCase): json.dump(config, f) cfg = auth.load_config(dockercfg_path) - assert cfg == {} + assert cfg == {'scarlet.net': {}} + + def test_load_config_identity_token(self): + folder = tempfile.mkdtemp() + registry = 'scarlet.net' + token = '1ce1cebb-503e-7043-11aa-7feb8bd4a1ce' + self.addCleanup(shutil.rmtree, folder) + dockercfg_path = os.path.join(folder, 'config.json') + auth_entry = encode_auth({'username': 'sakuya'}).decode('ascii') + config = { + 'auths': { + registry: { + 'auth': auth_entry, + 'identitytoken': token + } + } + } + with open(dockercfg_path, 'w') as f: + json.dump(config, f) + + cfg = auth.load_config(dockercfg_path) + assert registry in cfg + cfg = cfg[registry] + assert 'IdentityToken' in cfg + assert cfg['IdentityToken'] == token |