From bf4db834b9cce4c455f8a9fc0686986534c89290 Mon Sep 17 00:00:00 2001 From: Michael Haeuptle Date: Thu, 16 Jan 2020 22:27:01 +0000 Subject: [PATCH] lib/nvmf: Functional test for custom admin cmd handler This test verifies the custom identify handler functionality by querying the NVMe drive and comparing serial and model number from the NVMe drive with the corresponding info from the NVMF identify result. Signed-off-by: Michael Haeuptle Change-Id: I9d4edb1bf32550cbf5fbd45cbfa85f9afc408fc0 Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/481910 Reviewed-by: Shuhei Matsumoto Reviewed-by: Jim Harris Community-CI: SPDK CI Jenkins Tested-by: SPDK CI Jenkins --- autotest.sh | 1 + test/nvmf/target/identify_passthru.sh | 76 +++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100755 test/nvmf/target/identify_passthru.sh diff --git a/autotest.sh b/autotest.sh index a3b161f57..80093a6e1 100755 --- a/autotest.sh +++ b/autotest.sh @@ -221,6 +221,7 @@ if [ $SPDK_RUN_FUNCTIONAL_TEST -eq 1 ]; then elif [ "$SPDK_TEST_NVMF_TRANSPORT" = "tcp" ]; then run_test "nvmf_tcp" ./test/nvmf/nvmf.sh --transport=$SPDK_TEST_NVMF_TRANSPORT run_test "spdkcli_nvmf_tcp" ./test/spdkcli/nvmf.sh + run_test "nvmf_identify_passthru" test/nvmf/target/identify_passthru.sh --transport=$SPDK_TEST_NVMF_TRANSPORT elif [ "$SPDK_TEST_NVMF_TRANSPORT" = "fc" ]; then run_test "nvmf_fc" ./test/nvmf/nvmf.sh --transport=$SPDK_TEST_NVMF_TRANSPORT run_test "spdkcli_nvmf_fc" ./test/spdkcli/nvmf.sh diff --git a/test/nvmf/target/identify_passthru.sh b/test/nvmf/target/identify_passthru.sh new file mode 100755 index 000000000..afc707f7a --- /dev/null +++ b/test/nvmf/target/identify_passthru.sh @@ -0,0 +1,76 @@ +#!/usr/bin/env bash + +testdir=$(readlink -f $(dirname $0)) +rootdir=$(readlink -f $testdir/../../..) +source $rootdir/test/common/autotest_common.sh +source $rootdir/test/nvmf/common.sh +source $rootdir/scripts/common.sh + +rpc_py="$rootdir/scripts/rpc.py" + +nvmftestinit + +timing_enter nvme_identify + +bdf=$(iter_pci_class_code 01 08 02 | head -1) +if [ -z "${bdf}" ] ; then + echo "No NVMe drive found but test requires it. Failing the test." + exit 1 +fi + +# Expected values +nvme_serial_number=$($rootdir/examples/nvme/identify/identify -r "trtype:PCIe traddr:${bdf}" -i 0 | grep "Serial Number:" | awk '{print $3}') +nvme_model_number=$($rootdir/examples/nvme/identify/identify -r "trtype:PCIe traddr:${bdf}" -i 0 | grep "Model Number:" | awk '{print $3}') + +timing_exit nvme_identify + +timing_enter start_nvmf_tgt + +$NVMF_APP -m 0xF --wait-for-rpc & +nvmfpid=$! + +trap 'process_shm --id $NVMF_APP_SHM_ID; nvmftestfini; exit 1' SIGINT SIGTERM EXIT + +waitforlisten $nvmfpid +$rpc_py -v nvmf_set_config --passthru-identify-ctrlr +$rpc_py -v framework_start_init +$rpc_py nvmf_create_transport $NVMF_TRANSPORT_OPTS -u 8192 +timing_exit start_nvmf_tgt + +$rpc_py bdev_nvme_attach_controller -b Nvme0 -t PCIe -a ${bdf} +$rpc_py nvmf_create_subsystem nqn.2016-06.io.spdk:cnode1 -a -s SPDK00000000000001 +$rpc_py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 Nvme0n1 +$rpc_py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT + +$rpc_py nvmf_get_subsystems + +# Discovered values +nvmf_serial_number=$($rootdir/examples/nvme/identify/identify -r "\ + trtype:$TEST_TRANSPORT \ + adrfam:IPv4 \ + traddr:$NVMF_FIRST_TARGET_IP \ + trsvcid:$NVMF_PORT \ + subnqn:nqn.2016-06.io.spdk:cnode1" | grep "Serial Number:" | awk '{print $3}') + +nvmf_model_number=$($rootdir/examples/nvme/identify/identify -r "\ + trtype:$TEST_TRANSPORT \ + adrfam:IPv4 \ + traddr:$NVMF_FIRST_TARGET_IP \ + trsvcid:$NVMF_PORT \ + subnqn:nqn.2016-06.io.spdk:cnode1" | grep "Model Number:" | awk '{print $3}') + +if [ ${nvme_serial_number} != ${nvmf_serial_number} ] ; then + echo "Serial number doesn't match" + exit 1 +fi + +if [ ${nvme_model_number} != ${nvmf_model_number} ] ; then + echo "Model number doesn't match" + exit 1 +fi + +$rpc_py nvmf_delete_subsystem nqn.2016-06.io.spdk:cnode1 + +trap - SIGINT SIGTERM EXIT + +nvmftestfini