diff options
Diffstat (limited to 'tests/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_001_pos.ksh')
-rwxr-xr-x | tests/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_001_pos.ksh | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/tests/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_001_pos.ksh b/tests/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_001_pos.ksh new file mode 100755 index 000000000000..4aef51e0aedb --- /dev/null +++ b/tests/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_001_pos.ksh @@ -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." |