summaryrefslogtreecommitdiffstats
path: root/src/spdk/test/nvme/hotplug.sh
diff options
context:
space:
mode:
Diffstat (limited to 'src/spdk/test/nvme/hotplug.sh')
-rwxr-xr-xsrc/spdk/test/nvme/hotplug.sh147
1 files changed, 147 insertions, 0 deletions
diff --git a/src/spdk/test/nvme/hotplug.sh b/src/spdk/test/nvme/hotplug.sh
new file mode 100755
index 00000000..ca661b6f
--- /dev/null
+++ b/src/spdk/test/nvme/hotplug.sh
@@ -0,0 +1,147 @@
+#!/usr/bin/env bash
+
+set -xe
+
+testdir=$(readlink -f $(dirname $0))
+rootdir=$(readlink -f $testdir/../..)
+source $rootdir/test/common/autotest_common.sh
+
+if [ -z "${DEPENDENCY_DIR}" ]; then
+ echo DEPENDENCY_DIR not defined!
+ exit 1
+fi
+
+function ssh_vm() {
+ sshpass -p "$password" ssh -o PubkeyAuthentication=no -o StrictHostKeyChecking=no -p 10022 root@localhost "$@"
+}
+
+function monitor_cmd() {
+ rc=0
+ if ! (echo "$@" | nc localhost 4444 > mon.log); then
+ rc=1
+ cat mon.log
+ fi
+ rm mon.log
+ return $rc
+}
+
+function get_online_devices_count() {
+ ssh_vm "lspci | grep -c NVM"
+}
+
+function wait_for_devices_ready() {
+ count=$(get_online_devices_count)
+
+ while [ $count -ne 4 ]; do
+ echo "waitting for all devices online"
+ count=$(get_online_devices_count)
+ done
+}
+
+function devices_initialization() {
+ timing_enter devices_initialization
+ dd if=/dev/zero of=/root/test0 bs=1M count=1024
+ dd if=/dev/zero of=/root/test1 bs=1M count=1024
+ dd if=/dev/zero of=/root/test2 bs=1M count=1024
+ dd if=/dev/zero of=/root/test3 bs=1M count=1024
+ monitor_cmd "drive_add 0 file=/root/test0,format=raw,id=drive0,if=none"
+ monitor_cmd "drive_add 1 file=/root/test1,format=raw,id=drive1,if=none"
+ monitor_cmd "drive_add 2 file=/root/test2,format=raw,id=drive2,if=none"
+ monitor_cmd "drive_add 3 file=/root/test3,format=raw,id=drive3,if=none"
+ timing_exit devices_initialization
+}
+
+function insert_devices() {
+ monitor_cmd "device_add nvme,drive=drive0,id=nvme0,serial=nvme0"
+ monitor_cmd "device_add nvme,drive=drive1,id=nvme1,serial=nvme1"
+ monitor_cmd "device_add nvme,drive=drive2,id=nvme2,serial=nvme2"
+ monitor_cmd "device_add nvme,drive=drive3,id=nvme3,serial=nvme3"
+ wait_for_devices_ready
+ ssh_vm "scripts/setup.sh"
+}
+
+function remove_devices() {
+ monitor_cmd "device_del nvme0"
+ monitor_cmd "device_del nvme1"
+ monitor_cmd "device_del nvme2"
+ monitor_cmd "device_del nvme3"
+}
+
+function devices_delete() {
+ timing_enter devices_delete
+ rm /root/test0
+ rm /root/test1
+ rm /root/test2
+ rm /root/test3
+ timing_exit devices_delete
+}
+
+password=$1
+base_img=${DEPENDENCY_DIR}/fedora24.img
+test_img=${DEPENDENCY_DIR}/fedora24_test.img
+qemu_pidfile=${DEPENDENCY_DIR}/qemupid
+
+if [ ! -e "$base_img" ]; then
+ echo "Hotplug VM image not found; skipping test"
+ exit 0
+fi
+
+timing_enter hotplug
+
+timing_enter start_qemu
+
+qemu-img create -b "$base_img" -f qcow2 "$test_img"
+
+qemu-system-x86_64 \
+ -daemonize -display none -m 8192 \
+ -pidfile "$qemu_pidfile" \
+ -hda "$test_img" \
+ -net user,hostfwd=tcp::10022-:22 \
+ -net nic \
+ -cpu host \
+ -smp cores=16,sockets=1 \
+ --enable-kvm \
+ -chardev socket,id=mon0,host=localhost,port=4444,server,nowait \
+ -mon chardev=mon0,mode=readline
+
+timing_exit start_qemu
+
+timing_enter wait_for_vm
+ssh_vm 'echo ready'
+timing_exit wait_for_vm
+
+timing_enter copy_repo
+(cd "$rootdir"; tar -cf - .) | (ssh_vm 'tar -xf -')
+timing_exit copy_repo
+
+devices_initialization
+insert_devices
+
+timing_enter hotplug_test
+
+ssh_vm "examples/nvme/hotplug/hotplug -i 0 -t 25 -n 4 -r 8" &
+example_pid=$!
+
+sleep 4
+remove_devices
+sleep 4
+insert_devices
+sleep 4
+remove_devices
+devices_delete
+
+timing_enter wait_for_example
+wait $example_pid
+timing_exit wait_for_example
+
+trap - SIGINT SIGTERM EXIT
+
+qemupid=`cat "$qemu_pidfile" | awk '{printf $0}'`
+kill -9 $qemupid
+rm "$qemu_pidfile"
+rm "$test_img"
+
+report_test_completion "nvme_hotplug"
+timing_exit hotplug_test
+
+timing_exit hotplug