Commit 028c8cb4 authored by Karol Latecki's avatar Karol Latecki Committed by Jim Harris
Browse files

test/vhost: remove virsh use from filesystem test



Refactor filesystem test so that it does not use virsh, only qemu.

Source compliation on filesystem was replaced with FIO+verify
on file located on mounted filesystem.
Reason for this change is that test for single filesystem type
took about 1:30 for just compilation itself.
Considering that we have 4 filesystems in test with 2 different
vhost controllers, it took way too long.

Change spaces to tabs.

Change-Id: I396d653efe2bbf76934b2532576455be43632ff4
Signed-off-by: default avatarKarol Latecki <karol.latecki@intel.com>
Reviewed-on: https://review.gerrithub.io/398603


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent 8d7ddde1
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -151,13 +151,13 @@ if [ $SPDK_TEST_VHOST -eq 1 ]; then
		run_test ./test/vhost/spdk_vhost.sh --integrity
		timing_exit integrity

		# timing_enter fs_integrity_scsi
		# run_test ./test/vhost/spdk_vhost.sh --fs-integrity-scsi
		# timing_exit fs_integrity_scsi
		timing_enter fs_integrity_scsi
		run_test ./test/vhost/spdk_vhost.sh --fs-integrity-scsi
		timing_exit fs_integrity_scsi

		# timing_enter fs_integrity_blk
		# run_test ./test/vhost/spdk_vhost.sh --fs-integrity-blk
		# timing_exit fs_integrity_blk
		timing_enter fs_integrity_blk
		run_test ./test/vhost/spdk_vhost.sh --fs-integrity-blk
		timing_exit fs_integrity_blk

		timing_enter integrity_lvol_scsi_nightly
		run_test ./test/vhost/spdk_vhost.sh --integrity-lvol-scsi-nightly

test/vhost/integrity/base_vm.xml

deleted100644 → 0
+0 −68
Original line number Diff line number Diff line
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
  <name></name>
  <memory unit='GiB'>4</memory>
  <currentMemory unit='GiB'>4</currentMemory>
  <vcpu placement='static'>8</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-1.6'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <cpu mode='host-model'>
    <model fallback='allow'/>
  </cpu>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator></emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file=''/>
			<backingStore/>
      <target dev='hda' bus='ide'/>
      <address type='drive' domain='0' bus='0' slot='0' function='0'/>
    </disk>
    <controller type='usb' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <interface type='network'>
      <mac address=''/>
      <source network=''/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes'/>
    <video>
      <model type='cirrus' vram='16384' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </memballoon>
  </devices>
    <qemu:commandline>
        <qemu:arg value='-object'/>
    <qemu:arg value='memory-backend-file,id=mem,size=4096M,mem-path=/dev/hugepages,share=on'/>
        <qemu:arg value='-numa'/>
    <qemu:arg value='node,memdev=mem'/>
    <qemu:arg value='-chardev'/>
    <qemu:arg value='socket,id=char0,path=/tmp/naa.0'/>
        <qemu:arg value='-device'/>
    <qemu:arg value='vhost_dev_args,chardev=char0'/>
    </qemu:commandline>
</domain>
+0 −8
Original line number Diff line number Diff line
<network>
    <name></name>
    <bridge name="int_test_br" />
    <forward />
    <ip address="192.200.200.1" netmask="255.255.255.0">
        <dhcp><range end="192.200.200.254" start="192.200.200.2" /></dhcp>
    </ip>
</network>
+76 −169
Original line number Diff line number Diff line
#!/usr/bin/env bash

set -xe

: ${QEMU_PREFIX="/usr/local/qemu/spdk-2.12-pre"}

basedir=$(readlink -f $(dirname $0))
rootdir=$(readlink -f $basedir/../../..)
testdir=$(readlink -f $rootdir/..)
MAKE="make -j$(( $(nproc)  * 2 ))"

rpc_py="python $rootdir/scripts/rpc.py -s $(get_vhost_dir)/rpc.sock"
HOST_IP=192.200.200.1
VM_IP=192.200.200.254
VM_UNAME="root"
VM_PASS="root"
VM_NAME="int_test_vm"
VM_NET_NAME="int_test_net"
VM_MAC="02:de:ad:de:ad:01"
VM_BAK_IMG="/tmp/int_test_backing.img"
TIMEO=60
SSHCMD="sshpass -p $VM_PASS ssh"
SCPCMD="sshpass -p $VM_PASS scp"

