mirror of
				https://github.com/thib8956/nginx-proxy
				synced 2025-11-03 18:49:20 +00:00 
			
		
		
		
	chore(ci): ⬆️ porting python 2.7 code to python 3.9
This commit is contained in:
		
				
					committed by
					
						
						Nicolas Duchon
					
				
			
			
				
	
			
			
			
						parent
						
							fe79dd4cd3
						
					
				
				
					commit
					950a28f5ea
				
			@@ -1,4 +1,3 @@
 | 
			
		||||
from __future__ import print_function
 | 
			
		||||
import contextlib
 | 
			
		||||
import logging
 | 
			
		||||
import os
 | 
			
		||||
@@ -142,7 +141,7 @@ def container_ip(container):
 | 
			
		||||
            return net_info["bridge"]["IPAddress"]
 | 
			
		||||
 | 
			
		||||
        # not default bridge network, fallback on first network defined
 | 
			
		||||
        network_name = net_info.keys()[0]
 | 
			
		||||
        network_name = list(net_info.keys())[0]
 | 
			
		||||
        return net_info[network_name]["IPAddress"]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -155,7 +154,7 @@ def container_ipv6(container):
 | 
			
		||||
        return net_info["bridge"]["GlobalIPv6Address"]
 | 
			
		||||
 | 
			
		||||
    # not default bridge network, fallback on first network defined
 | 
			
		||||
    network_name = net_info.keys()[0]
 | 
			
		||||
    network_name = list(net_info.keys())[0]
 | 
			
		||||
    return net_info[network_name]["GlobalIPv6Address"]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -188,7 +187,7 @@ def docker_container_dns_resolver(domain_name):
 | 
			
		||||
    log = logging.getLogger('DNS')
 | 
			
		||||
    log.debug("docker_container_dns_resolver(%r)" % domain_name)
 | 
			
		||||
 | 
			
		||||
    match = re.search('(^|.+\.)(?P<container>[^.]+)\.container\.docker$', domain_name)
 | 
			
		||||
    match = re.search(r'(^|.+\.)(?P<container>[^.]+)\.container\.docker$', domain_name)
 | 
			
		||||
    if not match:
 | 
			
		||||
        log.debug("%r does not match" % domain_name)
 | 
			
		||||
        return
 | 
			
		||||
