xref: /freebsd/usr.sbin/ctladm/tests/port.sh (revision b8a496dfb6df7b86e014d0d4476cd75850e060c1)
1# Things that aren't tested due to lack of kernel support:
2# * Creating camsim ports
3# * Creating tpc ports
4# * Creating camtgt ports
5# * Creating umass ports
6
7# TODO
8# * Creating nvmf ports
9# * Creating ha ports
10# * Creating fc ports
11
12# The PGTAG can be any 16-bit number.  The only constraint is that each
13# PGTAG,TARGET pair must be globally unique.
14PGTAG=30257
15
16load_cfiscsi() {
17	if ! kldstat -q -m cfiscsi; then
18		kldload cfiscsi || atf_skip "could not load cfscsi kernel mod"
19	fi
20}
21
22skip_if_ctld() {
23	if service ctld onestatus > /dev/null; then
24		# If ctld is running on this server, let's not interfere.
25		atf_skip "Cannot run this test while ctld is running"
26	fi
27}
28
29cleanup() {
30	driver=$1
31
32	if [ -e port-create.txt ]; then
33		case "$driver" in
34		"ioctl")
35			PORTNUM=`awk '/port:/ {print $2}' port-create.txt`
36			ctladm port -r -d $driver -p $PORTNUM
37			;;
38		"iscsi")
39			TARGET=`awk '/target:/ {print $2}' port-create.txt`
40			ctladm port -r -d $driver -p "$PORTNUM" -O cfiscsi_portal_group_tag=$PGTAG -O cfiscsi_target=$TARGET
41			;;
42		esac
43	fi
44}
45
46atf_test_case create_ioctl cleanup
47create_ioctl_head()
48{
49	atf_set "descr" "ctladm can create a new ioctl port"
50	atf_set "require.user" "root"
51}
52create_ioctl_body()
53{
54	skip_if_ctld
55
56	atf_check -o save:port-create.txt ctladm port -c -d "ioctl"
57	atf_check egrep -q "Port created successfully" port-create.txt
58	atf_check egrep -q "frontend: *ioctl" port-create.txt
59	atf_check egrep -q "port: *[0-9]+" port-create.txt
60	portnum=`awk '/port:/ {print $2}' port-create.txt`
61	atf_check -o save:portlist.txt ctladm portlist -qf ioctl
62	atf_check egrep -q "$portnum *YES *ioctl *ioctl" portlist.txt
63}
64create_ioctl_cleanup()
65{
66	cleanup ioctl
67}
68
69atf_test_case remove_ioctl_without_required_args cleanup
70remove_ioctl_without_required_args_head()
71{
72	atf_set "descr" "ctladm will gracefully fail to remove an ioctl target if required arguments are missing"
73	atf_set "require.user" "root"
74}
75remove_ioctl_without_required_args_body()
76{
77	skip_if_ctld
78
79	atf_check -o save:port-create.txt ctladm port -c -d "ioctl"
80	atf_check egrep -q "Port created successfully" port-create.txt
81	atf_check -s exit:1 -e match:"Missing required argument: port_id" ctladm port -r -d "ioctl"
82}
83remove_ioctl_without_required_args_cleanup()
84{
85	cleanup ioctl
86}
87
88atf_test_case create_iscsi cleanup
89create_iscsi_head()
90{
91	atf_set "descr" "ctladm can create a new iscsi port"
92	atf_set "require.user" "root"
93}
94create_iscsi_body()
95{
96	skip_if_ctld
97	load_cfiscsi
98
99	TARGET=iqn.2018-10.myhost.create_iscsi
100	atf_check -o save:port-create.txt ctladm port -c -d "iscsi" -O cfiscsi_portal_group_tag=$PGTAG -O cfiscsi_target="$TARGET"
101	echo "target: $TARGET" >> port-create.txt
102	atf_check egrep -q "Port created successfully" port-create.txt
103	atf_check egrep -q "frontend: *iscsi" port-create.txt
104	atf_check egrep -q "port: *[0-9]+" port-create.txt
105	atf_check -o save:portlist.txt ctladm portlist -qf iscsi
106	# Unlike the ioctl driver, the iscsi driver creates ports in a disabled
107	# state, so the port's lunmap may be set before enabling it.
108	atf_check egrep -q "$portnum *NO *iscsi *iscsi.*$TARGET" portlist.txt
109}
110create_iscsi_cleanup()
111{
112	cleanup iscsi
113}
114
115atf_test_case create_iscsi_alias cleanup
116create_iscsi_alias_head()
117{
118	atf_set "descr" "ctladm can create a new iscsi port with a target alias"
119	atf_set "require.user" "root"
120}
121create_iscsi_alias_body()
122{
123	skip_if_ctld
124	load_cfiscsi
125
126	TARGET=iqn.2018-10.myhost.create_iscsi_alias
127	ALIAS="foobar"
128	atf_check -o save:port-create.txt ctladm port -c -d "iscsi" -O cfiscsi_portal_group_tag=$PGTAG -O cfiscsi_target="$TARGET" -O cfiscsi_target_alias="$ALIAS"
129	echo "target: $TARGET" >> port-create.txt
130	atf_check egrep -q "Port created successfully" port-create.txt
131	atf_check egrep -q "frontend: *iscsi" port-create.txt
132	atf_check egrep -q "port: *[0-9]+" port-create.txt
133	atf_check -o save:portlist.txt ctladm portlist -qvf iscsi
134	atf_check egrep -q "cfiscsi_target_alias=$ALIAS" portlist.txt
135}
136create_iscsi_alias_cleanup()
137{
138	cleanup iscsi
139}
140
141atf_test_case create_iscsi_without_required_args
142create_iscsi_without_required_args_head()
143{
144	atf_set "descr" "ctladm will gracefully fail to create an iSCSI target if required arguments are missing"
145	atf_set "require.user" "root"
146}
147create_iscsi_without_required_args_body()
148{
149	skip_if_ctld
150	load_cfiscsi
151
152	TARGET=iqn.2018-10.myhost.create_iscsi
153	atf_check -s exit:1 -e match:"Missing required argument: cfiscsi_target" ctladm port -c -d "iscsi" -O cfiscsi_portal_group_tag=$PGTAG
154	atf_check -s exit:1 -e match:"Missing required argument: cfiscsi_portal_group_tag" ctladm port -c -d "iscsi" -O cfiscsi_target=$TARGET
155}
156
157atf_test_case create_ioctl_options cleanup
158create_ioctl_options_head()
159{
160	atf_set "descr" "ctladm can set options when creating a new ioctl port"
161	atf_set "require.user" "root"
162}
163create_ioctl_options_body()
164{
165	skip_if_ctld
166
167	atf_check -o save:port-create.txt ctladm port -c -d "ioctl" -O pp=101 -O vp=102
168	atf_check egrep -q "Port created successfully" port-create.txt
169	atf_check egrep -q "frontend: *ioctl" port-create.txt
170	atf_check egrep -q "port: *[0-9]+" port-create.txt
171	portnum=`awk '/port:/ {print $2}' port-create.txt`
172	atf_check -o save:portlist.txt ctladm portlist -qf ioctl
173	if ! egrep -q '101[[:space:]]+102' portlist.txt; then
174		ctladm portlist
175		atf_fail "Did not create the port with the specified options"
176	fi
177}
178create_ioctl_options_cleanup()
179{
180	cleanup ioctl
181}
182
183
184atf_test_case disable_ioctl cleanup
185disable_ioctl_head()
186{
187	atf_set "descr" "ctladm can disable an ioctl port"
188	atf_set "require.user" "root"
189}
190disable_ioctl_body()
191{
192	skip_if_ctld
193
194	atf_check -o save:port-create.txt ctladm port -c -d "ioctl"
195	portnum=`awk '/port:/ {print $2}' port-create.txt`
196	atf_check -o save:portlist.txt ctladm portlist -qf ioctl
197	atf_check -o ignore ctladm port -o off -p $portnum
198	atf_check -o match:"^$portnum *NO" ctladm portlist -qf ioctl
199}
200disable_ioctl_cleanup()
201{
202	cleanup ioctl
203}
204
205atf_test_case enable_ioctl cleanup
206enable_ioctl_head()
207{
208	atf_set "descr" "ctladm can enable an ioctl port"
209	atf_set "require.user" "root"
210}
211enable_ioctl_body()
212{
213	skip_if_ctld
214
215	atf_check -o save:port-create.txt ctladm port -c -d "ioctl"
216	portnum=`awk '/port:/ {print $2}' port-create.txt`
217	atf_check -o save:portlist.txt ctladm portlist -qf ioctl
218	atf_check -o ignore ctladm port -o off -p $portnum
219	atf_check -o ignore ctladm port -o on -p $portnum
220	atf_check -o match:"^$portnum *YES" ctladm portlist -qf ioctl
221}
222enable_ioctl_cleanup()
223{
224	cleanup ioctl
225}
226
227atf_test_case remove_ioctl
228remove_ioctl_head()
229{
230	atf_set "descr" "ctladm can remove an ioctl port"
231	atf_set "require.user" "root"
232}
233remove_ioctl_body()
234{
235	skip_if_ctld
236
237	# Specify exact pp and vp to make the post-removal portlist check
238	# unambiguous
239	atf_check -o save:port-create.txt ctladm port -c -d "ioctl" -O pp=10001 -O vp=10002
240	portnum=`awk '/port:/ {print $2}' port-create.txt`
241	atf_check -o save:portlist.txt ctladm portlist -qf ioctl
242	atf_check -o inline:"Port destroyed successfully\n" ctladm port -r -d ioctl -p $portnum
243	# Check that the port was removed.  A new port may have been added with
244	# the same ID, so match against the pp and vp numbers, too.
245	if ctladm portlist -qf ioctl | egrep -q "^${portnum} .*10001 *10002"; then
246		ctladm portlist -qf ioctl
247		atf_fail "port was not removed"
248	fi
249}
250
251atf_test_case remove_iscsi
252remove_iscsi_head()
253{
254	atf_set "descr" "ctladm can remove an iscsi port"
255	atf_set "require.user" "root"
256}
257remove_iscsi_body()
258{
259	skip_if_ctld
260	load_cfiscsi
261
262	TARGET=iqn.2018-10.myhost.remove_iscsi
263	atf_check -o save:port-create.txt ctladm port -c -d "iscsi" -O cfiscsi_portal_group_tag=$PGTAG -O cfiscsi_target="$TARGET"
264	portnum=`awk '/port:/ {print $2}' port-create.txt`
265	atf_check -o save:portlist.txt ctladm portlist -qf iscsi
266	atf_check -o inline:"Port destroyed successfully\n" ctladm port -r -d iscsi -O cfiscsi_portal_group_tag=$PGTAG -O cfiscsi_target="$TARGET"
267	# Check that the port was removed.  A new port may have been added with
268	# the same ID, so match against the target and tag, too.
269	PGTAGHEX=0x7631	# PGTAG in hex
270	if ctladm portlist -qf iscsi | egrep -q "^${portnum} .*$PGTAG +[0-9]+ +$TARGET,t,$PGTAGHEX"; then
271		ctladm portlist -qf iscsi
272		atf_fail "port was not removed"
273	fi
274}
275
276atf_test_case remove_iscsi_without_required_args cleanup
277remove_iscsi_without_required_args_head()
278{
279	atf_set "descr" "ctladm will gracefully fail to remove an iSCSI target if required arguments are missing"
280	atf_set "require.user" "root"
281}
282remove_iscsi_without_required_args_body()
283{
284	skip_if_ctld
285	load_cfiscsi
286
287	TARGET=iqn.2018-10.myhost.remove_iscsi_without_required_args
288	atf_check -o save:port-create.txt ctladm port -c -d "iscsi" -O cfiscsi_portal_group_tag=$PGTAG -O cfiscsi_target="$TARGET"
289	echo "target: $TARGET" >> port-create.txt
290	atf_check -s exit:1 -e match:"Missing required argument: cfiscsi_portal_group_tag" ctladm port -r -d iscsi -O cfiscsi_target="$TARGET"
291	atf_check -s exit:1 -e match:"Missing required argument: cfiscsi_target" ctladm port -r -d iscsi -O cfiscsi_portal_group_tag=$PGTAG
292}
293remove_iscsi_without_required_args_cleanup()
294{
295	cleanup iscsi
296}
297
298atf_init_test_cases()
299{
300	atf_add_test_case create_ioctl
301	atf_add_test_case create_iscsi
302	atf_add_test_case create_iscsi_without_required_args
303	atf_add_test_case create_iscsi_alias
304	atf_add_test_case create_ioctl_options
305	atf_add_test_case disable_ioctl
306	atf_add_test_case enable_ioctl
307	atf_add_test_case remove_ioctl
308	atf_add_test_case remove_ioctl_without_required_args
309	atf_add_test_case remove_iscsi
310	atf_add_test_case remove_iscsi_without_required_args
311}
312