xref: /freebsd/tests/sys/cddl/zfs/tests/zfsd/zfsd_test.sh (revision 4b9d6057)
1# CDDL HEADER START
2#
3# The contents of this file are subject to the terms of the
4# Common Development and Distribution License (the "License").
5# You may not use this file except in compliance with the License.
6#
7# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
8# or http://www.opensolaris.org/os/licensing.
9# See the License for the specific language governing permissions
10# and limitations under the License.
11#
12# When distributing Covered Code, include this CDDL HEADER in each
13# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
14# If applicable, add the following below this CDDL HEADER, with the
15# fields enclosed by brackets "[]" replaced with your own identifying
16# information: Portions Copyright [yyyy] [name of copyright owner]
17#
18# CDDL HEADER END
19#
20
21#
22# Copyright 2012,2013 Spectra Logic.  All rights reserved.
23# Use is subject to license terms.
24#
25
26
27atf_test_case zfsd_fault_001_pos cleanup
28zfsd_fault_001_pos_head()
29{
30	atf_set "descr" "ZFS will fault a vdev that produces IO errors"
31	atf_set "require.progs" "ksh93 gnop zfs zpool zfsd"
32	atf_set "timeout" 300
33}
34zfsd_fault_001_pos_body()
35{
36	. $(atf_get_srcdir)/../../include/default.cfg
37	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
38	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
39	. $(atf_get_srcdir)/zfsd.cfg
40
41	verify_disk_count "$DISKS" 2
42	verify_zfsd_running
43	ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed"
44	ksh93 $(atf_get_srcdir)/zfsd_fault_001_pos.ksh
45	if [[ $? != 0 ]]; then
46		save_artifacts
47		atf_fail "Testcase failed"
48	fi
49}
50zfsd_fault_001_pos_cleanup()
51{
52	. $(atf_get_srcdir)/../../include/default.cfg
53	. $(atf_get_srcdir)/zfsd.cfg
54
55	ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed"
56}
57
58
59atf_test_case zfsd_fault_002_pos cleanup
60zfsd_fault_002_pos_head()
61{
62	atf_set "descr" "ZFS will fault a vdev that experiences delayed I/O"
63	atf_set "require.progs" "ksh93 gnop zfs zpool zfsd"
64	atf_set "timeout" 300
65}
66zfsd_fault_002_pos_body()
67{
68	. $(atf_get_srcdir)/../../include/default.cfg
69	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
70	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
71	. $(atf_get_srcdir)/zfsd.cfg
72
73	verify_disk_count "$DISKS" 2
74	verify_zfsd_running
75	ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed"
76	ksh93 $(atf_get_srcdir)/zfsd_fault_002_pos.ksh
77	if [[ $? != 0 ]]; then
78		save_artifacts
79		atf_fail "Testcase failed"
80	fi
81}
82zfsd_fault_002_pos_cleanup()
83{
84	. $(atf_get_srcdir)/../../include/default.cfg
85	. $(atf_get_srcdir)/zfsd.cfg
86
87	ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed"
88}
89
90atf_test_case zfsd_degrade_001_pos cleanup
91zfsd_degrade_001_pos_head()
92{
93	atf_set "descr" "ZFS will degrade a vdev that produces checksum errors"
94	atf_set "require.progs" "ksh93 zpool zfsd"
95	atf_set "timeout" 600
96}
97zfsd_degrade_001_pos_body()
98{
99	. $(atf_get_srcdir)/../../include/default.cfg
100	. $(atf_get_srcdir)/zfsd.cfg
101
102	verify_disk_count "$DISKS" 2
103	verify_zfsd_running
104	ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed"
105	ksh93 $(atf_get_srcdir)/zfsd_degrade_001_pos.ksh
106	if [[ $? != 0 ]]; then
107		save_artifacts
108		atf_fail "Testcase failed"
109	fi
110}
111zfsd_degrade_001_pos_cleanup()
112{
113	. $(atf_get_srcdir)/../../include/default.cfg
114	. $(atf_get_srcdir)/zfsd.cfg
115
116	ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed"
117}
118
119atf_test_case zfsd_degrade_002_pos cleanup
120zfsd_degrade_002_pos_head()
121{
122	atf_set "descr" "ZFS will degrade a spare that produces checksum errors"
123	atf_set "require.progs" "ksh93 zpool zfsd"
124	atf_set "timeout" 600
125}
126zfsd_degrade_002_pos_body()
127{
128	atf_expect_fail "https://www.illumos.org/issues/8614 Checksum errors on a mirrored child of a raidz are incorrectly accounted"
129	. $(atf_get_srcdir)/../../include/default.cfg
130	. $(atf_get_srcdir)/zfsd.cfg
131
132	verify_disk_count "$DISKS" 5
133	verify_zfsd_running
134	ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed"
135	ksh93 $(atf_get_srcdir)/zfsd_degrade_002_pos.ksh
136	if [[ $? != 0 ]]; then
137		save_artifacts
138		atf_fail "Testcase failed"
139	fi
140}
141zfsd_degrade_002_pos_cleanup()
142{
143	. $(atf_get_srcdir)/../../include/default.cfg
144	. $(atf_get_srcdir)/zfsd.cfg
145
146	ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed"
147}
148
149
150atf_test_case zfsd_hotspare_001_pos cleanup
151zfsd_hotspare_001_pos_head()
152{
153	atf_set "descr" "An active, damaged spare will be replaced by an available spare"
154	atf_set "require.progs" "ksh93 zpool zfsd"
155	atf_set "timeout" 3600
156}
157zfsd_hotspare_001_pos_body()
158{
159	. $(atf_get_srcdir)/../../include/default.cfg
160	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
161	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
162
163	verify_zfsd_running
164	ksh93 $(atf_get_srcdir)/hotspare_setup.ksh || atf_fail "Setup failed"
165	ksh93 $(atf_get_srcdir)/zfsd_hotspare_001_pos.ksh
166	if [[ $? != 0 ]]; then
167		save_artifacts
168		atf_fail "Testcase failed"
169	fi
170}
171zfsd_hotspare_001_pos_cleanup()
172{
173	. $(atf_get_srcdir)/../../include/default.cfg
174	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
175	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
176
177	ksh93 $(atf_get_srcdir)/hotspare_cleanup.ksh || atf_fail "Cleanup failed"
178}
179
180atf_test_case zfsd_hotspare_002_pos cleanup
181zfsd_hotspare_002_pos_head()
182{
183	atf_set "descr" "If a vdev becomes degraded, the spare will be activated."
184	atf_set "require.progs" "ksh93 zpool zfsd zinject"
185	atf_set "timeout" 3600
186}
187zfsd_hotspare_002_pos_body()
188{
189	. $(atf_get_srcdir)/../../include/default.cfg
190	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
191	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
192
193	verify_zfsd_running
194	ksh93 $(atf_get_srcdir)/hotspare_setup.ksh || atf_fail "Setup failed"
195	ksh93 $(atf_get_srcdir)/zfsd_hotspare_002_pos.ksh
196	if [[ $? != 0 ]]; then
197		save_artifacts
198		atf_fail "Testcase failed"
199	fi
200}
201zfsd_hotspare_002_pos_cleanup()
202{
203	. $(atf_get_srcdir)/../../include/default.cfg
204	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
205	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
206
207	ksh93 $(atf_get_srcdir)/hotspare_cleanup.ksh || atf_fail "Cleanup failed"
208}
209
210
211atf_test_case zfsd_hotspare_003_pos cleanup
212zfsd_hotspare_003_pos_head()
213{
214	atf_set "descr" "A faulted vdev will be replaced by an available spare"
215	atf_set "require.progs" "ksh93 zpool zfsd zinject"
216	atf_set "timeout" 3600
217}
218zfsd_hotspare_003_pos_body()
219{
220	. $(atf_get_srcdir)/../../include/default.cfg
221	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
222	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
223
224	verify_disk_count "$DISKS" 5
225	verify_zfsd_running
226	ksh93 $(atf_get_srcdir)/hotspare_setup.ksh || atf_fail "Setup failed"
227	ksh93 $(atf_get_srcdir)/zfsd_hotspare_003_pos.ksh
228	if [[ $? != 0 ]]; then
229		save_artifacts
230		atf_fail "Testcase failed"
231	fi
232}
233zfsd_hotspare_003_pos_cleanup()
234{
235	. $(atf_get_srcdir)/../../include/default.cfg
236	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
237	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
238
239	ksh93 $(atf_get_srcdir)/hotspare_cleanup.ksh || atf_fail "Cleanup failed"
240}
241
242atf_test_case zfsd_hotspare_004_pos cleanup
243zfsd_hotspare_004_pos_head()
244{
245	atf_set "descr" "Removing a disk from a pool results in the spare activating"
246	atf_set "require.progs" "ksh93 gnop zpool"
247	atf_set "timeout" 3600
248}
249zfsd_hotspare_004_pos_body()
250{
251	. $(atf_get_srcdir)/../../include/default.cfg
252	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
253	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
254
255	verify_disk_count "$DISKS" 5
256	verify_zfsd_running
257	ksh93 $(atf_get_srcdir)/hotspare_setup.ksh || atf_fail "Setup failed"
258	ksh93 $(atf_get_srcdir)/zfsd_hotspare_004_pos.ksh
259	if [[ $? != 0 ]]; then
260		save_artifacts
261		atf_fail "Testcase failed"
262	fi
263}
264zfsd_hotspare_004_pos_cleanup()
265{
266	. $(atf_get_srcdir)/../../include/default.cfg
267	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
268	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
269
270	ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed"
271}
272
273atf_test_case zfsd_hotspare_005_pos cleanup
274zfsd_hotspare_005_pos_head()
275{
276	atf_set "descr" "A spare that is added to a degraded pool will be activated"
277	atf_set "require.progs" "ksh93 zpool zfsd zinject"
278	atf_set "timeout" 3600
279}
280zfsd_hotspare_005_pos_body()
281{
282	. $(atf_get_srcdir)/../../include/default.cfg
283	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
284	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
285
286	verify_zfsd_running
287	ksh93 $(atf_get_srcdir)/hotspare_setup.ksh || atf_fail "Setup failed"
288	ksh93 $(atf_get_srcdir)/zfsd_hotspare_005_pos.ksh
289	if [[ $? != 0 ]]; then
290		save_artifacts
291		atf_fail "Testcase failed"
292	fi
293}
294zfsd_hotspare_005_pos_cleanup()
295{
296	. $(atf_get_srcdir)/../../include/default.cfg
297	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
298	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
299
300	ksh93 $(atf_get_srcdir)/hotspare_cleanup.ksh || atf_fail "Cleanup failed"
301}
302
303atf_test_case zfsd_hotspare_006_pos cleanup
304zfsd_hotspare_006_pos_head()
305{
306	atf_set "descr" "zfsd will replace two vdevs that fail simultaneously"
307	atf_set "require.progs" "ksh93 zpool zfsd zinject"
308	atf_set "timeout" 3600
309}
310zfsd_hotspare_006_pos_body()
311{
312	. $(atf_get_srcdir)/../../include/default.cfg
313	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
314	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
315
316	verify_zfsd_running
317	ksh93 $(atf_get_srcdir)/hotspare_setup.ksh || atf_fail "Setup failed"
318	ksh93 $(atf_get_srcdir)/zfsd_hotspare_006_pos.ksh
319	if [[ $? != 0 ]]; then
320		save_artifacts
321		atf_fail "Testcase failed"
322	fi
323}
324zfsd_hotspare_006_pos_cleanup()
325{
326	. $(atf_get_srcdir)/../../include/default.cfg
327	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
328	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
329
330	ksh93 $(atf_get_srcdir)/hotspare_cleanup.ksh || atf_fail "Cleanup failed"
331}
332
333atf_test_case zfsd_hotspare_007_pos cleanup
334zfsd_hotspare_007_pos_head()
335{
336	atf_set "descr" "zfsd will swap failed drives at startup"
337	atf_set "require.progs" "ksh93 gnop zpool"
338	atf_set "timeout" 3600
339}
340zfsd_hotspare_007_pos_body()
341{
342	. $(atf_get_srcdir)/../../include/default.cfg
343	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
344	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
345
346	verify_disk_count "$DISKS" 5
347	verify_zfsd_running
348	ksh93 $(atf_get_srcdir)/hotspare_setup.ksh || atf_fail "Setup failed"
349	ksh93 $(atf_get_srcdir)/zfsd_hotspare_007_pos.ksh
350	if [[ $? != 0 ]]; then
351		save_artifacts
352		atf_fail "Testcase failed"
353	fi
354}
355zfsd_hotspare_007_pos_cleanup()
356{
357	. $(atf_get_srcdir)/../../include/default.cfg
358	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
359	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
360
361	ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed"
362}
363
364atf_test_case zfsd_hotspare_008_neg cleanup
365zfsd_hotspare_008_neg_head()
366{
367	atf_set "descr" "zfsd will not use newly added spares on replacing vdevs"
368	atf_set "require.progs" "ksh93 zpool zfsd"
369	atf_set "timeout" 3600
370}
371zfsd_hotspare_008_neg_body()
372{
373	. $(atf_get_srcdir)/../../include/default.cfg
374	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
375	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
376
377	verify_disk_count "$DISKS" 4
378	ksh93 $(atf_get_srcdir)/hotspare_setup.ksh || atf_fail "Setup failed"
379	ksh93 $(atf_get_srcdir)/zfsd_hotspare_008_neg.ksh
380	if [[ $? != 0 ]]; then
381		save_artifacts
382		atf_fail "Testcase failed"
383	fi
384}
385zfsd_hotspare_008_neg_cleanup()
386{
387	. $(atf_get_srcdir)/../../include/default.cfg
388	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
389	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
390
391	ksh93 $(atf_get_srcdir)/hotspare_cleanup.ksh || atf_fail "Cleanup failed"
392}
393
394atf_test_case zfsd_autoreplace_001_neg cleanup
395zfsd_autoreplace_001_neg_head()
396{
397	atf_set "descr" "A pool without autoreplace set will not replace by physical path"
398	atf_set "require.progs" "ksh93 zpool gnop"
399	atf_set "timeout" 3600
400}
401zfsd_autoreplace_001_neg_body()
402{
403	. $(atf_get_srcdir)/../../include/default.cfg
404	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
405	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
406
407	verify_disk_count "$DISKS" 5
408	ksh93 $(atf_get_srcdir)/hotspare_setup.ksh || atf_fail "Setup failed"
409	ksh93 $(atf_get_srcdir)/zfsd_autoreplace_001_neg.ksh
410	if [[ $? != 0 ]]; then
411		save_artifacts
412		atf_fail "Testcase failed"
413	fi
414}
415zfsd_autoreplace_001_neg_cleanup()
416{
417	. $(atf_get_srcdir)/../../include/default.cfg
418	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
419	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
420
421	ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed"
422}
423
424atf_test_case zfsd_autoreplace_002_pos cleanup
425zfsd_autoreplace_002_pos_head()
426{
427	atf_set "descr" "A pool with autoreplace set will replace by physical path"
428	atf_set "require.progs" "ksh93 gnop zpool zfsd"
429	atf_set "timeout" 3600
430}
431zfsd_autoreplace_002_pos_body()
432{
433	. $(atf_get_srcdir)/../../include/default.cfg
434	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
435	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
436
437	verify_disk_count "$DISKS" 5
438	verify_zfsd_running
439	ksh93 $(atf_get_srcdir)/hotspare_setup.ksh || atf_fail "Setup failed"
440	ksh93 $(atf_get_srcdir)/zfsd_autoreplace_002_pos.ksh
441	if [[ $? != 0 ]]; then
442		save_artifacts
443		atf_fail "Testcase failed"
444	fi
445}
446zfsd_autoreplace_002_pos_cleanup()
447{
448	. $(atf_get_srcdir)/../../include/default.cfg
449	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
450	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
451
452	ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed"
453}
454
455atf_test_case zfsd_autoreplace_003_pos cleanup
456zfsd_autoreplace_003_pos_head()
457{
458	atf_set "descr" "A pool with autoreplace set will replace by physical path even if a spare is active"
459	atf_set "require.progs" "ksh93 zpool gnop"
460	atf_set "timeout" 3600
461}
462zfsd_autoreplace_003_pos_body()
463{
464	. $(atf_get_srcdir)/../../include/default.cfg
465	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
466	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
467
468	verify_disk_count "$DISKS" 5
469	verify_zfsd_running
470	ksh93 $(atf_get_srcdir)/hotspare_setup.ksh || atf_fail "Setup failed"
471	ksh93 $(atf_get_srcdir)/zfsd_autoreplace_003_pos.ksh
472	if [[ $? != 0 ]]; then
473		save_artifacts
474		atf_fail "Testcase failed"
475	fi
476}
477zfsd_autoreplace_003_pos_cleanup()
478{
479	. $(atf_get_srcdir)/../../include/default.cfg
480	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
481	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
482
483	ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed"
484}
485
486atf_test_case zfsd_replace_001_pos cleanup
487zfsd_replace_001_pos_head()
488{
489	atf_set "descr" "ZFSD will automatically replace a SAS disk that disappears and reappears in the same location, with the same devname"
490	atf_set "require.progs" "ksh93 zpool zfs gnop"
491}
492zfsd_replace_001_pos_body()
493{
494	. $(atf_get_srcdir)/../../include/default.cfg
495	. $(atf_get_srcdir)/zfsd.cfg
496
497	verify_disk_count "$DISKS" 3
498	verify_zfsd_running
499	ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed"
500	ksh93 $(atf_get_srcdir)/zfsd_replace_001_pos.ksh
501	if [[ $? != 0 ]]; then
502		save_artifacts
503		atf_fail "Testcase failed"
504	fi
505}
506zfsd_replace_001_pos_cleanup()
507{
508	. $(atf_get_srcdir)/../../include/default.cfg
509	. $(atf_get_srcdir)/zfsd.cfg
510
511	ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed"
512}
513
514
515atf_test_case zfsd_replace_002_pos cleanup
516zfsd_replace_002_pos_head()
517{
518	atf_set "descr" "zfsd will reactivate a pool after all disks are failed and reappeared"
519	atf_set "require.progs" "ksh93 zpool zfs"
520}
521zfsd_replace_002_pos_body()
522{
523	atf_expect_fail "Not yet implemented in zfsd"
524	. $(atf_get_srcdir)/../../include/default.cfg
525	. $(atf_get_srcdir)/zfsd.cfg
526
527	verify_disk_count "$DISKS" 3
528	verify_zfsd_running
529	ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed"
530	ksh93 $(atf_get_srcdir)/zfsd_replace_002_pos.ksh
531	if [[ $? != 0 ]]; then
532		save_artifacts
533		atf_fail "Testcase failed"
534	fi
535}
536zfsd_replace_002_pos_cleanup()
537{
538	. $(atf_get_srcdir)/../../include/default.cfg
539	. $(atf_get_srcdir)/zfsd.cfg
540
541	ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed"
542}
543
544atf_test_case zfsd_replace_003_pos cleanup
545zfsd_replace_003_pos_head()
546{
547	atf_set "descr" "ZFSD will correctly replace disks that dissapear and reappear with different devnames"
548	atf_set "require.progs" "ksh93 zpool zfs gnop"
549}
550zfsd_replace_003_pos_body()
551{
552	. $(atf_get_srcdir)/../../include/default.cfg
553	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
554	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
555
556	verify_zfsd_running
557	ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed"
558	ksh93 $(atf_get_srcdir)/zfsd_replace_003_pos.ksh
559	if [[ $? != 0 ]]; then
560		save_artifacts
561		atf_fail "Testcase failed"
562	fi
563}
564zfsd_replace_003_pos_cleanup()
565{
566	. $(atf_get_srcdir)/../../include/default.cfg
567	. $(atf_get_srcdir)/zfsd.cfg
568
569	ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed"
570}
571
572atf_test_case zfsd_replace_004_pos cleanup
573zfsd_replace_004_pos_head()
574{
575	atf_set "descr" "ZFSD will automatically replace a spare that disappears and reappears in the same location, with the same devname"
576	atf_set "require.progs" "ksh93 zpool zfs gnop"
577}
578zfsd_replace_004_pos_body()
579{
580	. $(atf_get_srcdir)/../../include/default.cfg
581	. $(atf_get_srcdir)/zfsd.cfg
582
583	verify_disk_count "$DISKS" 2
584	verify_zfsd_running
585	ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed"
586	ksh93 $(atf_get_srcdir)/zfsd_replace_004_pos.ksh
587	if [[ $? != 0 ]]; then
588		save_artifacts
589		atf_fail "Testcase failed"
590	fi
591}
592zfsd_replace_004_pos_cleanup()
593{
594	. $(atf_get_srcdir)/../../include/default.cfg
595	. $(atf_get_srcdir)/zfsd.cfg
596
597	ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed"
598}
599
600atf_test_case zfsd_replace_005_pos cleanup
601zfsd_replace_005_pos_head()
602{
603	atf_set "descr" "ZFSD will automatically replace a multi-pool spare that disappears and reappears"
604	atf_set "require.progs" "ksh93 zpool zfs gnop"
605}
606zfsd_replace_005_pos_body()
607{
608	. $(atf_get_srcdir)/../../include/default.cfg
609	. $(atf_get_srcdir)/zfsd.cfg
610
611	verify_disk_count "$DISKS" 3
612	verify_zfsd_running
613	ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed"
614	ksh93 $(atf_get_srcdir)/zfsd_replace_005_pos.ksh
615	if [[ $? != 0 ]]; then
616		save_artifacts
617		atf_fail "Testcase failed"
618	fi
619}
620zfsd_replace_005_pos_cleanup()
621{
622	. $(atf_get_srcdir)/../../include/default.cfg
623	. $(atf_get_srcdir)/zfsd.cfg
624
625	ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed"
626}
627
628atf_test_case zfsd_import_001_pos cleanup
629zfsd_import_001_pos_head()
630{
631	atf_set "descr" "If a removed drive gets reinserted while the pool is exported, it will detach its spare when imported."
632	atf_set "require.progs" "ksh93 gnop zfsd zpool"
633	atf_set "timeout" 3600
634}
635zfsd_import_001_pos_body()
636{
637	. $(atf_get_srcdir)/../../include/default.cfg
638	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
639	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
640
641	verify_disk_count "$DISKS" 5
642	verify_zfsd_running
643	ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed"
644	ksh93 $(atf_get_srcdir)/zfsd_import_001_pos.ksh || atf_fail "Testcase failed"
645	if [[ $? != 0 ]]; then
646		save_artifacts
647		atf_fail "Testcase failed"
648	fi
649}
650zfsd_import_001_pos_cleanup()
651{
652	. $(atf_get_srcdir)/../../include/default.cfg
653	. $(atf_get_srcdir)/../hotspare/hotspare.kshlib
654	. $(atf_get_srcdir)/../hotspare/hotspare.cfg
655
656	ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed"
657}
658
659
660
661
662atf_init_test_cases()
663{
664	atf_add_test_case zfsd_fault_001_pos
665	atf_add_test_case zfsd_fault_002_pos
666	atf_add_test_case zfsd_degrade_001_pos
667	atf_add_test_case zfsd_degrade_002_pos
668	atf_add_test_case zfsd_hotspare_001_pos
669	atf_add_test_case zfsd_hotspare_002_pos
670	atf_add_test_case zfsd_hotspare_003_pos
671	atf_add_test_case zfsd_hotspare_004_pos
672	atf_add_test_case zfsd_hotspare_005_pos
673	atf_add_test_case zfsd_hotspare_006_pos
674	atf_add_test_case zfsd_hotspare_007_pos
675	atf_add_test_case zfsd_hotspare_008_neg
676	atf_add_test_case zfsd_autoreplace_001_neg
677	atf_add_test_case zfsd_autoreplace_002_pos
678	atf_add_test_case zfsd_autoreplace_003_pos
679	atf_add_test_case zfsd_replace_001_pos
680	atf_add_test_case zfsd_replace_002_pos
681	atf_add_test_case zfsd_replace_003_pos
682	atf_add_test_case zfsd_replace_004_pos
683	atf_add_test_case zfsd_replace_005_pos
684	atf_add_test_case zfsd_import_001_pos
685}
686
687save_artifacts()
688{
689	# If ARTIFACTS_DIR is defined, save test artifacts for
690	# post-mortem analysis
691	if [[ -n $ARTIFACTS_DIR ]]; then
692		TC_ARTIFACTS_DIR=${ARTIFACTS_DIR}/sys/cddl/zfs/tests/zfsd/$(atf_get ident)
693		mkdir -p $TC_ARTIFACTS_DIR
694		cp -a /var/log/zfsd.log* $TC_ARTIFACTS_DIR
695		bzip2 $TC_ARTIFACTS_DIR/zfsd.log
696	fi
697}
698
699verify_zfsd_running()
700{
701	service zfsd onestatus || \
702		atf_skip "zfsd(8) must be enabled and running for this test"
703}
704