@@ -253,9 +252,12 @@ def get_nginx_conf_from_container(container):
 | 
			
		||||
    return the nginx /etc/nginx/conf.d/default.conf file content from a container
 | 
			
		||||
    """
 | 
			
		||||
    import tarfile
 | 
			
		||||
    from cStringIO import StringIO
 | 
			
		||||
    strm, stat = container.get_archive('/etc/nginx/conf.d/default.conf')
 | 
			
		||||
    with tarfile.open(fileobj=StringIO(strm.read())) as tf:
 | 
			
		||||
    from io import BytesIO
 | 
			
		||||
 | 
			
		||||
    strm_generator, stat = container.get_archive('/etc/nginx/conf.d/default.conf')
 | 
			
		||||
    strm_fileobj = BytesIO(b"".join(strm_generator))
 | 
			
		||||
 | 
			
		||||
    with tarfile.open(fileobj=strm_fileobj) as tf:
 | 
			
		||||
        conffile = tf.extractfile('default.conf')
 | 
			
		||||
        return conffile.read()
 | 
			
		||||
 | 
			
		||||
@@ -264,7 +266,7 @@ def docker_compose_up(compose_file='docker-compose.yml'):
 | 
			
		||||
    logging.info('docker-compose -f %s up -d' % compose_file)
 | 
			
		||||
    try:
 | 
			
		||||
        subprocess.check_output(shlex.split('docker-compose -f %s up -d' % compose_file), stderr=subprocess.STDOUT)
 | 
			
		||||
    except subprocess.CalledProcessError, e:
 | 
			
		||||
    except subprocess.CalledProcessError as e:
 | 
			
		||||
        pytest.fail("Error while runninng 'docker-compose -f %s up -d':\n%s" % (compose_file, e.output), pytrace=False)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -272,7 +274,7 @@ def docker_compose_down(compose_file='docker-compose.yml'):
 | 
			
		||||
    logging.info('docker-compose -f %s down' % compose_file)
 | 
			
		||||
    try:
 | 
			
		||||
        subprocess.check_output(shlex.split('docker-compose -f %s down' % compose_file), stderr=subprocess.STDOUT)
 | 
			
		||||
    except subprocess.CalledProcessError, e:
 | 
			
		||||
    except subprocess.CalledProcessError as e:
 | 
			
		||||
        pytest.fail("Error while runninng 'docker-compose -f %s down':\n%s" % (compose_file, e.output), pytrace=False)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -286,7 +288,7 @@ def wait_for_nginxproxy_to_be_ready():
 | 
			
		||||
        return
 | 
			
		||||
    container = containers[0]
 | 
			
		||||
    for line in container.logs(stream=True):
 | 
			
		||||
        if "Watching docker events" in line:
 | 
			
		||||
        if b"Watching docker events" in line:
 | 
			
		||||
            logging.debug("nginx-proxy ready")
 | 
			
		||||
            break
 | 
			
		||||
 | 
			
		||||
@@ -337,7 +339,7 @@ def connect_to_network(network):
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        # figure out our container networks
 | 
			
		||||
        my_networks = my_container.attrs["NetworkSettings"]["Networks"].keys()
 | 
			
		||||
        my_networks = list(my_container.attrs["NetworkSettings"]["Networks"].keys())
 | 
			
		||||
 | 
			
		||||
        # make sure our container is connected to the nginx-proxy's network
 | 
			
		||||
        if network not in my_networks:
 | 
			
		||||
@@ -360,7 +362,7 @@ def disconnect_from_network(network=None):
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        # figure out our container networks
 | 
			
		||||
        my_networks_names = my_container.attrs["NetworkSettings"]["Networks"].keys()
 | 
			
		||||
        my_networks_names = list(my_container.attrs["NetworkSettings"]["Networks"].keys())
 | 
			
		||||
 | 
			
		||||
        # disconnect our container from the given network
 | 
			
		||||
        if network.name in my_networks_names:
 | 
			
		||||
@@ -378,7 +380,7 @@ def connect_to_all_networks():
 | 
			
		||||
        return []
 | 
			
		||||
    else:
 | 
			
		||||
        # find the list of docker networks
 | 
			
		||||
        networks = filter(lambda network: len(network.containers) > 0 and network.name != 'bridge', docker_client.networks.list())
 | 
			
		||||
        networks = [network for network in docker_client.networks.list() if len(network.containers) > 0 and network.name != 'bridge']
 | 
			
		||||
        return [connect_to_network(network) for network in networks]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -388,7 +390,7 @@ def connect_to_all_networks():
 | 
			
		||||
# 
 | 
			
		||||
###############################################################################
 | 
			
		||||
 | 
			
		||||
@pytest.yield_fixture(scope="module")
 | 
			
		||||
@pytest.fixture(scope="module")
 | 
			
		||||
def docker_compose(request):
 | 
			
		||||
    """
 | 
			
		||||
    pytest fixture providing containers described in a docker compose file. After the tests, remove the created containers
 | 
			
		||||
@@ -412,7 +414,7 @@ def docker_compose(request):
 | 
			
		||||
    restore_urllib_dns_resolver(original_dns_resolver)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.yield_fixture()
 | 
			
		||||
@pytest.fixture()
 | 
			
		||||
