blob: 1e129ddd3bc9c5aff9821ec6ea6d7f5decb41237 [file] [log] [blame]
#!/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"