40
40
41
41
42
42
class Client (requests .Session ):
43
- def __init__ (self , base_url = None , version = DEFAULT_DOCKER_API_VERSION ,
43
+ def __init__ (self , base_url = None , version = None ,
44
44
timeout = DEFAULT_TIMEOUT_SECONDS , tls = False ):
45
45
super (Client , self ).__init__ ()
46
46
base_url = utils .parse_host (base_url )
@@ -50,15 +50,8 @@ def __init__(self, base_url=None, version=DEFAULT_DOCKER_API_VERSION,
50
50
raise errors .TLSParameterError (
51
51
'If using TLS, the base_url argument must begin with '
52
52
'"https://".' )
53
- if not isinstance (version , six .string_types ):
54
- raise errors .DockerException (
55
- 'version parameter must be a string. Found {0}' .format (
56
- type (version ).__name__
57
- )
58
- )
59
53
self .base_url = base_url
60
54
self .timeout = timeout
61
- self ._version = version
62
55
self ._auth_configs = auth .load_config ()
63
56
64
57
# Use SSLAdapter for the ability to specify SSL version
@@ -69,6 +62,34 @@ def __init__(self, base_url=None, version=DEFAULT_DOCKER_API_VERSION,
69
62
else :
70
63
self .mount ('http+unix://' , unixconn .UnixAdapter (base_url , timeout ))
71
64
65
+ # version detection needs to be after unix adapter mounting
66
+ if version is None :
67
+ self ._version = DEFAULT_DOCKER_API_VERSION
68
+ elif isinstance (version , six .string_types ):
69
+ if version .lower () == 'auto' :
70
+ self ._version = self ._retrieve_server_version ()
71
+ else :
72
+ self ._version = version
73
+ else :
74
+ raise errors .DockerException (
75
+ 'Version parameter must be a string or None. Found {0}' .format (
76
+ type (version ).__name__
77
+ )
78
+ )
79
+
80
+ def _retrieve_server_version (self ):
81
+ try :
82
+ return self .version (api_version = False )["ApiVersion" ]
83
+ except KeyError :
84
+ raise errors .DockerException (
85
+ 'Invalid response from docker daemon: key "ApiVersion"'
86
+ ' is missing.'
87
+ )
88
+ except Exception as e :
89
+ raise errors .DockerException (
90
+ 'Error while fetching server API version: {0}' .format (e )
91
+ )
92
+
72
93
def _set_request_timeout (self , kwargs ):
73
94
"""Prepare the kwargs for an HTTP request by inserting the timeout
74
95
parameter, if not already present."""
@@ -84,8 +105,11 @@ def _get(self, url, **kwargs):
84
105
def _delete (self , url , ** kwargs ):
85
106
return self .delete (url , ** self ._set_request_timeout (kwargs ))
86
107
87
- def _url (self , path ):
88
- return '{0}/v{1}{2}' .format (self .base_url , self ._version , path )
108
+ def _url (self , path , versioned_api = True ):
109
+ if versioned_api :
110
+ return '{0}/v{1}{2}' .format (self .base_url , self ._version , path )
111
+ else :
112
+ return '{0}{1}' .format (self .base_url , path )
89
113
90
114
def _raise_for_status (self , response , explanation = None ):
91
115
"""Raises stored :class:`APIError`, if one occurred."""
@@ -914,8 +938,9 @@ def top(self, container):
914
938
u = self ._url ("/containers/{0}/top" .format (container ))
915
939
return self ._result (self ._get (u ), True )
916
940
917
- def version (self ):
918
- return self ._result (self ._get (self ._url ("/version" )), True )
941
+ def version (self , api_version = True ):
942
+ url = self ._url ("/version" , versioned_api = api_version )
943
+ return self ._result (self ._get (url ), json = True )
919
944
920
945
def unpause (self , container ):
921
946
if isinstance (container , dict ):
@@ -934,3 +959,13 @@ def wait(self, container, timeout=None):
934
959
if 'StatusCode' in json_ :
935
960
return json_ ['StatusCode' ]
936
961
return - 1
962
+
963
+
964
+ class AutoVersionClient (Client ):
965
+ def __init__ (self , * args , ** kwargs ):
966
+ if 'version' in kwargs and kwargs ['version' ]:
967
+ raise errors .DockerException (
968
+ 'Can not specify version for AutoVersionClient'
969
+ )
970
+ kwargs ['version' ] = 'auto'
971
+ super (AutoVersionClient , self ).__init__ (* args , ** kwargs )
0 commit comments