diff options
author | Ulysses Souza <ulysses.souza@docker.com> | 2019-03-13 19:07:50 +0100 |
---|---|---|
committer | Ulysses Souza <ulysses.souza@docker.com> | 2019-03-15 11:23:00 +0100 |
commit | 4d7d4084138fa6161ef5f31d410b0d326d41f777 (patch) | |
tree | f57cbda31ee7c8ed7be1046c9677abef9aa83804 /docker/transport | |
parent | e48a1a94e6f76f9fd1b2882522eb714b1f70d5d6 (diff) | |
download | docker-py-4d7d4084138fa6161ef5f31d410b0d326d41f777.tar.gz |
Homogenize adapters close() behaviour.
- Adds a BaseHTTPAdapter with a close method to ensure that the
pools is clean on close()
- Makes SSHHTTPAdapter reopen a closed connection when needed
like the others
Signed-off-by: Ulysses Souza <ulysses.souza@docker.com>
Diffstat (limited to 'docker/transport')
-rw-r--r-- | docker/transport/__init__.py | 8 | ||||
-rw-r--r-- | docker/transport/basehttpadapter.py | 6 | ||||
-rw-r--r-- | docker/transport/npipeconn.py | 8 | ||||
-rw-r--r-- | docker/transport/sshconn.py | 23 | ||||
-rw-r--r-- | docker/transport/ssladapter.py | 8 | ||||
-rw-r--r-- | docker/transport/unixconn.py | 8 |
6 files changed, 37 insertions, 24 deletions
diff --git a/docker/transport/__init__.py b/docker/transport/__init__.py index d2cf2a7..e37fc3b 100644 --- a/docker/transport/__init__.py +++ b/docker/transport/__init__.py @@ -1,13 +1,13 @@ # flake8: noqa -from .unixconn import UnixAdapter -from .ssladapter import SSLAdapter +from .unixconn import UnixHTTPAdapter +from .ssladapter import SSLHTTPAdapter try: - from .npipeconn import NpipeAdapter + from .npipeconn import NpipeHTTPAdapter from .npipesocket import NpipeSocket except ImportError: pass try: - from .sshconn import SSHAdapter + from .sshconn import SSHHTTPAdapter except ImportError: pass diff --git a/docker/transport/basehttpadapter.py b/docker/transport/basehttpadapter.py new file mode 100644 index 0000000..d10c115 --- /dev/null +++ b/docker/transport/basehttpadapter.py @@ -0,0 +1,6 @@ +import requests.adapters + + +class BaseHTTPAdapter(requests.adapters.HTTPAdapter): + def close(self): + self.pools.clear() diff --git a/docker/transport/npipeconn.py b/docker/transport/npipeconn.py index ab9b904..aa05538 100644 --- a/docker/transport/npipeconn.py +++ b/docker/transport/npipeconn.py @@ -1,6 +1,7 @@ import six import requests.adapters +from docker.transport.basehttpadapter import BaseHTTPAdapter from .. import constants from .npipesocket import NpipeSocket @@ -68,7 +69,7 @@ class NpipeHTTPConnectionPool(urllib3.connectionpool.HTTPConnectionPool): return conn or self._new_conn() -class NpipeAdapter(requests.adapters.HTTPAdapter): +class NpipeHTTPAdapter(BaseHTTPAdapter): __attrs__ = requests.adapters.HTTPAdapter.__attrs__ + ['npipe_path', 'pools', @@ -81,7 +82,7 @@ class NpipeAdapter(requests.adapters.HTTPAdapter): self.pools = RecentlyUsedContainer( pool_connections, dispose_func=lambda p: p.close() ) - super(NpipeAdapter, self).__init__() + super(NpipeHTTPAdapter, self).__init__() def get_connection(self, url, proxies=None): with self.pools.lock: @@ -103,6 +104,3 @@ class NpipeAdapter(requests.adapters.HTTPAdapter): # anyway, we simply return the path URL directly. # See also: https://github.com/docker/docker-sdk-python/issues/811 return request.path_url - - def close(self): - self.pools.clear() diff --git a/docker/transport/sshconn.py b/docker/transport/sshconn.py index 0f6bb51..5a8ceb0 100644 --- a/docker/transport/sshconn.py +++ b/docker/transport/sshconn.py @@ -2,6 +2,7 @@ import paramiko import requests.adapters import six +from docker.transport.basehttpadapter import BaseHTTPAdapter from .. import constants if six.PY3: @@ -68,7 +69,7 @@ class SSHConnectionPool(urllib3.connectionpool.HTTPConnectionPool): return conn or self._new_conn() -class SSHAdapter(requests.adapters.HTTPAdapter): +class SSHHTTPAdapter(BaseHTTPAdapter): __attrs__ = requests.adapters.HTTPAdapter.__attrs__ + [ 'pools', 'timeout', 'ssh_client', @@ -79,15 +80,19 @@ class SSHAdapter(requests.adapters.HTTPAdapter): self.ssh_client = paramiko.SSHClient() self.ssh_client.load_system_host_keys() - parsed = six.moves.urllib_parse.urlparse(base_url) - self.ssh_client.connect( - parsed.hostname, parsed.port, parsed.username, - ) + self.base_url = base_url + self._connect() self.timeout = timeout self.pools = RecentlyUsedContainer( pool_connections, dispose_func=lambda p: p.close() ) - super(SSHAdapter, self).__init__() + super(SSHHTTPAdapter, self).__init__() + + def _connect(self): + parsed = six.moves.urllib_parse.urlparse(self.base_url) + self.ssh_client.connect( + parsed.hostname, parsed.port, parsed.username, + ) def get_connection(self, url, proxies=None): with self.pools.lock: @@ -95,6 +100,10 @@ class SSHAdapter(requests.adapters.HTTPAdapter): if pool: return pool + # Connection is closed try a reconnect + if not self.ssh_client.get_transport(): + self._connect() + pool = SSHConnectionPool( self.ssh_client, self.timeout ) @@ -103,5 +112,5 @@ class SSHAdapter(requests.adapters.HTTPAdapter): return pool def close(self): - self.pools.clear() + super(SSHHTTPAdapter, self).close() self.ssh_client.close() diff --git a/docker/transport/ssladapter.py b/docker/transport/ssladapter.py index 8fafec3..12de76c 100644 --- a/docker/transport/ssladapter.py +++ b/docker/transport/ssladapter.py @@ -7,6 +7,8 @@ import sys from distutils.version import StrictVersion from requests.adapters import HTTPAdapter +from docker.transport.basehttpadapter import BaseHTTPAdapter + try: import requests.packages.urllib3 as urllib3 except ImportError: @@ -22,7 +24,7 @@ if sys.version_info[0] < 3 or sys.version_info[1] < 5: urllib3.connection.match_hostname = match_hostname -class SSLAdapter(HTTPAdapter): +class SSLHTTPAdapter(BaseHTTPAdapter): '''An HTTPS Transport Adapter that uses an arbitrary SSL version.''' __attrs__ = HTTPAdapter.__attrs__ + ['assert_fingerprint', @@ -34,7 +36,7 @@ class SSLAdapter(HTTPAdapter): self.ssl_version = ssl_version self.assert_hostname = assert_hostname self.assert_fingerprint = assert_fingerprint - super(SSLAdapter, self).__init__(**kwargs) + super(SSLHTTPAdapter, self).__init__(**kwargs) def init_poolmanager(self, connections, maxsize, block=False): kwargs = { @@ -57,7 +59,7 @@ class SSLAdapter(HTTPAdapter): But we still need to take care of when there is a proxy poolmanager """ - conn = super(SSLAdapter, self).get_connection(*args, **kwargs) + conn = super(SSLHTTPAdapter, self).get_connection(*args, **kwargs) if conn.assert_hostname != self.assert_hostname: conn.assert_hostname = self.assert_hostname return conn diff --git a/docker/transport/unixconn.py b/docker/transport/unixconn.py index c59821a..b619103 100644 --- a/docker/transport/unixconn.py +++ b/docker/transport/unixconn.py @@ -3,6 +3,7 @@ import requests.adapters import socket from six.moves import http_client as httplib +from docker.transport.basehttpadapter import BaseHTTPAdapter from .. import constants try: @@ -69,7 +70,7 @@ class UnixHTTPConnectionPool(urllib3.connectionpool.HTTPConnectionPool): ) -class UnixAdapter(requests.adapters.HTTPAdapter): +class UnixHTTPAdapter(BaseHTTPAdapter): __attrs__ = requests.adapters.HTTPAdapter.__attrs__ + ['pools', 'socket_path', @@ -85,7 +86,7 @@ class UnixAdapter(requests.adapters.HTTPAdapter): self.pools = RecentlyUsedContainer( pool_connections, dispose_func=lambda p: p.close() ) - super(UnixAdapter, self).__init__() + super(UnixHTTPAdapter, self).__init__() def get_connection(self, url, proxies=None): with self.pools.lock: @@ -107,6 +108,3 @@ class UnixAdapter(requests.adapters.HTTPAdapter): # anyway, we simply return the path URL directly. # See also: https://github.com/docker/docker-py/issues/811 return request.path_url - - def close(self): - self.pools.clear() |