]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tests/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_016_pos.ksh
Vendor import of openzfs master @ 184df27eef0abdc7ab2105b21257f753834b936b
[FreeBSD/FreeBSD.git] / tests / zfs-tests / tests / functional / cli_root / zfs_destroy / zfs_destroy_016_pos.ksh
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
30 function 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
38 function 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
50 function 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
74 invalid_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"
77 valid_args="@snap1%snap5 @%"
78 log_assert "zfs destroy deletes ranges of snapshots"
79 log_onexit cleanup
80
81 log_must zfs create $TESTPOOL/$TESTFS1
82 log_must zfs create -V $VOLSIZE $TESTPOOL/$TESTVOL
83 snaps="1 2 3 4 5"
84 log_note "Verify the valid arguments"
85 range="1 2 3 4 5"
86 for 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
91 done
92
93 log_note "Verify invalid arguments"
94 setup_snapshots
95 for 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
99 done
100
101 log_note "Destroy the beginning range"
102
103 log_must zfs destroy $TESTPOOL/$TESTFS1@%snap3
104 log_must zfs destroy $TESTPOOL/$TESTVOL@%snap3
105 range="1 2 3"
106 verify_snapshots
107 range="4 5"
108 verify_snapshots 1
109
110 setup_snapshots
111 log_note "Destroy the mid range"
112 log_must zfs destroy $TESTPOOL/$TESTFS1@snap2%snap4
113 log_must zfs destroy $TESTPOOL/$TESTVOL@snap2%snap4
114 range="2 3 4"
115 verify_snapshots
116 log_must zfs destroy $TESTPOOL/$TESTFS1@snap1%snap5
117 log_must zfs destroy $TESTPOOL/$TESTVOL@snap1%snap5
118 range="1 5"
119 verify_snapshots
120
121 setup_snapshots
122 log_note "Destroy the end range"
123 log_must zfs destroy $TESTPOOL/$TESTFS1@snap3%
124 log_must zfs destroy $TESTPOOL/$TESTVOL@snap3%
125 range="1 2"
126 verify_snapshots 1
127 range="3 4 5"
128 verify_snapshots
129
130 setup_snapshots
131 log_note "Destroy a simple list"
132 log_must zfs destroy $TESTPOOL/$TESTFS1@snap2,snap4
133 log_must zfs destroy $TESTPOOL/$TESTVOL@snap2,snap4
134 range="2 4"
135 verify_snapshots
136 range="1 3 5"
137 verify_snapshots 1
138
139 setup_snapshots
140 log_note "Destroy a list and range together"
141 log_must zfs destroy $TESTPOOL/$TESTFS1@snap1%snap3,snap5
142 log_must zfs destroy $TESTPOOL/$TESTVOL@snap1%snap3,snap5
143 range="1 2 3 5"
144 verify_snapshots
145 range=4
146 verify_snapshots 1
147
148 snaps="1 2 3 5 6 7 8 9 10"
149 setup_snapshots
150 log_note "Destroy a list of ranges"
151 log_must zfs destroy $TESTPOOL/$TESTFS1@snap1%snap3,snap5
152 log_must zfs destroy $TESTPOOL/$TESTVOL@snap1%snap3,snap5
153 range="1 2 3 5"
154 verify_snapshots
155 range=4
156 verify_snapshots 1
157
158 snaps="1 2 3 4 5"
159 setup_snapshots
160 log_note "Snapshot destroy with hold"
161 range="1 2 3 4 5"
162 for 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
165 done
166 log_mustnot zfs destroy $TESTPOOL/$TESTFS1@snap1%snap5
167 log_mustnot zfs destroy $TESTPOOL/$TESTVOL@snap1%snap5
168 verify_snapshots 1
169 for 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
172 done
173 log_must zfs destroy $TESTPOOL/$TESTFS1@snap1%snap5
174 log_must zfs destroy $TESTPOOL/$TESTVOL@snap1%snap5
175 verify_snapshots
176
177 log_note "Range destroy for snapshots having clones"
178 setup_snapshots
179 for i in 1 2 3 4 5; do
180         log_must zfs clone $TESTPOOL/$TESTFS1@snap$i $TESTPOOL/$TESTFS1/clone$i
181 done
182 log_must zfs destroy -R $TESTPOOL/$TESTFS1@snap1%snap5
183 log_must zfs destroy $TESTPOOL/$TESTVOL@snap1%snap5
184 verify_snapshots
185
186 log_pass "'zfs destroy' successfully destroys ranges of snapshots"