#!/usr/bin/env python #-*- coding: utf-8 -*- import subprocess import os import getpass import argparse import logging import signal import subprocess CUR_FILE_DIR = os.path.dirname(os.path.realpath(__file__)) DEFAULT_CLICKHOUSE_ROOT = os.path.abspath(os.path.join(CUR_FILE_DIR, "../../../")) CURRENT_WORK_DIR = os.getcwd() CONTAINER_NAME = "clickhouse_integration_tests" DIND_INTEGRATION_TESTS_IMAGE_NAME = "yandex/clickhouse-integration-tests-runner" def check_args_and_update_paths(args): if not os.path.isabs(args.binary): args.binary = os.path.abspath(os.path.join(CURRENT_WORK_DIR, args.binary)) if not os.path.isabs(args.configs_dir): args.configs_dir = os.path.abspath(os.path.join(CURRENT_WORK_DIR, args.configs_dir)) if not os.path.isabs(args.clickhouse_root): args.clickhouse_root = os.path.abspath(os.path.join(CURRENT_WORK_DIR, args.clickhouse_root)) for path in [args.binary, args.configs_dir, args.clickhouse_root]: if not os.path.exists(path): raise Exception("Path {} doesn't exists".format(path)) def try_rm_image(): try: subprocess.check_call('docker rm {name}'.format(name=CONTAINER_NAME), shell=True) except: pass def docker_kill_handler_handler(signum, frame): subprocess.check_call('docker kill $(docker ps -a -q --filter name={name} --format="{{{{.ID}}}}")'.format(name=CONTAINER_NAME), shell=True) try_rm_image() raise KeyboardInterrupt("Killed by Ctrl+C") signal.signal(signal.SIGINT, docker_kill_handler_handler) if __name__ == "__main__": logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s') parser = argparse.ArgumentParser(description="ClickHouse integration tests runner") parser.add_argument( "--binary", default=os.environ.get("CLICKHOUSE_TESTS_SERVER_BIN_PATH", os.environ.get("CLICKHOUSE_TESTS_CLIENT_BIN_PATH", "/usr/bin/clickhouse")), help="Path to clickhouse binary") parser.add_argument( "--configs-dir", default=os.environ.get("CLICKHOUSE_TESTS_BASE_CONFIG_DIR", os.path.join(DEFAULT_CLICKHOUSE_ROOT, "dbms/programs/server")), help="Path to clickhouse configs directory") parser.add_argument( "--clickhouse-root", default=DEFAULT_CLICKHOUSE_ROOT, help="Path to repository root folder") parser.add_argument( "--disable-net-host", action='store_true', default=False, help="Don't use net host in parent docker container") parser.add_argument('pytest_args', nargs='*', help="args for pytest command") args = parser.parse_args() check_args_and_update_paths(args) net = "" if not args.disable_net_host: net = "--net=host" cmd = "docker run {net} --name {name} --user={user} --privileged --volume={bin}:/clickhouse \ --volume={cfg}:/clickhouse-config --volume={pth}:/ClickHouse -e PYTEST_OPTS='{opts}' {img} ".format( net=net, bin=args.binary, cfg=args.configs_dir, pth=args.clickhouse_root, opts=' '.join(args.pytest_args), img=DIND_INTEGRATION_TESTS_IMAGE_NAME, user=getpass.getuser(), name=CONTAINER_NAME, ) try: subprocess.check_call(cmd, shell=True) finally: try_rm_image()