Skip to content

Commit

Permalink
Merge pull request #1220 from docker/1.10.3-release
Browse files Browse the repository at this point in the history
1.10.3 release
  • Loading branch information
shin- authored Sep 16, 2016
2 parents e833881 + 64fba72 commit fc481c4
Show file tree
Hide file tree
Showing 8 changed files with 86 additions and 18 deletions.
13 changes: 12 additions & 1 deletion docker/auth/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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,
Expand Down
15 changes: 11 additions & 4 deletions docker/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -58,7 +59,9 @@ def __init__(self, base_url=None, version=None,
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'
Expand All @@ -68,7 +71,9 @@ def __init__(self, base_url=None, version=None,
'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'
Expand All @@ -80,7 +85,9 @@ def __init__(self, base_url=None, version=None,
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

Expand Down
1 change: 1 addition & 0 deletions docker/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@
IS_WINDOWS_PLATFORM = (sys.platform == 'win32')

DEFAULT_USER_AGENT = "docker-py/{0}".format(version)
DEFAULT_NUM_POOLS = 25
10 changes: 6 additions & 4 deletions docker/transport/npipeconn.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import six
import requests.adapters

from .. import constants
from .npipesocket import NpipeSocket

if six.PY3:
Expand Down Expand Up @@ -33,9 +34,9 @@ def connect(self):


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
Expand All @@ -47,11 +48,12 @@ def _new_conn(self):


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__()

Expand Down
20 changes: 13 additions & 7 deletions docker/transport/unixconn.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
import requests.adapters
import socket

from .. import constants

if six.PY3:
import http.client as httplib
else:
Expand All @@ -12,6 +14,7 @@
except ImportError:
import urllib3


RecentlyUsedContainer = urllib3._collections.RecentlyUsedContainer


Expand All @@ -32,28 +35,31 @@ def connect(self):


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):
Expand Down
2 changes: 1 addition & 1 deletion docker/version.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
version = "1.10.2"
version = "1.10.3"
version_info = tuple([int(d) for d in version.split("-")[0].split(".")])
17 changes: 17 additions & 0 deletions docs/change_log.md
Original file line number Diff line number Diff line change
@@ -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
------

Expand Down
26 changes: 25 additions & 1 deletion tests/unit/auth_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -460,4 +460,28 @@ def test_load_config_invalid_auth_dict(self):
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

0 comments on commit fc481c4

Please sign in to comment.