mirror of https://github.com/docker/docker-py.git
Merge branch 'timeout-support' of github.com:mpetazzoni/docker-py into mpetazzoni-timeout-support
Conflicts: docker/client.py tests/integration_test.py tests/test.py
This commit is contained in:
commit
35d3a3c977
|
@ -8,7 +8,8 @@ An API client for docker written in Python
|
|||
API
|
||||
===
|
||||
|
||||
`docker.Client(base_url='unix://var/run/docker.sock', version="1.4")`
|
||||
`docker.Client(base_url='unix://var/run/docker.sock', version="1.4",
|
||||
timeout=60)`
|
||||
Client class. `base_url` refers to the protocol+hostname+port where the docker
|
||||
server is hosted. Version is the version of the API the client will use.
|
||||
|
||||
|
|
116
docker/client.py
116
docker/client.py
|
@ -28,6 +28,8 @@ import docker.utils as utils
|
|||
if not six.PY3:
|
||||
import websocket
|
||||
|
||||
DEFAULT_TIMEOUT_SECONDS = 60
|
||||
|
||||
|
||||
class APIError(requests.exceptions.HTTPError):
|
||||
def __init__(self, message, response, explanation=None):
|
||||
|
@ -62,18 +64,36 @@ class APIError(requests.exceptions.HTTPError):
|
|||
|
||||
|
||||
class Client(requests.Session):
|
||||
def __init__(self, base_url="unix://var/run/docker.sock", version="1.6"):
|
||||
def __init__(self, base_url="unix://var/run/docker.sock", version="1.6",
|
||||
timeout=DEFAULT_TIMEOUT_SECONDS):
|
||||
super(Client, self).__init__()
|
||||
if base_url.startswith('unix:///'):
|
||||
base_url = base_url.replace('unix:/', 'unix:')
|
||||
self.mount('unix://', unixconn.UnixAdapter(base_url))
|
||||
self.base_url = base_url
|
||||
self._version = version
|
||||
self._timeout = timeout
|
||||
|
||||
self.mount('unix://', unixconn.UnixAdapter(base_url, timeout))
|
||||
try:
|
||||
self._cfg = auth.load_config()
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
def _set_request_timeout(self, kwargs):
|
||||
"""Prepare the kwargs for an HTTP request by inserting the timeout
|
||||
parameter, if not already present."""
|
||||
kwargs.setdefault('timeout', self._timeout)
|
||||
return kwargs
|
||||
|
||||
def _post(self, url, **kwargs):
|
||||
return self.post(url, **self._set_request_timeout(kwargs))
|
||||
|
||||
def _get(self, url, **kwargs):
|
||||
return self.get(url, **self._set_request_timeout(kwargs))
|
||||
|
||||
def _delete(self, url, **kwargs):
|
||||
return self.delete(url, **self._set_request_timeout(kwargs))
|
||||
|
||||
def _url(self, path):
|
||||
return '{0}/v{1}{2}'.format(self.base_url, self._version, path)
|
||||
|
||||
|
@ -155,7 +175,7 @@ class Client(requests.Session):
|
|||
if 'headers' not in kwargs:
|
||||
kwargs['headers'] = {}
|
||||
kwargs['headers']['Content-Type'] = 'application/json'
|
||||
return self.post(url, json.dumps(data2), **kwargs)
|
||||
return self._post(url, data=json.dumps(data2), **kwargs)
|
||||
|
||||
def _attach_params(self, override=None):
|
||||
return override or {
|
||||
|
@ -243,8 +263,11 @@ class Client(requests.Session):
|
|||
}
|
||||
if context is not None:
|
||||
headers = {'Content-Type': 'application/tar'}
|
||||
response = self.post(
|
||||
u, context, params=params, headers=headers, stream=stream)
|
||||
|
||||
response = self._post(
|
||||
u, data=context, params=params, headers=headers, stream=stream
|
||||
)
|
||||
|
||||
if context is not None:
|
||||
context.close()
|
||||
if stream:
|
||||
|
@ -267,7 +290,8 @@ class Client(requests.Session):
|
|||
'author': author
|
||||
}
|
||||
u = self._url("/commit")
|
||||
return self._result(self._post_json(u, conf, params=params), json=True)
|
||||
return self._result(self._post_json(u, data=conf, params=params),
|
||||
json=True)
|
||||
|
||||
def containers(self, quiet=False, all=False, trunc=True, latest=False,
|
||||
since=None, before=None, limit=-1):
|
||||
|
@ -279,7 +303,8 @@ class Client(requests.Session):
|
|||
'before': before
|
||||
}
|
||||
u = self._url("/containers/json")
|
||||
res = self._result(self.get(u, params=params), True)
|
||||
res = self._result(self._get(u, params=params), True)
|
||||
|
||||
if quiet:
|
||||
return [{'Id': x['Id']} for x in res]
|
||||
return res
|
||||
|
@ -287,7 +312,7 @@ class Client(requests.Session):
|
|||
def copy(self, container, resource):
|
||||
res = self._post_json(
|
||||
self._url("/containers/{0}/copy".format(container)),
|
||||
{"Resource": resource},
|
||||
data={"Resource": resource},
|
||||
stream=True
|
||||
)
|
||||
self._raise_for_status(res)
|
||||
|
@ -310,13 +335,13 @@ class Client(requests.Session):
|
|||
params = {
|
||||
'name': name
|
||||
}
|
||||
res = self._post_json(u, config, params=params)
|
||||
res = self._post_json(u, data=config, params=params)
|
||||
return self._result(res, True)
|
||||
|
||||
def diff(self, container):
|
||||
if isinstance(container, dict):
|
||||
container = container.get('Id')
|
||||
return self._result(self.get(self._url("/containers/{0}/changes".
|
||||
return self._result(self._get(self._url("/containers/{0}/changes".
|
||||
format(container))), True)
|
||||
|
||||
def events(self):
|
||||
|
@ -339,25 +364,25 @@ class Client(requests.Session):
|
|||
def export(self, container):
|
||||
if isinstance(container, dict):
|
||||
container = container.get('Id')
|
||||
res = self.get(self._url("/containers/{0}/export".format(container)),
|
||||
stream=True)
|
||||
res = self._get(self._url("/containers/{0}/export".format(container)),
|
||||
stream=True)
|
||||
self._raise_for_status(res)
|
||||
return res.raw
|
||||
|
||||
def history(self, image):
|
||||
res = self.get(self._url("/images/{0}/history".format(image)))
|
||||
res = self._get(self._url("/images/{0}/history".format(image)))
|
||||
self._raise_for_status(res)
|
||||
return self._result(res)
|
||||
|
||||
def images(self, name=None, quiet=False, all=False, viz=False):
|
||||
if viz:
|
||||
return self._result(self.get(self._url("images/viz")))
|
||||
return self._result(self._get(self._url("images/viz")))
|
||||
params = {
|
||||
'filter': name,
|
||||
'only_ids': 1 if quiet else 0,
|
||||
'all': 1 if all else 0,
|
||||
}
|
||||
res = self._result(self.get(self._url("/images/json"), params=params),
|
||||
res = self._result(self._get(self._url("/images/json"), params=params),
|
||||
True)
|
||||
if quiet:
|
||||
return [x['Id'] for x in res]
|
||||
|
@ -381,12 +406,13 @@ class Client(requests.Session):
|
|||
data = None
|
||||
if isinstance(src, six.string_types):
|
||||
params['fromSrc'] = src
|
||||
return self._result(self.post(u, data, params=params))
|
||||
return self._result(self._post(u, data=data, params=params))
|
||||
|
||||
return self._result(self.post(u, src, params=params))
|
||||
return self._result(self._post(u, data=src, params=params))
|
||||
|
||||
def info(self):
|
||||
return self._result(self.get(self._url("/info")), True)
|
||||
return self._result(self._get(self._url("/info")),
|
||||
True)
|
||||
|
||||
def insert(self, image, url, path):
|
||||
api_url = self._url("/images/" + image + "/insert")
|
||||
|
@ -394,19 +420,20 @@ class Client(requests.Session):
|
|||
'url': url,
|
||||
'path': path
|
||||
}
|
||||
return self._result(self.post(api_url, None, params=params))
|
||||
return self._result(self._post(api_url, params=params))
|
||||
|
||||
def inspect_container(self, container):
|
||||
if isinstance(container, dict):
|
||||
container = container.get('Id')
|
||||
return self._result(self.get(
|
||||
self._url("/containers/{0}/json".format(container))
|
||||
), True)
|
||||
return self._result(
|
||||
self._get(self._url("/containers/{0}/json".format(container))),
|
||||
True)
|
||||
|
||||
def inspect_image(self, image_id):
|
||||
return self._result(self.get(
|
||||
self._url("/images/{0}/json".format(image_id))
|
||||
), True)
|
||||
return self._result(
|
||||
self._get(self._url("/images/{0}/json".format(image_id))),
|
||||
True
|
||||
)
|
||||
|
||||
def kill(self, container, signal=None):
|
||||
if isinstance(container, dict):
|
||||
|
@ -415,7 +442,8 @@ class Client(requests.Session):
|
|||
params = {}
|
||||
if signal is not None:
|
||||
params['signal'] = signal
|
||||
res = self.post(url, None, params=params)
|
||||
res = self._post(url, params=params)
|
||||
|
||||
self._raise_for_status(res)
|
||||
|
||||
def login(self, username, password=None, email=None, registry=None):
|
||||
|
@ -432,7 +460,7 @@ class Client(requests.Session):
|
|||
'password': password,
|
||||
'email': email
|
||||
}
|
||||
res = self._result(self._post_json(url, req_data), True)
|
||||
res = self._result(self._post_json(url, data=req_data), True)
|
||||
if res['Status'] == 'Login Succeeded':
|
||||
self._cfg['Configs'][registry] = req_data
|
||||
return res
|
||||
|
@ -447,9 +475,9 @@ class Client(requests.Session):
|
|||
}
|
||||
u = self._url("/containers/{0}/attach".format(container))
|
||||
if utils.compare_version('1.6', self._version) < 0:
|
||||
return self._result(self.post(u, None, params=params))
|
||||
return self._result(self._post(u, params=params))
|
||||
res = ''
|
||||
response = self._result(self.post(u, None, params=params))
|
||||
response = self._result(self._post(u, params=params))
|
||||
walker = 0
|
||||
while walker < len(response):
|
||||
header = response[walker:walker+8]
|
||||
|
@ -464,7 +492,7 @@ class Client(requests.Session):
|
|||
def port(self, container, private_port):
|
||||
if isinstance(container, dict):
|
||||
container = container.get('Id')
|
||||
res = self.get(self._url("/containers/{0}/json".format(container)))
|
||||
res = self._get(self._url("/containers/{0}/json".format(container)))
|
||||
self._raise_for_status(res)
|
||||
json_ = res.json()
|
||||
s_port = str(private_port)
|
||||
|
@ -496,7 +524,7 @@ class Client(requests.Session):
|
|||
if authcfg:
|
||||
headers['X-Registry-Auth'] = auth.encode_header(authcfg)
|
||||
u = self._url("/images/create")
|
||||
response = self.post(u, params=params, headers=headers, stream=stream)
|
||||
response = self._post(u, params=params, headers=headers, stream=stream)
|
||||
|
||||
if stream:
|
||||
return self._stream_helper(response)
|
||||
|
@ -515,6 +543,7 @@ class Client(requests.Session):
|
|||
# for this specific registry as we can have an anon push
|
||||
if authcfg:
|
||||
headers['X-Registry-Auth'] = auth.encode_header(authcfg)
|
||||
|
||||
if stream:
|
||||
return self._stream_helper(
|
||||
self._post_json(u, None, headers=headers, stream=True))
|
||||
|
@ -531,11 +560,12 @@ class Client(requests.Session):
|
|||
if isinstance(container, dict):
|
||||
container = container.get('Id')
|
||||
params = {'v': v, 'link': link}
|
||||
res = self.delete(self._url("/containers/" + container), params=params)
|
||||
res = self._delete(self._url("/containers/" + container),
|
||||
params=params)
|
||||
self._raise_for_status(res)
|
||||
|
||||
def remove_image(self, image):
|
||||
res = self.delete(self._url("/images/" + image))
|
||||
res = self._delete(self._url("/images/" + image))
|
||||
self._raise_for_status(res)
|
||||
|
||||
def restart(self, container, timeout=10):
|
||||
|
@ -543,12 +573,13 @@ class Client(requests.Session):
|
|||
container = container.get('Id')
|
||||
params = {'t': timeout}
|
||||
url = self._url("/containers/{0}/restart".format(container))
|
||||
res = self.post(url, None, params=params)
|
||||
res = self._post(url, params=params)
|
||||
self._raise_for_status(res)
|
||||
|
||||
def search(self, term):
|
||||
return self._result(self.get(self._url("/images/search"),
|
||||
params={'term': term}), True)
|
||||
return self._result(self._get(self._url("/images/search"),
|
||||
params={'term': term}),
|
||||
True)
|
||||
|
||||
def start(self, container, binds=None, port_bindings=None, lxc_conf=None,
|
||||
publish_all_ports=False, links=None):
|
||||
|
@ -583,7 +614,7 @@ class Client(requests.Session):
|
|||
start_config['Links'] = formatted_links
|
||||
|
||||
url = self._url("/containers/{0}/start".format(container))
|
||||
res = self._post_json(url, start_config)
|
||||
res = self._post_json(url, data=start_config)
|
||||
self._raise_for_status(res)
|
||||
|
||||
def stop(self, container, timeout=10):
|
||||
|
@ -591,7 +622,8 @@ class Client(requests.Session):
|
|||
container = container.get('Id')
|
||||
params = {'t': timeout}
|
||||
url = self._url("/containers/{0}/stop".format(container))
|
||||
res = self.post(url, None, params=params)
|
||||
res = self._post(url, params=params,
|
||||
timeout=max(timeout, self._timeout))
|
||||
self._raise_for_status(res)
|
||||
|
||||
def tag(self, image, repository, tag=None, force=False):
|
||||
|
@ -601,22 +633,22 @@ class Client(requests.Session):
|
|||
'force': 1 if force else 0
|
||||
}
|
||||
url = self._url("/images/{0}/tag".format(image))
|
||||
res = self.post(url, None, params=params)
|
||||
res = self._post(url, params=params)
|
||||
self._raise_for_status(res)
|
||||
return res.status_code == 201
|
||||
|
||||
def top(self, container):
|
||||
u = self._url("/containers/{0}/top".format(container))
|
||||
return self._result(self.get(u), True)
|
||||
return self._result(self._get(u), True)
|
||||
|
||||
def version(self):
|
||||
return self._result(self.get(self._url("/version")), True)
|
||||
return self._result(self._get(self._url("/version")), True)
|
||||
|
||||
def wait(self, container):
|
||||
if isinstance(container, dict):
|
||||
container = container.get('Id')
|
||||
url = self._url("/containers/{0}/wait".format(container))
|
||||
res = self.post(url, None, timeout=None)
|
||||
res = self._post(url, timeout=None)
|
||||
self._raise_for_status(res)
|
||||
json_ = res.json()
|
||||
if 'StatusCode' in json_:
|
||||
|
|
|
@ -27,13 +27,15 @@ except ImportError:
|
|||
|
||||
|
||||
class UnixHTTPConnection(httplib.HTTPConnection, object):
|
||||
def __init__(self, base_url, unix_socket):
|
||||
httplib.HTTPConnection.__init__(self, 'localhost')
|
||||
def __init__(self, base_url, unix_socket, timeout=60):
|
||||
httplib.HTTPConnection.__init__(self, 'localhost', timeout=timeout)
|
||||
self.base_url = base_url
|
||||
self.unix_socket = unix_socket
|
||||
self.timeout = timeout
|
||||
|
||||
def connect(self):
|
||||
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
||||
sock.settimeout(self.timeout)
|
||||
sock.connect(self.base_url.replace("unix:/", ""))
|
||||
self.sock = sock
|
||||
|
||||
|
@ -47,19 +49,23 @@ class UnixHTTPConnection(httplib.HTTPConnection, object):
|
|||
|
||||
|
||||
class UnixHTTPConnectionPool(connectionpool.HTTPConnectionPool):
|
||||
def __init__(self, base_url, socket_path):
|
||||
self.socket_path = socket_path
|
||||
def __init__(self, base_url, socket_path, timeout=60):
|
||||
connectionpool.HTTPConnectionPool.__init__(self, 'localhost',
|
||||
timeout=timeout)
|
||||
self.base_url = base_url
|
||||
super(UnixHTTPConnectionPool, self).__init__(self, 'localhost')
|
||||
self.socket_path = socket_path
|
||||
self.timeout = timeout
|
||||
|
||||
def _new_conn(self):
|
||||
return UnixHTTPConnection(self.base_url, self.socket_path)
|
||||
return UnixHTTPConnection(self.base_url, self.socket_path,
|
||||
self.timeout)
|
||||
|
||||
|
||||
class UnixAdapter(requests.adapters.HTTPAdapter):
|
||||
def __init__(self, base_url):
|
||||
def __init__(self, base_url, timeout=60):
|
||||
self.base_url = base_url
|
||||
self.timeout = timeout
|
||||
super(UnixAdapter, self).__init__()
|
||||
|
||||
def get_connection(self, socket_path, proxies=None):
|
||||
return UnixHTTPConnectionPool(self.base_url, socket_path)
|
||||
return UnixHTTPConnectionPool(self.base_url, socket_path, self.timeout)
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
import time
|
||||
import base64
|
||||
import io
|
||||
import os
|
||||
|
@ -74,9 +75,9 @@ class TestSearch(BaseTestCase):
|
|||
def runTest(self):
|
||||
res = self.client.search('busybox')
|
||||
self.assertTrue(len(res) >= 1)
|
||||
base_img = [x for x in res if x['Name'] == 'busybox']
|
||||
base_img = [x for x in res if x['name'] == 'busybox']
|
||||
self.assertEqual(len(base_img), 1)
|
||||
self.assertIn('Description', base_img[0])
|
||||
self.assertIn('description', base_img[0])
|
||||
|
||||
###################
|
||||
## LISTING TESTS ##
|
||||
|
@ -166,8 +167,9 @@ class TestCreateContainerPrivileged(BaseTestCase):
|
|||
res = self.client.create_container('busybox', 'true', privileged=True)
|
||||
inspect = self.client.inspect_container(res['Id'])
|
||||
self.assertIn('Config', inspect)
|
||||
# In newer versions of docker, the "Privileged" flag is no
|
||||
# longer exposed in the API
|
||||
# Since Nov 2013, the Privileged flag is no longer part of the
|
||||
# container's config exposed via the API (safety concerns?).
|
||||
#
|
||||
# self.assertEqual(inspect['Config']['Privileged'], True)
|
||||
|
||||
|
||||
|
@ -750,5 +752,25 @@ class TestLoadConfig(BaseTestCase):
|
|||
self.assertEqual(cfg['Email'], 'sakuya@scarlet.net')
|
||||
self.assertEqual(cfg.get('Auth'), None)
|
||||
|
||||
|
||||
class TestConnectionTimeout(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.timeout = 0.5
|
||||
self.client = docker.client.Client(base_url='http://192.168.10.2:4243',
|
||||
timeout=self.timeout)
|
||||
|
||||
def runTest(self):
|
||||
start = time.time()
|
||||
res = None
|
||||
# This call isn't supposed to complete, and it should fail fast.
|
||||
try:
|
||||
res = self.client.inspect_container('id')
|
||||
except:
|
||||
pass
|
||||
end = time.time()
|
||||
self.assertTrue(res is None)
|
||||
self.assertTrue(end - start < 2 * self.timeout)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
|
188
tests/test.py
188
tests/test.py
|
@ -79,7 +79,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
self.fail('Command should not raise exception: {0}'.format(e))
|
||||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/version'
|
||||
'unix://var/run/docker.sock/v1.6/version',
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_info(self):
|
||||
|
@ -88,7 +89,10 @@ class DockerClientTest(unittest.TestCase):
|
|||
except Exception as e:
|
||||
self.fail('Command should not raise exception: {0}'.format(e))
|
||||
|
||||
fake_request.assert_called_with('unix://var/run/docker.sock/v1.6/info')
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/info',
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_search(self):
|
||||
try:
|
||||
|
@ -98,7 +102,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/images/search',
|
||||
params={'term': 'busybox'}
|
||||
params={'term': 'busybox'},
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
###################
|
||||
|
@ -112,7 +117,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
self.fail('Command should not raise exception: {0}'.format(e))
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/images/json',
|
||||
params={'filter': None, 'only_ids': 0, 'all': 1}
|
||||
params={'filter': None, 'only_ids': 0, 'all': 1},
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_images_quiet(self):
|
||||
|
@ -122,7 +128,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
self.fail('Command should not raise exception: {0}'.format(e))
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/images/json',
|
||||
params={'filter': None, 'only_ids': 1, 'all': 1}
|
||||
params={'filter': None, 'only_ids': 1, 'all': 1},
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_image_ids(self):
|
||||
|
@ -133,7 +140,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/images/json',
|
||||
params={'filter': None, 'only_ids': 1, 'all': 0}
|
||||
params={'filter': None, 'only_ids': 1, 'all': 0},
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_list_containers(self):
|
||||
|
@ -150,7 +158,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
'limit': -1,
|
||||
'trunc_cmd': 1,
|
||||
'before': None
|
||||
}
|
||||
},
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
#####################
|
||||
|
@ -166,7 +175,7 @@ class DockerClientTest(unittest.TestCase):
|
|||
args = fake_request.call_args
|
||||
self.assertEqual(args[0][0],
|
||||
'unix://var/run/docker.sock/v1.6/containers/create')
|
||||
self.assertEqual(json.loads(args[0][1]),
|
||||
self.assertEqual(json.loads(args[1]['data']),
|
||||
json.loads('''
|
||||
{"Tty": false, "Image": "busybox", "Cmd": ["true"],
|
||||
"AttachStdin": false, "Memory": 0,
|
||||
|
@ -188,7 +197,7 @@ class DockerClientTest(unittest.TestCase):
|
|||
args = fake_request.call_args
|
||||
self.assertEqual(args[0][0],
|
||||
'unix://var/run/docker.sock/v1.6/containers/create')
|
||||
self.assertEqual(json.loads(args[0][1]),
|
||||
self.assertEqual(json.loads(args[1]['data']),
|
||||
json.loads('''
|
||||
{"Tty": false, "Image": "busybox",
|
||||
"Cmd": ["ls", "/mnt"], "AttachStdin": false,
|
||||
|
@ -207,7 +216,7 @@ class DockerClientTest(unittest.TestCase):
|
|||
args = fake_request.call_args
|
||||
self.assertEqual(args[0][0],
|
||||
'unix://var/run/docker.sock/v1.6/containers/create')
|
||||
self.assertEqual(json.loads(args[0][1]),
|
||||
self.assertEqual(json.loads(args[1]['data']),
|
||||
json.loads('''
|
||||
{"Tty": false, "Image": "busybox", "Cmd": ["true"],
|
||||
"AttachStdin": false, "Memory": 0,
|
||||
|
@ -226,7 +235,7 @@ class DockerClientTest(unittest.TestCase):
|
|||
args = fake_request.call_args
|
||||
self.assertEqual(args[0][0],
|
||||
'unix://var/run/docker.sock/v1.6/containers/create')
|
||||
self.assertEqual(json.loads(args[0][1]),
|
||||
self.assertEqual(json.loads(args[1]['data']),
|
||||
json.loads('''
|
||||
{"Tty": false, "Image": "busybox", "Cmd": ["true"],
|
||||
"AttachStdin": false, "Memory": 0,
|
||||
|
@ -244,8 +253,9 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b/start',
|
||||
'{"PublishAllPorts": false}',
|
||||
headers={'Content-Type': 'application/json'}
|
||||
data='{"PublishAllPorts": false}',
|
||||
headers={'Content-Type': 'application/json'},
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_start_container_with_lxc_conf(self):
|
||||
|
@ -257,15 +267,19 @@ class DockerClientTest(unittest.TestCase):
|
|||
except Exception as e:
|
||||
self.fail('Command should not raise exception: {0}'.format(e))
|
||||
args = fake_request.call_args
|
||||
self.assertEqual(args[0][0], 'unix://var/run/docker.sock/v1.6/'
|
||||
'containers/3cc2351ab11b/start')
|
||||
self.assertEqual(
|
||||
json.loads(args[0][1]),
|
||||
args[0][0],
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b/start'
|
||||
)
|
||||
self.assertEqual(
|
||||
json.loads(args[1]['data']),
|
||||
{"LxcConf": [{"Value": "lxc.conf.value", "Key": "lxc.conf.k"}],
|
||||
"PublishAllPorts": False}
|
||||
)
|
||||
self.assertEqual(args[1]['headers'],
|
||||
{'Content-Type': 'application/json'})
|
||||
self.assertEqual(
|
||||
args[1]['headers'],
|
||||
{'Content-Type': 'application/json'}
|
||||
)
|
||||
|
||||
def test_start_container_with_lxc_conf_compat(self):
|
||||
try:
|
||||
|
@ -275,13 +289,16 @@ class DockerClientTest(unittest.TestCase):
|
|||
)
|
||||
except Exception as e:
|
||||
self.fail('Command should not raise exception: {0}'.format(e))
|
||||
|
||||
args = fake_request.call_args
|
||||
self.assertEqual(args[0][0], 'unix://var/run/docker.sock/v1.6/'
|
||||
'containers/3cc2351ab11b/start')
|
||||
self.assertEqual(
|
||||
json.loads(args[0][1]),
|
||||
{"LxcConf": [{"Value": "lxc.conf.value", "Key": "lxc.conf.k"}],
|
||||
"PublishAllPorts": False}
|
||||
json.loads(args[1]['data']),
|
||||
{
|
||||
"LxcConf": [{"Value": "lxc.conf.value", "Key": "lxc.conf.k"}],
|
||||
"PublishAllPorts": False
|
||||
}
|
||||
)
|
||||
self.assertEqual(args[1]['headers'],
|
||||
{'Content-Type': 'application/json'})
|
||||
|
@ -298,10 +315,14 @@ class DockerClientTest(unittest.TestCase):
|
|||
args = fake_request.call_args
|
||||
self.assertEqual(args[0][0], 'unix://var/run/docker.sock/v1.6/'
|
||||
'containers/3cc2351ab11b/start')
|
||||
self.assertEqual(json.loads(args[0][1]),
|
||||
self.assertEqual(json.loads(args[1]['data']),
|
||||
{"Binds": ["/tmp:/mnt"], "PublishAllPorts": False})
|
||||
self.assertEqual(args[1]['headers'],
|
||||
{'Content-Type': 'application/json'})
|
||||
self.assertEqual(
|
||||
args[1]['timeout'],
|
||||
docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_start_container_with_links(self):
|
||||
# one link
|
||||
|
@ -319,7 +340,7 @@ class DockerClientTest(unittest.TestCase):
|
|||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b/start'
|
||||
)
|
||||
self.assertEqual(
|
||||
json.loads(args[0][1]),
|
||||
json.loads(args[1]['data']),
|
||||
{"PublishAllPorts": False, "Links": ["path:alias"]}
|
||||
)
|
||||
self.assertEqual(
|
||||
|
@ -347,7 +368,7 @@ class DockerClientTest(unittest.TestCase):
|
|||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b/start'
|
||||
)
|
||||
self.assertEqual(
|
||||
json.loads(args[0][1]),
|
||||
json.loads(args[1]['data']),
|
||||
{
|
||||
"PublishAllPorts": False,
|
||||
"Links": ["path2:alias2", "path1:alias1"]
|
||||
|
@ -365,8 +386,9 @@ class DockerClientTest(unittest.TestCase):
|
|||
self.fail('Command should not raise exception: {0}'.format(e))
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b/start',
|
||||
'{"PublishAllPorts": false}',
|
||||
headers={'Content-Type': 'application/json'}
|
||||
data='{"PublishAllPorts": false}',
|
||||
headers={'Content-Type': 'application/json'},
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_wait(self):
|
||||
|
@ -377,7 +399,6 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b/wait',
|
||||
None,
|
||||
timeout=None
|
||||
)
|
||||
|
||||
|
@ -389,7 +410,6 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b/wait',
|
||||
None,
|
||||
timeout=None
|
||||
)
|
||||
|
||||
|
@ -401,8 +421,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b/attach',
|
||||
None,
|
||||
params={'logs': 1, 'stderr': 1, 'stdout': 1}
|
||||
params={'logs': 1, 'stderr': 1, 'stdout': 1},
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_logs_with_dict_instead_of_id(self):
|
||||
|
@ -413,8 +433,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b/attach',
|
||||
None,
|
||||
params={'logs': 1, 'stderr': 1, 'stdout': 1}
|
||||
params={'logs': 1, 'stderr': 1, 'stdout': 1},
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_diff(self):
|
||||
|
@ -424,7 +444,9 @@ class DockerClientTest(unittest.TestCase):
|
|||
self.fail('Command should not raise exception: {0}'.format(e))
|
||||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b/changes')
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b/changes',
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_diff_with_dict_instead_of_id(self):
|
||||
try:
|
||||
|
@ -433,7 +455,9 @@ class DockerClientTest(unittest.TestCase):
|
|||
self.fail('Command should not raise exception: {0}'.format(e))
|
||||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b/changes')
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b/changes',
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_stop_container(self):
|
||||
try:
|
||||
|
@ -443,8 +467,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b/stop',
|
||||
None,
|
||||
params={'t': 2}
|
||||
params={'t': 2},
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_stop_container_with_dict_instead_of_id(self):
|
||||
|
@ -455,8 +479,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b/stop',
|
||||
None,
|
||||
params={'t': 2}
|
||||
params={'t': 2},
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_kill_container(self):
|
||||
|
@ -467,8 +491,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b/kill',
|
||||
None,
|
||||
params={}
|
||||
params={},
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_kill_container_with_dict_instead_of_id(self):
|
||||
|
@ -479,8 +503,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b/kill',
|
||||
None,
|
||||
params={}
|
||||
params={},
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_kill_container_with_signal(self):
|
||||
|
@ -491,8 +515,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b/kill',
|
||||
None,
|
||||
params={'signal': signal.SIGTERM}
|
||||
params={'signal': signal.SIGTERM},
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_restart_container(self):
|
||||
|
@ -503,8 +527,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b/restart',
|
||||
None,
|
||||
params={'t': 2}
|
||||
params={'t': 2},
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_restart_container_with_dict_instead_of_id(self):
|
||||
|
@ -515,8 +539,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b/restart',
|
||||
None,
|
||||
params={'t': 2}
|
||||
params={'t': 2},
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_remove_container(self):
|
||||
|
@ -527,7 +551,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b',
|
||||
params={'v': False, 'link': False}
|
||||
params={'v': False, 'link': False},
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_remove_container_with_dict_instead_of_id(self):
|
||||
|
@ -538,7 +563,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b',
|
||||
params={'v': False, 'link': False}
|
||||
params={'v': False, 'link': False},
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_remove_link(self):
|
||||
|
@ -549,7 +575,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b',
|
||||
params={'v': False, 'link': True}
|
||||
params={'v': False, 'link': True},
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_export(self):
|
||||
|
@ -560,7 +587,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b/export',
|
||||
stream=True
|
||||
stream=True,
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_export_with_dict_instead_of_id(self):
|
||||
|
@ -571,7 +599,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b/export',
|
||||
stream=True
|
||||
stream=True,
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_inspect_container(self):
|
||||
|
@ -581,7 +610,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
self.fail('Command should not raise exception: {0}'.format(e))
|
||||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b/json'
|
||||
'unix://var/run/docker.sock/v1.6/containers/3cc2351ab11b/json',
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
##################
|
||||
|
@ -630,7 +660,7 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/commit',
|
||||
'{}',
|
||||
data='{}',
|
||||
headers={'Content-Type': 'application/json'},
|
||||
params={
|
||||
'repo': None,
|
||||
|
@ -638,7 +668,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
'tag': None,
|
||||
'container': '3cc2351ab11b',
|
||||
'author': None
|
||||
}
|
||||
},
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_remove_image(self):
|
||||
|
@ -648,7 +679,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
self.fail('Command should not raise exception: {0}'.format(e))
|
||||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/images/e9aa60c60128'
|
||||
'unix://var/run/docker.sock/v1.6/images/e9aa60c60128',
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_image_history(self):
|
||||
|
@ -658,7 +690,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
self.fail('Command should not raise exception: {0}'.format(e))
|
||||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/images/test_image/history'
|
||||
'unix://var/run/docker.sock/v1.6/images/test_image/history',
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_import_image(self):
|
||||
|
@ -673,12 +706,13 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/images/create',
|
||||
None,
|
||||
params={
|
||||
'repo': fake_api.FAKE_REPO_NAME,
|
||||
'tag': fake_api.FAKE_TAG_NAME,
|
||||
'fromSrc': fake_api.FAKE_TARBALL_PATH
|
||||
}
|
||||
},
|
||||
data=None,
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_import_image_from_file(self):
|
||||
|
@ -695,12 +729,13 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/images/create',
|
||||
'',
|
||||
params={
|
||||
'repo': fake_api.FAKE_REPO_NAME,
|
||||
'tag': fake_api.FAKE_TAG_NAME,
|
||||
'fromSrc': '-'
|
||||
}
|
||||
},
|
||||
data='',
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
buf.close()
|
||||
os.remove(buf.name)
|
||||
|
@ -712,7 +747,8 @@ class DockerClientTest(unittest.TestCase):
|
|||
self.fail('Command should not raise exception: {0}'.format(e))
|
||||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/images/test_image/json'
|
||||
'unix://var/run/docker.sock/v1.6/images/test_image/json',
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_insert_image(self):
|
||||
|
@ -724,11 +760,11 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/images/test_image/insert',
|
||||
None,
|
||||
params={
|
||||
'url': fake_api.FAKE_URL,
|
||||
'path': fake_api.FAKE_PATH
|
||||
}
|
||||
},
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_push_image(self):
|
||||
|
@ -739,9 +775,10 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/images/test_image/push',
|
||||
'{}',
|
||||
data='{}',
|
||||
headers={'Content-Type': 'application/json'},
|
||||
stream=False
|
||||
stream=False,
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_push_image_stream(self):
|
||||
|
@ -752,9 +789,10 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/images/test_image/push',
|
||||
'{}',
|
||||
data='{}',
|
||||
headers={'Content-Type': 'application/json'},
|
||||
stream=True
|
||||
stream=True,
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_tag_image(self):
|
||||
|
@ -765,12 +803,12 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/images/e9aa60c60128/tag',
|
||||
None,
|
||||
params={
|
||||
'tag': None,
|
||||
'repo': 'repo',
|
||||
'force': 0
|
||||
}
|
||||
},
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_tag_image_tag(self):
|
||||
|
@ -785,12 +823,12 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/images/e9aa60c60128/tag',
|
||||
None,
|
||||
params={
|
||||
'tag': 'tag',
|
||||
'repo': 'repo',
|
||||
'force': 0
|
||||
}
|
||||
},
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
def test_tag_image_force(self):
|
||||
|
@ -802,12 +840,12 @@ class DockerClientTest(unittest.TestCase):
|
|||
|
||||
fake_request.assert_called_with(
|
||||
'unix://var/run/docker.sock/v1.6/images/e9aa60c60128/tag',
|
||||
None,
|
||||
params={
|
||||
'tag': None,
|
||||
'repo': 'repo',
|
||||
'force': 1
|
||||
}
|
||||
},
|
||||
timeout=docker.client.DEFAULT_TIMEOUT_SECONDS
|
||||
)
|
||||
|
||||
#################
|
||||
|
|
Loading…
Reference in New Issue