diff usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_001_pos.ksh @ 13899:0bcf78798346

3311 Want a test framework for arbitrary OS unit tests 3312 Add a testrunner package for OS unit tests 3313 Add a testrunner package to convert ZFS tests from STF Reviewed by: Matt Ahrens <matthew.ahrens@delphix.com> Reviewed by: Will Guyette <will.guyette@delphix.com> Reviewed by: Dan Kimmel <dan.kimmel@delphix.com> Reviewed by: Adam Leventhal <ahl@delphix.com> Reviewed by: Henrik Mattson <henrik.mattson@delphix.com> Reviewed by: Sonu Pillai <sonu.pillai@delphix.com> Reviewed by: Christopher Siden <chris.siden@delphix.com> Reviewed by: George Wilson <george.wilson@delphix.com> Reviewed by: Richard Lowe <richlowe@richlowe.net> Approved by: Richard Lowe <richlowe@richlowe.net>
author John Wren Kennedy <john.kennedy@delphix.com>
date Wed, 05 Dec 2012 22:04:50 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_001_pos.ksh	Wed Dec 05 22:04:50 2012 -0500
@@ -0,0 +1,221 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2012 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg
+. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy_common.kshlib
+
+#
+# DESCRIPTION:
+#	'zfs destroy -r|-rf|-R|-Rf <fs|ctr|vol|snap>' should recursively destroy
+#	all children and clones based on options.
+#
+# STRATEGY:
+#	1. Create test environment according to options. There are three test
+#	models can be created. Only ctr, fs & vol; with snap; with clone.
+#	2. According to option, make the dataset busy or not.
+#	3. Run 'zfs destroy [-rRf] <dataset>'
+#	4. According to dataset and option, check if get the expected results.
+#
+
+verify_runnable "both"
+
+#
+# According to parameters, 1st, create suitable testing environment. 2nd,
+# run 'zfs destroy $opt <dataset>'. 3rd, check the system status.
+#
+# $1 option of 'zfs destroy'
+# $2 dataset will be destroied.
+#
+function test_n_check
+{
+	typeset opt=$1
+	typeset dtst=$2
+
+	if ! is_global_zone ; then
+		if [[ $dtst == $VOL || $dtst == $VOLSNAP ]]; then
+			log_note "UNSUPPORTED: Volume are unavailable in LZ."
+			return
+		fi
+	fi
+
+	# '-f' has no effect on non-filesystems
+	if [[ $opt == -f ]]; then
+		if [[ $dtst != $FS ]]; then
+			log_note "UNSUPPORTED: '-f ' is only available for " \
+			    "leaf FS."
+			return
+		fi
+	fi
+
+	# Clean the test environment and make it clear.
+	if datasetexists $CTR; then
+		log_must $ZFS destroy -Rf $CTR
+	fi
+
+	# According to option create test compatible environment.
+	case $opt in
+		-r|-rf) setup_testenv snap ;;
+		-R|-Rf) setup_testenv clone ;;
+		-f)	setup_testenv ;;
+		*)	log_fail "Incorrect option: '$opt'." ;;
+	esac
+
+	#
+	# According to different dataset type, create busy condition when try to
+	# destroy this dataset.
+	#
+	typeset mpt_dir
+	case $dtst in
+		$CTR|$FS)
+			if [[ $opt == *f* ]]; then
+				mpt_dir=$(get_prop mountpoint $FS)
+				pidlist="$pidlist $($MKBUSY \
+				    $mpt_dir/$TESTFILE0)"
+				log_note "$MKBUSY $mpt_dir/$TESTFILE0 " \
+				    "(pidlist: $pidlist)"
+				[[ -z $pidlist ]] && \
+				    log_fail "Failure from $MKBUSY"
+				log_mustnot $ZFS destroy -rR $dtst
+			fi
+			;;
+		$VOL)
+			if [[ $opt == *f* ]]; then
+				pidlist="$pidlist $($MKBUSY \
+				    $TESTDIR1/$TESTFILE0)"
+				log_note "$MKBUSY $TESTDIR1/$TESTFILE0 " \
+				    "(pidlist: $pidlist)"
+				[[ -z $pidlist ]] && \
+				    log_fail "Failure from $MKBUSY"
+				log_mustnot $ZFS destroy -rR $dtst
+			fi
+			;;
+		$VOLSNAP)
+			if [[ $opt == *f* ]]; then
+				pidlist="$pidlist $($MKBUSY \
+				    $TESTDIR1/$TESTFILE0)"
+				log_note "$MKBUSY $TESTDIR1/$TESTFILE0 " \
+				    "(pidlist: $pidlist)"
+				[[ -z $pidlist ]] && \
+				    log_fail "Failure from $MKBUSY"
+				log_must $ZFS destroy -rR $dtst
+				log_must $ZFS snapshot $dtst
+			fi
+			;;
+		$FSSNAP)
+			if [[ $opt == *f* ]]; then
+				mpt_dir=$(snapshot_mountpoint $dtst)
+				pidlist="$pidlist $($MKBUSY $mpt_dir)"
+				log_note "$MKBUSY $mpt_dir (pidlist: $pidlist)"
+				[[ -z $pidlist ]] && \
+				    log_fail "Failure from $MKBUSY"
+				log_must $ZFS destroy -rR $dtst
+				log_must $ZFS snapshot $dtst
+			fi
+			;;
+		*)	log_fail "Unsupported dataset: '$dtst'."
+	esac
+
+	# Firstly, umount ufs filesystem which was created by zfs volume.
+	if is_global_zone; then
+		log_must $UMOUNT -f $TESTDIR1
+	fi
+
+	# Invoke 'zfs destroy [-rRf] <dataset>'
+	log_must $ZFS destroy $opt $dtst
+
+	# Kill any lingering instances of mkbusy, and clear the list.
+	[[ -z $pidlist ]] || log_must $KILL -TERM $pidlist
+	pidlist=""
+	log_mustnot $PGREP -fl $MKBUSY
+
+	case $dtst in
+		$CTR)	check_dataset datasetnonexists \
+					$CTR $FS $VOL $FSSNAP $VOLSNAP
+			if [[ $opt == *R* ]]; then
+				check_dataset datasetnonexists \
+					$FSCLONE $VOLCLONE
+			fi
+			;;
+		$FS)	check_dataset datasetexists $CTR $VOL
+			check_dataset datasetnonexists $FS
+			if [[ $opt != -f ]]; then
+				check_dataset datasetexists $VOLSNAP
+				check_dataset datasetnonexists $FSSNAP
+			fi
+			if [[ $opt == *R* ]]; then
+				check_dataset datasetexists $VOLCLONE
+				check_dataset datasetnonexists $FSCLONE
+			fi
+			;;
+		$VOL)	check_dataset datasetexists $CTR $FS $FSSNAP
+			check_dataset datasetnonexists $VOL $VOLSNAP
+			if [[ $opt == *R* ]]; then
+				check_dataset datasetexists $FSCLONE
+				check_dataset datasetnonexists $VOLCLONE
+			fi
+			;;
+		$FSSNAP)
+			check_dataset datasetexists $CTR $FS $VOL $VOLSNAP
+			check_dataset datasetnonexists $FSSNAP
+			if [[ $opt == *R* ]]; then
+				check_dataset datasetexists $VOLCLONE
+				check_dataset datasetnonexists $FSCLONE
+			fi
+			;;
+		$VOLSNAP)
+			check_dataset datasetexists $CTR $FS $VOL $FSSNAP
+			check_dataset datasetnonexists $VOLSNAP
+			if [[ $opt == *R* ]]; then
+				check_dataset datasetexists $FSCLONE
+				check_dataset datasetnonexists $VOLCLONE
+			fi
+			;;
+	esac
+
+	log_note "'$ZFS destroy $opt $dtst' passed."
+}
+
+log_assert "'zfs destroy -r|-R|-f|-rf|-Rf <fs|ctr|vol|snap>' should " \
+	"recursively destroy all children."
+log_onexit cleanup_testenv
+
+typeset dtst=""
+typeset opt=""
+typeset pidlist=""
+for dtst in $CTR $FS $VOL $FSSNAP $VOLSNAP; do
+	for opt in "-r" "-R" "-f" "-rf" "-Rf"; do
+		log_note "Starting test: $ZFS destroy $opt $dtst"
+		test_n_check $opt $dtst
+	done
+done
+
+log_pass "'zfs destroy -r|-R|-f|-rf|-Rf <fs|ctr|vol|snap>' passed."