xref: /spdk/test/nvmf/target/ns_masking.sh (revision d37555b449d710cecc8e43cf307226656e062700)
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