diff --git a/docker/tests/conftest.py b/docker/tests/conftest.py --- a/docker/tests/conftest.py +++ b/docker/tests/conftest.py @@ -5,7 +5,6 @@ from os.path import join import re -import subprocess import time from typing import Generator, Mapping, Tuple from urllib.parse import urljoin @@ -36,67 +35,78 @@ """ +# wait-for-it timout +WFI_TIMEOUT = 60 + +@pytest.fixture(scope="session") +def docker_host(): + return testinfra.get_host("local://") + +@pytest.fixture(scope="session") +def compose_cmd(docker_host): + try: + docker_host.check_output("docker compose version") + return "docker compose" + except AssertionError: + print("Fall back to old docker-compose command") + return "docker-compose" + # scope='session' so we use the same container for all the tests; @pytest.fixture(scope="session") -def docker_compose(request): +def docker_compose(request, docker_host, compose_cmd): # start the whole cluster - subprocess.check_output(["docker-compose", "up", "-d"]) - yield - # and stop it - subprocess.check_call(["docker-compose", "down", "-v"]) + docker_host.check_output(f"{compose_cmd} up -d") + # small hack: add a helper func to docker_host; so it's not necessary to + # use all 3 docker_compose, docker_host and compose_cmd fixtures everywhere + docker_host.check_compose_output = lambda command: docker_host.check_output(f"{compose_cmd} {command}") + yield docker_host -@pytest.fixture(scope="session") -def wfi_timeout(): - """ - wait-for-it timeout in seconds - """ - return 60 + # and stop the cluster + docker_host.check_output(f"{compose_cmd} down -v") @pytest.fixture(scope="session") -def scheduler_host(request, docker_compose, wfi_timeout): +def scheduler_host(request, docker_compose): # run a container in which test commands are executed docker_id = ( - subprocess.check_output( - ["docker-compose", "run", "-d", "swh-scheduler", "shell", "sleep", "1h"] + docker_compose.check_compose_output( + "run -d swh-scheduler shell sleep 1h" ) - .decode() .strip() ) scheduler_host = testinfra.get_host("docker://" + docker_id) - scheduler_host.check_output(f"wait-for-it swh-scheduler:5008 -t {wfi_timeout}") - scheduler_host.check_output(f"wait-for-it swh-storage:5002 -t {wfi_timeout}") + scheduler_host.check_output(f"wait-for-it swh-scheduler:5008 -t {WFI_TIMEOUT}") + scheduler_host.check_output(f"wait-for-it swh-storage:5002 -t {WFI_TIMEOUT}") # return a testinfra connection to the container yield scheduler_host # at the end of the test suite, destroy the container - subprocess.check_call(["docker", "rm", "-f", docker_id]) + docker_compose.check_output(f"docker rm -f {docker_id}") # scope='session' so we use the same container for all the tests; @pytest.fixture(scope="session") -def deposit_host(request, docker_compose, wfi_timeout): +def deposit_host(request, docker_compose): # run a container in which test commands are executed docker_id = ( - subprocess.check_output( - ["docker-compose", "run", "-d", "swh-deposit", "shell", "sleep", "1h"] + docker_compose.check_compose_output( + "run -d swh-deposit shell sleep 1h" ) - .decode() .strip() ) deposit_host = testinfra.get_host("docker://" + docker_id) deposit_host.check_output("echo 'print(\"Hello World!\")\n' > /tmp/hello.py") deposit_host.check_output("tar -C /tmp -czf /tmp/archive.tgz /tmp/hello.py") deposit_host.check_output(f"echo '{SAMPLE_METADATA}' > /tmp/metadata.xml") - deposit_host.check_output(f"wait-for-it swh-deposit:5006 -t {wfi_timeout}") + deposit_host.check_output(f"wait-for-it swh-deposit:5006 -t {WFI_TIMEOUT}") # return a testinfra connection to the container yield deposit_host # at the end of the test suite, destroy the container - subprocess.check_call(["docker", "rm", "-f", docker_id]) + docker_compose.check_output(f"docker rm -f {docker_id}") @pytest.fixture(scope="session") @@ -105,7 +115,7 @@ @pytest.fixture(scope="session") -def git_origin(scheduler_host, git_url): +def git_origin(docker_compose, scheduler_host, git_url): task = scheduler_host.check_output(f"swh scheduler task add load-git url={git_url}") taskid = re.search(r"^Task (?P\d+)$", task, flags=re.MULTILINE).group("id") assert int(taskid) > 0 @@ -121,13 +131,13 @@ time.sleep(1) continue if "[failed]" in status: - loader_logs = subprocess.check_output( - ["docker-compose", "logs", "swh-loader"] + loader_logs = docker_compose.check_compose_output( + "logs swh-loader" ) assert False, ( "Loading execution failed\n" f"status: {status}\n" - f"loader logs: " + loader_logs.decode(errors="replace") + f"loader logs: " + loader_logs ) assert False, f"Loading execution failed, task status is {status}" return git_url