mirror of
https://github.com/thib8956/nginx-proxy
synced 2025-08-23 16:01:57 +00:00
Merge pull request #2625 from nginx-proxy/test/wait-for-docker-gen
test: fix docker-gen tests flakyness
This commit is contained in:
1
.github/workflows/test.yml
vendored
1
.github/workflows/test.yml
vendored
@@ -21,6 +21,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
base_docker_image: [alpine, debian]
|
base_docker_image: [alpine, debian]
|
||||||
|
fail-fast: false
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
@@ -199,26 +199,48 @@ def container_ipv6(container: Container) -> str:
|
|||||||
def nginx_proxy_dns_resolver(domain_name: str) -> Optional[str]:
|
def nginx_proxy_dns_resolver(domain_name: str) -> Optional[str]:
|
||||||
"""
|
"""
|
||||||
if "nginx-proxy" if found in host, return the ip address of the docker container
|
if "nginx-proxy" if found in host, return the ip address of the docker container
|
||||||
issued from the docker image nginxproxy/nginx-proxy:test.
|
issued from the docker image nginxproxy/nginx-proxy:test or nginx:latest.
|
||||||
|
|
||||||
:return: IP or None
|
:return: IP or None
|
||||||
"""
|
"""
|
||||||
log = logging.getLogger('DNS')
|
log = logging.getLogger('DNS')
|
||||||
log.debug(f"nginx_proxy_dns_resolver({domain_name!r})")
|
log.debug(f"nginx_proxy_dns_resolver({domain_name!r})")
|
||||||
|
|
||||||
if 'nginx-proxy' in domain_name:
|
if 'nginx-proxy' in domain_name:
|
||||||
nginxproxy_containers = docker_client.containers.list(filters={"status": "running", "ancestor": "nginxproxy/nginx-proxy:test"})
|
nginxproxy_containers = docker_client.containers.list(filters={"status": "running", "ancestor": "nginxproxy/nginx-proxy:test"})
|
||||||
if len(nginxproxy_containers) == 0:
|
nginx_containers = docker_client.containers.list(filters={"status": "running", "ancestor": "nginx:latest"})
|
||||||
log.warning(f"no container found from image nginxproxy/nginx-proxy:test while resolving {domain_name!r}")
|
|
||||||
|
if len(nginxproxy_containers) == 0 and len(nginx_containers) == 0:
|
||||||
|
log.warning(f"no running container found from image nginxproxy/nginx-proxy:test or nginx:latest while resolving {domain_name!r}")
|
||||||
|
|
||||||
exited_nginxproxy_containers = docker_client.containers.list(filters={"status": "exited", "ancestor": "nginxproxy/nginx-proxy:test"})
|
exited_nginxproxy_containers = docker_client.containers.list(filters={"status": "exited", "ancestor": "nginxproxy/nginx-proxy:test"})
|
||||||
|
exited_nginx_containers = docker_client.containers.list(filters={"status": "exited", "ancestor": "nginx:latest"})
|
||||||
|
|
||||||
if len(exited_nginxproxy_containers) > 0:
|
if len(exited_nginxproxy_containers) > 0:
|
||||||
exited_nginxproxy_container_logs = exited_nginxproxy_containers[0].logs()
|
exited_nginxproxy_container_logs = exited_nginxproxy_containers[0].logs()
|
||||||
log.warning(f"nginxproxy/nginx-proxy:test container might have exited unexpectedly. Container logs: " + "\n" + exited_nginxproxy_container_logs.decode())
|
log.warning(f"nginxproxy/nginx-proxy:test container might have exited unexpectedly. Container logs: " + "\n" + exited_nginxproxy_container_logs.decode())
|
||||||
|
if len(exited_nginx_containers) > 0:
|
||||||
|
exited_nginx_container_logs = exited_nginx_containers[0].logs()
|
||||||
|
log.warning(f"nginx:latest container might have exited unexpectedly. Container logs: " + "\n" + exited_nginx_container_logs.decode())
|
||||||
|
|
||||||
return None
|
return None
|
||||||
nginxproxy_container = nginxproxy_containers[0]
|
|
||||||
ip = container_ip(nginxproxy_container)
|
container = None
|
||||||
log.info(f"resolving domain name {domain_name!r} as IP address {ip} of nginx-proxy container {nginxproxy_container.name}")
|
container_type = "nginx-proxy"
|
||||||
|
|
||||||
|
if len(nginxproxy_containers) >= 1:
|
||||||
|
container = nginxproxy_containers[0]
|
||||||
|
if len(nginx_containers) >= 1:
|
||||||
|
container = nginx_containers[0]
|
||||||
|
container_type = "nginx"
|
||||||
|
|
||||||
|
ip = container_ip(container)
|
||||||
|
log.info(f"resolving domain name {domain_name!r} as IP address {ip} of {container_type} container {container.name}")
|
||||||
return ip
|
return ip
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
def docker_container_dns_resolver(domain_name: str) -> Optional[str]:
|
def docker_container_dns_resolver(domain_name: str) -> Optional[str]:
|
||||||
"""
|
"""
|
||||||
if domain name is of the form "XXX.container.docker" or "anything.XXX.container.docker",
|
if domain name is of the form "XXX.container.docker" or "anything.XXX.container.docker",
|
||||||
@@ -348,17 +370,20 @@ def docker_compose_down(compose_files: List[str], project_name: str):
|
|||||||
|
|
||||||
def wait_for_nginxproxy_to_be_ready():
|
def wait_for_nginxproxy_to_be_ready():
|
||||||
"""
|
"""
|
||||||
If one (and only one) container started from image nginxproxy/nginx-proxy:test is found,
|
Wait for logs of running containers started from image nginxproxy/nginx-proxy:test and/or
|
||||||
wait for its log to contain substring "Watching docker events"
|
nginxproxy/docker-gen:latest to contain the substring "Watching docker events"
|
||||||
"""
|
"""
|
||||||
containers = docker_client.containers.list(filters={"ancestor": "nginxproxy/nginx-proxy:test"})
|
nginx_proxy_containers = docker_client.containers.list(filters={"status": "running", "ancestor": "nginxproxy/nginx-proxy:test"})
|
||||||
if len(containers) != 1:
|
docker_gen_containers = docker_client.containers.list(filters={"status": "running", "ancestor": "nginxproxy/docker-gen:latest"})
|
||||||
return
|
|
||||||
container = containers[0]
|
containers = nginx_proxy_containers + docker_gen_containers
|
||||||
for line in container.logs(stream=True):
|
|
||||||
if b"Watching docker events" in line:
|
for container in containers:
|
||||||
logging.debug("nginx-proxy ready")
|
logging.debug(f"waiting for container {container.name} to be ready")
|
||||||
break
|
for line in container.logs(stream=True):
|
||||||
|
if b"Watching docker events" in line:
|
||||||
|
logging.debug(f"{container.name} ready")
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
|
@@ -27,4 +27,4 @@ services:
|
|||||||
- "80"
|
- "80"
|
||||||
environment:
|
environment:
|
||||||
WEB_PORTS: "80"
|
WEB_PORTS: "80"
|
||||||
VIRTUAL_HOST: whoami.nginx.container.docker
|
VIRTUAL_HOST: whoami.nginx-proxy.tld
|
||||||
|
@@ -1,27 +1,10 @@
|
|||||||
import docker
|
|
||||||
import pytest
|
|
||||||
from packaging.version import Version
|
|
||||||
|
|
||||||
|
|
||||||
raw_version = docker.from_env().version()["Version"]
|
|
||||||
pytestmark = pytest.mark.skipif(
|
|
||||||
Version(raw_version) < Version("1.13"),
|
|
||||||
reason="Docker compose syntax v3 requires docker engine v1.13 or later (got {raw_version})"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def test_unknown_virtual_host_is_503(docker_compose, nginxproxy):
|
def test_unknown_virtual_host_is_503(docker_compose, nginxproxy):
|
||||||
r = nginxproxy.get("http://unknown.nginx.container.docker/")
|
r = nginxproxy.get("http://unknown.nginx-proxy.tld/")
|
||||||
assert r.status_code == 503
|
assert r.status_code == 503
|
||||||
|
|
||||||
|
|
||||||
def test_forwards_to_whoami(docker_compose, nginxproxy):
|
def test_forwards_to_whoami(docker_compose, nginxproxy):
|
||||||
r = nginxproxy.get("http://whoami.nginx.container.docker/")
|
r = nginxproxy.get("http://whoami.nginx-proxy.tld/")
|
||||||
assert r.status_code == 200
|
assert r.status_code == 200
|
||||||
whoami_container = docker_compose.containers.get("whoami")
|
whoami_container = docker_compose.containers.get("whoami")
|
||||||
assert r.text == f"I'm {whoami_container.id[:12]}\n"
|
assert r.text == f"I'm {whoami_container.id[:12]}\n"
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
import doctest
|
|
||||||
doctest.testmod()
|
|
||||||
|
@@ -40,6 +40,6 @@ services:
|
|||||||
- "80"
|
- "80"
|
||||||
environment:
|
environment:
|
||||||
WEB_PORTS: "80"
|
WEB_PORTS: "80"
|
||||||
VIRTUAL_HOST: whoami2.nginx.container.docker
|
VIRTUAL_HOST: whoami2.nginx-proxy.tld
|
||||||
networks:
|
networks:
|
||||||
- proxy
|
- proxy
|
||||||
|
@@ -1,27 +1,10 @@
|
|||||||
import docker
|
|
||||||
import pytest
|
|
||||||
from packaging.version import Version
|
|
||||||
|
|
||||||
|
|
||||||
raw_version = docker.from_env().version()["Version"]
|
|
||||||
pytestmark = pytest.mark.skipif(
|
|
||||||
Version(raw_version) < Version("1.13"),
|
|
||||||
reason="Docker compose syntax v3 requires docker engine v1.13 or later (got {raw_version})"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def test_unknown_virtual_host_is_503(docker_compose, nginxproxy):
|
def test_unknown_virtual_host_is_503(docker_compose, nginxproxy):
|
||||||
r = nginxproxy.get("http://unknown.nginx.container.docker/")
|
r = nginxproxy.get("http://unknown.nginx-proxy.tld/")
|
||||||
assert r.status_code == 503
|
assert r.status_code == 503
|
||||||
|
|
||||||
|
|
||||||
def test_forwards_to_whoami(docker_compose, nginxproxy):
|
def test_forwards_to_whoami(docker_compose, nginxproxy):
|
||||||
r = nginxproxy.get("http://whoami2.nginx.container.docker/")
|
r = nginxproxy.get("http://whoami2.nginx-proxy.tld/")
|
||||||
assert r.status_code == 200
|
assert r.status_code == 200
|
||||||
whoami_container = docker_compose.containers.get("whoami2")
|
whoami_container = docker_compose.containers.get("whoami2")
|
||||||
assert r.text == f"I'm {whoami_container.id[:12]}\n"
|
assert r.text == f"I'm {whoami_container.id[:12]}\n"
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
import doctest
|
|
||||||
doctest.testmod()
|
|
||||||
|
@@ -38,6 +38,6 @@ services:
|
|||||||
- "80"
|
- "80"
|
||||||
environment:
|
environment:
|
||||||
WEB_PORTS: "80"
|
WEB_PORTS: "80"
|
||||||
VIRTUAL_HOST: whoami2.nginx.container.docker
|
VIRTUAL_HOST: whoami2.nginx-proxy.tld
|
||||||
networks:
|
networks:
|
||||||
- proxy
|
- proxy
|
||||||
|
@@ -1,27 +1,10 @@
|
|||||||
import docker
|
|
||||||
import pytest
|
|
||||||
from packaging.version import Version
|
|
||||||
|
|
||||||
|
|
||||||
raw_version = docker.from_env().version()["Version"]
|
|
||||||
pytestmark = pytest.mark.skipif(
|
|
||||||
Version(raw_version) < Version("1.13"),
|
|
||||||
reason="Docker compose syntax v3 requires docker engine v1.13 or later (got {raw_version})"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def test_unknown_virtual_host_is_503(docker_compose, nginxproxy):
|
def test_unknown_virtual_host_is_503(docker_compose, nginxproxy):
|
||||||
r = nginxproxy.get("http://unknown.nginx.container.docker/")
|
r = nginxproxy.get("http://unknown.nginx-proxy.tld/")
|
||||||
assert r.status_code == 503
|
assert r.status_code == 503
|
||||||
|
|
||||||
|
|
||||||
def test_forwards_to_whoami(docker_compose, nginxproxy):
|
def test_forwards_to_whoami(docker_compose, nginxproxy):
|
||||||
r = nginxproxy.get("http://whoami2.nginx.container.docker/")
|
r = nginxproxy.get("http://whoami2.nginx-proxy.tld/")
|
||||||
assert r.status_code == 200
|
assert r.status_code == 200
|
||||||
whoami_container = docker_compose.containers.get("whoami2")
|
whoami_container = docker_compose.containers.get("whoami2")
|
||||||
assert r.text == f"I'm {whoami_container.id[:12]}\n"
|
assert r.text == f"I'm {whoami_container.id[:12]}\n"
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
import doctest
|
|
||||||
doctest.testmod()
|
|
||||||
|
Reference in New Issue
Block a user