xref: /cloud-hypervisor/scripts/run_integration_tests_x86_64.sh (revision 2b05753716936506ed440863fe6a29dfc7a427e2)
191fe48d5SPhilipp Schuster#!/usr/bin/env bash
22b2d0065SRuslan Mstoi# shellcheck disable=SC2048,SC2086
3ddce3df8SRob Bradfordset -x
4ddce3df8SRob Bradford
52b2d0065SRuslan Mstoi# shellcheck source=/dev/null
62b2d0065SRuslan Mstoisource "$HOME"/.cargo/env
72b2d0065SRuslan Mstoisource "$(dirname "$0")"/test-util.sh
8ddce3df8SRob Bradford
9ddce3df8SRob BradfordWORKLOADS_DIR="$HOME/workloads"
10ddce3df8SRob Bradfordmkdir -p "$WORKLOADS_DIR"
11ddce3df8SRob Bradford
1227b5f8d7SMuminul Islamprocess_common_args "$@"
1327b5f8d7SMuminul Islam
145b05e0cdSBo Chen# For now these values are default for kvm
151faaa2cdSBo Chentest_features=""
1627b5f8d7SMuminul Islam
176454c677SMuminul Islamif [ "$hypervisor" = "mshv" ]; then
18219716c3SBo Chen    test_features="--features mshv"
196454c677SMuminul Islamfi
206454c677SMuminul Islam
212b2d0065SRuslan Mstoicp scripts/sha1sums-x86_64 "$WORKLOADS_DIR"
220223cf8cSSebastien Boeuf
2372e213ebSRob Bradforddownload_hypervisor_fw
24ddce3df8SRob Bradford
2576dbe660SThomas Barrettdownload_ovmf
26eea2907dSRob Bradford
279dba0972SSebastien BoeufFOCAL_OS_IMAGE_NAME="focal-server-cloudimg-amd64-custom-20210609-0.qcow2"
2805ec6190SRavi kumar VeeramallyFOCAL_OS_IMAGE_URL="https://ch-images.azureedge.net/$FOCAL_OS_IMAGE_NAME"
29c790bba9SRob BradfordFOCAL_OS_IMAGE="$WORKLOADS_DIR/$FOCAL_OS_IMAGE_NAME"
30c790bba9SRob Bradfordif [ ! -f "$FOCAL_OS_IMAGE" ]; then
312b2d0065SRuslan Mstoi    pushd "$WORKLOADS_DIR" || exit
32c790bba9SRob Bradford    time wget --quiet $FOCAL_OS_IMAGE_URL || exit 1
332b2d0065SRuslan Mstoi    popd || exit
34df3e5c87SRob Bradfordfi
35df3e5c87SRob Bradford
369dba0972SSebastien BoeufFOCAL_OS_RAW_IMAGE_NAME="focal-server-cloudimg-amd64-custom-20210609-0.raw"
37c790bba9SRob BradfordFOCAL_OS_RAW_IMAGE="$WORKLOADS_DIR/$FOCAL_OS_RAW_IMAGE_NAME"
38c790bba9SRob Bradfordif [ ! -f "$FOCAL_OS_RAW_IMAGE" ]; then
392b2d0065SRuslan Mstoi    pushd "$WORKLOADS_DIR" || exit
40c790bba9SRob Bradford    time qemu-img convert -p -f qcow2 -O raw $FOCAL_OS_IMAGE_NAME $FOCAL_OS_RAW_IMAGE_NAME || exit 1
412b2d0065SRuslan Mstoi    popd || exit
42df3e5c87SRob Bradfordfi
43df3e5c87SRob Bradford
444ef388b6SYu LiFOCAL_OS_QCOW_BACKING_FILE_IMAGE_NAME="focal-server-cloudimg-amd64-custom-20210609-0-backing.qcow2"
454ef388b6SYu LiFOCAL_OS_QCOW_BACKING_FILE_IMAGE="$WORKLOADS_DIR/$FOCAL_OS_QCOW_BACKING_FILE_IMAGE_NAME"
464ef388b6SYu Liif [ ! -f "$FOCAL_OS_QCOW_BACKING_FILE_IMAGE" ]; then
472b2d0065SRuslan Mstoi    pushd "$WORKLOADS_DIR" || exit
482b2d0065SRuslan Mstoi    time qemu-img create -f qcow2 -b "$FOCAL_OS_IMAGE" -F qcow2 $FOCAL_OS_QCOW_BACKING_FILE_IMAGE_NAME
492b2d0065SRuslan Mstoi    popd || exit
504ef388b6SYu Lifi
514ef388b6SYu Li
52b1547c4cSRob BradfordJAMMY_OS_IMAGE_NAME="jammy-server-cloudimg-amd64-custom-20241017-0.qcow2"
5305ec6190SRavi kumar VeeramallyJAMMY_OS_IMAGE_URL="https://ch-images.azureedge.net/$JAMMY_OS_IMAGE_NAME"
540e2cb9fdSBo ChenJAMMY_OS_IMAGE="$WORKLOADS_DIR/$JAMMY_OS_IMAGE_NAME"
550e2cb9fdSBo Chenif [ ! -f "$JAMMY_OS_IMAGE" ]; then
562b2d0065SRuslan Mstoi    pushd "$WORKLOADS_DIR" || exit
570e2cb9fdSBo Chen    time wget --quiet $JAMMY_OS_IMAGE_URL || exit 1
582b2d0065SRuslan Mstoi    popd || exit
590e2cb9fdSBo Chenfi
600e2cb9fdSBo Chen
61b1547c4cSRob BradfordJAMMY_OS_RAW_IMAGE_NAME="jammy-server-cloudimg-amd64-custom-20241017-0.raw"
620e2cb9fdSBo ChenJAMMY_OS_RAW_IMAGE="$WORKLOADS_DIR/$JAMMY_OS_RAW_IMAGE_NAME"
630e2cb9fdSBo Chenif [ ! -f "$JAMMY_OS_RAW_IMAGE" ]; then
642b2d0065SRuslan Mstoi    pushd "$WORKLOADS_DIR" || exit
650e2cb9fdSBo Chen    time qemu-img convert -p -f qcow2 -O raw $JAMMY_OS_IMAGE_NAME $JAMMY_OS_RAW_IMAGE_NAME || exit 1
662b2d0065SRuslan Mstoi    popd || exit
670e2cb9fdSBo Chenfi
680e2cb9fdSBo Chen
693b470d4fSDamjan GeorgievskiALPINE_MINIROOTFS_URL="http://dl-cdn.alpinelinux.org/alpine/v3.11/releases/x86_64/alpine-minirootfs-3.11.3-x86_64.tar.gz"
703b470d4fSDamjan GeorgievskiALPINE_MINIROOTFS_TARBALL="$WORKLOADS_DIR/alpine-minirootfs-x86_64.tar.gz"
713b470d4fSDamjan Georgievskiif [ ! -f "$ALPINE_MINIROOTFS_TARBALL" ]; then
722b2d0065SRuslan Mstoi    pushd "$WORKLOADS_DIR" || exit
732b2d0065SRuslan Mstoi    time wget --quiet $ALPINE_MINIROOTFS_URL -O "$ALPINE_MINIROOTFS_TARBALL" || exit 1
742b2d0065SRuslan Mstoi    popd || exit
753b470d4fSDamjan Georgievskifi
763b470d4fSDamjan Georgievski
773b470d4fSDamjan GeorgievskiALPINE_INITRAMFS_IMAGE="$WORKLOADS_DIR/alpine_initramfs.img"
783b470d4fSDamjan Georgievskiif [ ! -f "$ALPINE_INITRAMFS_IMAGE" ]; then
792b2d0065SRuslan Mstoi    pushd "$WORKLOADS_DIR" || exit
803b470d4fSDamjan Georgievski    mkdir alpine-minirootfs
813b470d4fSDamjan Georgievski    tar xf "$ALPINE_MINIROOTFS_TARBALL" -C alpine-minirootfs
823b470d4fSDamjan Georgievski    cat >alpine-minirootfs/init <<-EOF
833b470d4fSDamjan Georgievski		#! /bin/sh
843b470d4fSDamjan Georgievski		mount -t devtmpfs dev /dev
853b470d4fSDamjan Georgievski		echo \$TEST_STRING > /dev/console
863b470d4fSDamjan Georgievski		poweroff -f
873b470d4fSDamjan Georgievski	EOF
883b470d4fSDamjan Georgievski    chmod +x alpine-minirootfs/init
892b2d0065SRuslan Mstoi    cd alpine-minirootfs || exit
903b470d4fSDamjan Georgievski    find . -print0 |
913b470d4fSDamjan Georgievski        cpio --null --create --verbose --owner root:root --format=newc >"$ALPINE_INITRAMFS_IMAGE"
922b2d0065SRuslan Mstoi    popd || exit
933b470d4fSDamjan Georgievskifi
943b470d4fSDamjan Georgievski
952b2d0065SRuslan Mstoipushd "$WORKLOADS_DIR" || exit
962b2d0065SRuslan Mstoiif ! sha1sum sha1sums-x86_64 --check; then
97694da826SSebastien Boeuf    echo "sha1sum validation of images failed, remove invalid images to fix the issue."
98694da826SSebastien Boeuf    exit 1
99694da826SSebastien Boeuffi
1002b2d0065SRuslan Mstoipopd || exit
101df3e5c87SRob Bradford
102ebe04f6dSRob Bradford# Build custom kernel based on virtio-pmem and virtio-fs upstream patches
103*2b057537SBo ChenVMLINUX_IMAGE="$WORKLOADS_DIR/vmlinux-x86_64"
104103fe1f4SRob Bradfordif [ ! -f "$VMLINUX_IMAGE" ]; then
1053c05626aSRuoqing He    # Prepare linux image (build from source or download pre-built)
1063c05626aSRuoqing He    prepare_linux
107103fe1f4SRob Bradfordfi
108efb24478SAlejandro Jimenez
10954474519SRob BradfordVIRTIOFSD="$WORKLOADS_DIR/virtiofsd"
11054474519SRob BradfordVIRTIOFSD_DIR="virtiofsd_build"
11154474519SRob Bradfordif [ ! -f "$VIRTIOFSD" ]; then
1122b2d0065SRuslan Mstoi    pushd "$WORKLOADS_DIR" || exit
11354474519SRob Bradford    git clone "https://gitlab.com/virtio-fs/virtiofsd.git" $VIRTIOFSD_DIR
1142b2d0065SRuslan Mstoi    pushd $VIRTIOFSD_DIR || exit
11524f384d2SRavi kumar Veeramally    git checkout v1.8.0
1161908f488SRob Bradford    time cargo build --release
1172b2d0065SRuslan Mstoi    cp target/release/virtiofsd "$VIRTIOFSD" || exit 1
1182b2d0065SRuslan Mstoi    popd || exit
11954474519SRob Bradford    rm -rf $VIRTIOFSD_DIR
1202b2d0065SRuslan Mstoi    popd || exit
1211908f488SRob Bradfordfi
1221908f488SRob Bradford
1230a229ef4SSebastien BoeufBLK_IMAGE="$WORKLOADS_DIR/blk.img"
1240a229ef4SSebastien BoeufMNT_DIR="mount_image"
1250a229ef4SSebastien Boeufif [ ! -f "$BLK_IMAGE" ]; then
1262b2d0065SRuslan Mstoi    pushd "$WORKLOADS_DIR" || exit
1272b2d0065SRuslan Mstoi    fallocate -l 16M "$BLK_IMAGE"
1282b2d0065SRuslan Mstoi    mkfs.ext4 -j "$BLK_IMAGE"
1290a229ef4SSebastien Boeuf    mkdir $MNT_DIR
1302b2d0065SRuslan Mstoi    sudo mount -t ext4 "$BLK_IMAGE" $MNT_DIR
131e5180986SRob Bradford    sudo bash -c "echo bar > $MNT_DIR/foo" || exit 1
1322b2d0065SRuslan Mstoi    sudo umount "$BLK_IMAGE"
1330a229ef4SSebastien Boeuf    rm -r $MNT_DIR
1342b2d0065SRuslan Mstoi    popd || exit
1356b06cec6SYang Zhongfi
1366b06cec6SYang Zhong
1370fcca3edSSebastien BoeufSHARED_DIR="$WORKLOADS_DIR/shared_dir"
1380fcca3edSSebastien Boeufif [ ! -d "$SHARED_DIR" ]; then
1392b2d0065SRuslan Mstoi    mkdir -p "$SHARED_DIR"
1400fcca3edSSebastien Boeuf    echo "foo" >"$SHARED_DIR/file1"
141e5180986SRob Bradford    echo "bar" >"$SHARED_DIR/file3" || exit 1
1420fcca3edSSebastien Boeuffi
14372f3a697SRob Bradford
1445ae3144fSSamuel OrtizVFIO_DIR="$WORKLOADS_DIR/vfio"
1454ef702eaSRob BradfordVFIO_DISK_IMAGE="$WORKLOADS_DIR/vfio.img"
1462b2d0065SRuslan Mstoirm -rf "$VFIO_DIR" "$VFIO_DISK_IMAGE"
1472b2d0065SRuslan Mstoimkdir -p "$VFIO_DIR"
1482b2d0065SRuslan Mstoicp "$FOCAL_OS_RAW_IMAGE" "$VFIO_DIR"
1492b2d0065SRuslan Mstoicp "$FW" "$VFIO_DIR"
1502b2d0065SRuslan Mstoicp "$VMLINUX_IMAGE" "$VFIO_DIR" || exit 1
1515ae3144fSSamuel Ortiz
1522b2d0065SRuslan Mstoicargo build --features mshv --all --release --target "$BUILD_TARGET"
1536fde2d18SRob Bradford
1545ae3144fSSamuel Ortiz# We always copy a fresh version of our binary for our L2 guest.
1552b2d0065SRuslan Mstoicp target/"$BUILD_TARGET"/release/cloud-hypervisor "$VFIO_DIR"
1562b2d0065SRuslan Mstoicp target/"$BUILD_TARGET"/release/ch-remote "$VFIO_DIR"
1575ae3144fSSamuel Ortiz
158bdb7bcdbSSebastien Boeuf# Enable KSM with some reasonable parameters so that it won't take too long
159bdb7bcdbSSebastien Boeuf# for the memory to be merged between two processes.
160f6686036SSebastien Boeufsudo bash -c "echo 1000000 > /sys/kernel/mm/ksm/pages_to_scan"
161bdb7bcdbSSebastien Boeufsudo bash -c "echo 10 > /sys/kernel/mm/ksm/sleep_millisecs"
162bdb7bcdbSSebastien Boeufsudo bash -c "echo 1 > /sys/kernel/mm/ksm/run"
163bdb7bcdbSSebastien Boeuf
16403014e2eSSebastien Boeuf# Both test_vfio, ovs-dpdk and vDPA tests rely on hugepages
165318caeb9SRuslan MstoiHUGEPAGESIZE=$(grep Hugepagesize /proc/meminfo | awk '{print $2}')
1662b2d0065SRuslan MstoiPAGE_NUM=$((12288 * 1024 / HUGEPAGESIZE))
1672b2d0065SRuslan Mstoiecho "$PAGE_NUM" | sudo tee /proc/sys/vm/nr_hugepages
168e8e4f43dSRob Bradfordsudo chmod a+rwX /dev/hugepages
169e8e4f43dSRob Bradford
17003014e2eSSebastien Boeuf# Update max locked memory to 'unlimited' to avoid issues with vDPA
17103014e2eSSebastien Boeufulimit -l unlimited
17203014e2eSSebastien Boeuf
1730b6bc75dSAnatol Belski# Set number of open descriptors high enough for VFIO tests to run
1740b6bc75dSAnatol Belskiulimit -n 4096
1750b6bc75dSAnatol Belski
176f0082fecSRob Bradfordexport RUST_BACKTRACE=1
1770a3ad615SSongqian Litime cargo test --release --target "$BUILD_TARGET" $test_features "common_parallel::$test_filter" -- ${test_binary_args[*]}
17891ce39e2SRob BradfordRES=$?
1795ae3144fSSamuel Ortiz
180bb917460SSebastien Boeuf# Run some tests in sequence since the result could be affected by other tests
181bb917460SSebastien Boeuf# running in parallel.
182bb917460SSebastien Boeufif [ $RES -eq 0 ]; then
183bb917460SSebastien Boeuf    export RUST_BACKTRACE=1
1840a3ad615SSongqian Li    time cargo test --release --target "$BUILD_TARGET" $test_features "common_sequential::$test_filter" -- --test-threads=1 ${test_binary_args[*]}
185bb917460SSebastien Boeuf    RES=$?
186bb917460SSebastien Boeuffi
187bb917460SSebastien Boeuf
1881faaa2cdSBo Chen# Run tests on dbus_api
1891faaa2cdSBo Chenif [ $RES -eq 0 ]; then
1902b2d0065SRuslan Mstoi    cargo build --features "mshv,dbus_api" --all --release --target "$BUILD_TARGET"
1911faaa2cdSBo Chen    export RUST_BACKTRACE=1
1921faaa2cdSBo Chen    # integration tests now do not reply on build feature "dbus_api"
1931faaa2cdSBo Chen    time cargo test $test_features "dbus_api::$test_filter" -- ${test_binary_args[*]}
1941faaa2cdSBo Chen    RES=$?
1951faaa2cdSBo Chenfi
1961faaa2cdSBo Chen
19791ce39e2SRob Bradfordexit $RES
198