1eb53c232Spaul luse# SPDX-License-Identifier: BSD-3-Clause 2eb53c232Spaul luse# Copyright (C) 2017 Intel Corporation 3eb53c232Spaul luse# All rights reserved. 4eb53c232Spaul luse# 5eb53c232Spaul luse 673bb5a71SBen Walkertestdir=$(readlink -f $(dirname $0)) 773bb5a71SBen Walkerrootdir=$(readlink -f $testdir/../../..) 873bb5a71SBen Walkersource $rootdir/test/common/autotest_common.sh 973bb5a71SBen Walkersource $rootdir/test/vhost/common.sh 1073bb5a71SBen Walker 11598ba73fSPawel Kaminskidry_run=false 12598ba73fSPawel Kaminskino_shutdown=false 13598ba73fSPawel Kaminskifio_bin="fio" 1473bb5a71SBen Walkerfio_jobs="$testdir/fio_jobs/" 15598ba73fSPawel Kaminskitest_type=spdk_vhost_scsi 16598ba73fSPawel Kaminskireuse_vms=false 17598ba73fSPawel Kaminskivms=() 18598ba73fSPawel Kaminskiused_vms="" 19598ba73fSPawel Kaminskidisk_split="" 20598ba73fSPawel Kaminskix="" 21576f8ed2SPawel Kaminskiscsi_hot_remove_test=0 2221140193SPawel Kaminskiblk_hot_remove_test=0 234d0c5091SPawel Kaminskireadonly="" 24598ba73fSPawel Kaminski 25598ba73fSPawel Kaminskifunction usage() { 26844c8ec3SMichal Berger [[ -n $2 ]] && ( 27844c8ec3SMichal Berger echo "$2" 28844c8ec3SMichal Berger echo "" 29844c8ec3SMichal Berger ) 30598ba73fSPawel Kaminski echo "Shortcut script for doing automated hotattach/hotdetach test" 31598ba73fSPawel Kaminski echo "Usage: $(basename $1) [OPTIONS]" 32598ba73fSPawel Kaminski echo 33598ba73fSPawel Kaminski echo "-h, --help print help and exit" 34598ba73fSPawel Kaminski echo " --test-type=TYPE Perform specified test:" 35598ba73fSPawel Kaminski echo " virtio - test host virtio-scsi-pci using file as disk image" 36598ba73fSPawel Kaminski echo " kernel_vhost - use kernel driver vhost-scsi" 37598ba73fSPawel Kaminski echo " spdk_vhost_scsi - use spdk vhost scsi" 38598ba73fSPawel Kaminski echo " spdk_vhost_blk - use spdk vhost block" 39598ba73fSPawel Kaminski echo "-x set -x for script debug" 40598ba73fSPawel Kaminski echo " --fio-bin=FIO Use specific fio binary (will be uploaded to VM)" 41598ba73fSPawel Kaminski echo " --fio-jobs= Fio configs to use for tests. Can point to a directory or" 42598ba73fSPawel Kaminski echo " --vm=NUM[,OS][,DISKS] VM configuration. This parameter might be used more than once:" 43598ba73fSPawel Kaminski echo " NUM - VM number (mandatory)" 44598ba73fSPawel Kaminski echo " OS - VM os disk path (optional)" 45598ba73fSPawel Kaminski echo " DISKS - VM os test disks/devices path (virtio - optional, kernel_vhost - mandatory)" 46576f8ed2SPawel Kaminski echo " --scsi-hotremove-test Run scsi hotremove tests" 474d0c5091SPawel Kaminski echo " --readonly Use readonly for fio" 48598ba73fSPawel Kaminski exit 0 49598ba73fSPawel Kaminski} 50598ba73fSPawel Kaminski 51598ba73fSPawel Kaminskiwhile getopts 'xh-:' optchar; do 52598ba73fSPawel Kaminski case "$optchar" in 53598ba73fSPawel Kaminski -) 54598ba73fSPawel Kaminski case "$OPTARG" in 55598ba73fSPawel Kaminski help) usage $0 ;; 56598ba73fSPawel Kaminski fio-bin=*) fio_bin="${OPTARG#*=}" ;; 57598ba73fSPawel Kaminski fio-jobs=*) fio_jobs="${OPTARG#*=}" ;; 58598ba73fSPawel Kaminski test-type=*) test_type="${OPTARG#*=}" ;; 59598ba73fSPawel Kaminski vm=*) vms+=("${OPTARG#*=}") ;; 60576f8ed2SPawel Kaminski scsi-hotremove-test) scsi_hot_remove_test=1 ;; 6121140193SPawel Kaminski blk-hotremove-test) blk_hot_remove_test=1 ;; 624d0c5091SPawel Kaminski readonly) readonly="--readonly" ;; 63598ba73fSPawel Kaminski *) usage $0 "Invalid argument '$OPTARG'" ;; 64598ba73fSPawel Kaminski esac 65598ba73fSPawel Kaminski ;; 66598ba73fSPawel Kaminski h) usage $0 ;; 67844c8ec3SMichal Berger x) 68844c8ec3SMichal Berger set -x 69844c8ec3SMichal Berger x="-x" 70844c8ec3SMichal Berger ;; 71844c8ec3SMichal Berger *) usage $0 "Invalid argument '$OPTARG'" ;; 72598ba73fSPawel Kaminski esac 73598ba73fSPawel Kaminskidone 74598ba73fSPawel Kaminskishift $((OPTIND - 1)) 75598ba73fSPawel Kaminski 7673bb5a71SBen Walkerfio_job=$testdir/fio_jobs/default_integrity.job 7773bb5a71SBen Walkertmp_attach_job=$testdir/fio_jobs/fio_attach.job.tmp 7873bb5a71SBen Walkertmp_detach_job=$testdir/fio_jobs/fio_detach.job.tmp 79598ba73fSPawel Kaminski 80fa563858SBen Walkerrpc_py="$rootdir/scripts/rpc.py -s $(get_vhost_dir 0)/rpc.sock" 81598ba73fSPawel Kaminski 82598ba73fSPawel Kaminskifunction print_test_fio_header() { 83575a291fSPawel Wodkowski notice "===============" 84575a291fSPawel Wodkowski notice "" 85575a291fSPawel Wodkowski notice "Testing..." 86598ba73fSPawel Kaminski 87575a291fSPawel Wodkowski notice "Running fio jobs ..." 88598ba73fSPawel Kaminski if [ $# -gt 0 ]; then 89598ba73fSPawel Kaminski echo $1 90598ba73fSPawel Kaminski fi 91598ba73fSPawel Kaminski} 92598ba73fSPawel Kaminski 93598ba73fSPawel Kaminskifunction vms_setup() { 94fdc82d3bSMaciej Wawryk for vm_conf in "${vms[@]}"; do 95598ba73fSPawel Kaminski IFS=',' read -ra conf <<< "$vm_conf" 96dd2b935dSMichal Berger if [[ -z ${conf[0]} ]] || ! assert_number ${conf[0]}; then 97575a291fSPawel Wodkowski fail "invalid VM configuration syntax $vm_conf" 98598ba73fSPawel Kaminski fi 99598ba73fSPawel Kaminski 100598ba73fSPawel Kaminski # Sanity check if VM is not defined twice 101598ba73fSPawel Kaminski for vm_num in $used_vms; do 102598ba73fSPawel Kaminski if [[ $vm_num -eq ${conf[0]} ]]; then 103575a291fSPawel Wodkowski fail "VM$vm_num defined more than twice ( $(printf "'%s' " "${vms[@]}"))!" 104598ba73fSPawel Kaminski fi 105598ba73fSPawel Kaminski done 106598ba73fSPawel Kaminski 107598ba73fSPawel Kaminski used_vms+=" ${conf[0]}" 108598ba73fSPawel Kaminski 109e6e2fc5bSPawel Wodkowski setup_cmd="vm_setup --disk-type=$test_type --force=${conf[0]}" 110e6e2fc5bSPawel Wodkowski [[ x"${conf[1]}" != x"" ]] && setup_cmd+=" --os=${conf[1]}" 111e6e2fc5bSPawel Wodkowski [[ x"${conf[2]}" != x"" ]] && setup_cmd+=" --disks=${conf[2]}" 112598ba73fSPawel Kaminski $setup_cmd 113598ba73fSPawel Kaminski done 114598ba73fSPawel Kaminski} 115598ba73fSPawel Kaminski 116576f8ed2SPawel Kaminskifunction vm_run_with_arg() { 1178d4ecf1eSPawel Kaminski local vms_to_run="$*" 1188d4ecf1eSPawel Kaminski vm_run $vms_to_run 1198d4ecf1eSPawel Kaminski vm_wait_for_boot 300 $vms_to_run 120576f8ed2SPawel Kaminski} 121576f8ed2SPawel Kaminski 122598ba73fSPawel Kaminskifunction vms_setup_and_run() { 1238d4ecf1eSPawel Kaminski local vms_to_run="$*" 124598ba73fSPawel Kaminski vms_setup 1258d4ecf1eSPawel Kaminski vm_run_with_arg $vms_to_run 126598ba73fSPawel Kaminski} 127598ba73fSPawel Kaminski 128598ba73fSPawel Kaminskifunction vms_prepare() { 129598ba73fSPawel Kaminski for vm_num in $1; do 130598ba73fSPawel Kaminski qemu_mask_param="VM_${vm_num}_qemu_mask" 131598ba73fSPawel Kaminski 132598ba73fSPawel Kaminski host_name="VM-${vm_num}-${!qemu_mask_param}" 133575a291fSPawel Wodkowski notice "Setting up hostname: $host_name" 13497df5bccSBen Walker vm_exec $vm_num "hostname $host_name" 135598ba73fSPawel Kaminski vm_start_fio_server --fio-bin=$fio_bin $readonly $vm_num 136598ba73fSPawel Kaminski done 137598ba73fSPawel Kaminski} 138598ba73fSPawel Kaminski 139598ba73fSPawel Kaminskifunction vms_reboot_all() { 140575a291fSPawel Wodkowski notice "Rebooting all vms " 141598ba73fSPawel Kaminski for vm_num in $1; do 142*c7a40fcbSMichal Berger VM_SSH_OPTIONS="-oServerAliveInterval=1" vm_exec $vm_num "reboot -f" || true 143598ba73fSPawel Kaminski done 144598ba73fSPawel Kaminski 14521140193SPawel Kaminski vm_wait_for_boot 300 $1 146598ba73fSPawel Kaminski} 147598ba73fSPawel Kaminski 148598ba73fSPawel Kaminskifunction check_fio_retcode() { 14921140193SPawel Kaminski local fio_retcode=$3 150598ba73fSPawel Kaminski echo $1 15121140193SPawel Kaminski local retcode_expected=$2 152598ba73fSPawel Kaminski if [ $retcode_expected == 0 ]; then 153598ba73fSPawel Kaminski if [ $fio_retcode != 0 ]; then 15421140193SPawel Kaminski error " Fio test ended with error." 155598ba73fSPawel Kaminski else 156575a291fSPawel Wodkowski notice " Fio test ended with success." 157598ba73fSPawel Kaminski fi 158598ba73fSPawel Kaminski else 159598ba73fSPawel Kaminski if [ $fio_retcode != 0 ]; then 160575a291fSPawel Wodkowski notice " Fio test ended with expected error." 161598ba73fSPawel Kaminski else 16221140193SPawel Kaminski error " Fio test ended with unexpected success." 163598ba73fSPawel Kaminski fi 164598ba73fSPawel Kaminski fi 165598ba73fSPawel Kaminski} 166598ba73fSPawel Kaminski 16721140193SPawel Kaminskifunction wait_for_finish() { 16821140193SPawel Kaminski local wait_for_pid=$1 16921140193SPawel Kaminski local sequence=${2:-30} 170fb9c4ee6SKarol Latecki for i in $(seq 1 $sequence); do 17121140193SPawel Kaminski if kill -0 $wait_for_pid; then 17221140193SPawel Kaminski sleep 0.5 17321140193SPawel Kaminski continue 17421140193SPawel Kaminski else 17521140193SPawel Kaminski break 17621140193SPawel Kaminski fi 17721140193SPawel Kaminski done 17821140193SPawel Kaminski if kill -0 $wait_for_pid; then 17921140193SPawel Kaminski error "Timeout for fio command" 18021140193SPawel Kaminski fi 18121140193SPawel Kaminski 18221140193SPawel Kaminski wait $wait_for_pid 18321140193SPawel Kaminski} 18421140193SPawel Kaminski 185598ba73fSPawel Kaminskifunction reboot_all_and_prepare() { 186576f8ed2SPawel Kaminski vms_reboot_all "$1" 187576f8ed2SPawel Kaminski vms_prepare "$1" 188576f8ed2SPawel Kaminski} 189576f8ed2SPawel Kaminski 190576f8ed2SPawel Kaminskifunction post_test_case() { 191576f8ed2SPawel Kaminski vm_shutdown_all 192fa563858SBen Walker vhost_kill 0 193576f8ed2SPawel Kaminski} 194576f8ed2SPawel Kaminski 195576f8ed2SPawel Kaminskifunction on_error_exit() { 196576f8ed2SPawel Kaminski set +e 197576f8ed2SPawel Kaminski echo "Error on $1 - $2" 198576f8ed2SPawel Kaminski post_test_case 199576f8ed2SPawel Kaminski print_backtrace 200576f8ed2SPawel Kaminski exit 1 201576f8ed2SPawel Kaminski} 202576f8ed2SPawel Kaminski 203576f8ed2SPawel Kaminskifunction check_disks() { 204576f8ed2SPawel Kaminski if [ "$1" == "$2" ]; then 205576f8ed2SPawel Kaminski echo "Disk has not been deleted" 206576f8ed2SPawel Kaminski exit 1 207576f8ed2SPawel Kaminski fi 208576f8ed2SPawel Kaminski} 209576f8ed2SPawel Kaminski 210576f8ed2SPawel Kaminskifunction get_traddr() { 211576f8ed2SPawel Kaminski local nvme_name=$1 212074df1d8SPawel Kaminski local nvme 2136b523365SMichal Berger 214074df1d8SPawel Kaminski nvme="$($rootdir/scripts/gen_nvme.sh)" 2153cbd2dccSMaciej Wawryk traddr=$(jq -r ".config[] | select(.params.name == \"$nvme_name\") | .params.traddr" <<< "$nvme") 2166b523365SMichal Berger [[ -n $traddr ]] || return 1 217576f8ed2SPawel Kaminski} 218576f8ed2SPawel Kaminski 219576f8ed2SPawel Kaminskifunction delete_nvme() { 22031e77a73SPawel Kaminski $rpc_py bdev_nvme_detach_controller $1 221576f8ed2SPawel Kaminski} 222576f8ed2SPawel Kaminski 223576f8ed2SPawel Kaminskifunction add_nvme() { 224f54df840SPawel Kaminski $rpc_py bdev_nvme_attach_controller -b $1 -t PCIe -a $2 225598ba73fSPawel Kaminski} 226