#!/usr/bin/env 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
source $rootdir/test/vhost/hotplug/common.sh

function prepare_fio_cmd_tc1() {
	print_test_fio_header

	run_fio="$fio_bin --eta=never "
	for vm_num in $1; do
		cp $fio_job $tmp_attach_job
		vm_check_scsi_location $vm_num
		for disk in $SCSI_DISK; do
			echo "[nvme-host$disk]" >> $tmp_attach_job
			echo "filename=/dev/$disk" >> $tmp_attach_job
		done
		vm_scp $vm_num $tmp_attach_job 127.0.0.1:/root/default_integrity_discs.job
		run_fio+="--client=127.0.0.1,$(vm_fio_socket ${vm_num}) --remote-config /root/default_integrity_discs.job "
		rm $tmp_attach_job
	done
}

# Check if fio test passes on device attached to first controller.
function hotattach_tc1() {
	notice "Hotattach test case 1"

	$rpc_py vhost_scsi_controller_add_target naa.Nvme0n1p0.0 0 Nvme0n1p0

	sleep 3
	prepare_fio_cmd_tc1 "0"
	$run_fio
	check_fio_retcode "Hotattach test case 1: Iteration 1." 0 $?
}

# Run fio test for previously attached device.
# During test attach another device to first controller and check fio status.
function hotattach_tc2() {
	notice "Hotattach test case 2"
	prepare_fio_cmd_tc1 "0"

	$run_fio &
	last_pid=$!
	sleep 3
	$rpc_py vhost_scsi_controller_add_target naa.Nvme0n1p0.0 1 Nvme0n1p1
	wait $last_pid
	check_fio_retcode "Hotattach test case 2: Iteration 1." 0 $?
}

# Run fio test for previously attached devices.
# During test attach another device to second controller and check fio status.
function hotattach_tc3() {
	notice "Hotattach test case 3"
	prepare_fio_cmd_tc1 "0"

	$run_fio &
	last_pid=$!
	sleep 3
	$rpc_py vhost_scsi_controller_add_target naa.Nvme0n1p1.0 0 Nvme0n1p2
	wait $last_pid
	check_fio_retcode "Hotattach test case 3: Iteration 1." 0 $?
}

# Run fio test for previously attached devices.
# During test attach another device to third controller(VM2) and check fio status.
# At the end after rebooting VMs run fio test for all devices and check fio status.
function hotattach_tc4() {
	notice "Hotattach test case 4"

	prepare_fio_cmd_tc1 "0"

	$run_fio &
	last_pid=$!
	sleep 3
	$rpc_py vhost_scsi_controller_add_target naa.Nvme0n1p2.1 0 Nvme0n1p3
	wait $last_pid
	check_fio_retcode "Hotattach test case 4: Iteration 1." 0 $?

	prepare_fio_cmd_tc1 "0 1"
	$run_fio
	check_fio_retcode "Hotattach test case 4: Iteration 2." 0 $?

	reboot_all_and_prepare "0 1"

	prepare_fio_cmd_tc1 "0 1"
	$run_fio
	check_fio_retcode "Hotattach test case 4: Iteration 3." 0 $?
}

function cleanup_after_tests() {
	$rpc_py vhost_scsi_controller_remove_target naa.Nvme0n1p0.0 0
	$rpc_py vhost_scsi_controller_remove_target naa.Nvme0n1p0.0 1
	$rpc_py vhost_scsi_controller_remove_target naa.Nvme0n1p1.0 0
	$rpc_py vhost_scsi_controller_remove_target naa.Nvme0n1p2.1 0
}

hotattach_tc1
hotattach_tc2
hotattach_tc3
hotattach_tc4
cleanup_after_tests
