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,29 @@ 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
+ response = self .version (api_version = False )
82
+ try :
83
+ return response ["ApiVersion" ]
84
+ except KeyError :
85
+ raise ValueError ("Invalid response from docker daemon: "
86
+ "key \" ApiVersion\" is missing." )
87
+
72
88
def _set_request_timeout (self , kwargs ):
73
89
"""Prepare the kwargs for an HTTP request by inserting the timeout
74
90
parameter, if not already present."""
@@ -84,8 +100,11 @@ def _get(self, url, **kwargs):
84
100
def _delete (self , url , ** kwargs ):
85
101
return self .delete (url , ** self ._set_request_timeout (kwargs ))
86
102
87
- def _url (self , path ):
88
- return '{0}/v{1}{2}' .format (self .base_url , self ._version , path )
103
+ def _url (self , path , versioned_api = True ):
104
+ if versioned_api :
105
+ return '{0}/v{1}{2}' .format (self .base_url , self ._version , path )
106
+ else :
107
+ return '{0}{1}' .format (self .base_url , path )
89
108
90
109
def _raise_for_status (self , response , explanation = None ):
91
110
"""Raises stored :class:`APIError`, if one occurred."""
@@ -914,8 +933,9 @@ def top(self, container):
914
933
u = self ._url ("/containers/{0}/top" .format (container ))
915
934
return self ._result (self ._get (u ), True )
916
935
917
- def version (self ):
918
- return self ._result (self ._get (self ._url ("/version" )), True )
936
+ def version (self , api_version = True ):
937
+ url = self ._url ("/version" , versioned_api = api_version )
938
+ return self ._result (self ._get (url ), json = True )
919
939
920
940
def unpause (self , container ):
921
941
if isinstance (container , dict ):
@@ -934,3 +954,9 @@ def wait(self, container, timeout=None):
934
954
if 'StatusCode' in json_ :
935
955
return json_ ['StatusCode' ]
936
956
return - 1
957
+
958
+
959
+ class AutoVersionClient (Client ):
960
+ def __init__ (self , * args , ** kwargs ):
961
+ kwargs ['version' ] = 'auto'
962
+ super (AutoVersionClient , self ).__init__ (* args , ** kwargs )
0 commit comments