1#!/bin/bash 2set -x 3 4source $HOME/.cargo/env 5source $(dirname "$0")/test-util.sh 6 7WORKLOADS_DIR="$HOME/workloads" 8mkdir -p "$WORKLOADS_DIR" 9 10process_common_args "$@" 11 12# For now these values are default for kvm 13test_features="" 14 15if [ "$hypervisor" = "mshv" ] ; then 16 test_features="--features mshv" 17fi 18 19cp scripts/sha1sums-x86_64 $WORKLOADS_DIR 20 21download_hypervisor_fw 22 23OVMF_FW_URL=$(curl --silent https://api.github.com/repos/cloud-hypervisor/edk2/releases/latest | grep "browser_download_url" | grep -o 'https://.*[^ "]') 24OVMF_FW="$WORKLOADS_DIR/CLOUDHV.fd" 25if [ ! -f "$OVMF_FW" ]; then 26 pushd $WORKLOADS_DIR 27 time wget --quiet $OVMF_FW_URL || exit 1 28 popd 29fi 30 31FOCAL_OS_IMAGE_NAME="focal-server-cloudimg-amd64-custom-20210609-0.qcow2" 32FOCAL_OS_IMAGE_URL="https://cloud-hypervisor.azureedge.net/$FOCAL_OS_IMAGE_NAME" 33FOCAL_OS_IMAGE="$WORKLOADS_DIR/$FOCAL_OS_IMAGE_NAME" 34if [ ! -f "$FOCAL_OS_IMAGE" ]; then 35 pushd $WORKLOADS_DIR 36 time wget --quiet $FOCAL_OS_IMAGE_URL || exit 1 37 popd 38fi 39 40FOCAL_OS_RAW_IMAGE_NAME="focal-server-cloudimg-amd64-custom-20210609-0.raw" 41FOCAL_OS_RAW_IMAGE="$WORKLOADS_DIR/$FOCAL_OS_RAW_IMAGE_NAME" 42if [ ! -f "$FOCAL_OS_RAW_IMAGE" ]; then 43 pushd $WORKLOADS_DIR 44 time qemu-img convert -p -f qcow2 -O raw $FOCAL_OS_IMAGE_NAME $FOCAL_OS_RAW_IMAGE_NAME || exit 1 45 popd 46fi 47 48FOCAL_OS_QCOW_BACKING_FILE_IMAGE_NAME="focal-server-cloudimg-amd64-custom-20210609-0-backing.qcow2" 49FOCAL_OS_QCOW_BACKING_FILE_IMAGE="$WORKLOADS_DIR/$FOCAL_OS_QCOW_BACKING_FILE_IMAGE_NAME" 50if [ ! -f "$FOCAL_OS_QCOW_BACKING_FILE_IMAGE" ]; then 51 pushd $WORKLOADS_DIR 52 time qemu-img create -f qcow2 -b $FOCAL_OS_IMAGE -F qcow2 $FOCAL_OS_QCOW_BACKING_FILE_IMAGE_NAME 53 popd 54fi 55 56JAMMY_OS_IMAGE_NAME="jammy-server-cloudimg-amd64-custom-20230119-0.qcow2" 57JAMMY_OS_IMAGE_URL="https://cloud-hypervisor.azureedge.net/$JAMMY_OS_IMAGE_NAME" 58JAMMY_OS_IMAGE="$WORKLOADS_DIR/$JAMMY_OS_IMAGE_NAME" 59if [ ! -f "$JAMMY_OS_IMAGE" ]; then 60 pushd $WORKLOADS_DIR 61 time wget --quiet $JAMMY_OS_IMAGE_URL || exit 1 62 popd 63fi 64 65JAMMY_OS_RAW_IMAGE_NAME="jammy-server-cloudimg-amd64-custom-20230119-0.raw" 66JAMMY_OS_RAW_IMAGE="$WORKLOADS_DIR/$JAMMY_OS_RAW_IMAGE_NAME" 67if [ ! -f "$JAMMY_OS_RAW_IMAGE" ]; then 68 pushd $WORKLOADS_DIR 69 time qemu-img convert -p -f qcow2 -O raw $JAMMY_OS_IMAGE_NAME $JAMMY_OS_RAW_IMAGE_NAME || exit 1 70 popd 71fi 72 73ALPINE_MINIROOTFS_URL="http://dl-cdn.alpinelinux.org/alpine/v3.11/releases/x86_64/alpine-minirootfs-3.11.3-x86_64.tar.gz" 74ALPINE_MINIROOTFS_TARBALL="$WORKLOADS_DIR/alpine-minirootfs-x86_64.tar.gz" 75if [ ! -f "$ALPINE_MINIROOTFS_TARBALL" ]; then 76 pushd $WORKLOADS_DIR 77 time wget --quiet $ALPINE_MINIROOTFS_URL -O $ALPINE_MINIROOTFS_TARBALL || exit 1 78 popd 79fi 80 81ALPINE_INITRAMFS_IMAGE="$WORKLOADS_DIR/alpine_initramfs.img" 82if [ ! -f "$ALPINE_INITRAMFS_IMAGE" ]; then 83 pushd $WORKLOADS_DIR 84 mkdir alpine-minirootfs 85 tar xf "$ALPINE_MINIROOTFS_TARBALL" -C alpine-minirootfs 86 cat > alpine-minirootfs/init <<-EOF 87 #! /bin/sh 88 mount -t devtmpfs dev /dev 89 echo \$TEST_STRING > /dev/console 90 poweroff -f 91 EOF 92 chmod +x alpine-minirootfs/init 93 cd alpine-minirootfs 94 find . -print0 | 95 cpio --null --create --verbose --owner root:root --format=newc > "$ALPINE_INITRAMFS_IMAGE" 96 popd 97fi 98 99pushd $WORKLOADS_DIR 100sha1sum sha1sums-x86_64 --check 101if [ $? -ne 0 ]; then 102 echo "sha1sum validation of images failed, remove invalid images to fix the issue." 103 exit 1 104fi 105popd 106 107# Build custom kernel based on virtio-pmem and virtio-fs upstream patches 108VMLINUX_IMAGE="$WORKLOADS_DIR/vmlinux" 109if [ ! -f "$VMLINUX_IMAGE" ]; then 110 build_custom_linux 111fi 112 113VIRTIOFSD="$WORKLOADS_DIR/virtiofsd" 114VIRTIOFSD_DIR="virtiofsd_build" 115if [ ! -f "$VIRTIOFSD" ]; then 116 pushd $WORKLOADS_DIR 117 git clone "https://gitlab.com/virtio-fs/virtiofsd.git" $VIRTIOFSD_DIR 118 pushd $VIRTIOFSD_DIR 119 git checkout v1.1.0 120 time cargo build --release 121 cp target/release/virtiofsd $VIRTIOFSD || exit 1 122 popd 123 rm -rf $VIRTIOFSD_DIR 124 popd 125fi 126 127 128BLK_IMAGE="$WORKLOADS_DIR/blk.img" 129MNT_DIR="mount_image" 130if [ ! -f "$BLK_IMAGE" ]; then 131 pushd $WORKLOADS_DIR 132 fallocate -l 16M $BLK_IMAGE 133 mkfs.ext4 -j $BLK_IMAGE 134 mkdir $MNT_DIR 135 sudo mount -t ext4 $BLK_IMAGE $MNT_DIR 136 sudo bash -c "echo bar > $MNT_DIR/foo" || exit 1 137 sudo umount $BLK_IMAGE 138 rm -r $MNT_DIR 139 popd 140fi 141 142SHARED_DIR="$WORKLOADS_DIR/shared_dir" 143if [ ! -d "$SHARED_DIR" ]; then 144 mkdir -p $SHARED_DIR 145 echo "foo" > "$SHARED_DIR/file1" 146 echo "bar" > "$SHARED_DIR/file3" || exit 1 147fi 148 149VFIO_DIR="$WORKLOADS_DIR/vfio" 150VFIO_DISK_IMAGE="$WORKLOADS_DIR/vfio.img" 151rm -rf $VFIO_DIR $VFIO_DISK_IMAGE 152mkdir -p $VFIO_DIR 153cp $FOCAL_OS_RAW_IMAGE $VFIO_DIR 154cp $FW $VFIO_DIR 155cp $VMLINUX_IMAGE $VFIO_DIR || exit 1 156 157cargo build --features mshv --all --release --target $BUILD_TARGET 158 159# We always copy a fresh version of our binary for our L2 guest. 160cp target/$BUILD_TARGET/release/cloud-hypervisor $VFIO_DIR 161cp target/$BUILD_TARGET/release/ch-remote $VFIO_DIR 162 163# Enable KSM with some reasonable parameters so that it won't take too long 164# for the memory to be merged between two processes. 165sudo bash -c "echo 1000000 > /sys/kernel/mm/ksm/pages_to_scan" 166sudo bash -c "echo 10 > /sys/kernel/mm/ksm/sleep_millisecs" 167sudo bash -c "echo 1 > /sys/kernel/mm/ksm/run" 168 169# Both test_vfio, ovs-dpdk and vDPA tests rely on hugepages 170HUGEPAGESIZE=`grep Hugepagesize /proc/meminfo | awk '{print $2}'` 171PAGE_NUM=`echo $((12288 * 1024 / $HUGEPAGESIZE))` 172echo $PAGE_NUM | sudo tee /proc/sys/vm/nr_hugepages 173sudo chmod a+rwX /dev/hugepages 174 175# Update max locked memory to 'unlimited' to avoid issues with vDPA 176ulimit -l unlimited 177 178# Set number of open descriptors high enough for VFIO tests to run 179ulimit -n 4096 180 181export RUST_BACKTRACE=1 182time cargo test $test_features "common_parallel::$test_filter" -- ${test_binary_args[*]} 183RES=$? 184 185# Run some tests in sequence since the result could be affected by other tests 186# running in parallel. 187if [ $RES -eq 0 ]; then 188 export RUST_BACKTRACE=1 189 time cargo test $test_features "common_sequential::$test_filter" -- --test-threads=1 ${test_binary_args[*]} 190 RES=$? 191fi 192 193# Run tests on dbus_api 194if [ $RES -eq 0 ]; then 195 cargo build --features "mshv,dbus_api" --all --release --target $BUILD_TARGET 196 export RUST_BACKTRACE=1 197 # integration tests now do not reply on build feature "dbus_api" 198 time cargo test $test_features "dbus_api::$test_filter" -- ${test_binary_args[*]} 199 RES=$? 200fi 201 202exit $RES 203