def nginxproxy():
 | 
			
		||||
    """
 | 
			
		||||
    Provides the `nginxproxy` object that can be used in the same way the requests module is:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
FROM python:2.7-alpine
 | 
			
		||||
FROM python:3.9-alpine
 | 
			
		||||
 | 
			
		||||
# Note: we're using alpine because it has openssl 1.0.2, which we need for testing
 | 
			
		||||
RUN apk add --update bash openssl curl && rm -rf /var/cache/apk/*
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@ script_dir = os.path.dirname(__file__)
 | 
			
		||||
pytestmark = pytest.mark.xfail()  # TODO delete this marker once those issues are fixed
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.yield_fixture(scope="module", autouse=True)
 | 
			
		||||
@pytest.fixture(scope="module", autouse=True)
 | 
			
		||||
def certs():
 | 
			
		||||
    """
 | 
			
		||||
    pytest fixture that provides cert and key files into the tmp_certs directory
 | 
			
		||||
@@ -43,7 +43,7 @@ def test_http_web_is_301(docker_compose, nginxproxy):
 | 
			
		||||
def test_https_web_is_200(docker_compose, nginxproxy):
 | 
			
		||||
    r = nginxproxy.get("https://web.nginx-proxy/port")
 | 
			
		||||
    assert r.status_code == 200
 | 
			
		||||
    assert 'answer from port 81\n' in r.text
 | 
			
		||||
    assert "answer from port 81\n" in r.text
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.incremental
 | 
			
		||||
 
 | 
			
		||||
@@ -19,4 +19,4 @@ def test_custom_conf_does_not_apply_to_web2(docker_compose, nginxproxy):
 | 
			
		||||
    assert "X-test" not in r.headers
 | 
			
		||||
 | 
			
		||||
def test_custom_block_is_present_in_nginx_generated_conf(docker_compose, nginxproxy):
 | 
			
		||||
    assert "include /etc/nginx/vhost.d/web1.nginx-proxy.local_location;" in nginxproxy.get_conf()
 | 
			
		||||
    assert b"include /etc/nginx/vhost.d/web1.nginx-proxy.local_location;" in nginxproxy.get_conf()
 | 
			
		||||
@@ -4,7 +4,7 @@ import logging
 | 
			
		||||
import pytest
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.yield_fixture(scope="module")
 | 
			
		||||
@pytest.fixture(scope="module")
 | 
			
		||||
def nginx_tmpl():
 | 
			
		||||
    """
 | 
			
		||||
    pytest fixture which extracts the the nginx config template from
 | 
			
		||||
@@ -13,14 +13,18 @@ def nginx_tmpl():
 | 
			
		||||
    script_dir = os.path.dirname(__file__)
 | 
			
		||||
    logging.info("extracting nginx.tmpl from nginxproxy/nginx-proxy:test")
 | 
			
		||||
    docker_client = docker.from_env()
 | 
			
		||||
    print(docker_client.containers.run(
 | 
			
		||||
        image='nginxproxy/nginx-proxy:test',
 | 
			
		||||
        remove=True,
 | 
			
		||||
        volumes=['{current_dir}:{current_dir}'.format(current_dir=script_dir)],
 | 
			
		||||
        entrypoint='sh',
 | 
			
		||||
        command='-xc "cp /app/nginx.tmpl {current_dir} && chmod 777 {current_dir}/nginx.tmpl"'.format(
 | 
			
		||||
            current_dir=script_dir),
 | 
			
		||||
        stderr=True))
 | 
			
		||||
    print(
 | 
			
		||||
        docker_client.containers.run(
 | 
			
		||||
            image="nginxproxy/nginx-proxy:test",
 | 
			
		||||
            remove=True,
 | 
			
		||||
            volumes=["{current_dir}:{current_dir}".format(current_dir=script_dir)],
 | 
			
		||||
            entrypoint="sh",
 | 
			
		||||
            command='-xc "cp /app/nginx.tmpl {current_dir} && chmod 777 {current_dir}/nginx.tmpl"'.format(
 | 
			
		||||
                current_dir=script_dir
 | 
			
		||||
            ),
 | 
			
		||||
            stderr=True,
 | 
			
		||||
        )
 | 
			
		||||
    )
 | 
			
		||||
    yield
 | 
			
		||||
    logging.info("removing nginx.tmpl")
 | 
			
		||||
    os.remove(os.path.join(script_dir, "nginx.tmpl"))
 | 
			
		||||
 
 | 
			
		||||
@@ -18,16 +18,18 @@ def versiontuple(v):
 | 
			
		||||
    >>> versiontuple("17.03.0-ce") < (1, 13)
 | 
			
		||||
    False
 | 
			
		||||
    """
 | 
			
		||||
    return tuple(map(int, (v.split('-')[0].split("."))))
 | 
			
		||||
    return tuple(map(int, (v.split("-")[0].split("."))))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
