]> git.proxmox.com Git - mirror_zfs-debian.git/blame - tests/zfs-tests/tests/functional/cli_root/zfs_receive/receive-o-x_props_override.ksh
New upstream version 0.7.11
[mirror_zfs-debian.git] / tests / zfs-tests / tests / functional / cli_root / zfs_receive / receive-o-x_props_override.ksh
CommitLineData
cae5b340
AX
1#!/bin/ksh -p
2#
3# CDDL HEADER START
4#
5# This file and its contents are supplied under the terms of the
6# Common Development and Distribution License ("CDDL"), version 1.0.
7# You may only use this file in accordance with the terms of version
8# 1.0 of the CDDL.
9#
10# A full copy of the text of the CDDL should have accompanied this
11# source. A copy of the CDDL is also available via the Internet at
12# http://www.illumos.org/license/CDDL.
13#
14# CDDL HEADER END
15#
16
17#
18# Copyright 2017, loli10K <ezomori.nozomu@gmail.com>. All rights reserved.
19#
20
21. $STF_SUITE/include/libtest.shlib
22. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib
23
24#
25# DESCRIPTION:
26# Verify ZFS property override (-o) and exclude (-x) options work when
27# receiving a send stream
28#
29# STRATEGY:
30# 1. Create a filesystem with children.
31# 2. Snapshot the filesystems.
32# 3. Create various send streams (full, incremental, replication) and verify
33# we can both override and exclude native and user properties.
34#
35
36verify_runnable "both"
37
38function cleanup
39{
40 log_must rm -f $streamfile_full
41 log_must rm -f $streamfile_incr
42 log_must rm -f $streamfile_repl
43 log_must rm -f $streamfile_trun
44 log_must zfs destroy -r -f $orig
45 log_must zfs destroy -r -f $dest
46}
47
48#
49# Verify property $2 is set from source $4 on dataset $1 and has value $3.
50#
51# $1 checked dataset
52# $2 user property
53# $3 property value
54# $4 source
55#
56function check_prop_source
57{
58 typeset dataset="$1"
59 typeset prop="$2"
60 typeset value="$3"
61 typeset source="$4"
62 typeset chk_value=$(get_prop "$prop" "$dataset")
63 typeset chk_source=$(get_source "$prop" "$dataset")
64
65 if [[ "$chk_value" != "$value" || "$chk_source" != "$4" ]]
66 then
67 return 1
68 else
69 return 0
70 fi
71}
72
73#
74# Verify target dataset $1 inherit property $2 from dataset $3.
75#
76# $1 checked dataset
77# $2 property
78# $3 inherited dataset
79#
80function check_prop_inherit
81{
82 typeset checked_dtst="$1"
83 typeset prop="$2"
84 typeset inherited_dtst="$3"
85 typeset inherited_value=$(get_prop "$prop" "$inherited_dtst")
86 typeset value=$(get_prop "$prop" "$checked_dtst")
87 typeset source=$(get_source "$prop" "$checked_dtst")
88
89 if [[ "$value" != "$inherited_value" || \
90 "$source" != "inherited from $inherited_dtst" ]]
91 then
92 return 1
93 else
94 return 0
95 fi
96}
97
98#
99# Verify property $2 received value on dataset $1 has value $3
100#
101# $1 checked dataset
102# $2 property name
103# $3 checked value
104#
105function check_prop_received
106{
107 typeset dataset="$1"
108 typeset prop="$2"
109 typeset value="$3"
110
111 received=$(zfs get -H -o received "$prop" "$dataset")
112 if (($? != 0)); then
113 log_fail "Unable to get $prop received value for dataset " \
114 "$dataset"
115 fi
116 if [[ "$received" == "$value" ]]
117 then
118 return 0
119 else
120 return 1
121 fi
122}
123
124#
125# Verify user property $2 is not set on dataset $1
126#
127# $1 checked dataset
128# $2 property name
129#
130function check_prop_missing
131{
132 typeset dataset="$1"
133 typeset prop="$2"
134
135 value=$(zfs get -H -o value "$prop" "$dataset")
136 if (($? != 0)); then
137 log_fail "Unable to get $prop value for dataset $dataset"
138 fi
139 if [[ "-" == "$value" ]]
140 then
141 return 0
142 else
143 return 1
144 fi
145}
146
147log_assert "ZFS receive property override and exclude options work as expected."
148log_onexit cleanup
149
150orig=$TESTPOOL/$TESTFS1
151origsub=$orig/sub
152dest=$TESTPOOL/$TESTFS2
153destsub=$dest/sub
154typeset userprop=$(valid_user_property 8)
155typeset userval=$(user_property_value 8)
156typeset streamfile_full=$TESTDIR/streamfile_full.$$
157typeset streamfile_incr=$TESTDIR/streamfile_incr.$$
158typeset streamfile_repl=$TESTDIR/streamfile_repl.$$
159typeset streamfile_trun=$TESTDIR/streamfile_trun.$$
160
161#
162# 3.1 Verify we can't specify the same property in multiple -o or -x options
163# or an invalid value was specified.
164#
165# Create a full send stream
166log_must zfs create $orig
167log_must zfs snapshot $orig@snap1
168log_must eval "zfs send $orig@snap1 > $streamfile_full"
169# Verify we reject invalid options
170log_mustnot eval "zfs recv $dest -o atime < $streamfile_full"
171log_mustnot eval "zfs recv $dest -x atime=off < $streamfile_full"
172log_mustnot eval "zfs recv $dest -o atime=off -x atime < $streamfile_full"
173log_mustnot eval "zfs recv $dest -o atime=off -o atime=on < $streamfile_full"
174log_mustnot eval "zfs recv $dest -x atime -x atime < $streamfile_full"
175log_mustnot eval "zfs recv $dest -o version=1 < $streamfile_full"
176log_mustnot eval "zfs recv $dest -x version < $streamfile_full"
177log_mustnot eval "zfs recv $dest -x normalization < $streamfile_full"
178# Verify we also reject invalid ZVOL options
179log_must zfs create -V 32K -s $orig/zvol
180log_must eval "zfs send $orig@snap1 > $streamfile_full"
181log_mustnot eval "zfs recv $dest -x volsize < $streamfile_full"
182log_mustnot eval "zfs recv $dest -o volsize=32K < $streamfile_full"
183# Cleanup
184block_device_wait
185log_must_busy zfs destroy -r -f $orig
186
187#
188# 3.2 Verify -o property=value works on streams without properties.
189#
190# Create a full send stream
191log_must zfs create $orig
192log_must zfs snapshot $orig@snap1
193log_must eval "zfs send $orig@snap1 > $streamfile_full"
194# Receive the full stream, override some properties
195log_must eval "zfs recv -o compression=on -o '$userprop:dest'='$userval' "\
196 "$dest < $streamfile_full"
197log_must eval "check_prop_source $dest compression on local"
198log_must eval "check_prop_source $dest '$userprop:dest' '$userval' local"
199# Cleanup
200log_must zfs destroy -r -f $orig
201log_must zfs destroy -r -f $dest
202
203#
204# 3.3 Verify -o property=value and -x work on both native and user properties
205# for an incremental replication send stream.
206#
207# Create a dataset tree and receive it
208log_must zfs create $orig
209log_must zfs create $origsub
210log_must zfs snapshot -r $orig@snap1
211log_must eval "zfs send -R $orig@snap1 > $streamfile_repl"
212log_must eval "zfs recv $dest < $streamfile_repl"
213# Fill the datasets with properties and create an incremental replication stream
214log_must zfs snapshot -r $orig@snap2
a07c8b41 215log_must zfs snapshot -r $orig@snap3
cae5b340
AX
216log_must eval "zfs set copies=2 $orig"
217log_must eval "zfs set '$userprop:orig'='$userval' $orig"
218log_must eval "zfs set '$userprop:orig'='$userval' $origsub"
219log_must eval "zfs set '$userprop:snap'='$userval' $orig@snap1"
a07c8b41
MZ
220log_must eval "zfs set '$userprop:snap'='$userval' $origsub@snap3"
221log_must eval "zfs send -R -I $orig@snap1 $orig@snap3 > $streamfile_incr"
cae5b340
AX
222# Sets various combination of override and exclude options
223log_must eval "zfs recv -F -o atime=off -o '$userprop:dest2'='$userval' "\
a07c8b41
MZ
224 "-o quota=123456789 -o checksum=sha512 -x compression "\
225 "-x '$userprop:orig' -x '$userprop:snap3' $dest < $streamfile_incr"
cae5b340
AX
226# Verify we can correctly override and exclude properties
227log_must eval "check_prop_source $dest copies 2 received"
228log_must eval "check_prop_source $dest atime off local"
229log_must eval "check_prop_source $dest '$userprop:dest2' '$userval' local"
230log_must eval "check_prop_source $dest quota 123456789 local"
a07c8b41 231log_must eval "check_prop_source $dest checksum sha512 local"
cae5b340
AX
232log_must eval "check_prop_inherit $destsub copies $dest"
233log_must eval "check_prop_inherit $destsub atime $dest"
a07c8b41 234log_must eval "check_prop_inherit $destsub checksum $dest"
cae5b340
AX
235log_must eval "check_prop_inherit $destsub '$userprop:dest2' $dest"
236log_must eval "check_prop_source $destsub quota 0 default"
237log_must eval "check_prop_source $destsub compression off default"
238log_must eval "check_prop_missing $dest '$userprop:orig'"
239log_must eval "check_prop_missing $destsub '$userprop:orig'"
240log_must eval "check_prop_source " \
241 "$dest@snap1 '$userprop:snap' '$userval' received"
242log_must eval "check_prop_source " \
a07c8b41
MZ
243 "$destsub@snap3 '$userprop:snap' '$userval' received"
244log_must eval "check_prop_missing $dest@snap3 '$userprop:snap3'"
245log_must eval "check_prop_missing $destsub@snap3 '$userprop:snap3'"
cae5b340
AX
246# Cleanup
247log_must zfs destroy -r -f $orig
248log_must zfs destroy -r -f $dest
249
250#
251# 3.4 Verify '-x property' does not remove existing local properties and a
252# modified sent property is received and updated to the new value but can
253# still be excluded.
254#
255# Create a dataset tree
256log_must zfs create $orig
257log_must zfs create $origsub
258log_must zfs snapshot -r $orig@snap1
259log_must eval "zfs set copies=2 $orig"
260log_must eval "zfs set '$userprop:orig'='oldval' $orig"
261log_must eval "zfs set '$userprop:orig'='oldsubval' $origsub"
262log_must eval "zfs send -R $orig@snap1 > $streamfile_repl"
263log_must eval "zfs receive $dest < $streamfile_repl"
264log_must eval "check_prop_source $dest copies 2 received"
265log_must eval "check_prop_inherit $destsub copies $dest"
266log_must eval "check_prop_source $dest '$userprop:orig' 'oldval' received"
267log_must eval "check_prop_source $destsub '$userprop:orig' 'oldsubval' received"
268# Set new custom properties on both source and destination
269log_must eval "zfs set copies=3 $orig"
270log_must eval "zfs set '$userprop:orig'='newval' $orig"
271log_must eval "zfs set '$userprop:orig'='newsubval' $origsub"
272log_must eval "zfs set compression=gzip $dest"
273log_must eval "zfs set '$userprop:dest'='localval' $dest"
274# Receive the new stream, verify we preserve locally set properties
275log_must zfs snapshot -r $orig@snap2
a07c8b41
MZ
276log_must zfs snapshot -r $orig@snap3
277log_must eval "zfs send -R -I $orig@snap1 $orig@snap3 > $streamfile_incr"
cae5b340
AX
278log_must eval "zfs recv -F -x copies -x compression -x '$userprop:orig' " \
279 "-x '$userprop:dest' $dest < $streamfile_incr"
280log_must eval "check_prop_source $dest '$userprop:dest' 'localval' local"
281log_must eval "check_prop_received $dest '$userprop:orig' 'newval'"
282log_must eval "check_prop_received $destsub '$userprop:orig' 'newsubval'"
283log_must eval "check_prop_missing $dest '$userprop:orig'"
284log_must eval "check_prop_missing $destsub '$userprop:orig'"
285log_must eval "check_prop_source $dest copies 1 default"
286log_must eval "check_prop_received $dest copies 3"
287log_must eval "check_prop_source $destsub copies 1 default"
288log_must eval "check_prop_received $destsub copies '-'"
289log_must eval "check_prop_source $dest compression gzip local"
290log_must eval "check_prop_inherit $destsub compression $dest"
291# Cleanup
292log_must zfs destroy -r -f $orig
293log_must zfs destroy -r -f $dest
294
295#
296# 3.5 Verify we can exclude non-inheritable properties from a send stream
297#
298# Create a dataset tree and replication stream
299log_must zfs create $orig
300log_must zfs create $origsub
301log_must zfs snapshot -r $orig@snap1
302log_must eval "zfs set quota=123456789 $orig"
303log_must eval "zfs send -R $orig@snap1 > $streamfile_repl"
304# Receive the stream excluding non-inheritable properties
305log_must eval "zfs recv -F -x quota $dest < $streamfile_repl"
306log_must eval "check_prop_source $dest quota 0 default"
307log_must eval "check_prop_source $destsub quota 0 default"
308# Set some non-inheritable properties on the destination, verify we keep them
309log_must eval "zfs set quota=123456789 $dest"
310log_must eval "zfs set canmount=off $destsub"
311log_must zfs snapshot -r $orig@snap2
a07c8b41
MZ
312log_must zfs snapshot -r $orig@snap3
313log_must eval "zfs send -R -I $orig@snap1 $orig@snap3 > $streamfile_incr"
cae5b340
AX
314log_must eval "zfs recv -F -x quota -x canmount $dest < $streamfile_incr"
315log_must eval "check_prop_source $dest quota 123456789 local"
316log_must eval "check_prop_source $destsub quota 0 default"
317log_must eval "check_prop_source $destsub canmount off local"
318# Cleanup
319log_must zfs destroy -r -f $orig
320log_must zfs destroy -r -f $dest
321
322#
323# 3.6 Verify we correctly restore existing properties on a failed receive
324#
325# Receive a "clean" dataset tree
326log_must zfs create $orig
327log_must zfs create $origsub
328log_must zfs snapshot -r $orig@snap1
329log_must eval "zfs send -R $orig@snap1 > $streamfile_repl"
330log_must eval "zfs receive $dest < $streamfile_repl"
331# Set custom properties on the destination
332log_must eval "zfs set atime=off $dest"
333log_must eval "zfs set quota=123456789 $dest"
334log_must eval "zfs set '$userprop:orig'='$userval' $dest"
335log_must eval "zfs set '$userprop:origsub'='$userval' $destsub"
336# Create a truncated incremental replication stream
337mntpnt=$(get_prop mountpoint $orig)
338log_must eval "dd if=/dev/urandom of=$mntpnt/file bs=1024k count=10"
339log_must zfs snapshot -r $orig@snap2
a07c8b41
MZ
340log_must zfs snapshot -r $orig@snap3
341log_must eval "zfs send -R -I $orig@snap1 $orig@snap3 > $streamfile_incr"
cae5b340
AX
342log_must eval "dd if=$streamfile_incr of=$streamfile_trun bs=1024k count=9"
343# Receive the truncated stream, verify original properties are kept
344log_mustnot eval "zfs recv -F -o copies=3 -o quota=987654321 "\
345 "-o '$userprop:new'='badval' $dest < $streamfile_trun"
346log_must eval "check_prop_source $dest copies 1 default"
347log_must eval "check_prop_source $destsub copies 1 default"
348log_must eval "check_prop_source $dest atime off local"
349log_must eval "check_prop_inherit $destsub atime $dest"
350log_must eval "check_prop_source $dest quota 123456789 local"
351log_must eval "check_prop_source $destsub quota 0 default"
352log_must eval "check_prop_source $dest '$userprop:orig' '$userval' local"
353log_must eval "check_prop_inherit $destsub '$userprop:orig' $dest"
354log_must eval "check_prop_source $destsub '$userprop:origsub' '$userval' local"
355log_must eval "check_prop_missing $dest '$userprop:new'"
356# Cleanup
357log_must zfs destroy -r -f $orig
358log_must zfs destroy -r -f $dest
359
360#
361# 3.7 Verify we can't receive a send stream overriding or excluding properties
362# invalid for the dataset type unless the stream it's recursive, in which
363# case only the appropriate properties are set on the destination.
364#
365log_must zfs create -V 128K -s $orig
366log_must zfs snapshot $orig@snap1
367log_must eval "zfs send $orig@snap1 > $streamfile_full"
368log_mustnot eval "zfs receive -x atime $dest < $streamfile_full"
369log_mustnot eval "zfs receive -o atime=off $dest < $streamfile_full"
370log_must zfs destroy -r -f $orig
371log_must zfs create $orig
372log_must zfs create -V 128K -s $origsub
373log_must zfs snapshot -r $orig@snap1
374log_must eval "zfs send -R $orig@snap1 > $streamfile_repl"
375log_must eval "zfs receive -o atime=off $dest < $streamfile_repl"
376log_must eval "check_prop_source $dest type filesystem -"
377log_must eval "check_prop_source $dest atime off local"
378log_must eval "check_prop_source $destsub type volume -"
379log_must eval "check_prop_source $destsub atime - -"
047218e2
AX
380# Cleanup
381log_must zfs destroy -r -f $orig
382log_must zfs destroy -r -f $dest
383
384#
385# 3.8 Verify 'zfs recv -x|-o' works correctly when used in conjunction with -d
386# and -e options.
387#
388log_must zfs create -p $orig/1/2/3/4
389log_must eval "zfs set copies=2 $orig"
390log_must eval "zfs set atime=on $orig"
391log_must eval "zfs set '$userprop:orig'='oldval' $orig"
392log_must zfs snapshot -r $orig@snap1
393log_must eval "zfs send -R $orig/1/2@snap1 > $streamfile_repl"
394# Verify 'zfs recv -e'
395log_must zfs create $dest
396log_must eval "zfs receive -e -o copies=3 -x atime "\
397 "-o '$userprop:orig'='newval' $dest < $streamfile_repl"
398log_must datasetexists $dest/2/3/4
399log_must eval "check_prop_source $dest/2 copies 3 local"
400log_must eval "check_prop_inherit $dest/2/3/4 copies $dest/2"
401log_must eval "check_prop_source $dest/2/3/4 atime on default"
402log_must eval "check_prop_source $dest/2 '$userprop:orig' 'newval' local"
403log_must eval "check_prop_inherit $dest/2/3/4 '$userprop:orig' $dest/2"
404log_must zfs destroy -r -f $dest
405# Verify 'zfs recv -d'
406log_must zfs create $dest
407typeset fs="$(echo $orig | awk -F'/' '{print $NF}')"
408log_must eval "zfs receive -d -o copies=3 -x atime "\
409 "-o '$userprop:orig'='newval' $dest < $streamfile_repl"
410log_must datasetexists $dest/$fs/1/2/3/4
411log_must eval "check_prop_source $dest/$fs/1/2 copies 3 local"
412log_must eval "check_prop_inherit $dest/$fs/1/2/3/4 copies $dest/$fs/1/2"
413log_must eval "check_prop_source $dest/$fs/1/2/3/4 atime on default"
414log_must eval "check_prop_source $dest/$fs/1/2 '$userprop:orig' 'newval' local"
415log_must eval "check_prop_inherit $dest/$fs/1/2/3/4 '$userprop:orig' $dest/$fs/1/2"
cae5b340
AX
416# We don't need to cleanup here
417
418log_pass "ZFS receive property override and exclude options passed."