Blame automation/run-tests.sh

Packit Service 5e62f7
#!/bin/bash -ex
Packit Service 5e62f7
Packit Service 5e62f7
EXEC_PATH=$(dirname "$(realpath "$0")")
Packit Service 5e62f7
PROJECT_PATH="$(dirname $EXEC_PATH)"
Packit Service 5e62f7
EXPORT_DIR="$PWD/exported-artifacts"
Packit Service 5e62f7
CONT_EXPORT_DIR="/exported-artifacts"
Packit Service 5e62f7
Packit Service 5e62f7
CONTAINER_WORKSPACE="/workspace/nmstate"
Packit Service 5e62f7
Packit Service 5e62f7
TEST_TYPE_ALL="all"
Packit Service 5e62f7
TEST_TYPE_FORMAT="format"
Packit Service 5e62f7
TEST_TYPE_LINT="lint"
Packit Service 5e62f7
TEST_TYPE_UNIT_PY36="unit_py36"
Packit Service 5e62f7
TEST_TYPE_UNIT_PY38="unit_py38"
Packit Service 5e62f7
TEST_TYPE_INTEG="integ"
Packit Service 5e62f7
TEST_TYPE_INTEG_TIER1="integ_tier1"
Packit Service 5e62f7
TEST_TYPE_INTEG_TIER2="integ_tier2"
Packit Service 5e62f7
TEST_TYPE_INTEG_SLOW="integ_slow"
Packit Service 5e62f7
Packit Service 5e62f7
FEDORA_IMAGE_DEV="docker.io/nmstate/fedora-nmstate-dev"
Packit Service 5e62f7
CENTOS_IMAGE_DEV="docker.io/nmstate/centos8-nmstate-dev"
Packit Service 5e62f7
CENTOS_STREAM_IMAGE_DEV="docker.io/nmstate/centos-stream-nmstate-dev"
Packit Service 5e62f7
Packit Service 5e62f7
CREATED_INTERFACES=""
Packit Service 5e62f7
INTERFACES="eth1 eth2"
Packit Service 5e62f7
Packit Service 5e62f7
PYTEST_OPTIONS="--verbose --verbose \
Packit Service 5e62f7
        --log-level=DEBUG \
Packit Service 5e62f7
        --log-date-format='%Y-%m-%d %H:%M:%S' \
Packit Service 5e62f7
        --log-format='%(asctime)s %(filename)s:%(lineno)d %(levelname)s %(message)s' \
Packit Service 5e62f7
        --durations=5 \
Packit Service 5e62f7
        --cov /usr/lib/python*/site-packages/libnmstate \
Packit Service 5e62f7
        --cov /usr/lib/python*/site-packages/nmstatectl \
Packit Service 5e62f7
        --cov-report=term \
Packit Service 5e62f7
        --cov-report=xml \
Packit Service 5e62f7
        --log-file=pytest-run.log"
