summaryrefslogtreecommitdiff
path: root/docker/transport
diff options
context:
space:
mode:
authorUlysses Souza <ulysses.souza@docker.com>2019-03-13 19:07:50 +0100
committerUlysses Souza <ulysses.souza@docker.com>2019-03-15 11:23:00 +0100
commit4d7d4084138fa6161ef5f31d410b0d326d41f777 (patch)
treef57cbda31ee7c8ed7be1046c9677abef9aa83804 /docker/transport
parente48a1a94e6f76f9fd1b2882522eb714b1f70d5d6 (diff)
downloaddocker-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__.py8
-rw-r--r--docker/transport/basehttpadapter.py6
-rw-r--r--docker/transport/npipeconn.py8
-rw-r--r--docker/transport/sshconn.py23
-rw-r--r--docker/transport/ssladapter.py8
-rw-r--r--docker/transport/unixconn.py8
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()