per Intel policy to include file commit date using git cmd below. The policy does not apply to non-Intel (C) notices. git log --follow -C90% --format=%ad --date default <file> | tail -1 and then pull just the year from the result. Intel copyrights were not added to files where Intel either had no contribution ot the contribution lacked substance (ie license header updates, formatting changes, etc) For intel copyrights added, --follow and -C95% were used. Signed-off-by: paul luse <paul.e.luse@intel.com> Change-Id: I2ef86976095b88a9bf5b1003e59f3943cd6bbe4c Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15209 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Community-CI: Mellanox Build Bot Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Krzysztof Karas <krzysztof.karas@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
229 lines
5.4 KiB
Bash
229 lines
5.4 KiB
Bash
# SPDX-License-Identifier: BSD-3-Clause
|
|
# Copyright (C) 2017 Intel Corporation
|
|
# All rights reserved.
|
|
#
|
|
|
|
testdir=$(readlink -f $(dirname $0))
|
|
rootdir=$(readlink -f $testdir/../../..)
|
|
source $rootdir/test/common/autotest_common.sh
|
|
source $rootdir/test/vhost/common.sh
|
|
|
|
dry_run=false
|
|
no_shutdown=false
|
|
fio_bin="fio"
|
|
fio_jobs="$testdir/fio_jobs/"
|
|
test_type=spdk_vhost_scsi
|
|
reuse_vms=false
|
|
vms=()
|
|
used_vms=""
|
|
disk_split=""
|
|
x=""
|
|
scsi_hot_remove_test=0
|
|
blk_hot_remove_test=0
|
|
readonly=""
|
|
|
|
function usage() {
|
|
[[ -n $2 ]] && (
|
|
echo "$2"
|
|
echo ""
|
|
)
|
|
echo "Shortcut script for doing automated hotattach/hotdetach test"
|
|
echo "Usage: $(basename $1) [OPTIONS]"
|
|
echo
|
|
echo "-h, --help print help and exit"
|
|
echo " --test-type=TYPE Perform specified test:"
|
|
echo " virtio - test host virtio-scsi-pci using file as disk image"
|
|
echo " kernel_vhost - use kernel driver vhost-scsi"
|
|
echo " spdk_vhost_scsi - use spdk vhost scsi"
|
|
echo " spdk_vhost_blk - use spdk vhost block"
|
|
echo "-x set -x for script debug"
|
|
echo " --fio-bin=FIO Use specific fio binary (will be uploaded to VM)"
|
|
echo " --fio-jobs= Fio configs to use for tests. Can point to a directory or"
|
|
echo " --vm=NUM[,OS][,DISKS] VM configuration. This parameter might be used more than once:"
|
|
echo " NUM - VM number (mandatory)"
|
|
echo " OS - VM os disk path (optional)"
|
|
echo " DISKS - VM os test disks/devices path (virtio - optional, kernel_vhost - mandatory)"
|
|
echo " --scsi-hotremove-test Run scsi hotremove tests"
|
|
echo " --readonly Use readonly for fio"
|
|
exit 0
|
|
}
|
|
|
|
while getopts 'xh-:' optchar; do
|
|
case "$optchar" in
|
|
-)
|
|
case "$OPTARG" in
|
|
help) usage $0 ;;
|
|
fio-bin=*) fio_bin="${OPTARG#*=}" ;;
|
|
fio-jobs=*) fio_jobs="${OPTARG#*=}" ;;
|
|
test-type=*) test_type="${OPTARG#*=}" ;;
|
|
vm=*) vms+=("${OPTARG#*=}") ;;
|
|
scsi-hotremove-test) scsi_hot_remove_test=1 ;;
|
|
blk-hotremove-test) blk_hot_remove_test=1 ;;
|
|
readonly) readonly="--readonly" ;;
|
|
*) usage $0 "Invalid argument '$OPTARG'" ;;
|
|
esac
|
|
;;
|
|
h) usage $0 ;;
|
|
x)
|
|
set -x
|
|
x="-x"
|
|
;;
|
|
*) usage $0 "Invalid argument '$OPTARG'" ;;
|
|
esac
|
|
done
|
|
shift $((OPTIND - 1))
|
|
|
|
fio_job=$testdir/fio_jobs/default_integrity.job
|
|
tmp_attach_job=$testdir/fio_jobs/fio_attach.job.tmp
|
|
tmp_detach_job=$testdir/fio_jobs/fio_detach.job.tmp
|
|
|
|
rpc_py="$rootdir/scripts/rpc.py -s $(get_vhost_dir 0)/rpc.sock"
|
|
|
|
function print_test_fio_header() {
|
|
notice "==============="
|
|
notice ""
|
|
notice "Testing..."
|
|
|
|
notice "Running fio jobs ..."
|
|
if [ $# -gt 0 ]; then
|
|
echo $1
|
|
fi
|
|
}
|
|
|
|
function vms_setup() {
|
|
for vm_conf in "${vms[@]}"; do
|
|
IFS=',' read -ra conf <<< "$vm_conf"
|
|
if [[ -z ${conf[0]} ]] || ! assert_number ${conf[0]}; then
|
|
fail "invalid VM configuration syntax $vm_conf"
|
|
fi
|
|
|
|
# Sanity check if VM is not defined twice
|
|
for vm_num in $used_vms; do
|
|
if [[ $vm_num -eq ${conf[0]} ]]; then
|
|
fail "VM$vm_num defined more than twice ( $(printf "'%s' " "${vms[@]}"))!"
|
|
fi
|
|
done
|
|
|
|
used_vms+=" ${conf[0]}"
|
|
|
|
setup_cmd="vm_setup --disk-type=$test_type --force=${conf[0]}"
|
|
[[ x"${conf[1]}" != x"" ]] && setup_cmd+=" --os=${conf[1]}"
|
|
[[ x"${conf[2]}" != x"" ]] && setup_cmd+=" --disks=${conf[2]}"
|
|
$setup_cmd
|
|
done
|
|
}
|
|
|
|
function vm_run_with_arg() {
|
|
local vms_to_run="$*"
|
|
vm_run $vms_to_run
|
|
vm_wait_for_boot 300 $vms_to_run
|
|
}
|
|
|
|
function vms_setup_and_run() {
|
|
local vms_to_run="$*"
|
|
vms_setup
|
|
vm_run_with_arg $vms_to_run
|
|
}
|
|
|
|
function vms_prepare() {
|
|
for vm_num in $1; do
|
|
qemu_mask_param="VM_${vm_num}_qemu_mask"
|
|
|
|
host_name="VM-${vm_num}-${!qemu_mask_param}"
|
|
notice "Setting up hostname: $host_name"
|
|
vm_exec $vm_num "hostname $host_name"
|
|
vm_start_fio_server --fio-bin=$fio_bin $readonly $vm_num
|
|
done
|
|
}
|
|
|
|
function vms_reboot_all() {
|
|
notice "Rebooting all vms "
|
|
for vm_num in $1; do
|
|
vm_exec $vm_num "reboot" || true
|
|
while vm_os_booted $vm_num; do
|
|
sleep 0.5
|
|
done
|
|
done
|
|
|
|
vm_wait_for_boot 300 $1
|
|
}
|
|
|
|
function check_fio_retcode() {
|
|
local fio_retcode=$3
|
|
echo $1
|
|
local retcode_expected=$2
|
|
if [ $retcode_expected == 0 ]; then
|
|
if [ $fio_retcode != 0 ]; then
|
|
error " Fio test ended with error."
|
|
else
|
|
notice " Fio test ended with success."
|
|
fi
|
|
else
|
|
if [ $fio_retcode != 0 ]; then
|
|
notice " Fio test ended with expected error."
|
|
else
|
|
error " Fio test ended with unexpected success."
|
|
fi
|
|
fi
|
|
}
|
|
|
|
function wait_for_finish() {
|
|
local wait_for_pid=$1
|
|
local sequence=${2:-30}
|
|
for i in $(seq 1 $sequence); do
|
|
if kill -0 $wait_for_pid; then
|
|
sleep 0.5
|
|
continue
|
|
else
|
|
break
|
|
fi
|
|
done
|
|
if kill -0 $wait_for_pid; then
|
|
error "Timeout for fio command"
|
|
fi
|
|
|
|
wait $wait_for_pid
|
|
}
|
|
|
|
function reboot_all_and_prepare() {
|
|
vms_reboot_all "$1"
|
|
vms_prepare "$1"
|
|
}
|
|
|
|
function post_test_case() {
|
|
vm_shutdown_all
|
|
vhost_kill 0
|
|
}
|
|
|
|
function on_error_exit() {
|
|
set +e
|
|
echo "Error on $1 - $2"
|
|
post_test_case
|
|
print_backtrace
|
|
exit 1
|
|
}
|
|
|
|
function check_disks() {
|
|
if [ "$1" == "$2" ]; then
|
|
echo "Disk has not been deleted"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
function get_traddr() {
|
|
local nvme_name=$1
|
|
local nvme
|
|
|
|
nvme="$($rootdir/scripts/gen_nvme.sh)"
|
|
traddr=$(jq -r ".config[] | select(.params.name == \"$nvme_name\") | .params.traddr" <<< "$nvme")
|
|
[[ -n $traddr ]] || return 1
|
|
}
|
|
|
|
function delete_nvme() {
|
|
$rpc_py bdev_nvme_detach_controller $1
|
|
}
|
|
|
|
function add_nvme() {
|
|
$rpc_py bdev_nvme_attach_controller -b $1 -t PCIe -a $2
|
|
}
|