/tests/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_016_pos.ksh
Korn Shell | 186 lines | 143 code | 20 blank | 23 comment | 19 complexity | cdef2dbde655371092e893a0ba6978e9 MD5 | raw file
Possible License(s): Apache-2.0, MPL-2.0-no-copyleft-exception
- #!/bin/ksh
- #
- # This file and its contents are supplied under the terms of the
- # Common Development and Distribution License ("CDDL"), version 1.0.
- # You may only use this file in accordance with the terms of version
- # 1.0 of the CDDL.
- #
- # A full copy of the text of the CDDL should have accompanied this
- # source. A copy of the CDDL is also available via the Internet at
- # http://www.illumos.org/license/CDDL.
- #
- #
- # Copyright (c) 2012, 2016 by Delphix. All rights reserved.
- #
- # DESCRIPTION
- # Verify zfs destroy test for range of snapshots by giving a list
- # of valid and invalid arguments.
- # STRATEGY
- # 1. Create a list of valid and invalid arguments for range snapshot
- # destroy.
- # 2. Set up a filesystem and a volume with multiple snapshots
- # 3. Run zfs destroy for all the arguments and verify existence of snapshots
- # 4. Verify the destroy for snapshots with clones and hold
- . $STF_SUITE/include/libtest.shlib
- function cleanup
- {
- datasetexists $TESTPOOL/$TESTFS1 && \
- log_must zfs destroy -R $TESTPOOL/$TESTFS1
- datasetexists $TESTPOOL/$TESTVOL && \
- log_must zfs destroy -Rf $TESTPOOL/$TESTVOL
- }
- function setup_snapshots
- {
- for i in $snaps; do
- datasetexists $TESTPOOL/$TESTFS1@snap$i && \
- log_must zfs destroy $TESTPOOL/$TESTFS1@snap$i
- datasetexists $TESTPOOL/$TESTVOL@snap$i && \
- log_must zfs destroy $TESTPOOL/$TESTVOL@snap$i
- log_must zfs snapshot $TESTPOOL/$TESTFS1@snap$i
- log_must zfs snapshot $TESTPOOL/$TESTVOL@snap$i
- done
- }
- function verify_snapshots
- {
- typeset snap_exists=${1:-0}
- if [[ $snap_exists == 1 ]]; then
- for i in $range; do
- snapexists $TESTPOOL/$TESTFS1@snap$i || \
- log_fail "zfs destroy should not have destroyed" \
- "$TESTPOOL/$TESTFS1@snap$i"
- snapexists $TESTPOOL/$TESTVOL@snap$i || \
- log_fail "zfs destroy should not have destroyed" \
- "$TESTPOOL/$TESTVOL@snap$i"
- done
- else
- for i in $range; do
- snapexists $TESTPOOL/$TESTFS1@snap$i && \
- log_fail "zfs destroy should have destroyed" \
- "$TESTPOOL/$TESTFS1@snap$i"
- snapexists $TESTPOOL/$TESTVOL@snap$i && \
- log_fail "zfs destroy should have destroyed" \
- "$TESTPOOL/$TESTVOL@snap$i"
- done
- fi
- }
- invalid_args="@snap0%snap5 @snap1%snap6 @snap0%snap6 @snap5%snap1 \
- @snap1%$TESTPOOL/$TESTFS1@snap5 @snap1%%snap5 @snap1%@snap5 \
- @@snap1%snap5 snap1%snap5 snap1%snap3%snap5"
- valid_args="@snap1%snap5 @%"
- log_assert "zfs destroy deletes ranges of snapshots"
- log_onexit cleanup
- log_must zfs create $TESTPOOL/$TESTFS1
- log_must zfs create -V $VOLSIZE $TESTPOOL/$TESTVOL
- snaps="1 2 3 4 5"
- log_note "Verify the valid arguments"
- range="1 2 3 4 5"
- for args in $valid_args; do
- setup_snapshots
- log_must zfs destroy $TESTPOOL/$TESTFS1$args
- log_must zfs destroy $TESTPOOL/$TESTVOL$args
- verify_snapshots
- done
- log_note "Verify invalid arguments"
- setup_snapshots
- for args in $invalid_args; do
- log_mustnot zfs destroy $TESTPOOL/$TESTFS1$args
- log_mustnot zfs destroy $TESTPOOL/$TESTVOL$args
- log_must verify_snapshots 1
- done
- log_note "Destroy the beginning range"
- log_must zfs destroy $TESTPOOL/$TESTFS1@%snap3
- log_must zfs destroy $TESTPOOL/$TESTVOL@%snap3
- range="1 2 3"
- verify_snapshots
- range="4 5"
- verify_snapshots 1
- setup_snapshots
- log_note "Destroy the mid range"
- log_must zfs destroy $TESTPOOL/$TESTFS1@snap2%snap4
- log_must zfs destroy $TESTPOOL/$TESTVOL@snap2%snap4
- range="2 3 4"
- verify_snapshots
- log_must zfs destroy $TESTPOOL/$TESTFS1@snap1%snap5
- log_must zfs destroy $TESTPOOL/$TESTVOL@snap1%snap5
- range="1 5"
- verify_snapshots
- setup_snapshots
- log_note "Destroy the end range"
- log_must zfs destroy $TESTPOOL/$TESTFS1@snap3%
- log_must zfs destroy $TESTPOOL/$TESTVOL@snap3%
- range="1 2"
- verify_snapshots 1
- range="3 4 5"
- verify_snapshots
- setup_snapshots
- log_note "Destroy a simple list"
- log_must zfs destroy $TESTPOOL/$TESTFS1@snap2,snap4
- log_must zfs destroy $TESTPOOL/$TESTVOL@snap2,snap4
- range="2 4"
- verify_snapshots
- range="1 3 5"
- verify_snapshots 1
- setup_snapshots
- log_note "Destroy a list and range together"
- log_must zfs destroy $TESTPOOL/$TESTFS1@snap1%snap3,snap5
- log_must zfs destroy $TESTPOOL/$TESTVOL@snap1%snap3,snap5
- range="1 2 3 5"
- verify_snapshots
- range=4
- verify_snapshots 1
- snaps="1 2 3 5 6 7 8 9 10"
- setup_snapshots
- log_note "Destroy a list of ranges"
- log_must zfs destroy $TESTPOOL/$TESTFS1@snap1%snap3,snap5
- log_must zfs destroy $TESTPOOL/$TESTVOL@snap1%snap3,snap5
- range="1 2 3 5"
- verify_snapshots
- range=4
- verify_snapshots 1
- snaps="1 2 3 4 5"
- setup_snapshots
- log_note "Snapshot destroy with hold"
- range="1 2 3 4 5"
- for i in 1 2 3 4 5; do
- log_must zfs hold keep $TESTPOOL/$TESTFS1@snap$i
- log_must zfs hold keep $TESTPOOL/$TESTVOL@snap$i
- done
- log_mustnot zfs destroy $TESTPOOL/$TESTFS1@snap1%snap5
- log_mustnot zfs destroy $TESTPOOL/$TESTVOL@snap1%snap5
- verify_snapshots 1
- for i in 1 2 3 4 5; do
- log_must zfs release keep $TESTPOOL/$TESTFS1@snap$i
- log_must zfs release keep $TESTPOOL/$TESTVOL@snap$i
- done
- log_must zfs destroy $TESTPOOL/$TESTFS1@snap1%snap5
- log_must zfs destroy $TESTPOOL/$TESTVOL@snap1%snap5
- verify_snapshots
- log_note "Range destroy for snapshots having clones"
- setup_snapshots
- for i in 1 2 3 4 5; do
- log_must zfs clone $TESTPOOL/$TESTFS1@snap$i $TESTPOOL/$TESTFS1/clone$i
- done
- log_must zfs destroy -R $TESTPOOL/$TESTFS1@snap1%snap5
- log_must zfs destroy $TESTPOOL/$TESTVOL@snap1%snap5
- verify_snapshots
- log_pass "'zfs destroy' successfully destroys ranges of snapshots"