mirror of https://github.com/docker/docker-py.git
Merge branch 'delfick-patch-1'
This commit is contained in:
commit
80baee55b6
20
Makefile
20
Makefile
|
@ -11,7 +11,10 @@ build:
|
|||
build-py3:
|
||||
docker build -t docker-py3 -f Dockerfile-py3 .
|
||||
|
||||
test: flake8 unit-test unit-test-py3 integration-dind
|
||||
build-dind-certs:
|
||||
docker build -t dpy-dind-certs -f tests/Dockerfile-dind-certs .
|
||||
|
||||
test: flake8 unit-test unit-test-py3 integration-dind integration-dind-ssl
|
||||
|
||||
unit-test: build
|
||||
docker run docker-py py.test tests/test.py tests/utils_test.py
|
||||
|
@ -26,10 +29,17 @@ integration-test-py3: build-py3
|
|||
docker run -v /var/run/docker.sock:/var/run/docker.sock docker-py3 py.test tests/integration_test.py
|
||||
|
||||
integration-dind: build build-py3
|
||||
docker run -d --name dpy-dind --privileged dockerswarm/dind:1.8.1 docker -d -H tcp://0.0.0.0:2375
|
||||
docker run --env="DOCKER_HOST=tcp://docker:2375" --link=dpy-dind:docker docker-py py.test tests/integration_test.py
|
||||
docker run --env="DOCKER_HOST=tcp://docker:2375" --link=dpy-dind:docker docker-py3 py.test tests/integration_test.py
|
||||
docker run -d --name dpy-dind --env="DOCKER_HOST=tcp://localhost:2375" --privileged dockerswarm/dind:1.8.1 docker -d -H tcp://0.0.0.0:2375
|
||||
docker run --volumes-from dpy-dind --env="DOCKER_HOST=tcp://docker:2375" --link=dpy-dind:docker docker-py py.test tests/integration_test.py
|
||||
docker run --volumes-from dpy-dind --env="DOCKER_HOST=tcp://docker:2375" --link=dpy-dind:docker docker-py3 py.test tests/integration_test.py
|
||||
docker rm -vf dpy-dind
|
||||
|
||||
integration-dind-ssl: build-dind-certs build build-py3
|
||||
docker run -d --name dpy-dind-certs dpy-dind-certs
|
||||
docker run -d --env="DOCKER_HOST=tcp://localhost:2375" --env="DOCKER_TLS_VERIFY=1" --env="DOCKER_CERT_PATH=/certs" --volumes-from dpy-dind-certs --name dpy-dind-ssl -v /tmp --privileged dockerswarm/dind:1.8.1 docker daemon --tlsverify --tlscacert=/certs/ca.pem --tlscert=/certs/server-cert.pem --tlskey=/certs/server-key.pem -H tcp://0.0.0.0:2375
|
||||
docker run --volumes-from dpy-dind-ssl --env="DOCKER_HOST=tcp://docker:2375" --env="DOCKER_TLS_VERIFY=1" --env="DOCKER_CERT_PATH=/certs" --link=dpy-dind-ssl:docker docker-py py.test tests/integration_test.py
|
||||
docker run --volumes-from dpy-dind-ssl --env="DOCKER_HOST=tcp://docker:2375" --env="DOCKER_TLS_VERIFY=1" --env="DOCKER_CERT_PATH=/certs" --link=dpy-dind-ssl:docker docker-py3 py.test tests/integration_test.py
|
||||
docker rm -vf dpy-dind-ssl dpy-dind-certs
|
||||
|
||||
flake8: build
|
||||
docker run docker-py flake8 docker tests
|
||||
docker run docker-py flake8 docker tests
|
||||
|
|
|
@ -188,6 +188,8 @@ class Client(
|
|||
self._raise_for_status(response)
|
||||
if six.PY3:
|
||||
sock = response.raw._fp.fp.raw
|
||||
if self.base_url.startswith("https://"):
|
||||
sock = sock._sock
|
||||
else:
|
||||
sock = response.raw._fp.fp._sock
|
||||
try:
|
||||
|
@ -244,10 +246,7 @@ class Client(
|
|||
# Disable timeout on the underlying socket to prevent
|
||||
# Read timed out(s) for long running processes
|
||||
socket = self._get_raw_response_socket(response)
|
||||
if six.PY3:
|
||||
socket._sock.settimeout(None)
|
||||
else:
|
||||
socket.settimeout(None)
|
||||
self._disable_socket_timeout(socket)
|
||||
|
||||
while True:
|
||||
header = response.raw.read(constants.STREAM_HEADER_SIZE_BYTES)
|
||||
|
@ -276,6 +275,19 @@ class Client(
|
|||
for out in response.iter_content(chunk_size=1, decode_unicode=True):
|
||||
yield out
|
||||
|
||||
def _disable_socket_timeout(self, socket):
|
||||
""" Depending on the combination of python version and whether we're
|
||||
connecting over http or https, we might need to access _sock, which
|
||||
may or may not exist; or we may need to just settimeout on socket
|
||||
itself, which also may or may not have settimeout on it.
|
||||
|
||||
To avoid missing the correct one, we try both.
|
||||
"""
|
||||
if hasattr(socket, "settimeout"):
|
||||
socket.settimeout(None)
|
||||
if hasattr(socket, "_sock") and hasattr(socket._sock, "settimeout"):
|
||||
socket._sock.settimeout(None)
|
||||
|
||||
def _get_result(self, container, stream, res):
|
||||
cont = self.inspect_container(container)
|
||||
return self._get_result_tty(stream, res, cont['Config']['Tty'])
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
[pytest]
|
||||
addopts = --tb=short -rxs
|
||||
addopts = --tb=short -rxs -s
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
FROM python:2.7
|
||||
RUN mkdir /tmp/certs
|
||||
VOLUME /certs
|
||||
|
||||
WORKDIR /tmp/certs
|
||||
RUN openssl genrsa -aes256 -passout pass:foobar -out ca-key.pem 4096
|
||||
RUN echo "[req]\nprompt=no\ndistinguished_name = req_distinguished_name\n[req_distinguished_name]\ncountryName=AU" > /tmp/config
|
||||
RUN openssl req -new -x509 -passin pass:foobar -config /tmp/config -days 365 -key ca-key.pem -sha256 -out ca.pem
|
||||
RUN openssl genrsa -out server-key.pem -passout pass:foobar 4096
|
||||
RUN openssl req -subj "/CN=docker" -sha256 -new -key server-key.pem -out server.csr
|
||||
RUN echo subjectAltName = DNS:docker,DNS:localhost > extfile.cnf
|
||||
RUN openssl x509 -req -days 365 -passin pass:foobar -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
|
||||
RUN openssl genrsa -out key.pem 4096
|
||||
RUN openssl req -passin pass:foobar -subj '/CN=client' -new -key key.pem -out client.csr
|
||||
RUN echo extendedKeyUsage = clientAuth > extfile.cnf
|
||||
RUN openssl x509 -req -passin pass:foobar -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
|
||||
RUN chmod -v 0400 ca-key.pem key.pem server-key.pem
|
||||
RUN chmod -v 0444 ca.pem server-cert.pem cert.pem
|
||||
|
||||
CMD cp -R /tmp/certs/* /certs && while true; do sleep 1; done
|
|
@ -14,6 +14,7 @@
|
|||
|
||||
import base64
|
||||
import contextlib
|
||||
import errno
|
||||
import json
|
||||
import io
|
||||
import os
|
||||
|
@ -21,6 +22,7 @@ import random
|
|||
import shutil
|
||||
import signal
|
||||
import socket
|
||||
import struct
|
||||
import tarfile
|
||||
import tempfile
|
||||
import threading
|
||||
|
@ -76,7 +78,17 @@ def setup_module():
|
|||
try:
|
||||
c.inspect_image(BUSYBOX)
|
||||
except NotFound:
|
||||
c.pull(BUSYBOX)
|
||||
os.write(2, "\npulling busybox\n".encode('utf-8'))
|
||||
for data in c.pull('busybox', stream=True):
|
||||
data = json.loads(data.decode('utf-8'))
|
||||
os.write(2, ("%c[2K\r" % 27).encode('utf-8'))
|
||||
status = data.get("status")
|
||||
progress = data.get("progress")
|
||||
detail = "{0} - {1}".format(status, progress).encode('utf-8')
|
||||
os.write(2, detail)
|
||||
os.write(2, "\npulled busybox\n".encode('utf-8'))
|
||||
|
||||
# Double make sure we now have busybox
|
||||
c.inspect_image(BUSYBOX)
|
||||
c.close()
|
||||
|
||||
|
@ -887,7 +899,6 @@ class TestContainerTop(BaseTestCase):
|
|||
|
||||
self.client.start(container)
|
||||
res = self.client.top(container['Id'])
|
||||
print(res)
|
||||
self.assertEqual(
|
||||
res['Titles'],
|
||||
['UID', 'PID', 'PPID', 'C', 'STIME', 'TTY', 'TIME', 'CMD']
|
||||
|
@ -1213,6 +1224,64 @@ class TestRunContainerStreaming(BaseTestCase):
|
|||
self.assertTrue(sock.fileno() > -1)
|
||||
|
||||
|
||||
class TestRunContainerReadingSocket(BaseTestCase):
|
||||
def runTest(self):
|
||||
line = 'hi there and stuff and things, words!'
|
||||
command = "echo '{0}'".format(line)
|
||||
container = self.client.create_container(BUSYBOX, command,
|
||||
detach=True, tty=False)
|
||||
ident = container['Id']
|
||||
self.tmp_containers.append(ident)
|
||||
|
||||
opts = {"stdout": 1, "stream": 1, "logs": 1}
|
||||
pty_stdout = self.client.attach_socket(ident, opts)
|
||||
self.client.start(ident)
|
||||
|
||||
recoverable_errors = (errno.EINTR, errno.EDEADLK, errno.EWOULDBLOCK)
|
||||
|
||||
def read(n=4096):
|
||||
"""Code stolen from dockerpty to read the socket"""
|
||||
try:
|
||||
if hasattr(pty_stdout, 'recv'):
|
||||
return pty_stdout.recv(n)
|
||||
return os.read(pty_stdout.fileno(), n)
|
||||
except EnvironmentError as e:
|
||||
if e.errno not in recoverable_errors:
|
||||
raise
|
||||
|
||||
def next_packet_size():
|
||||
"""Code stolen from dockerpty to get the next packet size"""
|
||||
data = six.binary_type()
|
||||
while len(data) < 8:
|
||||
next_data = read(8 - len(data))
|
||||
if not next_data:
|
||||
return 0
|
||||
data = data + next_data
|
||||
|
||||
if data is None:
|
||||
return 0
|
||||
|
||||
if len(data) == 8:
|
||||
_, actual = struct.unpack('>BxxxL', data)
|
||||
return actual
|
||||
|
||||
next_size = next_packet_size()
|
||||
self.assertEqual(next_size, len(line)+1)
|
||||
|
||||
data = six.binary_type()
|
||||
while len(data) < next_size:
|
||||
next_data = read(next_size - len(data))
|
||||
if not next_data:
|
||||
assert False, "Failed trying to read in the dataz"
|
||||
data += next_data
|
||||
self.assertEqual(data.decode('utf-8'), "{0}\n".format(line))
|
||||
pty_stdout.close()
|
||||
|
||||
# Prevent segfault at the end of the test run
|
||||
if hasattr(pty_stdout, "_response"):
|
||||
del pty_stdout._response
|
||||
|
||||
|
||||
class TestPauseUnpauseContainer(BaseTestCase):
|
||||
def runTest(self):
|
||||
container = self.client.create_container(BUSYBOX, ['sleep', '9999'])
|
||||
|
|
Loading…
Reference in New Issue