1*85723e5eSloli#!/bin/ksh -p 2*85723e5eSloli# 3*85723e5eSloli# CDDL HEADER START 4*85723e5eSloli# 5*85723e5eSloli# This file and its contents are supplied under the terms of the 6*85723e5eSloli# Common Development and Distribution License ("CDDL"), version 1.0. 7*85723e5eSloli# You may only use this file in accordance with the terms of version 8*85723e5eSloli# 1.0 of the CDDL. 9*85723e5eSloli# 10*85723e5eSloli# A full copy of the text of the CDDL should have accompanied this 11*85723e5eSloli# source. A copy of the CDDL is also available via the Internet at 12*85723e5eSloli# http://www.illumos.org/license/CDDL. 13*85723e5eSloli# 14*85723e5eSloli# CDDL HEADER END 15*85723e5eSloli# 16*85723e5eSloli 17*85723e5eSloli# 18*85723e5eSloli# Copyright 2017, loli10K. All rights reserved. 19*85723e5eSloli# 20*85723e5eSloli 21*85723e5eSloli. $STF_SUITE/include/libtest.shlib 22*85723e5eSloli. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib 23*85723e5eSloli 24*85723e5eSloli# 25*85723e5eSloli# DESCRIPTION: 26*85723e5eSloli# Verify ZFS successfully receive and restore properties. 27*85723e5eSloli# 28*85723e5eSloli# STRATEGY: 29*85723e5eSloli# 1. Create a filesystem. 30*85723e5eSloli# 2. Create a full stream with properties and receive it. 31*85723e5eSloli# 3. Create also an incremental stream without some properties and a truncated 32*85723e5eSloli# stream. 33*85723e5eSloli# 4. Fail to receive the truncated incremental stream and verify previously 34*85723e5eSloli# received properties are still present. 35*85723e5eSloli# 5. Receive the complete incremental send stream and verify that sent 36*85723e5eSloli# properties are successfully received. 37*85723e5eSloli# 38*85723e5eSloli 39*85723e5eSloliverify_runnable "both" 40*85723e5eSloli 41*85723e5eSloliorig=$TESTPOOL/$TESTFS1 42*85723e5eSlolidest=$TESTPOOL/$TESTFS2 43*85723e5eSlolitypeset userprop=$(valid_user_property 8) 44*85723e5eSlolitypeset userval=$(user_property_value 8) 45*85723e5eSlolitypeset streamfile_full=$TESTDIR/streamfile_full.$$ 46*85723e5eSlolitypeset streamfile_incr=$TESTDIR/streamfile_incr.$$ 47*85723e5eSlolitypeset streamfile_trun=$TESTDIR/streamfile_trun.$$ 48*85723e5eSloli 49*85723e5eSlolifunction cleanup 50*85723e5eSloli{ 51*85723e5eSloli log_must rm $streamfile_full 52*85723e5eSloli log_must rm $streamfile_incr 53*85723e5eSloli log_must rm $streamfile_trun 54*85723e5eSloli log_must zfs destroy -rf $orig 55*85723e5eSloli log_must zfs destroy -rf $dest 56*85723e5eSloli} 57*85723e5eSloli 58*85723e5eSloli# 59*85723e5eSloli# Verify property $2 is set from source $4 on dataset $1 and has value $3. 60*85723e5eSloli# 61*85723e5eSloli# $1 checked dataset 62*85723e5eSloli# $2 user property 63*85723e5eSloli# $3 property value 64*85723e5eSloli# $4 source 65*85723e5eSloli# 66*85723e5eSlolifunction check_prop_source 67*85723e5eSloli{ 68*85723e5eSloli typeset dataset=$1 69*85723e5eSloli typeset prop=$2 70*85723e5eSloli typeset value=$3 71*85723e5eSloli typeset source=$4 72*85723e5eSloli typeset chk_value=$(get_prop "$prop" "$dataset") 73*85723e5eSloli typeset chk_source=$(get_source "$prop" "$dataset") 74*85723e5eSloli if [[ "$chk_value" != "$value" || \ 75*85723e5eSloli "$chk_source" != "$4" ]] 76*85723e5eSloli then 77*85723e5eSloli return 1 78*85723e5eSloli else 79*85723e5eSloli return 0 80*85723e5eSloli fi 81*85723e5eSloli} 82*85723e5eSloli 83*85723e5eSlolilog_assert "ZFS successfully receive and restore properties." 84*85723e5eSlolilog_onexit cleanup 85*85723e5eSloli 86*85723e5eSloli# 1. Create a filesystem. 87*85723e5eSlolilog_must eval "zfs create $orig" 88*85723e5eSlolimntpnt=$(get_prop mountpoint $orig) 89*85723e5eSloli 90*85723e5eSloli# 2. Create a full stream with properties and receive it. 91*85723e5eSlolilog_must eval "zfs set compression='gzip-1' $orig" 92*85723e5eSlolilog_must eval "zfs set '$userprop'='$userval' $orig" 93*85723e5eSlolilog_must eval "zfs snapshot $orig@snap1" 94*85723e5eSlolilog_must eval "zfs send -p $orig@snap1 > $streamfile_full" 95*85723e5eSlolilog_must eval "zfs recv $dest < $streamfile_full" 96*85723e5eSlolilog_must eval "check_prop_source $dest compression 'gzip-1' received" 97*85723e5eSlolilog_must eval "check_prop_source $dest '$userprop' '$userval' received" 98*85723e5eSloli 99*85723e5eSloli# 3. Create also an incremental stream without some properties and a truncated 100*85723e5eSloli# stream. 101*85723e5eSlolilog_must eval "zfs set compression='gzip-2' $orig" 102*85723e5eSlolilog_must eval "zfs inherit '$userprop' $orig" 103*85723e5eSlolilog_must eval "dd if=/dev/urandom of=$mntpnt/file bs=1024k count=10" 104*85723e5eSlolilog_must eval "zfs snapshot $orig@snap2" 105*85723e5eSlolilog_must eval "zfs send -p -i $orig@snap1 $orig@snap2 > $streamfile_incr" 106*85723e5eSlolilog_must eval "dd if=$streamfile_incr of=$streamfile_trun bs=1024k count=9" 107*85723e5eSlolilog_must eval "zfs snapshot $orig@snap3" 108*85723e5eSlolilog_must eval "zfs send -p -i $orig@snap1 $orig@snap3 > $streamfile_incr" 109*85723e5eSloli 110*85723e5eSloli# 4. Fail to receive the truncated incremental stream and verify previously 111*85723e5eSloli# received properties are still present. 112*85723e5eSlolilog_mustnot eval "zfs recv -F $dest < $streamfile_trun" 113*85723e5eSlolilog_must eval "check_prop_source $dest compression 'gzip-1' received" 114*85723e5eSlolilog_must eval "check_prop_source $dest '$userprop' '$userval' received" 115*85723e5eSloli 116*85723e5eSloli# 5. Receive the complete incremental send stream and verify that sent 117*85723e5eSloli# properties are successfully received. 118*85723e5eSlolilog_must eval "zfs recv -F $dest < $streamfile_incr" 119*85723e5eSlolilog_must eval "check_prop_source $dest compression 'gzip-2' received" 120*85723e5eSlolilog_must eval "check_prop_source $dest '$userprop' '-' '-'" 121*85723e5eSloli 122*85723e5eSlolilog_pass "ZFS properties are successfully received and restored." 123