raw_version = docker.from_env().version()['Version']
 | 
			
		||||
raw_version = docker.from_env().version()["Version"]
 | 
			
		||||
pytestmark = pytest.mark.skipif(
 | 
			
		||||
    versiontuple(raw_version) < (1, 13),
 | 
			
		||||
    reason="Docker compose syntax v3 requires docker engine v1.13 or later (got %s)" % raw_version)
 | 
			
		||||
    reason="Docker compose syntax v3 requires docker engine v1.13 or later (got %s)"
 | 
			
		||||
    % raw_version,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.yield_fixture(scope="module")
 | 
			
		||||
@pytest.fixture(scope="module")
 | 
			
		||||
def nginx_tmpl():
 | 
			
		||||
    """
 | 
			
		||||
    pytest fixture which extracts the the nginx config template from
 | 
			
		||||
@@ -36,14 +38,18 @@ def nginx_tmpl():
 | 
			
		||||
    script_dir = os.path.dirname(__file__)
 | 
			
		||||
    logging.info("extracting nginx.tmpl from nginxproxy/nginx-proxy:test")
 | 
			
		||||
    docker_client = docker.from_env()
 | 
			
		||||
    print(docker_client.containers.run(
 | 
			
		||||
        image='nginxproxy/nginx-proxy:test',
 | 
			
		||||
        remove=True,
 | 
			
		||||
        volumes=['{current_dir}:{current_dir}'.format(current_dir=script_dir)],
 | 
			
		||||
        entrypoint='sh',
 | 
			
		||||
        command='-xc "cp /app/nginx.tmpl {current_dir} && chmod 777 {current_dir}/nginx.tmpl"'.format(
 | 
			
		||||
            current_dir=script_dir),
 | 
			
		||||
        stderr=True))
 | 
			
		||||
    print(
 | 
			
		||||
        docker_client.containers.run(
 | 
			
		||||
            image="nginxproxy/nginx-proxy:test",
 | 
			
		||||
            remove=True,
 | 
			
		||||
            volumes=["{current_dir}:{current_dir}".format(current_dir=script_dir)],
 | 
			
		||||
            entrypoint="sh",
 | 
			
		||||
            command='-xc "cp /app/nginx.tmpl {current_dir} && chmod 777 {current_dir}/nginx.tmpl"'.format(
 | 
			
		||||
                current_dir=script_dir
 | 
			
		||||
            ),
 | 
			
		||||
            stderr=True,
 | 
			
		||||
        )
 | 
			
		||||
    )
 | 
			
		||||
    yield
 | 
			
		||||
    logging.info("removing nginx.tmpl")
 | 
			
		||||
    os.remove(os.path.join(script_dir, "nginx.tmpl"))
 | 
			
		||||
@@ -61,6 +67,6 @@ def test_forwards_to_whoami(nginx_tmpl, docker_compose, nginxproxy):
 | 
			
		||||
    assert r.text == "I'm %s\n" % whoami_container.id[:12]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
    import doctest
 | 
			
		||||
    doctest.testmod()
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@ import pytest
 | 
			
		||||
from docker.errors import NotFound
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.yield_fixture()
 | 
			
		||||
@pytest.fixture()
 | 
			
		||||
def web1(docker_compose):
 | 
			
		||||
    """
 | 
			
		||||
    pytest fixture creating a web container with `VIRTUAL_HOST=web1.nginx-proxy` listening on port 81.
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,7 @@ def assert_log_contains(expected_log_line):
 | 
			
		||||
    """
 | 
			
		||||
    sut_container = docker_client.containers.get("nginxproxy")
 | 
			
		||||
    docker_logs = sut_container.logs(stdout=True, stderr=True, stream=False, follow=False)
 | 
			
		||||
    assert expected_log_line in docker_logs
 | 
			
		||||
    assert bytes(expected_log_line, encoding="utf8") in docker_logs
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def require_openssl(required_version):
 | 
			
		||||
@@ -42,7 +42,7 @@ def require_openssl(required_version):
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    def versiontuple(v):
 | 
			
		||||
        clean_v = re.sub("[^\d\.]", "", v)
 | 
			
		||||
        clean_v = re.sub(r"[^\d\.]", "", v)
 | 
			
		||||
        return tuple(map(int, (clean_v.split("."))))
 | 
			
		||||
 | 
			
		||||
    try:
 | 
			
		||||
@@ -52,7 +52,7 @@ def require_openssl(required_version):
 | 
			
		||||
    else:
 | 
			
		||||
        if not command_output:
 | 
			
		||||
            raise Exception("Could not get openssl version")
 | 
			
		||||
        openssl_version = command_output.split()[1]
 | 
			
		||||
        openssl_version = str(command_output.split()[1])
 | 
			
		||||
        return pytest.mark.skipif(
 | 
			
		||||
            versiontuple(openssl_version) < versiontuple(required_version),
 | 
			
		||||
            reason="openssl v%s is less than required version %s" % (openssl_version, required_version))
 | 
			
		||||
@@ -71,8 +71,8 @@ def test_dhparam_is_not_generated_if_present(docker_compose):
 | 
			
		||||
    assert_log_contains("Custom dhparam.pem file found, generation skipped")
 | 
			
		||||
 | 
			
		||||
    # Make sure the dhparam in use is not the default, pre-generated one
 | 
			
		||||
    default_checksum = sut_container.exec_run("md5sum /app/dhparam.pem.default").split()
 | 
			
		||||
    current_checksum = sut_container.exec_run("md5sum /etc/nginx/dhparam/dhparam.pem").split()
 | 
			
		||||
    default_checksum = sut_container.exec_run("md5sum /app/dhparam.pem.default").output.split()
 | 
			
		||||
    current_checksum = sut_container.exec_run("md5sum /etc/nginx/dhparam/dhparam.pem").output.split()
 | 
			
		||||
    assert default_checksum[0] != current_checksum[0]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -89,5 +89,5 @@ def test_web5_dhparam_is_used(docker_compose):
 | 
			
		||||
 | 
			
		||||
    host = "%s:443" % sut_container.attrs["NetworkSettings"]["IPAddress"]
 | 
			
		||||
    r = subprocess.check_output(
 | 
			
		||||
        "echo '' | openssl s_client -connect %s -cipher 'EDH' | grep 'Server Temp Key'" % host, shell=True)
 | 
			
		||||
    assert "Server Temp Key: X25519, 253 bits\n" == r
 | 
			
		||||
        f"echo '' | openssl s_client -connect {host} -cipher 'EDH' | grep 'Server Temp Key'", shell=True)
 | 
			
		||||
    assert b"Server Temp Key: X25519, 253 bits\n" == r
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ def assert_log_contains(expected_log_line):
 | 
			
		||||
    """
 | 
			
		||||
    sut_container = docker_client.containers.get("nginxproxy")
 | 
			
		||||
    docker_logs = sut_container.logs(stdout=True, stderr=True, stream=False, follow=False)
 | 
			
		||||
    assert expected_log_line in docker_logs
 | 
			
		||||
    assert bytes(expected_log_line, encoding="utf8") in docker_logs
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
###############################################################################
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
import pytest
 | 
			
		||||
from backports.ssl_match_hostname import CertificateError
 | 
			
		||||
from ssl import CertificateError
 | 
			
		||||
from requests.exceptions import SSLError
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user