From bd3244325c47b15fffc4cf13086f27b558f6885a Mon Sep 17 00:00:00 2001 From: Tomasz Kulasek Date: Mon, 25 Nov 2019 09:29:32 -0500 Subject: [PATCH] test/nvme: add cuse smartctl tests Change-Id: Id6ed39a4e6c4d360111aea96f630bb678f5b306e Signed-off-by: Tomasz Kulasek Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/475754 Community-CI: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Tomasz Zawadzki Tested-by: SPDK CI Jenkins --- autotest.sh | 1 + test/nvme/spdk_smartctl_cuse.sh | 85 +++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100755 test/nvme/spdk_smartctl_cuse.sh diff --git a/autotest.sh b/autotest.sh index 015f73ae8..56394e768 100755 --- a/autotest.sh +++ b/autotest.sh @@ -178,6 +178,7 @@ if [ $SPDK_RUN_FUNCTIONAL_TEST -eq 1 ]; then fi if [[ $SPDK_TEST_NVME_CUSE -eq 1 ]]; then run_test suite "nvme_cli_cuse" test/nvme/spdk_nvme_cli_cuse.sh + run_test suite "nvme_smartctl_cuse" test/nvme/spdk_smartctl_cuse.sh fi # Only test hotplug without ASAN enabled. Since if it is # enabled, it catches SEGV earlier than our handler which diff --git a/test/nvme/spdk_smartctl_cuse.sh b/test/nvme/spdk_smartctl_cuse.sh new file mode 100755 index 000000000..e86dc79eb --- /dev/null +++ b/test/nvme/spdk_smartctl_cuse.sh @@ -0,0 +1,85 @@ +#!/usr/bin/env bash + +testdir=$(readlink -f $(dirname $0)) +rootdir=$(readlink -f $testdir/../..) +source $rootdir/scripts/common.sh +source $rootdir/test/common/autotest_common.sh + +timing_enter nvme_smartctl_cuse + +SMARTCTL_CMD='smartctl -d nvme' +rpc_py=$rootdir/scripts/rpc.py + +bdf=$(iter_pci_class_code 01 08 02 | head -1) + +PCI_WHITELIST="${bdf}" $rootdir/scripts/setup.sh reset +sleep 1 +bdf_sysfs_path=$( readlink -f /sys/class/nvme/nvme* | grep "$bdf/nvme/nvme" ) +if [ -z "$bdf_sysfs_path" ]; then + echo "setup.sh failed bind kernel driver to ${bdf}" + return 1 +fi +nvme_name=$( basename $bdf_sysfs_path ) + +KERNEL_SMART_JSON=$( ${SMARTCTL_CMD} --json=g -a /dev/${nvme_name} | grep -v "/dev/${nvme_name}" | sort || true ) + +${SMARTCTL_CMD} -i /dev/${nvme_name}n1 + +# logs are not provided by json output +KERNEL_SMART_ERRLOG=$( ${SMARTCTL_CMD} -l error /dev/${nvme_name} ) + +$rootdir/scripts/setup.sh + +$rootdir/app/spdk_tgt/spdk_tgt -m 0x3 & +spdk_tgt_pid=$! +trap 'kill -9 ${spdk_tgt_pid}; exit 1' SIGINT SIGTERM EXIT + +waitforlisten $spdk_tgt_pid + +$rpc_py bdev_nvme_attach_controller -b Nvme0 -t PCIe -a ${bdf} +$rpc_py bdev_nvme_cuse_register -n Nvme0 + +sleep 5 + +if [ ! -c /dev/spdk/nvme0 ]; then + return 1 +fi + +CUSE_SMART_JSON=$( ${SMARTCTL_CMD} --json=g -a /dev/spdk/nvme0 | grep -v "/dev/spdk/nvme0" | sort || true ) + +DIFF_SMART_JSON=$( diff --changed-group-format='%<' --unchanged-group-format='' <(echo "$KERNEL_SMART_JSON") <(echo "$CUSE_SMART_JSON") || true) + +# Mask values can change +ERR_SMART_JSON=$( grep -v "json\.nvme_smart_health_information_log\.\|json\.local_time\.\|json\.temperature\." <<< $DIFF_SMART_JSON || true ) + +if [ -n "$ERR_SMART_JSON" ] ; then + echo "Wrong values for: $ERR_SMART_JSON" + return 1 +fi + +CUSE_SMART_ERRLOG=$( ${SMARTCTL_CMD} -l error /dev/spdk/nvme0 ) +if [ "$CUSE_SMART_ERRLOG" != "$KERNEL_SMART_ERRLOG" ]; then + echo "Wrong values in NVMe Error log" + return 1 +fi + +# Data integity was checked before, now make sure other commads didn't fail +${SMARTCTL_CMD} -i /dev/spdk/nvme0n1 +${SMARTCTL_CMD} -c /dev/spdk/nvme0 +${SMARTCTL_CMD} -A /dev/spdk/nvme0 + +# Health test can fail +${SMARTCTL_CMD} -x /dev/spdk/nvme0 || true +${SMARTCTL_CMD} -H /dev/spdk/nvme0 || true + +$rpc_py bdev_nvme_detach_controller Nvme0 +sleep 1 +if [ -c /dev/spdk/nvme1 ]; then + return 1 +fi + +trap - SIGINT SIGTERM EXIT +killprocess $spdk_tgt_pid + +report_test_completion spdk_nvme_smartctl_cuse +timing_exit nvme_smartctl_cuse