aboutsummaryrefslogtreecommitdiff
path: root/tests/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_016_pos.ksh
blob: 1e129ddd3bc9c5aff9821ec6ea6d7f5decb41237 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
#!/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"