aboutsummaryrefslogtreecommitdiff
path: root/tests/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_common.kshlib
diff options
context:
space:
mode:
Diffstat (limited to 'tests/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_common.kshlib')
-rw-r--r--tests/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_common.kshlib174
1 files changed, 174 insertions, 0 deletions
diff --git a/tests/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_common.kshlib b/tests/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_common.kshlib
new file mode 100644
index 000000000000..096c18f069ff
--- /dev/null
+++ b/tests/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_common.kshlib
@@ -0,0 +1,174 @@
+#
+# 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 2007 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2012, 2018 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg
+
+#
+# Create or recover a set of test environment which include ctr, vol, fs,
+# snap & clone. It looks like the following.
+#
+# pool
+# |ctr
+# | |fs
+# | | |fssnap
+# | |vol
+# | |volsnap
+# |fsclone
+# |volclone
+#
+# $1 indicate which dependent dataset need be created. Such as 'snap', 'clone'.
+#
+function setup_testenv #[dtst]
+{
+ typeset dtst=$1
+
+ if ! datasetexists $CTR; then
+ log_must zfs create $CTR
+ fi
+ if ! datasetexists $FS; then
+ log_must zfs create $FS
+ fi
+ # Volume test is only available on global zone
+ if ! datasetexists $VOL && is_global_zone; then
+ log_must zfs create -V $VOLSIZE $VOL
+ block_device_wait
+
+ log_must new_fs $ZVOL_DEVDIR/$VOL
+
+ if [[ ! -d $TESTDIR1 ]]; then
+ log_must mkdir $TESTDIR1
+ fi
+ log_must mount $ZVOL_DEVDIR/$VOL $TESTDIR1
+ fi
+
+ if [[ $dtst == snap || $dtst == clone ]]; then
+ if ! datasetexists $FSSNAP; then
+ log_must zfs snapshot $FSSNAP
+ fi
+ if ! datasetexists $VOLSNAP && is_global_zone; then
+ log_must zfs snapshot $VOLSNAP
+ fi
+ fi
+
+ if [[ $dtst == clone ]]; then
+ if ! datasetexists $FSCLONE; then
+ log_must zfs clone $FSSNAP $FSCLONE
+ fi
+ if ! datasetexists $VOLCLONE && is_global_zone; then
+ log_must zfs clone $VOLSNAP $VOLCLONE
+ block_device_wait
+ fi
+ fi
+}
+
+# Clean up the testing environment
+#
+function cleanup_testenv
+{
+ if is_global_zone && ismounted "$TESTDIR1" "$NEWFS_DEFAULT_FS" ; then
+ log_must umount -f $TESTDIR1
+ fi
+ if [[ -d $TESTDIR1 ]]; then
+ log_must rm -rf $TESTDIR1
+ fi
+
+ pkill mkbusy
+
+ if datasetexists $CTR; then
+ log_must zfs destroy -Rf $CTR
+ fi
+}
+
+#
+# Delete volume and related datasets from list, if the test cases was
+# running in local zone. Then check them are existed or non-exists.
+#
+# $1 function name
+# $2-n datasets name
+#
+function check_dataset
+{
+ typeset funname=$1
+ typeset newlist=""
+ typeset dtst
+ shift
+
+ for dtst in "$@"; do
+ # Volume and related stuff are unavailable in local zone
+ if ! is_global_zone; then
+ if [[ $dtst == $VOL || $dtst == $VOLSNAP || \
+ $dtst == $VOLCLONE ]]
+ then
+ continue
+ fi
+ fi
+ newlist="$newlist $dtst"
+ done
+
+ if (( ${#newlist} != 0 )); then
+ # Run each item in $newlist individually so on failure, the
+ # problematic dataset is listed in the logs.
+ for i in $newlist; do
+ log_must $funname $i
+ done
+ fi
+}
+
+# Use zdb to see if a livelist exists for a given clone
+# $1 clone name
+function check_livelist_exists
+{
+ zdb -vvvvv $TESTPOOL/$1 | grep "Livelist" || \
+ log_fail "zdb could not find Livelist"
+}
+
+# Check that a livelist has been removed, waiting for deferred destroy entries
+# to be cleared from zdb.
+function check_livelist_gone
+{
+ log_must zpool wait -t free $TESTPOOL
+ zpool sync
+ zdb -vvvvv $TESTPOOL | grep "Livelist" && \
+ log_fail "zdb found Livelist after the clone is deleted."
+}
+
+# Create a clone in the testpool based on $TESTFS@snap. Verify that the clone
+# was created and that it includes a livelist
+# $1 fs name
+# $2 snap name
+# $3 clone name
+function clone_dataset
+{
+ log_must zfs clone $TESTPOOL/$1@$2 $TESTPOOL/$3
+ datasetexists $TESTPOOL/$3 || \
+ log_fail "zfs clone $TESTPOOL/$3 fail."
+ check_livelist_exists $3
+}