From f30aad0d9e0f24e6b7c07503d9f9149b25b58f0e Mon Sep 17 00:00:00 2001 From: John Mulligan Date: Wed, 1 Nov 2023 18:14:34 -0400 Subject: [PATCH] cephadm: add tests for build.py script Add tests that cover the four main distros that ceph is built on (in the ceph infra). These tests should not be run by automation as they are slow and have special requirements like a working podman. Instead, these are provided to be run by a dev when build.py is updated. Signed-off-by: John Mulligan --- src/cephadm/tests/build/__init__.py | 0 src/cephadm/tests/build/test_cephadm_build.py | 96 +++++++++++++++++++ src/cephadm/tox.ini | 9 ++ 3 files changed, 105 insertions(+) create mode 100644 src/cephadm/tests/build/__init__.py create mode 100644 src/cephadm/tests/build/test_cephadm_build.py diff --git a/src/cephadm/tests/build/__init__.py b/src/cephadm/tests/build/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/cephadm/tests/build/test_cephadm_build.py b/src/cephadm/tests/build/test_cephadm_build.py new file mode 100644 index 00000000000..b6fea0e8a9e --- /dev/null +++ b/src/cephadm/tests/build/test_cephadm_build.py @@ -0,0 +1,96 @@ +# tests for building cephadm into a zipapp using build.py +# +# these should not be run automatically as they require the use of podman, +# which should not be assumed to exist on a typical test node + +import os +import pathlib +import pytest +import subprocess +import sys + + +CONTAINERS = { + 'centos-8': { + 'name': 'cephadm-build-test:centos8-py36', + 'base_image': 'quay.io/centos/centos:stream8', + 'script': 'dnf install -y python36', + }, + 'centos-9': { + 'name': 'cephadm-build-test:centos9-py3', + 'base_image': 'quay.io/centos/centos:stream9', + 'script': 'dnf install -y python3', + }, + 'ubuntu-20.04': { + 'name': 'cephadm-build-test:ubuntu-20-04-py3', + 'base_image': 'docker.io/library/ubuntu:20.04', + 'script': 'apt update && apt install -y python3-venv', + }, + 'ubuntu-22.04': { + 'name': 'cephadm-build-test:ubuntu-22-04-py3', + 'base_image': 'docker.io/library/ubuntu:22.04', + 'script': 'apt update && apt install -y python3-venv', + }, +} + +BUILD_PY = 'src/cephadm/build.py' + + +def _print(*args): + """Print with a highlight prefix.""" + print('----->', *args) + sys.stdout.flush() + + +def container_cmd(image, cmd, ceph_dir, out_dir): + return [ + 'podman', + 'run', + '--rm', + f'--volume={ceph_dir}:/ceph:ro', + f'--volume={out_dir}:/out', + image, + ] + list(cmd) + + +def run_container_cmd(image, cmd, ceph_dir, out_dir): + full_cmd = container_cmd(image, cmd, ceph_dir, out_dir) + _print("CMD", full_cmd) + return subprocess.run(full_cmd) + + +def build_container(src_image, dst_image, build_script, workdir): + cfile = pathlib.Path(workdir) / 'Dockerfile' + with open(cfile, 'w') as fh: + fh.write(f'FROM {src_image}\n') + fh.write(f'RUN {build_script}\n') + cmd = ['podman', 'build', '-t', str(dst_image), '-f', str(cfile)] + _print("BUILD CMD", cmd) + subprocess.run(cmd, check=True) + + +def build_in(alias, ceph_dir, out_dir, args): + ctr = CONTAINERS[alias] + build_container(ctr['base_image'], ctr['name'], ctr['script'], out_dir) + cmd = ['/ceph/' + BUILD_PY] + list(args or []) + ['/out/cephadm'] + run_container_cmd(ctr['name'], cmd, ceph_dir, out_dir) + + +@pytest.fixture +def source_dir(): + return pathlib.Path(__file__).parents[4].absolute() + + +@pytest.mark.parametrize( + 'env', + [ + 'centos-8', + 'centos-9', + 'ubuntu-20.04', + 'ubuntu-22.04', + ], +) +def test_cephadm_build(env, source_dir, tmp_path): + build_in(env, source_dir, tmp_path, []) + assert (tmp_path / 'cephadm').is_file() + # TODO: verify contents of zip diff --git a/src/cephadm/tox.ini b/src/cephadm/tox.ini index 266520ff572..cea84554e12 100644 --- a/src/cephadm/tox.ini +++ b/src/cephadm/tox.ini @@ -87,3 +87,12 @@ deps = black>=23,<24 commands = black -q -l78 -t py36 --skip-string-normalization cephadmlib/ + +# test_build env is intentionally left out of the envlist. It is here for developers +# to run locally as it has some unusual requirements: needs podman, etc +[testenv:test_build] +skip_install=true +deps = + {[testenv]deps} +commands = + pytest {posargs} tests/build -- 2.39.5