xref: /illumos-gate/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_016_pos.ksh (revision 5f82aa32fbc5dc2c59bca6ff315f44a4c4c9ea86)
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