while getopts 'i:m:f:' optchar; do
    case $optchar in
        i) VM_IMG="${OPTARG#*=}" ;;
        m) VHOST_MODE="${OPTARG#*=}" ;;
        f) VM_FS="${OPTARG#*=}" ;;
    esac
done

source $rootdir/test/common/autotest_common.sh

if [ -z "$VM_IMG" ]; then
    echo "ERROR: VM_IMG: path to qcow2 image not provided - not running"
    exit 1
fi

if [ -z "$VHOST_MODE" ]; then
    echo "ERROR: VHOST_MODE: please specify Vhost mode - scsi or blk"
fi

if [ -z "$VM_FS" ]; then
    VM_FS="ext4"
    echo "INFO: Using default value for filesystem: $VM_FS"
fi

# Check if Qemu binary is present
if [[ -z $VM_QEMU ]]; then
    VM_QEMU="$QEMU_PREFIX/bin/qemu-system-x86_64"
fi

if [[ ! -x $VM_QEMU ]]; then
    echo "ERROR: QEMU binary not present in $VM_QEMU"
fi

if [[ -z $QEMU_IMG ]]; then
    QEMU_IMG="$QEMU_PREFIX/bin/qemu-img"
fi

echo "Running test with filesystem: $VM_FS"

function cleanup_virsh() {
    if virsh domstate $VM_NAME; then
        virsh shutdown $VM_NAME
        for timeo in `seq 0 10`; do
            if ! virsh domstate $VM_NAME; then
                break
            fi
            if [[ $timeo -eq 10 ]]; then
                echo "ERROR: VM did not shutdown, killing!"
                virsh destroy $VM_NAME
            fi
            sleep 1
        done
    fi

    if virsh net-info $VM_NET_NAME; then
        virsh net-destroy $VM_NET_NAME
    fi
    rm $VM_BAK_IMG || true
set -e

ctrl_type="spdk_vhost_scsi"
vm_fs="ext4"

function usage()
{
	[[ ! -z $2 ]] && ( echo "$2"; echo ""; )
	echo "Shortcut script for doing automated test"
	echo "Usage: $(basename $1) [OPTIONS]"
	echo
	echo "-h, --help                Print help and exit"
	echo "    --work-dir=WORK_DIR   Workspace for the test to run"
	echo "    --ctrl-type=TYPE      Controller type to use for test:"
	echo "                          spdk_vhost_scsi - use spdk vhost scsi"
	echo "    --fs=FS_LIST          Filesystems to use for test in VM:"
	echo "                          Example: --fs=\"ext4 ntfs ext2\""
	echo "                          Default: ext4"
	echo "                          spdk_vhost_blk - use spdk vhost block"
	echo "-x                        set -x for script debug"
	exit 0
}

function cleanup_lvol() {
    echo "INFO: Removing lvol bdevs"
    $rpc_py delete_bdev $lb_name
    echo -e "\tINFO: lvol bdev $lb_name removed"

    echo "INFO: Removing lvol stores"
    $rpc_py destroy_lvol_store -u $lvol_store
    echo -e "\tINFO: lvol stote $lvol_store removed"
function clean_lvol_cfg()
{
	notice "Removing lvol bdev and lvol store"
	$rpc_py delete_bdev lvol_store/lvol_bdev
	$rpc_py destroy_lvol_store -l lvol_store
}

timing_enter integrity_test

# Backing image for VM
"$QEMU_IMG" create -f qcow2 -o backing_file=$VM_IMG $VM_BAK_IMG

# Prepare vhost config
cp $basedir/vhost.conf.in $basedir/vhost.conf
$rootdir/scripts/gen_nvme.sh >> $basedir/vhost.conf

# Prepare .xml files for Virsh
cp $basedir/base_vm.xml $basedir/vm_conf.xml
cp $basedir/base_vnet.xml $basedir/vnet_conf.xml
sed -i "s@<name></name>@<name>$VM_NAME</name>@g" $basedir/vm_conf.xml
sed -i "s@source file=''@source file='$VM_BAK_IMG'@g" $basedir/vm_conf.xml
sed -i "s@<emulator></emulator>@<emulator>$VM_QEMU</emulator>@g" $basedir/vm_conf.xml
sed -i "s@mac address=''@mac address='$VM_MAC'@g" $basedir/vm_conf.xml
sed -i "s@source network=''@source network='$VM_NET_NAME'@g" $basedir/vm_conf.xml
sed -i "s@<name></name>@<name>$VM_NET_NAME</name>@g" $basedir/vnet_conf.xml
if [[ "$VHOST_MODE" == "scsi" ]]; then
    sed -i "s@vhost_dev_args@vhost-user-scsi-pci,id=scsi0@g" $basedir/vm_conf.xml
else
    sed -i "s@vhost_dev_args@vhost-user-blk-pci@g" $basedir/vm_conf.xml
fi

trap "cleanup_virsh; killprocess $pid; exit 1" SIGINT SIGTERM EXIT

virsh net-create $basedir/vnet_conf.xml

# Change directory and ownership because virsh has issues with
# paths that are in /root tree
cd /tmp
$rootdir/app/vhost/vhost -c $basedir/vhost.conf &
pid=$!
echo "Process pid: $pid"
waitforlisten "$pid"
while getopts 'xh-:' optchar; do
	case "$optchar" in
		-)
		case "$OPTARG" in
			help) usage $0 ;;
			ctrl-type=*) ctrl_type="${OPTARG#*=}" ;;
			fs=*) vm_fs="${OPTARG#*=}" ;;
			*) usage $0 "Invalid argument '$OPTARG'" ;;
		esac
		;;
	h) usage $0 ;;
	x) set -x
		x="-x" ;;
	*) usage $0 "Invalid argument '$OPTARG'"
	esac
