From 05d46e1d9b6e6974e4e56e10fb002614a2f07720 Mon Sep 17 00:00:00 2001 From: Simon Li Date: Sun, 27 Nov 2022 20:28:16 +0000 Subject: [PATCH] integration-test.py: Add debugging info --- .github/integration-test.py | 64 +++++++++++++++++++++++++++++-------- 1 file changed, 51 insertions(+), 13 deletions(-) diff --git a/.github/integration-test.py b/.github/integration-test.py index 6d05ecb..73ea6d7 100755 --- a/.github/integration-test.py +++ b/.github/integration-test.py @@ -1,19 +1,56 @@ #!/usr/bin/env python3 import argparse +from shutil import which import subprocess +from time import time import os +def container_runtime(): + runtimes = ["podman", "docker"] + for runtime in runtimes: + if which(runtime): + return runtime + raise RuntimeError(f"No container runtime found, tried: {' '.join(runtimes)}") + + +def container_check_output(*args, **kwargs): + cmd = [container_runtime()] + list(*args) + print(f"Running {cmd} {kwargs}") + return subprocess.check_output(cmd, **kwargs) + + +def container_run(*args, **kwargs): + cmd = [container_runtime()] + list(*args) + print(f"Running {cmd} {kwargs}") + return subprocess.run(cmd, **kwargs) + + def build_systemd_image(image_name, source_path, build_args=None): """ Build docker image with systemd at source_path. Built image is tagged with image_name """ - cmd = ["docker", "build", f"-t={image_name}", source_path] + cmd = ["build", f"-t={image_name}", source_path] if build_args: cmd.extend([f"--build-arg={ba}" for ba in build_args]) - subprocess.check_call(cmd) + container_check_output(cmd) + + +def check_container_ready(container_name, timeout=60): + """ + Check if container is ready to run tests + """ + now = time() + while True: + try: + container_check_output(["exec", "-t", container_name, "id"]) + return + except subprocess.CalledProcessError: + if time() - now > timeout: + raise RuntimeError(f"Container {container_name} hasn't started") + time.sleep(5) def run_systemd_image(image_name, container_name, bootstrap_pip_spec): @@ -25,16 +62,16 @@ def run_systemd_image(image_name, container_name, bootstrap_pip_spec): Container named container_name will be started. """ cmd = [ - "docker", "run", "--privileged", - "--mount=type=bind,source=/sys/fs/cgroup,target=/sys/fs/cgroup", "--detach", f"--name={container_name}", # A bit less than 1GB to ensure TLJH runs on 1GB VMs. # If this is changed all docs references to the required memory must be changed too. "--memory=900m", ] + if container_runtime() != "podman": + cmd.append("--mount=type=bind,source=/sys/fs/cgroup,target=/sys/fs/cgroup") if bootstrap_pip_spec: cmd.append("-e") @@ -42,7 +79,7 @@ def run_systemd_image(image_name, container_name, bootstrap_pip_spec): cmd.append(image_name) - subprocess.check_call(cmd) + container_check_output(cmd) def stop_container(container_name): @@ -50,21 +87,20 @@ def stop_container(container_name): Stop & remove docker container if it exists. """ try: - subprocess.check_output( - ["docker", "inspect", container_name], stderr=subprocess.STDOUT - ) + container_check_output(["inspect", container_name], stderr=subprocess.STDOUT) except subprocess.CalledProcessError: # No such container exists, nothing to do return - subprocess.check_call(["docker", "rm", "-f", container_name]) + container_check_output(["rm", "-f", container_name]) def run_container_command(container_name, cmd): """ Run cmd in a running container with a bash shell """ - proc = subprocess.run( - ["docker", "exec", "-t", container_name, "/bin/bash", "-c", cmd], check=True + proc = container_run( + ["exec", "-t", container_name, "/bin/bash", "-c", cmd], + check=True, ) @@ -72,7 +108,7 @@ def copy_to_container(container_name, src_path, dest_path): """ Copy files from src_path to dest_path inside container_name """ - subprocess.check_call(["docker", "cp", src_path, f"{container_name}:{dest_path}"]) + container_check_output(["cp", src_path, f"{container_name}:{dest_path}"]) def run_test( @@ -84,6 +120,8 @@ def run_test( stop_container(test_name) run_systemd_image(image_name, test_name, bootstrap_pip_spec) + check_container_ready(test_name) + source_path = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) copy_to_container(test_name, os.path.join(source_path, "bootstrap/."), "/srv/src") @@ -93,7 +131,7 @@ def run_test( # These logs can be very relevant to debug a container startup failure print(f"--- Start of logs from the container: {test_name}") - print(subprocess.check_output(["docker", "logs", test_name]).decode()) + print(container_check_output(["logs", test_name]).decode()) print(f"--- End of logs from the container: {test_name}") # Install TLJH from the default branch first to test upgrades