1d583b39bSJohn Wren Kennedy#!/bin/ksh -p
2d583b39bSJohn Wren Kennedy#
3d583b39bSJohn Wren Kennedy# CDDL HEADER START
4d583b39bSJohn Wren Kennedy#
5d583b39bSJohn Wren Kennedy# The contents of this file are subject to the terms of the
6d583b39bSJohn Wren Kennedy# Common Development and Distribution License (the "License").
7d583b39bSJohn Wren Kennedy# You may not use this file except in compliance with the License.
8d583b39bSJohn Wren Kennedy#
9d583b39bSJohn Wren Kennedy# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10d583b39bSJohn Wren Kennedy# or http://www.opensolaris.org/os/licensing.
11d583b39bSJohn Wren Kennedy# See the License for the specific language governing permissions
12d583b39bSJohn Wren Kennedy# and limitations under the License.
13d583b39bSJohn Wren Kennedy#
14d583b39bSJohn Wren Kennedy# When distributing Covered Code, include this CDDL HEADER in each
15d583b39bSJohn Wren Kennedy# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16d583b39bSJohn Wren Kennedy# If applicable, add the following below this CDDL HEADER, with the
17d583b39bSJohn Wren Kennedy# fields enclosed by brackets "[]" replaced with your own identifying
18d583b39bSJohn Wren Kennedy# information: Portions Copyright [yyyy] [name of copyright owner]
19d583b39bSJohn Wren Kennedy#
20d583b39bSJohn Wren Kennedy# CDDL HEADER END
21d583b39bSJohn Wren Kennedy#
22d583b39bSJohn Wren Kennedy
23d583b39bSJohn Wren Kennedy#
24d583b39bSJohn Wren Kennedy# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
25d583b39bSJohn Wren Kennedy# Use is subject to license terms.
26d583b39bSJohn Wren Kennedy#
27d583b39bSJohn Wren Kennedy
28d583b39bSJohn Wren Kennedy#
29*1d32ba66SJohn Wren Kennedy# Copyright (c) 2012, 2016 by Delphix. All rights reserved.
30d583b39bSJohn Wren Kennedy#
31d583b39bSJohn Wren Kennedy
32d583b39bSJohn Wren Kennedy. $STF_SUITE/include/libtest.shlib
33d583b39bSJohn Wren Kennedy. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg
34d583b39bSJohn Wren Kennedy. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy_common.kshlib
35d583b39bSJohn Wren Kennedy
36d583b39bSJohn Wren Kennedy#
37d583b39bSJohn Wren Kennedy# DESCRIPTION:
38d583b39bSJohn Wren Kennedy#	'zfs destroy -r|-rf|-R|-Rf <fs|ctr|vol|snap>' should recursively destroy
39d583b39bSJohn Wren Kennedy#	all children and clones based on options.
40d583b39bSJohn Wren Kennedy#
41d583b39bSJohn Wren Kennedy# STRATEGY:
42d583b39bSJohn Wren Kennedy#	1. Create test environment according to options. There are three test
43d583b39bSJohn Wren Kennedy#	models can be created. Only ctr, fs & vol; with snap; with clone.
44d583b39bSJohn Wren Kennedy#	2. According to option, make the dataset busy or not.
45d583b39bSJohn Wren Kennedy#	3. Run 'zfs destroy [-rRf] <dataset>'
46d583b39bSJohn Wren Kennedy#	4. According to dataset and option, check if get the expected results.
47d583b39bSJohn Wren Kennedy#
48d583b39bSJohn Wren Kennedy
49d583b39bSJohn Wren Kennedyverify_runnable "both"
50d583b39bSJohn Wren Kennedy
51d583b39bSJohn Wren Kennedy#
52d583b39bSJohn Wren Kennedy# According to parameters, 1st, create suitable testing environment. 2nd,
53d583b39bSJohn Wren Kennedy# run 'zfs destroy $opt <dataset>'. 3rd, check the system status.
54d583b39bSJohn Wren Kennedy#
55d583b39bSJohn Wren Kennedy# $1 option of 'zfs destroy'
56d583b39bSJohn Wren Kennedy# $2 dataset will be destroied.
57d583b39bSJohn Wren Kennedy#
58d583b39bSJohn Wren Kennedyfunction test_n_check
59d583b39bSJohn Wren Kennedy{
60d583b39bSJohn Wren Kennedy	typeset opt=$1
61d583b39bSJohn Wren Kennedy	typeset dtst=$2
62d583b39bSJohn Wren Kennedy
63d583b39bSJohn Wren Kennedy	if ! is_global_zone ; then
64d583b39bSJohn Wren Kennedy		if [[ $dtst == $VOL || $dtst == $VOLSNAP ]]; then
65d583b39bSJohn Wren Kennedy			log_note "UNSUPPORTED: Volume are unavailable in LZ."
66d583b39bSJohn Wren Kennedy			return
67d583b39bSJohn Wren Kennedy		fi
68d583b39bSJohn Wren Kennedy	fi
69d583b39bSJohn Wren Kennedy
70d583b39bSJohn Wren Kennedy	# '-f' has no effect on non-filesystems
71d583b39bSJohn Wren Kennedy	if [[ $opt == -f ]]; then
72d583b39bSJohn Wren Kennedy		if [[ $dtst != $FS ]]; then
73d583b39bSJohn Wren Kennedy			log_note "UNSUPPORTED: '-f ' is only available for " \
74d583b39bSJohn Wren Kennedy			    "leaf FS."
75d583b39bSJohn Wren Kennedy			return
76d583b39bSJohn Wren Kennedy		fi
77d583b39bSJohn Wren Kennedy	fi
78d583b39bSJohn Wren Kennedy
79d583b39bSJohn Wren Kennedy	# Clean the test environment and make it clear.
80d583b39bSJohn Wren Kennedy	if datasetexists $CTR; then
81*1d32ba66SJohn Wren Kennedy		log_must zfs destroy -Rf $CTR
82d583b39bSJohn Wren Kennedy	fi
83d583b39bSJohn Wren Kennedy
84d583b39bSJohn Wren Kennedy	# According to option create test compatible environment.
85d583b39bSJohn Wren Kennedy	case $opt in
86d583b39bSJohn Wren Kennedy		-r|-rf) setup_testenv snap ;;
87d583b39bSJohn Wren Kennedy		-R|-Rf) setup_testenv clone ;;
88d583b39bSJohn Wren Kennedy		-f)	setup_testenv ;;
89d583b39bSJohn Wren Kennedy		*)	log_fail "Incorrect option: '$opt'." ;;
90d583b39bSJohn Wren Kennedy	esac
91d583b39bSJohn Wren Kennedy
92d583b39bSJohn Wren Kennedy	#
93d583b39bSJohn Wren Kennedy	# According to different dataset type, create busy condition when try to
94d583b39bSJohn Wren Kennedy	# destroy this dataset.
95d583b39bSJohn Wren Kennedy	#
96d583b39bSJohn Wren Kennedy	typeset mpt_dir
97d583b39bSJohn Wren Kennedy	case $dtst in
98d583b39bSJohn Wren Kennedy		$CTR|$FS)
99d583b39bSJohn Wren Kennedy			if [[ $opt == *f* ]]; then
100d583b39bSJohn Wren Kennedy				mpt_dir=$(get_prop mountpoint $FS)
101*1d32ba66SJohn Wren Kennedy				pidlist="$pidlist $(mkbusy \
102d583b39bSJohn Wren Kennedy				    $mpt_dir/$TESTFILE0)"
103*1d32ba66SJohn Wren Kennedy				log_note "mkbusy $mpt_dir/$TESTFILE0 " \
104d583b39bSJohn Wren Kennedy				    "(pidlist: $pidlist)"
105d583b39bSJohn Wren Kennedy				[[ -z $pidlist ]] && \
106*1d32ba66SJohn Wren Kennedy				    log_fail "Failure from mkbusy"
107*1d32ba66SJohn Wren Kennedy				log_mustnot zfs destroy -rR $dtst
108d583b39bSJohn Wren Kennedy			fi
109d583b39bSJohn Wren Kennedy			;;
110d583b39bSJohn Wren Kennedy		$VOL)
111d583b39bSJohn Wren Kennedy			if [[ $opt == *f* ]]; then
112*1d32ba66SJohn Wren Kennedy				pidlist="$pidlist $(mkbusy \
113d583b39bSJohn Wren Kennedy				    $TESTDIR1/$TESTFILE0)"
114*1d32ba66SJohn Wren Kennedy				log_note "mkbusy $TESTDIR1/$TESTFILE0 " \
115d583b39bSJohn Wren Kennedy				    "(pidlist: $pidlist)"
116d583b39bSJohn Wren Kennedy				[[ -z $pidlist ]] && \
117*1d32ba66SJohn Wren Kennedy				    log_fail "Failure from mkbusy"
118*1d32ba66SJohn Wren Kennedy				log_mustnot zfs destroy -rR $dtst
119d583b39bSJohn Wren Kennedy			fi
120d583b39bSJohn Wren Kennedy			;;
121d583b39bSJohn Wren Kennedy		$VOLSNAP)
122d583b39bSJohn Wren Kennedy			if [[ $opt == *f* ]]; then
123*1d32ba66SJohn Wren Kennedy				pidlist="$pidlist $(mkbusy \
124d583b39bSJohn Wren Kennedy				    $TESTDIR1/$TESTFILE0)"
125*1d32ba66SJohn Wren Kennedy				log_note "mkbusy $TESTDIR1/$TESTFILE0 " \
126d583b39bSJohn Wren Kennedy				    "(pidlist: $pidlist)"
127d583b39bSJohn Wren Kennedy				[[ -z $pidlist ]] && \
128*1d32ba66SJohn Wren Kennedy				    log_fail "Failure from mkbusy"
129*1d32ba66SJohn Wren Kennedy				log_must zfs destroy -rR $dtst
130*1d32ba66SJohn Wren Kennedy				log_must zfs snapshot $dtst
131d583b39bSJohn Wren Kennedy			fi
132d583b39bSJohn Wren Kennedy			;;
133d583b39bSJohn Wren Kennedy		$FSSNAP)
134d583b39bSJohn Wren Kennedy			if [[ $opt == *f* ]]; then
135d583b39bSJohn Wren Kennedy				mpt_dir=$(snapshot_mountpoint $dtst)
136*1d32ba66SJohn Wren Kennedy				pidlist="$pidlist $(mkbusy $mpt_dir)"
137*1d32ba66SJohn Wren Kennedy				log_note "mkbusy $mpt_dir (pidlist: $pidlist)"
138d583b39bSJohn Wren Kennedy				[[ -z $pidlist ]] && \
139*1d32ba66SJohn Wren Kennedy				    log_fail "Failure from mkbusy"
140*1d32ba66SJohn Wren Kennedy				log_must zfs destroy -rR $dtst
141*1d32ba66SJohn Wren Kennedy				log_must zfs snapshot $dtst
142d583b39bSJohn Wren Kennedy			fi
143d583b39bSJohn Wren Kennedy			;;
144d583b39bSJohn Wren Kennedy		*)	log_fail "Unsupported dataset: '$dtst'."
145d583b39bSJohn Wren Kennedy	esac
146d583b39bSJohn Wren Kennedy
147d583b39bSJohn Wren Kennedy	# Firstly, umount ufs filesystem which was created by zfs volume.
148d583b39bSJohn Wren Kennedy	if is_global_zone; then
149*1d32ba66SJohn Wren Kennedy		log_must umount -f $TESTDIR1
150d583b39bSJohn Wren Kennedy	fi
151d583b39bSJohn Wren Kennedy
152d583b39bSJohn Wren Kennedy	# Invoke 'zfs destroy [-rRf] <dataset>'
153*1d32ba66SJohn Wren Kennedy	log_must zfs destroy $opt $dtst
154d583b39bSJohn Wren Kennedy
155d583b39bSJohn Wren Kennedy	# Kill any lingering instances of mkbusy, and clear the list.
156*1d32ba66SJohn Wren Kennedy	[[ -z $pidlist ]] || log_must kill -TERM $pidlist
157d583b39bSJohn Wren Kennedy	pidlist=""
158*1d32ba66SJohn Wren Kennedy	log_mustnot pgrep -fl mkbusy
159d583b39bSJohn Wren Kennedy
160d583b39bSJohn Wren Kennedy	case $dtst in
161d583b39bSJohn Wren Kennedy		$CTR)	check_dataset datasetnonexists \
162d583b39bSJohn Wren Kennedy					$CTR $FS $VOL $FSSNAP $VOLSNAP
163d583b39bSJohn Wren Kennedy			if [[ $opt == *R* ]]; then
164d583b39bSJohn Wren Kennedy				check_dataset datasetnonexists \
165d583b39bSJohn Wren Kennedy					$FSCLONE $VOLCLONE
166d583b39bSJohn Wren Kennedy			fi
167d583b39bSJohn Wren Kennedy			;;
168d583b39bSJohn Wren Kennedy		$FS)	check_dataset datasetexists $CTR $VOL
169d583b39bSJohn Wren Kennedy			check_dataset datasetnonexists $FS
170d583b39bSJohn Wren Kennedy			if [[ $opt != -f ]]; then
171d583b39bSJohn Wren Kennedy				check_dataset datasetexists $VOLSNAP
172d583b39bSJohn Wren Kennedy				check_dataset datasetnonexists $FSSNAP
173d583b39bSJohn Wren Kennedy			fi
174d583b39bSJohn Wren Kennedy			if [[ $opt == *R* ]]; then
175d583b39bSJohn Wren Kennedy				check_dataset datasetexists $VOLCLONE
176d583b39bSJohn Wren Kennedy				check_dataset datasetnonexists $FSCLONE
177d583b39bSJohn Wren Kennedy			fi
178d583b39bSJohn Wren Kennedy			;;
179d583b39bSJohn Wren Kennedy		$VOL)	check_dataset datasetexists $CTR $FS $FSSNAP
180d583b39bSJohn Wren Kennedy			check_dataset datasetnonexists $VOL $VOLSNAP
181d583b39bSJohn Wren Kennedy			if [[ $opt == *R* ]]; then
182d583b39bSJohn Wren Kennedy				check_dataset datasetexists $FSCLONE
183d583b39bSJohn Wren Kennedy				check_dataset datasetnonexists $VOLCLONE
184d583b39bSJohn Wren Kennedy			fi
185d583b39bSJohn Wren Kennedy			;;
186d583b39bSJohn Wren Kennedy		$FSSNAP)
187d583b39bSJohn Wren Kennedy			check_dataset datasetexists $CTR $FS $VOL $VOLSNAP
188d583b39bSJohn Wren Kennedy			check_dataset datasetnonexists $FSSNAP
189d583b39bSJohn Wren Kennedy			if [[ $opt == *R* ]]; then
190d583b39bSJohn Wren Kennedy				check_dataset datasetexists $VOLCLONE
191d583b39bSJohn Wren Kennedy				check_dataset datasetnonexists $FSCLONE
192d583b39bSJohn Wren Kennedy			fi
193d583b39bSJohn Wren Kennedy			;;
194d583b39bSJohn Wren Kennedy		$VOLSNAP)
195d583b39bSJohn Wren Kennedy			check_dataset datasetexists $CTR $FS $VOL $FSSNAP
196d583b39bSJohn Wren Kennedy			check_dataset datasetnonexists $VOLSNAP
197d583b39bSJohn Wren Kennedy			if [[ $opt == *R* ]]; then
198d583b39bSJohn Wren Kennedy				check_dataset datasetexists $FSCLONE
199d583b39bSJohn Wren Kennedy				check_dataset datasetnonexists $VOLCLONE
200d583b39bSJohn Wren Kennedy			fi
201d583b39bSJohn Wren Kennedy			;;
202d583b39bSJohn Wren Kennedy	esac
203d583b39bSJohn Wren Kennedy
204*1d32ba66SJohn Wren Kennedy	log_note "'zfs destroy $opt $dtst' passed."
205d583b39bSJohn Wren Kennedy}
206d583b39bSJohn Wren Kennedy
207d583b39bSJohn Wren Kennedylog_assert "'zfs destroy -r|-R|-f|-rf|-Rf <fs|ctr|vol|snap>' should " \
208d583b39bSJohn Wren Kennedy	"recursively destroy all children."
209d583b39bSJohn Wren Kennedylog_onexit cleanup_testenv
210d583b39bSJohn Wren Kennedy
211d583b39bSJohn Wren Kennedytypeset dtst=""
212d583b39bSJohn Wren Kennedytypeset opt=""
213d583b39bSJohn Wren Kennedytypeset pidlist=""
214d583b39bSJohn Wren Kennedyfor dtst in $CTR $FS $VOL $FSSNAP $VOLSNAP; do
215d583b39bSJohn Wren Kennedy	for opt in "-r" "-R" "-f" "-rf" "-Rf"; do
216*1d32ba66SJohn Wren Kennedy		log_note "Starting test: zfs destroy $opt $dtst"
217d583b39bSJohn Wren Kennedy		test_n_check $opt $dtst
218d583b39bSJohn Wren Kennedy	done
219d583b39bSJohn Wren Kennedydone
220d583b39bSJohn Wren Kennedy
221d583b39bSJohn Wren Kennedylog_pass "'zfs destroy -r|-R|-f|-rf|-Rf <fs|ctr|vol|snap>' passed."
222