1#!/usr/bin/env bash 2# SPDX-License-Identifier: BSD-3-Clause 3# All rights reserved. 4 5testdir=$(readlink -f $(dirname $0)) 6rootdir=$(readlink -f $testdir/../../..) 7source $rootdir/test/common/autotest_common.sh 8source $rootdir/test/nvmf/common.sh 9 10rpc_py="$rootdir/scripts/rpc.py" 11loops=5 12 13SUBSYSNQN="nqn.2016-06.io.spdk:cnode1" 14HOSTNQN="nqn.2016-06.io.spdk:host1" 15HOSTID=$(uuidgen) 16 17function connect() { 18 nvme connect -t $TEST_TRANSPORT -n $SUBSYSNQN -q $HOSTNQN -I $HOSTID \ 19 -a "$NVMF_FIRST_TARGET_IP" -s "$NVMF_PORT" -i 4 20 waitforserial "$NVMF_SERIAL" $1 21 ctrl_id=$(nvme list-subsys -o json \ 22 | jq -r '.[0].Subsystems[] | select(.NQN=='\"$SUBSYSNQN\"') | .Paths[0].Name') 23} 24 25function disconnect() { 26 nvme disconnect -n $SUBSYSNQN 27} 28 29# $1 == hex nsid 30function ns_is_visible() { 31 nvme list-ns /dev/$ctrl_id | grep "$1" 32 nguid=$(nvme id-ns /dev/$ctrl_id -n $1 -o json | jq -r ".nguid") 33 [[ $nguid != "00000000000000000000000000000000" ]] 34} 35 36nvmftestinit 37nvmfappstart -m 0xF 38 39$rpc_py nvmf_create_transport $NVMF_TRANSPORT_OPTS -u 8192 40 41MALLOC_BDEV_SIZE=64 42MALLOC_BLOCK_SIZE=512 43 44$rpc_py bdev_malloc_create $MALLOC_BDEV_SIZE $MALLOC_BLOCK_SIZE -b Malloc1 45$rpc_py bdev_malloc_create $MALLOC_BDEV_SIZE $MALLOC_BLOCK_SIZE -b Malloc2 46 47# No masking (all namespaces automatically visible) 48$rpc_py nvmf_create_subsystem $SUBSYSNQN -a -s $NVMF_SERIAL 49$rpc_py nvmf_subsystem_add_ns $SUBSYSNQN Malloc1 -n 1 50$rpc_py nvmf_subsystem_add_listener $SUBSYSNQN -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT 51 52# Namespace should be visible 53connect 54ns_is_visible "0x1" 55 56# Add 2nd namespace and check visible 57$rpc_py nvmf_subsystem_add_ns $SUBSYSNQN Malloc2 -n 2 58ns_is_visible "0x1" 59ns_is_visible "0x2" 60 61disconnect 62 63# Remove ns1 and re-add without auto visibility 64# Note: we will leave ns2 with auto-attach for rest of this test 65$rpc_py nvmf_subsystem_remove_ns $SUBSYSNQN 1 66$rpc_py nvmf_subsystem_add_ns $SUBSYSNQN Malloc1 -n 1 --no-auto-visible 67 68# ns1 should be invisible 69connect 1 70NOT ns_is_visible "0x1" 71ns_is_visible "0x2" 72 73# hot attach and check ns1 visible 74$rpc_py nvmf_ns_add_host $SUBSYSNQN 1 $HOSTNQN 75ns_is_visible "0x1" 76ns_is_visible "0x2" 77 78# hot detach and check ns1 invisible 79$rpc_py nvmf_ns_remove_host $SUBSYSNQN 1 $HOSTNQN 80NOT ns_is_visible "0x1" 81ns_is_visible "0x2" 82 83disconnect 84 85# cold attach, connect and check ns1 visible 86$rpc_py nvmf_ns_add_host $SUBSYSNQN 1 $HOSTNQN 87connect 2 88ns_is_visible "0x1" 89ns_is_visible "0x2" 90 91# detach and check ns1 invisible 92$rpc_py nvmf_ns_remove_host $SUBSYSNQN 1 $HOSTNQN 93NOT ns_is_visible "0x1" 94ns_is_visible "0x2" 95 96# hot detach ns2 should not work, since ns2 is auto-visible 97NOT $rpc_py nvmf_ns_remove_host $SUBSYSNQN 2 $HOSTNQN 98NOT ns_is_visible "0x1" 99ns_is_visible "0x2" 100disconnect 101 102$rpc_py nvmf_delete_subsystem $SUBSYSNQN 103 104trap - SIGINT SIGTERM EXIT 105 106nvmftestfini 107