Spdk/test/vhost/migration/migration.sh
Ben Walker 3d11b2fedf vhost: Move test/vhost/common/common.sh up one directory
This matches the pattern used in other tests.

Many of the tests use a COMMON_DIR defined up top.
Instead of changing where this points, because it's used
for multiple things, just change the places where it
is used to source common.sh. This is lower risk for now
until these are cleaned up later.

Change-Id: Ib38ea9fdc94118c6c406f86177bab21c4e1c98b4
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/453440
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Pawel Kaminski <pawelx.kaminski@intel.com>
Reviewed-by: Paul Luse <paul.e.luse@intel.com>
Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Karol Latecki <karol.latecki@intel.com>
2019-05-16 11:16:30 +00:00

154 lines
4.3 KiB
Bash
Executable File

#!/usr/bin/env bash
set -e
vms=()
declare -A vms_os
declare -A vms_raw_disks
declare -A vms_ctrlrs
declare -A vms_ctrlrs_disks
# By default use Guest fio
fio_bin=""
test_cases=""
MGMT_TARGET_IP=""
MGMT_INITIATOR_IP=""
RDMA_TARGET_IP=""
RDMA_INITIATOR_IP=""
function usage()
{
[[ ! -z $2 ]] && ( echo "$2"; echo ""; )
echo "Shortcut script for doing automated test of live migration."
echo "Usage: $(basename $1) [OPTIONS]"
echo
echo " --work-dir=WORK_DIR Where to find build file. Must exist. [default: $TEST_DIR]"
echo " --os ARGS VM configuration. This parameter might be used more than once:"
echo " --fio-bin=FIO Use specific fio binary (will be uploaded to VM)"
echo " --test-cases=TESTS Coma-separated list of tests to run. Implemented test cases are: 1"
echo " See test/vhost/test_plan.md for more info."
echo " --mgmt-tgt-ip=IP IP address of target."
echo " --mgmt-init-ip=IP IP address of initiator."
echo " --rdma-tgt-ip=IP IP address of targets rdma capable NIC."
echo " --rdma-init-ip=IP IP address of initiators rdma capable NIC."
echo "-x set -x for script debug"
}
for param in "$@"; do
case "$param" in
--help|-h)
usage $0
exit 0
;;
--work-dir=*) TEST_DIR="${param#*=}" ;;
--os=*) os_image="${param#*=}" ;;
--fio-bin=*) fio_bin="${param}" ;;
--test-cases=*) test_cases="${param#*=}" ;;
--mgmt-tgt-ip=*) MGMT_TARGET_IP="${param#*=}" ;;
--mgmt-init-ip=*) MGMT_INITIATOR_IP="${param#*=}" ;;
--rdma-tgt-ip=*) RDMA_TARGET_IP="${param#*=}" ;;
--rdma-init-ip=*) RDMA_INITIATOR_IP="${param#*=}" ;;
-x) set -x ;;
-v) SPDK_VHOST_VERBOSE=true ;;
*)
usage $0 "Invalid argument '$param'"
exit 1;;
esac
done
. $(readlink -e "$(dirname $0)/../common.sh") || exit 1
MIGRATION_DIR=$(readlink -f $(dirname $0))
[[ ! -z "$test_cases" ]] || fail "Need '--test-cases=' parameter"
trap 'error_exit "${FUNCNAME}" "${LINENO}"' INT ERR EXIT
function vm_monitor_send()
{
local vm_num=$1
local cmd_result_file="$2"
local vm_dir="$VM_BASE_DIR/$1"
local vm_monitor_port=$(cat $vm_dir/monitor_port)
[[ ! -z "$vm_monitor_port" ]] || fail "No monitor port!"
shift 2
nc 127.0.0.1 $vm_monitor_port "$@" > $cmd_result_file
}
# Migrate VM $1
function vm_migrate()
{
local from_vm_dir="$VM_BASE_DIR/$1"
local target_vm_dir="$(readlink -e $from_vm_dir/vm_migrate_to)"
local target_vm="$(basename $target_vm_dir)"
local target_vm_migration_port="$(cat $target_vm_dir/migration_port)"
if [[ -n "$2" ]]; then
local target_ip=$2
else
local target_ip="127.0.0.1"
fi
# Sanity check if target VM (QEMU) is configured to accept source VM (QEMU) migration
if [[ "$(readlink -e ${target_vm_dir}/vm_incoming)" != "$(readlink -e ${from_vm_dir})" ]]; then
fail "source VM $1 or destination VM is not properly configured for live migration"
fi
timing_enter vm_migrate
notice "Migrating VM $1 to VM "$(basename $target_vm_dir)
echo -e \
"migrate_set_speed 1g\n" \
"migrate tcp:$target_ip:$target_vm_migration_port\n" \
"info migrate\n" \
"quit" | vm_monitor_send $1 "$from_vm_dir/migration_result"
# Post migration checks:
if ! grep "Migration status: completed" $from_vm_dir/migration_result -q; then
cat $from_vm_dir/migration_result
fail "Migration failed:\n"
fi
# Don't perform the following check if target VM is on remote server
# as we won't have access to it.
# If you need this check then perform it on your own.
if [[ "$target_ip" == "127.0.0.1" ]]; then
if ! vm_os_booted $target_vm; then
fail "VM$target_vm is not running"
cat $target_vm $target_vm_dir/cont_result
fi
fi
notice "Migration complete"
timing_exit vm_migrate
}
function is_fio_running()
{
local shell_restore_x="$( [[ "$-" =~ x ]] && echo 'set -x' )"
set +x
if vm_ssh $1 'kill -0 $(cat /root/fio.pid)'; then
local ret=0
else
local ret=1
fi
$shell_restore_x
return $ret
}
for test_case in ${test_cases//,/ }; do
assert_number "$test_case"
notice "==============================="
notice "Running Migration test case ${test_case}"
notice "==============================="
timing_enter migration-tc${test_case}
source $MIGRATION_DIR/migration-tc${test_case}.sh
timing_exit migration-tc${test_case}
done
notice "Migration Test SUCCESS"
notice "==============="
trap - SIGINT ERR EXIT