Packit Service 5e62f7
Packit Service 5e62f7
NMSTATE_TEMPDIR=$(mktemp -d /tmp/nmstate-test-XXXX)
Packit Service 5e62f7
Packit Service 5e62f7
VETH_PEER_NS="nmstate_test"
Packit Service 5e62f7
Packit Service 5e62f7
: ${CONTAINER_CMD:=podman}
Packit Service 5e62f7
Packit Service 5e62f7
test -t 1 && USE_TTY="-t"
Packit Service 5e62f7
source automation/tests-container-utils.sh
Packit Service 5e62f7
source automation/tests-machine-utils.sh
Packit Service 5e62f7
Packit Service 5e62f7
function pyclean {
Packit Service 5e62f7
    exec_cmd '
Packit Service 5e62f7
        find . -type f -name "*.py[co]" -delete
Packit Service 5e62f7
        find . -type d -name "__pycache__" -delete
Packit Service 5e62f7
    '
Packit Service 5e62f7
}
Packit Service 5e62f7
Packit Service 5e62f7
function exec_cmd {
Packit Service 5e62f7
    if [ -z ${RUN_BAREMETAL} ];then
Packit Service 5e62f7
        container_exec "$1"
Packit Service 5e62f7
    else
Packit Service 5e62f7
        bash -c "$1"
Packit Service 5e62f7
    fi
Packit Service 5e62f7
}
Packit Service 5e62f7
Packit Service 5e62f7
function dump_network_info {
Packit Service 5e62f7
    exec_cmd '
Packit Service 5e62f7
      nmcli dev; \
Packit Service 5e62f7
      # Use empty PAGER variable to stop nmcli send output to less which hang \
Packit Service 5e62f7
      # the CI. \
Packit Service 5e62f7
      PAGER= nmcli con; \
Packit Service 5e62f7
      ip addr; \
Packit Service 5e62f7
      ip route; \
Packit Service 5e62f7
      cat /etc/resolv.conf; \
Packit Service 5e62f7
      head /proc/sys/net/ipv6/conf/*/disable_ipv6; \
Packit Service 5e62f7
    '
Packit Service 5e62f7
}
Packit Service 5e62f7
Packit Service 5e62f7
function install_nmstate {
Packit Service 5e62f7
    if [ $INSTALL_NMSTATE == "true" ];then
Packit Service 5e62f7
        exec_cmd '
Packit Service 5e62f7
          rpm -ivh `./packaging/make_rpm.sh|tail -1 || exit 1`
Packit Service 5e62f7
        '
Packit Service 5e62f7
    fi
Packit Service 5e62f7
}
Packit Service 5e62f7
Packit Service 5e62f7
function run_tests {
Packit Service 5e62f7
    if [ $TEST_TYPE == $TEST_TYPE_ALL ] || \
Packit Service 5e62f7
       [ $TEST_TYPE == $TEST_TYPE_FORMAT ];then
Packit Service 5e62f7
        exec_cmd "tox -e black"
Packit Service 5e62f7
    fi
Packit Service 5e62f7
Packit Service 5e62f7
    if [ $TEST_TYPE == $TEST_TYPE_ALL ] || \
Packit Service 5e62f7
       [ $TEST_TYPE == $TEST_TYPE_LINT ];then
Packit Service 5e62f7
        exec_cmd "tox -e flake8,pylint,yamllint"
Packit Service 5e62f7
    fi
Packit Service 5e62f7
Packit Service 5e62f7
    if [ $TEST_TYPE == $TEST_TYPE_ALL ] || \
Packit Service 5e62f7
       [ $TEST_TYPE == $TEST_TYPE_UNIT_PY36 ];then
Packit Service 5e62f7
        if [[ $CONTAINER_IMAGE == *"centos"* ]]; then
Packit Service 5e62f7
            # Due to https://github.com/pypa/virtualenv/issues/1009
Packit Service 5e62f7
            # Instruct virtualenv not to upgrade to the latest versions of pip,
Packit Service 5e62f7
            # setuptools, wheel and etc
Packit Service 5e62f7
            exec_cmd 'env VIRTUALENV_NO_DOWNLOAD=1 \
Packit Service 5e62f7
                            tox --sitepackages -e py36'
Packit Service 5e62f7
        else
Packit Service 5e62f7
            exec_cmd "tox -e py36"
Packit Service 5e62f7
        fi
Packit Service 5e62f7
    fi
Packit Service 5e62f7
Packit Service 5e62f7
    if [ $TEST_TYPE == $TEST_TYPE_ALL ] || \
Packit Service 5e62f7
       [ $TEST_TYPE == $TEST_TYPE_UNIT_PY38 ];then
Packit Service 5e62f7
        if [[ $CONTAINER_IMAGE == *"centos"* ]]; then
Packit Service 5e62f7
            echo "Running unit test in $CONTAINER_IMAGE container is not " \
Packit Service 5e62f7
                 "support yet"
Packit Service 5e62f7
        else
Packit Service 5e62f7
            exec_cmd "tox -e py38"
Packit Service 5e62f7
        fi
Packit Service 5e62f7
    fi
Packit Service 5e62f7
Packit Service 5e62f7
    if [ $TEST_TYPE == $TEST_TYPE_ALL ] || \
Packit Service 5e62f7
       [ $TEST_TYPE == $TEST_TYPE_INTEG ];then
Packit Service 5e62f7
        exec_cmd "cd $CONTAINER_WORKSPACE"
Packit Service 5e62f7
        exec_cmd "
Packit Service 5e62f7
            pytest \
Packit Service 5e62f7
            $PYTEST_OPTIONS \
Packit Service 5e62f7
            --cov-report=html:htmlcov-integ \
Packit Service 5e62f7
            tests/integration \
Packit Service 5e62f7
            ${nmstate_pytest_extra_args}"
Packit Service 5e62f7
    fi
Packit Service 5e62f7
Packit Service 5e62f7
    if  [ $TEST_TYPE == $TEST_TYPE_INTEG_TIER1 ];then
Packit Service 5e62f7
        exec_cmd "cd $CONTAINER_WORKSPACE"
Packit Service 5e62f7
        exec_cmd "
Packit Service 5e62f7
          pytest \
Packit Service 5e62f7
            $PYTEST_OPTIONS \
Packit Service 5e62f7
            --cov-report=html:htmlcov-integ_tier1 \
Packit Service 5e62f7
            -m tier1 \
Packit Service 5e62f7
            tests/integration \
Packit Service 5e62f7
            ${nmstate_pytest_extra_args}"
Packit Service 5e62f7
    fi
Packit Service 5e62f7
Packit Service 5e62f7
    if  [ $TEST_TYPE == $TEST_TYPE_INTEG_TIER2 ];then
Packit Service 5e62f7
        exec_cmd "cd $CONTAINER_WORKSPACE"
Packit Service 5e62f7
        exec_cmd "
Packit Service 5e62f7
          pytest \
Packit Service 5e62f7
            $PYTEST_OPTIONS \
Packit Service 5e62f7
            --cov-report=html:htmlcov-integ_tier2 \
Packit Service 5e62f7
            -m tier2 \
Packit Service 5e62f7
            tests/integration \
Packit Service 5e62f7
            ${nmstate_pytest_extra_args}"
Packit Service 5e62f7
    fi
Packit Service 5e62f7
Packit Service 5e62f7
    if [ $TEST_TYPE == $TEST_TYPE_ALL ] || \
Packit Service 5e62f7
       [ $TEST_TYPE == $TEST_TYPE_INTEG_SLOW ];then
Packit Service 5e62f7
        exec_cmd "cd $CONTAINER_WORKSPACE"
Packit Service 5e62f7
        exec_cmd "
Packit Service 5e62f7
          pytest \
Packit Service 5e62f7
            $PYTEST_OPTIONS \
Packit Service 5e62f7
            --cov-report=html:htmlcov-integ_slow \
Packit Service 5e62f7
            -m slow --runslow \
Packit Service 5e62f7
            tests/integration \
Packit Service 5e62f7
            ${nmstate_pytest_extra_args}"
Packit Service 5e62f7
    fi
Packit Service 5e62f7
}
Packit Service 5e62f7
Packit Service 5e62f7
function write_separator {
Packit Service 5e62f7
    set +x
Packit Service 5e62f7
    local text="$(echo "${1}" | sed 's,., \0,g') "
Packit Service 5e62f7
    local char="="
Packit Service 5e62f7
Packit Service 5e62f7
    local textlength=$(echo -n "${text}" | wc --chars)
Packit Service 5e62f7
    local cols="$(tput cols)"
Packit Service 5e62f7
    local wraplength=$(((cols - textlength) / 2))
Packit Service 5e62f7
Packit Service 5e62f7
    eval printf %.1s "${char}"'{1..'"${wraplength}"\}
Packit Service 5e62f7
    echo -n "${text}"
Packit Service 5e62f7
    wraplength=$((wraplength + ((cols - textlength) % 2)))
Packit Service 5e62f7
    eval printf %.1s "${char}"'{1..'"${wraplength}"\}
Packit Service 5e62f7
    echo
Packit Service 5e62f7
    set -x
Packit Service 5e62f7
}
Packit Service 5e62f7
Packit Service 5e62f7
function run_exit {
Packit Service 5e62f7
    write_separator "TEARDOWN"
Packit Service 5e62f7
    dump_network_info
Packit Service 5e62f7
    if [ -z ${RUN_BAREMETAL} ];then
Packit Service 5e62f7
        collect_artifacts
Packit Service 5e62f7
        remove_container
Packit Service 5e62f7
        remove_tempdir
Packit Service 5e62f7
    else
Packit Service 5e62f7
        teardown_network_environment
Packit Service 5e62f7
    fi
Packit Service 5e62f7
}
Packit Service 5e62f7
Packit Service 5e62f7
function modprobe_ovs {
Packit Service 5e62f7
    lsmod | grep -q ^openvswitch || modprobe openvswitch || { echo 1>&2 "Please run 'modprobe openvswitch' as root"; exit 1; }
Packit Service 5e62f7
}
Packit Service 5e62f7
Packit Service 5e62f7
function check_services {
Packit Service 5e62f7
    exec_cmd 'while ! systemctl is-active dbus; do sleep 1; done'
Packit Service 5e62f7
    exec_cmd 'systemctl start systemd-udevd
Packit Service 5e62f7
                 while ! systemctl is-active systemd-udevd; do sleep 1; done
Packit Service 5e62f7
    '
Packit Service 5e62f7
    exec_cmd '
Packit Service 5e62f7
        systemctl restart NetworkManager
Packit Service 5e62f7
        while ! systemctl is-active NetworkManager; do sleep 1; done
Packit Service 5e62f7
    '
Packit Service 5e62f7
}
Packit Service 5e62f7
Packit Service 5e62f7
function upload_coverage {
Packit Service 5e62f7
    if [[ "$CI" == "true" ]] ;then
Packit Service 5e62f7
        container_exec "
Packit Service 5e62f7
            cd $CONTAINER_WORKSPACE &&
Packit Service 5e62f7
            COVERALLS_PARALLEL=true COVERALLS_SERVICE_NAME=travis-ci coveralls
Packit Service 5e62f7
        " || true
Packit Service 5e62f7
        container_exec "
Packit Service 5e62f7
            cd $CONTAINER_WORKSPACE &&
Packit Service 5e62f7
            bash <(curl -s https://codecov.io/bash)
Packit Service 5e62f7
        " || true
Packit Service 5e62f7
    fi
Packit Service 5e62f7
}
Packit Service 5e62f7
Packit Service 5e62f7
function check_iface_exist {
Packit Service 5e62f7
    exec_cmd "ip link | grep -q $1"
Packit Service 5e62f7
}
Packit Service 5e62f7
Packit Service 5e62f7
function prepare_network_environment {
Packit Service 5e62f7
    set +e
Packit Service 5e62f7
    exec_cmd "ip netns add ${VETH_PEER_NS}"
Packit Service 5e62f7
    for device in $INTERFACES;
Packit Service 5e62f7
    do
Packit Service 5e62f7
        peer="${device}peer"
Packit Service 5e62f7
        check_iface_exist $device
Packit Service 5e62f7
        if [ $? -eq 1 ]; then
Packit Service 5e62f7
            CREATED_INTERFACES="${CREATED_INTERFACES} ${device}"
Packit Service 5e62f7
            exec_cmd "ip link add ${device} type veth peer name ${peer}"
Packit Service 5e62f7
            exec_cmd "ip link set ${peer} netns ${VETH_PEER_NS}"
Packit Service 5e62f7
            exec_cmd "ip netns exec ${VETH_PEER_NS} ip link set ${peer} up"
Packit Service 5e62f7
            exec_cmd "ip link set ${device} up"
Packit Service 5e62f7
            exec_cmd "nmcli device set ${device} managed yes"
Packit Service 5e62f7
        fi
Packit Service 5e62f7
    done
Packit Service 5e62f7
    set -e
Packit Service 5e62f7
}
Packit Service 5e62f7
Packit Service 5e62f7
function teardown_network_environment {
Packit Service 5e62f7
    for device in $CREATED_INTERFACES;
Packit Service 5e62f7
    do
Packit Service 5e62f7
        exec_cmd "ip link del ${device}"
Packit Service 5e62f7
    done
Packit Service 5e62f7
    exec_cmd "ip netns del ${VETH_PEER_NS}"
Packit Service 5e62f7
}
Packit Service 5e62f7
Packit Service 5e62f7
function clean_dnf_cache {
Packit Service 5e62f7
    # Workaround for dnf failure:
Packit Service 5e62f7
    # [Errno 2] No such file or directory: '/var/cache/dnf/metadata_lock.pid'
Packit Service 5e62f7
    if [[ "$CI" == "true" ]];then
Packit Service 5e62f7
        exec_cmd "rm -fv /var/cache/dnf/metadata_lock.pid"
Packit Service 5e62f7
        exec_cmd "dnf clean all"
Packit Service 5e62f7
        exec_cmd "dnf makecache || :"
Packit Service 5e62f7
    fi
Packit Service 5e62f7
}
Packit Service 5e62f7
Packit Service 5e62f7
function upgrade_nm_from_copr {
Packit Service 5e62f7
    local copr_repo=$1
Packit Service 5e62f7
    # The repoid for a Copr repo is the name with the slash replaces by a colon
Packit Service 5e62f7
    local copr_repo_id="copr:copr.fedorainfracloud.org:${copr_repo/\//:}"
Packit Service 5e62f7
    clean_dnf_cache
Packit Service 5e62f7
    exec_cmd "command -v dnf && plugin='dnf-command(copr)' || plugin='yum-plugin-copr'; yum install --assumeyes \$plugin;"
Packit Service 5e62f7
    exec_cmd "yum copr enable --assumeyes ${copr_repo}"
Packit Service 5e62f7
    # Update only from Copr to limit the changes in the environment
Packit Service 5e62f7
    exec_cmd "yum update --assumeyes --disablerepo '*' --enablerepo '${copr_repo_id}'"
Packit Service 5e62f7
    exec_cmd "systemctl restart NetworkManager"
Packit Service 5e62f7
}
Packit Service 5e62f7
Packit Service 5e62f7
function run_customize_command {
Packit Service 5e62f7
    if [[ -n "$customize_cmd" ]];then
Packit Service 5e62f7
        clean_dnf_cache
Packit Service 5e62f7
        exec_cmd "${customize_cmd}"
Packit Service 5e62f7
    fi
Packit Service 5e62f7
}
Packit Service 5e62f7
Packit Service 5e62f7
options=$(getopt --options "" \
Packit Service 5e62f7
    --long customize:,pytest-args:,help,debug-shell,test-type:,el8,copr:,artifacts-dir:,test-vdsm,machine,use-installed-nmstate\
Packit Service 5e62f7
    -- "${@}")
Packit Service 5e62f7
eval set -- "$options"
Packit Service 5e62f7
while true; do
Packit Service 5e62f7
    case "$1" in
Packit Service 5e62f7
    --pytest-args)
Packit Service 5e62f7
        shift
Packit Service 5e62f7
        nmstate_pytest_extra_args="$1"
Packit Service 5e62f7
        ;;
Packit Service 5e62f7
    --copr)
Packit Service 5e62f7
        shift
Packit Service 5e62f7
        copr_repo="$1"
Packit Service 5e62f7
        ;;
Packit Service 5e62f7
    --customize)
Packit Service 5e62f7
        shift
Packit Service 5e62f7
        customize_cmd="$1"
Packit Service 5e62f7
        ;;
Packit Service 5e62f7
    --debug-shell)
Packit Service 5e62f7
        debug_exit_shell="1"
Packit Service 5e62f7
        ;;
Packit Service 5e62f7
    --test-type)
Packit Service 5e62f7
        shift
Packit Service 5e62f7
        TEST_TYPE="$1"
Packit Service 5e62f7
        ;;
Packit Service 5e62f7
    --el8)
Packit Service 5e62f7
        CONTAINER_IMAGE=$CENTOS_IMAGE_DEV
Packit Service 5e62f7
        ;;
Packit Service 5e62f7
    --centos-stream)
Packit Service 5e62f7
        CONTAINER_IMAGE=$CENTOS_STREAM_IMAGE_DEV
Packit Service 5e62f7
        ;;
Packit Service 5e62f7
    --artifacts-dir)
Packit Service 5e62f7
        shift
Packit Service 5e62f7
        EXPORT_DIR="$1"
Packit Service 5e62f7
        ;;
Packit Service 5e62f7
    --test-vdsm)
Packit Service 5e62f7
        vdsm_tests
Packit Service 5e62f7
        exit
Packit Service 5e62f7
        ;;
Packit Service 5e62f7
    --machine)
Packit Service 5e62f7
        RUN_BAREMETAL="true"
Packit Service 5e62f7
        ;;
Packit Service 5e62f7
    --use-installed-nmstate)
Packit Service 5e62f7
        INSTALL_NMSTATE="false"
Packit Service 5e62f7
        ;;
Packit Service 5e62f7
    --help)
Packit Service 5e62f7
        set +x
Packit Service 5e62f7
        echo -n "$0 [--copr=...] [--customize=...] [--debug-shell] [--el8] "
Packit Service 5e62f7
        echo -n "[--help] [--pytest-args=...] [--machine] "
Packit Service 5e62f7
        echo "[--use-installed-nmstate] [--test-type=<TEST_TYPE>] [--test-vdsm]"
Packit Service 5e62f7
        echo "    Valid TEST_TYPE are:"
Packit Service 5e62f7
        echo "     * $TEST_TYPE_ALL (default)"
Packit Service 5e62f7
        echo "     * $TEST_TYPE_FORMAT"
Packit Service 5e62f7
        echo "     * $TEST_TYPE_LINT"
Packit Service 5e62f7
        echo "     * $TEST_TYPE_INTEG"
Packit Service 5e62f7
        echo "     * $TEST_TYPE_INTEG_TIER1"
Packit Service 5e62f7
        echo "     * $TEST_TYPE_INTEG_TIER2"
Packit Service 5e62f7
        echo "     * $TEST_TYPE_INTEG_SLOW"
Packit Service 5e62f7
        echo "     * $TEST_TYPE_UNIT_PY36"
Packit Service 5e62f7
        echo "     * $TEST_TYPE_UNIT_PY38"
Packit Service 5e62f7
        echo -n "--customize allows to specify a command to customize the "
Packit Service 5e62f7
        echo "container before running the tests"
Packit Service 5e62f7
        exit
Packit Service 5e62f7
        ;;
Packit Service 5e62f7
    --)
Packit Service 5e62f7
        shift
Packit Service 5e62f7
        break
Packit Service 5e62f7
        ;;
Packit Service 5e62f7
    esac
Packit Service 5e62f7
    shift
Packit Service 5e62f7
done
Packit Service 5e62f7
Packit Service 5e62f7
: ${TEST_TYPE:=$TEST_TYPE_ALL}
Packit Service 5e62f7
: ${CONTAINER_IMAGE:=$FEDORA_IMAGE_DEV}
Packit Service 5e62f7
: ${INSTALL_NMSTATE:="true"}
Packit Service 5e62f7
: ${INSTALL_DEPS:="false"}
Packit Service 5e62f7
Packit Service 5e62f7
modprobe_ovs
Packit Service 5e62f7
Packit Service 5e62f7
if [ -n "${RUN_BAREMETAL}" ];then
Packit Service 5e62f7
    CONTAINER_WORKSPACE="."
Packit Service 5e62f7
    run_customize_command
Packit Service 5e62f7
    start_machine_services
Packit Service 5e62f7
else
Packit Service 5e62f7
    container_pre_test_setup
Packit Service 5e62f7
    run_customize_command
Packit Service 5e62f7
fi
Packit Service 5e62f7
Packit Service 5e62f7
if [[ -v copr_repo ]];then
Packit Service 5e62f7
    upgrade_nm_from_copr "${copr_repo}"
Packit Service 5e62f7
fi
Packit Service 5e62f7
Packit Service 5e62f7
check_services
Packit Service 5e62f7
prepare_network_environment
Packit Service 5e62f7
Packit Service 5e62f7
if [ -n "$RUN_BAREMETAL" ];then
Packit Service 5e62f7
    trap run_exit ERR EXIT
Packit Service 5e62f7
fi
Packit Service 5e62f7
Packit Service 5e62f7
exec_cmd '(source /etc/os-release; echo $PRETTY_NAME); rpm -q NetworkManager'
Packit Service 5e62f7
Packit Service 5e62f7
dump_network_info
Packit Service 5e62f7
Packit Service 5e62f7
pyclean
Packit Service 5e62f7
if [ -z ${RUN_BAREMETAL} ];then
Packit Service 5e62f7
    copy_workspace_container
Packit Service 5e62f7
fi
Packit Service 5e62f7
Packit Service 5e62f7
install_nmstate
Packit Service 5e62f7
run_tests
Packit Service 5e62f7
upload_coverage