1# !/bin/ksh 2# 3# This file and its contents are supplied under the terms of the 4# Common Development and Distribution License ("CDDL"), version 1.0. 5# You may only use this file in accordance with the terms of version 6# 1.0 of the CDDL. 7# 8# A full copy of the text of the CDDL should have accompanied this 9# source. A copy of the CDDL is also available via the Internet at 10# http://www.illumos.org/license/CDDL. 11# 12 13# 14# Copyright (c) 2012, 2016 by Delphix. All rights reserved. 15# 16 17# DESCRIPTION 18# Verify zfs destroy test for range of snapshots by giving a list 19# of valid and invalid arguments. 20 21# STRATEGY 22# 1. Create a list of valid and invalid arguments for range snapshot 23# destroy. 24# 2. Set up a filesystem and a volume with multiple snapshots 25# 3. Run zfs destroy for all the arguments and verify existence of snapshots 26# 4. Verify the destroy for snapshots with clones and hold 27 28. $STF_SUITE/include/libtest.shlib 29 30function cleanup 31{ 32 datasetexists $TESTPOOL/$TESTFS1 && \ 33 log_must zfs destroy -R $TESTPOOL/$TESTFS1 34 datasetexists $TESTPOOL/$TESTVOL && \ 35 log_must zfs destroy -Rf $TESTPOOL/$TESTVOL 36} 37 38function setup_snapshots 39{ 40 for i in $snaps; do 41 datasetexists $TESTPOOL/$TESTFS1@snap$i && \ 42 log_must zfs destroy $TESTPOOL/$TESTFS1@snap$i 43 datasetexists $TESTPOOL/$TESTVOL@snap$i && \ 44 log_must zfs destroy $TESTPOOL/$TESTVOL@snap$i 45 log_must zfs snapshot $TESTPOOL/$TESTFS1@snap$i 46 log_must zfs snapshot $TESTPOOL/$TESTVOL@snap$i 47 done 48} 49 50function verify_snapshots 51{ 52 typeset snap_exists=${1:-0} 53 if [[ $snap_exists == 1 ]]; then 54 for i in $range; do 55 snapexists $TESTPOOL/$TESTFS1@snap$i || \ 56 log_fail "zfs destroy should not have destroyed" \ 57 "$TESTPOOL/$TESTFS1@snap$i" 58 snapexists $TESTPOOL/$TESTVOL@snap$i || \ 59 log_fail "zfs destroy should not have destroyed" \ 60 "$TESTPOOL/$TESTVOL@snap$i" 61 done 62 else 63 for i in $range; do 64 snapexists $TESTPOOL/$TESTFS1@snap$i && \ 65 log_fail "zfs destroy should have destroyed" \ 66 "$TESTPOOL/$TESTFS1@snap$i" 67 snapexists $TESTPOOL/$TESTVOL@snap$i && \ 68 log_fail "zfs destroy should have destroyed" \ 69 "$TESTPOOL/$TESTVOL@snap$i" 70 done 71 fi 72} 73 74invalid_args="@snap0%snap5 @snap1%snap6 @snap0%snap6 @snap5%snap1 \ 75 @snap1%$TESTPOOL/$TESTFS1@snap5 @snap1%%snap5 @snap1%@snap5 \ 76 @@snap1%snap5 snap1%snap5 snap1%snap3%snap5" 77valid_args="@snap1%snap5 @%" 78log_assert "zfs destroy deletes ranges of snapshots" 79log_onexit cleanup 80 81log_must zfs create $TESTPOOL/$TESTFS1 82log_must zfs create -V $VOLSIZE $TESTPOOL/$TESTVOL 83snaps="1 2 3 4 5" 84log_note "Verify the valid arguments" 85range="1 2 3 4 5" 86for args in $valid_args; do 87 setup_snapshots 88 log_must zfs destroy $TESTPOOL/$TESTFS1$args 89 log_must zfs destroy $TESTPOOL/$TESTVOL$args 90 verify_snapshots 91done 92 93log_note "Verify invalid arguements" 94setup_snapshots 95for args in $invalid_args; do 96 log_mustnot zfs destroy $TESTPOOL/$TESTFS1$args 97 log_mustnot zfs destroy $TESTPOOL/$TESTVOL$args 98 log_must verify_snapshots 1 99done 100 101log_note "Destroy the begining range" 102 103log_must zfs destroy $TESTPOOL/$TESTFS1@%snap3 104log_must zfs destroy $TESTPOOL/$TESTVOL@%snap3 105range="1 2 3" 106verify_snapshots 107range="4 5" 108verify_snapshots 1 109 110setup_snapshots 111log_note "Destroy the mid range" 112log_must zfs destroy $TESTPOOL/$TESTFS1@snap2%snap4 113log_must zfs destroy $TESTPOOL/$TESTVOL@snap2%snap4 114range="2 3 4" 115verify_snapshots 116log_must zfs destroy $TESTPOOL/$TESTFS1@snap1%snap5 117log_must zfs destroy $TESTPOOL/$TESTVOL@snap1%snap5 118range="1 5" 119verify_snapshots 120 121setup_snapshots 122log_note "Destroy the end range" 123log_must zfs destroy $TESTPOOL/$TESTFS1@snap3% 124log_must zfs destroy $TESTPOOL/$TESTVOL@snap3% 125range="1 2" 126verify_snapshots 1 127range="3 4 5" 128verify_snapshots 129 130setup_snapshots 131log_note "Destroy a simple list" 132log_must zfs destroy $TESTPOOL/$TESTFS1@snap2,snap4 133log_must zfs destroy $TESTPOOL/$TESTVOL@snap2,snap4 134range="2 4" 135verify_snapshots 136range="1 3 5" 137verify_snapshots 1 138 139setup_snapshots 140log_note "Destroy a list and range together" 141log_must zfs destroy $TESTPOOL/$TESTFS1@snap1%snap3,snap5 142log_must zfs destroy $TESTPOOL/$TESTVOL@snap1%snap3,snap5 143range="1 2 3 5" 144verify_snapshots 145range=4 146verify_snapshots 1 147 148snaps="1 2 3 5 6 7 8 9 10" 149setup_snapshots 150log_note "Destroy a list of ranges" 151log_must zfs destroy $TESTPOOL/$TESTFS1@snap1%snap3,snap5 152log_must zfs destroy $TESTPOOL/$TESTVOL@snap1%snap3,snap5 153range="1 2 3 5" 154verify_snapshots 155range=4 156verify_snapshots 1 157 158snaps="1 2 3 4 5" 159setup_snapshots 160log_note "Snapshot destory with hold" 161range="1 2 3 4 5" 162for i in 1 2 3 4 5; do 163 log_must zfs hold keep $TESTPOOL/$TESTFS1@snap$i 164 log_must zfs hold keep $TESTPOOL/$TESTVOL@snap$i 165done 166log_mustnot zfs destroy $TESTPOOL/$TESTFS1@snap1%snap5 167log_mustnot zfs destroy $TESTPOOL/$TESTVOL@snap1%snap5 168verify_snapshots 1 169for i in 1 2 3 4 5; do 170 log_must zfs release keep $TESTPOOL/$TESTFS1@snap$i 171 log_must zfs release keep $TESTPOOL/$TESTVOL@snap$i 172done 173log_must zfs destroy $TESTPOOL/$TESTFS1@snap1%snap5 174log_must zfs destroy $TESTPOOL/$TESTVOL@snap1%snap5 175verify_snapshots 176 177log_note "Range destroy for snapshots having clones" 178setup_snapshots 179for i in 1 2 3 4 5; do 180 log_must zfs clone $TESTPOOL/$TESTFS1@snap$i $TESTPOOL/$TESTFS1/clone$i 181done 182log_must zfs destroy -R $TESTPOOL/$TESTFS1@snap1%snap5 183log_must zfs destroy $TESTPOOL/$TESTVOL@snap1%snap5 184verify_snapshots 185 186log_pass "'zfs destroy' successfully destroys ranges of snapshots" 187