Forráskód Böngészése

Merge pull request #2625 from nginx-proxy/test/wait-for-docker-gen

test: fix docker-gen tests flakyness
Nicolas Duchon 6 napja
szülő
commit
219d3b1b8c

+ 1 - 0
.github/workflows/test.yml

@@ -21,6 +21,7 @@ jobs:
     strategy:
       matrix:
         base_docker_image: [alpine, debian]
+      fail-fast: false
 
     steps:
       - uses: actions/checkout@v4

+ 42 - 17
test/conftest.py

@@ -199,26 +199,48 @@ def container_ipv6(container: Container) -> 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
-    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
     """
     log = logging.getLogger('DNS')
     log.debug(f"nginx_proxy_dns_resolver({domain_name!r})")
+
     if 'nginx-proxy' in domain_name:
         nginxproxy_containers = docker_client.containers.list(filters={"status": "running", "ancestor": "nginxproxy/nginx-proxy:test"})
-        if len(nginxproxy_containers) == 0:
-            log.warning(f"no container found from image nginxproxy/nginx-proxy:test while resolving {domain_name!r}")
+        nginx_containers = docker_client.containers.list(filters={"status": "running", "ancestor": "nginx:latest"})
+
+        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_nginx_containers = docker_client.containers.list(filters={"status": "exited", "ancestor": "nginx:latest"})
+
             if len(exited_nginxproxy_containers) > 0:
                 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())
+            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
-        nginxproxy_container = nginxproxy_containers[0]
-        ip = container_ip(nginxproxy_container)
-        log.info(f"resolving domain name {domain_name!r} as IP address {ip} of nginx-proxy container {nginxproxy_container.name}")
+
+        container = None
+        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 None
+
+
 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",
@@ -348,17 +370,20 @@ def docker_compose_down(compose_files: List[str], project_name: str):
 
 def wait_for_nginxproxy_to_be_ready():
     """
-    If one (and only one) container started from image nginxproxy/nginx-proxy:test is found,
-    wait for its log to contain substring "Watching docker events"
-    """
-    containers = docker_client.containers.list(filters={"ancestor": "nginxproxy/nginx-proxy:test"})
-    if len(containers) != 1:
-        return
-    container = containers[0]
-    for line in container.logs(stream=True):
-        if b"Watching docker events" in line:
-            logging.debug("nginx-proxy ready")
-            break
+    Wait for logs of running containers started from image nginxproxy/nginx-proxy:test and/or
+    nginxproxy/docker-gen:latest to contain the substring "Watching docker events"
+    """
+    nginx_proxy_containers = docker_client.containers.list(filters={"status": "running", "ancestor": "nginxproxy/nginx-proxy:test"})
+    docker_gen_containers = docker_client.containers.list(filters={"status": "running", "ancestor": "nginxproxy/docker-gen:latest"})
+
+    containers = nginx_proxy_containers + docker_gen_containers
+
+    for container in containers:
+        logging.debug(f"waiting for container {container.name} to be ready")
+        for line in container.logs(stream=True):
+            if b"Watching docker events" in line:
+                logging.debug(f"{container.name} ready")
+                break
 
 
 @pytest.fixture

+ 1 - 1
test/test_dockergen/test_dockergen.base.yml

@@ -27,4 +27,4 @@ services:
       - "80"
     environment:
       WEB_PORTS: "80"
-      VIRTUAL_HOST: whoami.nginx.container.docker
+      VIRTUAL_HOST: whoami.nginx-proxy.tld

+ 2 - 19
test/test_dockergen/test_dockergen.py

@@ -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):
-    r = nginxproxy.get("http://unknown.nginx.container.docker/")
+    r = nginxproxy.get("http://unknown.nginx-proxy.tld/")
     assert r.status_code == 503
 
 
 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
     whoami_container = docker_compose.containers.get("whoami")
     assert r.text == f"I'm {whoami_container.id[:12]}\n"
-
-
-if __name__ == "__main__":
-    import doctest
-    doctest.testmod()

+ 1 - 1
test/test_dockergen/test_dockergen_network_segregation-custom-label.base.yml

@@ -40,6 +40,6 @@ services:
       - "80"
     environment:
       WEB_PORTS: "80"
-      VIRTUAL_HOST: whoami2.nginx.container.docker
+      VIRTUAL_HOST: whoami2.nginx-proxy.tld
     networks:
       - proxy

+ 2 - 19
test/test_dockergen/test_dockergen_network_segregation-custom-label.py

@@ -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):
-    r = nginxproxy.get("http://unknown.nginx.container.docker/")
+    r = nginxproxy.get("http://unknown.nginx-proxy.tld/")
     assert r.status_code == 503
 
 
 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
     whoami_container = docker_compose.containers.get("whoami2")
     assert r.text == f"I'm {whoami_container.id[:12]}\n"
-
-
-if __name__ == "__main__":
-    import doctest
-    doctest.testmod()

+ 1 - 1
test/test_dockergen/test_dockergen_network_segregation.base.yml

@@ -38,6 +38,6 @@ services:
       - "80"
     environment:
       WEB_PORTS: "80"
-      VIRTUAL_HOST: whoami2.nginx.container.docker
+      VIRTUAL_HOST: whoami2.nginx-proxy.tld
     networks:
       - proxy

+ 2 - 19
test/test_dockergen/test_dockergen_network_segregation.py

@@ -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):
-    r = nginxproxy.get("http://unknown.nginx.container.docker/")
+    r = nginxproxy.get("http://unknown.nginx-proxy.tld/")
     assert r.status_code == 503
 
 
 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
     whoami_container = docker_compose.containers.get("whoami2")
     assert r.text == f"I'm {whoami_container.id[:12]}\n"
-
-
-if __name__ == "__main__":
-    import doctest
-    doctest.testmod()