# !/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 arguements" 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 begining 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 destory 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"