diff options
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.kshlib | 174 |
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 +} |