From 38d69a6ecdb38f1747313e3a25c769fdc4943d1a Mon Sep 17 00:00:00 2001 From: David Wilson Date: Sun, 24 Jun 2018 01:55:35 +0100 Subject: [PATCH] issue #275: tests: drop docker client dep, doesn't run on 2.6. --- dev_requirements.txt | 2 - tests/show_docker_hostname.py | 5 +-- tests/testlib.py | 74 ++++++++++++++++++++++++----------- 3 files changed, 53 insertions(+), 28 deletions(-) diff --git a/dev_requirements.txt b/dev_requirements.txt index c8b6af13..a55be0de 100644 --- a/dev_requirements.txt +++ b/dev_requirements.txt @@ -4,8 +4,6 @@ coverage==4.5.1 Django==1.6.11; python_version < '2.7' Django==1.11.5; python_version >= '2.7' # for module_finder_test debops==0.7.2 -https://github.com/docker/docker-py/archive/1.10.6.tar.gz; python_version < '2.7' -docker[tls]==2.5.1; python_version >= '2.7' mock==2.0.0 pytest-catchlog==1.2.2 pytest==3.1.2 diff --git a/tests/show_docker_hostname.py b/tests/show_docker_hostname.py index 1dc1cb98..d4326f92 100644 --- a/tests/show_docker_hostname.py +++ b/tests/show_docker_hostname.py @@ -5,8 +5,5 @@ For use by the Travis scripts, just print out the hostname of the Docker daemon from the environment. """ -import docker import testlib - -docker = docker.from_env(version='auto') -print testlib.get_docker_host(docker) +print testlib.get_docker_host() diff --git a/tests/testlib.py b/tests/testlib.py index 28316ba9..56f2e232 100644 --- a/tests/testlib.py +++ b/tests/testlib.py @@ -5,6 +5,7 @@ import os import random import re import socket +import subprocess import sys import time import urlparse @@ -15,9 +16,6 @@ import mitogen.core import mitogen.master import mitogen.utils -if mitogen.is_master: # TODO: shouldn't be necessary. - import docker - DATA_DIR = os.path.join(os.path.dirname(__file__), 'data') sys.path.append(DATA_DIR) @@ -34,6 +32,19 @@ def data_path(suffix): return path +def subprocess__check_output(*popenargs, **kwargs): + # Missing from 2.6. + process = subprocess.Popen(stdout=subprocess.PIPE, *popenargs, **kwargs) + output, _ = process.communicate() + retcode = process.poll() + if retcode: + cmd = kwargs.get("args") + if cmd is None: + cmd = popenargs[0] + raise subprocess.CalledProcessError(retcode, cmd, output=output) + return output + + def wait_for_port( host, port, @@ -162,11 +173,12 @@ class TestCase(unittest2.TestCase): assert 0, '%r did not raise %r' % (func, exc) -def get_docker_host(docker): - if docker.api.base_url == 'http+docker://localunixsocket': +def get_docker_host(): + url = os.environ.get('DOCKER_HOST') + if url in (None, 'http+docker://localunixsocket'): return 'localhost' - parsed = urlparse.urlparse(docker.api.base_url) + parsed = urlparse.urlparse(url) return parsed.netloc.partition(':')[0] @@ -179,29 +191,47 @@ class DockerizedSshDaemon(object): self.image = 'mitogen/%s-test' % (distro,) return self.image - def __init__(self): - self.docker = docker.from_env(version='auto') - self.container_name = 'mitogen-test-%08x' % (random.getrandbits(64),) - self.container = self.docker.containers.run( - image=self.get_image(), - detach=True, - privileged=True, - publish_all_ports=True, - ) - self.container.reload() - self.port = (self.container.attrs['NetworkSettings']['Ports'] - ['22/tcp'][0]['HostPort']) + # 22/tcp -> 0.0.0.0:32771 + PORT_RE = re.compile(r'([^/]+)/([^ ]+) -> ([^:]+):(.*)') + port = None + + def _get_container_port(self): + s = subprocess__check_output(['docker', 'port', self.container_name]) + for line in s.splitlines(): + dport, proto, baddr, bport = self.PORT_RE.match(line).groups() + if dport == '22' and proto == 'tcp': + self.port = int(bport) + self.host = self.get_host() + if self.port is None: + raise ValueError('could not find SSH port in: %r' % (s,)) + + def start_container(self): + self.container_name = 'mitogen-test-%08x' % (random.getrandbits(64),) + args = [ + 'docker', + 'run', + '--detach', + '--privileged', + '--publish-all', + '--name', self.container_name, + self.get_image() + ] + subprocess__check_output(args) + self._get_container_port() + + def __init__(self): + self.start_container() def get_host(self): - return get_docker_host(self.docker) + return get_docker_host() def wait_for_sshd(self): - wait_for_port(self.get_host(), int(self.port), pattern='OpenSSH') + wait_for_port(self.get_host(), self.port, pattern='OpenSSH') def close(self): - self.container.stop() - self.container.remove() + args = ['docker', 'rm', '-f', self.container_name] + subprocess__check_output(args) class BrokerMixin(object):