diff --git a/autotest.sh b/autotest.sh index 123411179..887383bdd 100755 --- a/autotest.sh +++ b/autotest.sh @@ -194,6 +194,10 @@ if [ $SPDK_TEST_VHOST -eq 1 ]; then run_test ./test/vhost/spdk_vhost.sh --integrity-lvol-blk timing_exit integrity_lvol_blk + timing_enter spdk_cli + run_test ./test/spdkcli/vhost.sh + timing_exit spdk_cli + timing_exit vhost fi diff --git a/test/spdkcli/common.sh b/test/spdkcli/common.sh new file mode 100644 index 000000000..09d4bd077 --- /dev/null +++ b/test/spdkcli/common.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +set -xe + +testdir=$(readlink -f $(dirname $0)) +SPDKCLI_BUILD_DIR=$(readlink -f $testdir/../..) +spdkcli_job="python3 $SPDKCLI_BUILD_DIR/test/spdkcli/spdkcli_job.py" +. $SPDKCLI_BUILD_DIR/test/common/autotest_common.sh + +function on_error_exit() { + set +e + killprocess $spdk_tgt_pid + rm -f $testdir/${MATCH_FILE} $testdir/spdkcli_details_vhost.test /tmp/sample_aio + print_backtrace + exit 1 +} + +function run_spdk_tgt() { + $SPDKCLI_BUILD_DIR/app/spdk_tgt/spdk_tgt -m 0x3 -p 0 -s 1024 & + spdk_tgt_pid=$! + waitforlisten $spdk_tgt_pid +} + +function check_match() { + python3 $SPDKCLI_BUILD_DIR/scripts/spdkcli.py ll > $testdir/${MATCH_FILE} + $SPDKCLI_BUILD_DIR/test/app/match/match -v $testdir/${MATCH_FILE}.match + rm -f $testdir/${MATCH_FILE} +} diff --git a/test/spdkcli/spdkcli_details_vhost.test.match b/test/spdkcli/spdkcli_details_vhost.test.match new file mode 100644 index 000000000..4189e106f --- /dev/null +++ b/test/spdkcli/spdkcli_details_vhost.test.match @@ -0,0 +1,25 @@ +{ + "aliases": [], + "block_size": $(N), + "claimed": false, + "driver_specific": { + "split": { + "base_bdev": "Nvme0n1", + "offset_blocks": $(N) + } + }, + "name": "Nvme0n1p0", + "num_blocks": $(N), + "product_name": "Split Disk", + "qos_ios_per_sec": 0, + "supported_io_types": { + "flush": $(S), + "nvme_admin": $(S), + "nvme_io": $(S), + "read": $(S), + "reset": $(S), + "unmap": $(S), + "write": $(S), + "write_zeroes": $(S) + } +} diff --git a/test/spdkcli/spdkcli_job.py b/test/spdkcli/spdkcli_job.py new file mode 100755 index 000000000..83331c3ea --- /dev/null +++ b/test/spdkcli/spdkcli_job.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3.5 +import pexpect +import os +import sys + + +def execute_command(cmd, element=None, element_exists=False): + child.sendline(cmd) + child.expect("/>") + print("before: %s" % child.before.decode()) + if "error response" in child.before.decode(): + print("Error in cmd: %s" % cmd) + exit(1) + ls_tree = cmd.split(" ")[0] + if ls_tree and element: + child.sendline("ls %s" % ls_tree) + child.expect("/>") + print("child: %s" % child.before.decode()) + if element_exists: + if element not in child.before.decode(): + print("Element %s not in list" % element) + exit(1) + else: + if element in child.before.decode(): + print("Element %s is in list" % element) + exit(1) + + +if __name__ == "__main__": + testdir = os.path.dirname(os.path.realpath(sys.argv[0])) + child = pexpect.spawn(os.path.join(testdir, "../../scripts/spdkcli.py")) + child.expect(">") + child.sendline("cd /") + child.expect("/>") + + execute_command(*sys.argv[1:]) diff --git a/test/spdkcli/spdkcli_vhost.test.match b/test/spdkcli/spdkcli_vhost.test.match new file mode 100644 index 000000000..ff43a2540 --- /dev/null +++ b/test/spdkcli/spdkcli_vhost.test.match @@ -0,0 +1,46 @@ +o- / ......................................................................................................................... [...] + o- bdevs ................................................................................................................... [...] + | o- aio .............................................................................................................. [Bdevs: 1] + | | o- sample ........................................................................................... [Size=$(FP)M, Not claimed] + | o- error ............................................................................................................ [Bdevs: 1] + | | o- EE_Malloc1 ...................................................................................... [Size=$(FP)M, Not claimed] + | o- iscsi ............................................................................................................ [Bdevs: 0] + | o- logical_volume ................................................................................................... [Bdevs: 1] + | | o- $(X)-$(X)-$(X)-$(X)-$(X) .................................................. [lvs/lvol, Size=$(FP)M, Not claimed] + | o- malloc ........................................................................................................... [Bdevs: 4] + | | o- Malloc0 ............................................................................................. [Size=$(FP)M, Claimed] + | | o- Malloc1 ............................................................................................. [Size=$(FP)M, Claimed] + | | o- Malloc2 ......................................................................................... [Size=$(FP)M, Not claimed] + | | o- Malloc3 ......................................................................................... [Size=$(FP)M, Not claimed] + | o- null ............................................................................................................. [Bdevs: 1] + | | o- null_bdev ....................................................................................... [Size=$(FP)M, Not claimed] + | o- nvme ............................................................................................................. [Bdevs: 1] + | | o- Nvme0n1 $(S) [Size=$(FP)G, Claimed] + | o- pmemblk .......................................................................................................... [Bdevs: 0] + | o- rbd .............................................................................................................. [Bdevs: 0] + | o- split_disk ....................................................................................................... [Bdevs: 4] + | | o- Nvme0n1p0 $(S) [Size=$(FP)G, Not claimed] + | | o- Nvme0n1p1 $(S) [Size=$(FP)G, Not claimed] + | | o- Nvme0n1p2 $(S) [Size=$(FP)G, Not claimed] + | | o- Nvme0n1p3 $(S) [Size=$(FP)G, Not claimed] + | o- virtioblk_disk ................................................................................................... [Bdevs: 0] + | o- virtioscsi_disk .................................................................................................. [Bdevs: 0] + o- lvol_stores .................................................................................................. [Lvol stores: 1] + | o- lvs ................................................................................................ [Size=$(FP)M, Free=$(FP)M] + o- vhost ................................................................................................................... [...] + o- block ................................................................................................................. [...] + | o- vhost_blk1 $(S) [$(S)] + | | o- Nvme0n1p0 ......................................................................................................... [...] + | o- vhost_blk2 $(S) [$(S), Readonly] + | o- Nvme0n1p1 ......................................................................................................... [...] + o- scsi .................................................................................................................. [...] + o- vhost_scsi1 $(S) [$(S)] + | o- Target_0 .......................................................................................... [LUNs: 1,TargetID: 0] + | o- Malloc2 ......................................................................................................... [...] + o- vhost_scsi2 $(S) [$(S)] + o- Target_0 .......................................................................................... [LUNs: 1,TargetID: 0] + | o- Malloc3 ......................................................................................................... [...] + o- Target_1 .......................................................................................... [LUNs: 1,TargetID: 1] + | o- Nvme0n1p2 ....................................................................................................... [...] + o- Target_2 .......................................................................................... [LUNs: 1,TargetID: 2] + o- Nvme0n1p3 ....................................................................................................... [...] diff --git a/test/spdkcli/vhost.sh b/test/spdkcli/vhost.sh new file mode 100755 index 000000000..f7ecc89bf --- /dev/null +++ b/test/spdkcli/vhost.sh @@ -0,0 +1,80 @@ +#!/usr/bin/env bash +set -xe + +MATCH_FILE="spdkcli_vhost.test" +testdir=$(readlink -f $(dirname $0)) +. $testdir/common.sh + +timing_enter spdk_cli_vhost +trap 'on_error_exit' ERR +timing_enter run_spdk_tgt +run_spdk_tgt +timing_exit run_spdk_tgt + +timing_enter spdkcli_create_bdevs_config +$spdkcli_job "/bdevs/malloc create 32 512 Malloc0" "Malloc0" True +$spdkcli_job "/bdevs/malloc create 32 512 Malloc1" "Malloc1" True +$spdkcli_job "/bdevs/malloc create 32 512 Malloc2" "Malloc2" True +$spdkcli_job "/bdevs/malloc create 32 4096 Malloc3" "Malloc3" True +$spdkcli_job "/bdevs/error create Malloc1" "EE_Malloc1" True +$spdkcli_job "/bdevs/null create null_bdev 32 512" "null_bdev" True +dd if=/dev/zero of=/tmp/sample_aio bs=2048 count=5000 +$spdkcli_job "/bdevs/aio create sample /tmp/sample_aio 512" "sample" True +trtype=$($SPDKCLI_BUILD_DIR/scripts/gen_nvme.sh --json | jq -r '.config[].params | select(.name=="Nvme0").trtype') +traddr=$($SPDKCLI_BUILD_DIR/scripts/gen_nvme.sh --json | jq -r '.config[].params | select(.name=="Nvme0").traddr') +$spdkcli_job "/bdevs/nvme create Nvme0 $trtype $traddr" "Nvme0" True +$spdkcli_job "/bdevs/split_disk split_bdev Nvme0n1 4" "Nvme0n1p0" True +timing_exit spdkcli_create_bdevs_config + +timing_enter spdkcli_create_lvols_config +$spdkcli_job "/lvol_stores create lvs Malloc0" "lvs" True +$spdkcli_job "/bdevs/logical_volume create lvol 16 lvs" "lvs/lvol" True +timing_exit spdkcli_create_lvols_config + +timing_enter spdkcli_create_vhosts_config +$spdkcli_job "vhost/block create vhost_blk1 Nvme0n1p0" "Nvme0n1p0" True +$spdkcli_job "vhost/block create vhost_blk2 Nvme0n1p1 0x2 readonly" "Nvme0n1p1" True +$spdkcli_job "vhost/scsi create vhost_scsi1" "vhost_scsi1" True +$spdkcli_job "vhost/scsi create vhost_scsi2" "vhost_scsi2" True +$spdkcli_job "vhost/scsi/vhost_scsi1 add_lun 0 Malloc2" "Malloc2" True +$spdkcli_job "vhost/scsi/vhost_scsi2 add_lun 0 Malloc3" "Malloc3" True +$spdkcli_job "vhost/scsi/vhost_scsi2 add_lun 1 Nvme0n1p2" "Nvme0n1p2" True +$spdkcli_job "vhost/scsi/vhost_scsi2 add_lun 2 Nvme0n1p3" "Nvme0n1p3" True +timing_exit spdkcli_create_vhosts_config + +timing_enter spdkcli_check_match +check_match +timing_exit spdkcli_check_match + +timing_enter spdkcli_check_match_details +python3 $SPDKCLI_BUILD_DIR/scripts/spdkcli.py bdevs/split_disk/Nvme0n1p0 show_details | jq -r -S '.' > $testdir/spdkcli_details_vhost.test +$SPDKCLI_BUILD_DIR/test/app/match/match -v $testdir/spdkcli_details_vhost.test.match +rm -f $testdir/spdkcli_details_vhost.test +timing_exit spdkcli_check_match_details + +timing_enter spdkcli_clear_config +$spdkcli_job "vhost/scsi/vhost_scsi2 remove_target 2" "Nvme0n1p3" +$spdkcli_job "vhost/scsi/vhost_scsi2 remove_target 1" "Nvme0n1p2" +$spdkcli_job "vhost/scsi/vhost_scsi2 remove_target 0" "Malloc3" +$spdkcli_job "vhost/scsi/vhost_scsi1 remove_target 0" "Malloc2" +$spdkcli_job "vhost/scsi delete vhost_scsi2" "vhost_scsi2" +$spdkcli_job "vhost/scsi delete vhost_scsi1" "vhost_scsi1" +$spdkcli_job "vhost/block delete vhost_blk2" "vhost_blk2" +$spdkcli_job "vhost/block delete vhost_blk1" "vhost_blk1" +$spdkcli_job "/bdevs/split_disk destruct_split_bdev Nvme0n1" "Nvme0n1p0" +$spdkcli_job "/bdevs/aio delete sample" "sample" +$spdkcli_job "/bdevs/nvme delete Nvme0n1" "Nvme0n1" +$spdkcli_job "/bdevs/null delete null_bdev" "null_bdev" +$spdkcli_job "/bdevs/logical_volume delete lvs/lvol" "lvs/lvol" +$spdkcli_job "/lvol_stores delete lvs" "lvs" +$spdkcli_job "/bdevs/malloc delete Malloc0" "Malloc0" +$spdkcli_job "/bdevs/malloc delete Malloc1" "Malloc1" +$spdkcli_job "/bdevs/malloc delete Malloc2" "Malloc2" +$spdkcli_job "/bdevs/malloc delete Malloc3" "Malloc3" +rm -f /tmp/sample_aio +timing_exit spdkcli_clear_config + +killprocess $spdk_tgt_pid + +timing_exit spdk_cli_vhost +report_test_completion spdk_cli_vhost