done

lvol_store=$($rpc_py construct_lvol_store Nvme0n1 lvs_0)
free_mb=$(get_lvs_free_mb "$lvol_store")
lb_name=$($rpc_py construct_lvol_bdev -u $lvol_store lbd_0 $free_mb)
. $(readlink -e "$(dirname $0)/../common/common.sh") || exit 1
rpc_py="python $SPDK_BUILD_DIR/scripts/rpc.py -s $(get_vhost_dir)/rpc.sock"

if [[ "$VHOST_MODE" == "scsi" ]]; then
    $rpc_py construct_vhost_scsi_controller naa.0
    $rpc_py add_vhost_scsi_lun naa.0 0 $lb_name
else
    $rpc_py construct_vhost_blk_controller naa.0 $lb_name
fi
trap 'error_exit "${FUNCNAME}" "${LINENO}"' SIGTERM SIGABRT ERR

trap "cleanup_lvol; cleanup_virsh; killprocess $pid; exit 1" SIGINT SIGTERM EXIT ERR
# Try to kill if any VM remains from previous runs
vm_kill_all

chmod 777 /tmp/naa.0
notice "Starting SPDK vhost"
spdk_vhost_run --conf-path=$BASE_DIR
notice "..."

virsh create $basedir/vm_conf.xml
virsh net-update $VM_NET_NAME add ip-dhcp-host "<host mac='$VM_MAC' name='$VM_NAME' ip='$VM_IP'/>"
# Set up lvols and vhost controllers
trap 'clean_lvol_cfg; error_exit "${FUNCNAME}" "${LINENO}"' SIGTERM SIGABRT ERR
notice "Constructing lvol store and lvol bdev on top of Nvme0n1"
lvs_uuid=$($rpc_py construct_lvol_store Nvme0n1 lvol_store)
$rpc_py construct_lvol_bdev lvol_bdev 10000 -l lvol_store

# Wait for VM to boot
echo "INFO: Trying to connect to virtual machine..."
while ! $SSHCMD root@$VM_IP -q -oStrictHostKeyChecking=no 'echo Hello'; do
    sleep 1
    if ! (( TIMEO-=1 ));then
        echo "ERROR: VM did not boot properly, exiting"
        exit 1
if [[ "$ctrl_type" == "spdk_vhost_scsi" ]]; then
	$rpc_py construct_vhost_scsi_controller naa.Nvme0n1.0
	$rpc_py add_vhost_scsi_lun naa.Nvme0n1.0 0 lvol_store/lvol_bdev
elif [[ "$ctrl_type" == "spdk_vhost_blk" ]]; then
	$rpc_py construct_vhost_blk_controller naa.Nvme0n1.0 lvol_store/lvol_bdev
