xref: /spdk/test/vhost/hotplug/scsi_hotdetach.sh (revision 79c52a64269385b9a8b53c2fe03e2343160d38b3)
1#!/usr/bin/env bash
2#  SPDX-License-Identifier: BSD-3-Clause
3#  Copyright (C) 2017 Intel Corporation
4#  All rights reserved.
5#
6testdir=$(readlink -f $(dirname $0))
7rootdir=$(readlink -f $testdir/../../..)
8source "$rootdir/test/vhost/hotplug/common.sh"
9
10function get_first_disk() {
11	vm_check_scsi_location $1
12	disk_array=($SCSI_DISK)
13	eval "$2=${disk_array[0]}"
14}
15
16function check_disks() {
17	if [ "$1" == "$2" ]; then
18		fail "Disk has not been deleted"
19	fi
20}
21
22function prepare_fio_cmd_tc1_iter1() {
23	print_test_fio_header
24
25	run_fio="$fio_bin --eta=never "
26	for vm_num in $1; do
27		cp $fio_job $tmp_detach_job
28		vm_check_scsi_location $vm_num
29		for disk in $SCSI_DISK; do
30			echo "[nvme-host$disk]" >> $tmp_detach_job
31			echo "filename=/dev/$disk" >> $tmp_detach_job
32		done
33		vm_scp "$vm_num" $tmp_detach_job 127.0.0.1:/root/default_integrity_4discs.job
34		run_fio+="--client=127.0.0.1,$(vm_fio_socket $vm_num) --remote-config /root/default_integrity_4discs.job "
35		rm $tmp_detach_job
36	done
37}
38
39function prepare_fio_cmd_tc2_iter1() {
40	print_test_fio_header
41
42	run_fio="$fio_bin --eta=never "
43	for vm_num in $1; do
44		cp $fio_job $tmp_detach_job
45		vm_check_scsi_location $vm_num
46		disk_array=($SCSI_DISK)
47		disk=${disk_array[0]}
48		echo "[nvme-host$disk]" >> $tmp_detach_job
49		echo "filename=/dev/$disk" >> $tmp_detach_job
50		vm_scp "$vm_num" $tmp_detach_job 127.0.0.1:/root/default_integrity.job
51		run_fio+="--client=127.0.0.1,$(vm_fio_socket $vm_num) --remote-config /root/default_integrity.job "
52		rm $tmp_detach_job
53	done
54}
55
56function prepare_fio_cmd_tc2_iter2() {
57	print_test_fio_header
58
59	run_fio="$fio_bin --eta=never "
60	for vm_num in $1; do
61		cp $fio_job $tmp_detach_job
62		if [ $vm_num == 2 ]; then
63			vm_job_name=default_integrity_3discs.job
64		else
65			vm_job_name=default_integrity_4discs.job
66		fi
67		vm_check_scsi_location $vm_num
68		for disk in $SCSI_DISK; do
69			echo "[nvme-host$disk]" >> $tmp_detach_job
70			echo "filename=/dev/$disk" >> $tmp_detach_job
71		done
72		vm_scp "$vm_num" $tmp_detach_job 127.0.0.1:/root/$vm_job_name
73		run_fio+="--client=127.0.0.1,$(vm_fio_socket $vm_num) --remote-config /root/${vm_job_name} "
74		rm $tmp_detach_job
75	done
76}
77
78function prepare_fio_cmd_tc3_iter1() {
79	print_test_fio_header
80
81	run_fio="$fio_bin --eta=never "
82	for vm_num in $1; do
83		cp $fio_job $tmp_detach_job
84		if [ $vm_num == 2 ]; then
85			vm_job_name=default_integrity_3discs.job
86		else
87			vm_job_name=default_integrity_4discs.job
88		fi
89		vm_check_scsi_location $vm_num
90		j=1
91		for disk in $SCSI_DISK; do
92			if [ $vm_num == 2 ]; then
93				if [ $j == 1 ]; then
94					((j++))
95					continue
96				fi
97			fi
98			echo "[nvme-host$disk]" >> $tmp_detach_job
99			echo "filename=/dev/$disk" >> $tmp_detach_job
100			((j++))
101		done
102		vm_scp "$vm_num" $tmp_detach_job 127.0.0.1:/root/$vm_job_name
103		run_fio+="--client=127.0.0.1,$(vm_fio_socket $vm_num) --remote-config /root/$vm_job_name "
104		rm $tmp_detach_job
105	done
106}
107
108# During fio test for all devices remove first device from fifth controller and check if fio fails.
109# Also check if disc has been removed from VM.
110function hotdetach_tc1() {
111	notice "Hotdetach test case 1"
112	first_disk=""
113	get_first_disk "2" first_disk
114	prepare_fio_cmd_tc1_iter1 "2 3"
115	$run_fio &
116	last_pid=$!
117	sleep 3
118	$rpc_py vhost_scsi_controller_remove_target naa.Nvme0n1p4.2 0
119	set +xe
120	wait $last_pid
121	check_fio_retcode "Hotdetach test case 1: Iteration 1." 1 $?
122	set -xe
123	second_disk=""
124	get_first_disk "2" second_disk
125	check_disks $first_disk $second_disk
126	clear_after_tests
127}
128
129# During fio test for device from third VM remove first device from fifth controller and check if fio fails.
130# Also check if disc has been removed from VM.
131function hotdetach_tc2() {
132	notice "Hotdetach test case 2"
133	sleep 2
134	first_disk=""
135	get_first_disk "2" first_disk
136	prepare_fio_cmd_tc2_iter1 "2"
137	$run_fio &
138	last_pid=$!
139	sleep 3
140	$rpc_py vhost_scsi_controller_remove_target naa.Nvme0n1p4.2 0
141	set +xe
142	wait $last_pid
143	check_fio_retcode "Hotdetach test case 2: Iteration 1." 1 $?
144	set -xe
145	second_disk=""
146	get_first_disk "2" second_disk
147	check_disks $first_disk $second_disk
148	clear_after_tests
149}
150
151# Run fio test for all devices except one, then remove this device and check if fio passes.
152# Also check if disc has been removed from VM.
153function hotdetach_tc3() {
154	notice "Hotdetach test case 3"
155	sleep 2
156	first_disk=""
157	get_first_disk "2" first_disk
158	prepare_fio_cmd_tc3_iter1 "2 3"
159	$run_fio &
160	last_pid=$!
161	sleep 3
162	$rpc_py vhost_scsi_controller_remove_target naa.Nvme0n1p4.2 0
163	wait $last_pid
164	check_fio_retcode "Hotdetach test case 3: Iteration 1." 0 $?
165	second_disk=""
166	get_first_disk "2" second_disk
167	check_disks $first_disk $second_disk
168	clear_after_tests
169}
170
171# Run fio test for all devices except one and run separate fio test for this device.
172# Check if first fio test passes and second fio test fails.
173# Also check if disc has been removed from VM.
174# After reboot run fio test for remaining devices and check if fio passes.
175function hotdetach_tc4() {
176	notice "Hotdetach test case 4"
177	sleep 2
178	first_disk=""
179	get_first_disk "2" first_disk
180	prepare_fio_cmd_tc2_iter1 "2"
181	$run_fio &
182	first_fio_pid=$!
183	prepare_fio_cmd_tc3_iter1 "2 3"
184	$run_fio &
185	second_fio_pid=$!
186	sleep 3
187	$rpc_py vhost_scsi_controller_remove_target naa.Nvme0n1p4.2 0
188	set +xe
189	wait $first_fio_pid
190	check_fio_retcode "Hotdetach test case 4: Iteration 1." 1 $?
191	set -xe
192	wait $second_fio_pid
193	check_fio_retcode "Hotdetach test case 4: Iteration 2." 0 $?
194	second_disk=""
195	get_first_disk "2" second_disk
196	check_disks $first_disk $second_disk
197
198	reboot_all_and_prepare "2 3"
199	sleep 2
200	prepare_fio_cmd_tc2_iter2 "2 3"
201	$run_fio
202	check_fio_retcode "Hotdetach test case 4: Iteration 3." 0 $?
203	clear_after_tests
204}
205
206function clear_after_tests() {
207	$rpc_py vhost_scsi_controller_add_target naa.Nvme0n1p4.2 0 Nvme0n1p8
208}
209
210hotdetach_tc1
211hotdetach_tc2
212hotdetach_tc3
213hotdetach_tc4
214