fi
done

# Run test on Virtual Machine
$SCPCMD -r $basedir/integrity_vm.sh root@$VM_IP:~
$SSHCMD root@$VM_IP "fs=$VM_FS ~/integrity_vm.sh $VHOST_MODE"
# Set up and run VM
setup_cmd="vm_setup --disk-type=$ctrl_type --force=0"
setup_cmd+=" --os=/home/sys_sgsw/vhost_vm_image.qcow2"
setup_cmd+=" --disks=Nvme0n1"
$setup_cmd

# Kill VM, cleanup config files
cleanup_virsh
rm $basedir/vm_conf.xml || true
rm $basedir/vnet_conf.xml || true
rm $basedir/vhost.conf || true
# Run VM
vm_run 0
vm_wait_for_boot 600 0

# Delete lvol bdev, destroy lvol store
cleanup_lvol
# Run tests on VM
vm_scp 0 $BASE_DIR/integrity_vm.sh root@127.0.0.1:/root/integrity_vm.sh
vm_ssh 0 "~/integrity_vm.sh $ctrl_type \"$vm_fs\""

# Try to gracefully stop spdk vhost
if /bin/kill -INT $pid; then
    while /bin/kill -0 $pid; do
        sleep 1
    done
elif /bin/kill -0 $pid; then
    killprocess $pid
    echo "ERROR: Vhost was not closed gracefully..."
    exit 1
else
    exit 1
fi
notice "Shutting down virtual machine..."
vm_shutdown_all

trap - SIGINT SIGTERM EXIT
timing_exit integrity_test
clean_lvol_cfg
notice "Shutting down SPDK vhost app..."
spdk_vhost_kill
+49 −46
Original line number Diff line number Diff line
@@ -4,22 +4,23 @@ set -xe
basedir=$(readlink -f $(dirname $0))
MAKE="make -j$(( $(nproc)  * 2 ))"

if [[ $1 == "scsi" ]]; then
if [[ $1 == "spdk_vhost_scsi" ]]; then
	devs=""
	for entry in /sys/block/sd*; do
		if grep -Eq '(INTEL|RAWSCSI|LIO-ORG)' $entry/device/vendor; then
			devs+="$(basename $entry) "
		fi
	done
else script=$blk_script;
elif [[ $1 == "spdk_vhost_blk" ]]; then
	devs=$(cd /sys/block; echo vd*)
fi

fs=$2

trap "exit 1" SIGINT SIGTERM EXIT

for fs in $fs; do
	for dev in $devs; do
                mkfs_cmd="mkfs.$fs"
		parted_cmd="parted -s /dev/${dev}"

		echo "INFO: Creating partition table on disk using: $parted_cmd mklabel gpt"
@@ -27,6 +28,10 @@ for fs in $fs; do
		$parted_cmd mkpart primary 2048s 100%
		sleep 2

		mkfs_cmd="mkfs.$fs"
		if [[ $fs == "ntfs" ]]; then
			mkfs_cmd+=" -f"
		fi
		mkfs_cmd+=" /dev/${dev}1"
		echo "INFO: Creating filesystem using: $mkfs_cmd"
		wipefs -a /dev/${dev}1
@@ -34,16 +39,14 @@ for fs in $fs; do

		mkdir -p /mnt/${dev}dir
		mount -o sync /dev/${dev}1 /mnt/${dev}dir
                mkdir -p /mnt/${dev}dir/linux-src
                tar xf $basedir/linux-src.tar.gz -C /mnt/${dev}dir/linux-src --strip-components=1
                sleep 2

                # Now build SPDK
                $MAKE -C /mnt/${dev}dir/linux-src defconfig
                $MAKE -C /mnt/${dev}dir/linux-src
		fio --name="integrity" --bsrange=4k-512k --iodepth=128 --numjobs=1 --direct=1 \
		--thread=1 --group_reporting=1 --rw=randrw --rwmixread=70 \
		--filename=/mnt/${dev}dir/test_file --verify=md5 --do_verify=1 \
		--verify_backlog=1024 --fsync_on_close=1 --runtime=20 --time_based=1 --size=1G

		# Print out space consumed on target device
		df -h /dev/$dev
                rm -rf /mnt/${dev}dir/linux-src
	done

	for dev in $devs; do
Loading