1*6ccda740Sloli#!/bin/ksh -p
2*6ccda740Sloli#
3*6ccda740Sloli# This file and its contents are supplied under the terms of the
4*6ccda740Sloli# Common Development and Distribution License ("CDDL"), version 1.0.
5*6ccda740Sloli# You may only use this file in accordance with the terms of version
6*6ccda740Sloli# 1.0 of the CDDL.
7*6ccda740Sloli#
8*6ccda740Sloli# A full copy of the text of the CDDL should have accompanied this
9*6ccda740Sloli# source.  A copy of the CDDL is also available via the Internet at
10*6ccda740Sloli# http://www.illumos.org/license/CDDL.
11*6ccda740Sloli#
12*6ccda740Sloli
13*6ccda740Sloli#
14*6ccda740Sloli# Copyright 2018, loli10K <ezomori.nozomu@gmail.com>. All rights reserved.
15*6ccda740Sloli#
16*6ccda740Sloli
17*6ccda740Sloli. $STF_SUITE/include/libtest.shlib
18*6ccda740Sloli. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib
19*6ccda740Sloli
20*6ccda740Sloli#
21*6ccda740Sloli# DESCRIPTION:
22*6ccda740Sloli# 'zfs send -b' should works as expected.
23*6ccda740Sloli#
24*6ccda740Sloli# STRATEGY:
25*6ccda740Sloli# 1. Create a source dataset and set some properties
26*6ccda740Sloli# 2. Verify command line options interact with '-b' correctly
27*6ccda740Sloli# 3. Send the dataset and its properties to a new "backup" destination
28*6ccda740Sloli# 4. Set some properties on the new "backup" dataset
29*6ccda740Sloli# 5. Restore the "backup" dataset to a new destination
30*6ccda740Sloli# 6. Verify only original (received) properties are sent from "backup"
31*6ccda740Sloli#
32*6ccda740Sloli
33*6ccda740Sloliverify_runnable "both"
34*6ccda740Sloli
35*6ccda740Slolifunction cleanup
36*6ccda740Sloli{
37*6ccda740Sloli	for ds in "$SENDFS" "$BACKUP" "$RESTORE"; do
38*6ccda740Sloli		datasetexists $ds && log_must zfs destroy -r $ds
39*6ccda740Sloli	done
40*6ccda740Sloli}
41*6ccda740Sloli
42*6ccda740Slolilog_assert "'zfs send -b' should work as expected."
43*6ccda740Slolilog_onexit cleanup
44*6ccda740Sloli
45*6ccda740SloliSENDFS="$TESTPOOL/sendfs"
46*6ccda740SloliBACKUP="$TESTPOOL/backup"
47*6ccda740SloliRESTORE="$TESTPOOL/restore"
48*6ccda740Sloli
49*6ccda740Sloli# 1. Create a source dataset and set some properties
50*6ccda740Slolilog_must zfs create $SENDFS
51*6ccda740Slolilog_must zfs snapshot "$SENDFS@s1"
52*6ccda740Slolilog_must zfs bookmark "$SENDFS@s1" "$SENDFS#bm"
53*6ccda740Slolilog_must zfs snapshot "$SENDFS@s2"
54*6ccda740Slolilog_must zfs set "compression=gzip" $SENDFS
55*6ccda740Slolilog_must zfs set "org.zfsonlinux:prop=val" $SENDFS
56*6ccda740Slolilog_must zfs set "org.zfsonlinux:snapprop=val" "$SENDFS@s1"
57*6ccda740Sloli
58*6ccda740Sloli# 2. Verify command line options interact with '-b' correctly
59*6ccda740Slolitypeset opts=("" "p" "Rp" "cew" "nv" "D" "DLPRcenpvw")
60*6ccda740Slolifor opt in ${opts[@]}; do
61*6ccda740Sloli	log_must eval "zfs send -b$opt $SENDFS@s1 > /dev/null"
62*6ccda740Sloli	log_must eval "zfs send -b$opt -i $SENDFS@s1 $SENDFS@s2 > /dev/null"
63*6ccda740Sloli	log_must eval "zfs send -b$opt -I $SENDFS@s1 $SENDFS@s2 > /dev/null"
64*6ccda740Slolidone
65*6ccda740Slolifor opt in ${opts[@]}; do
66*6ccda740Sloli	log_mustnot eval "zfs send -b$opt $SENDFS > /dev/null"
67*6ccda740Sloli	log_mustnot eval "zfs send -b$opt $SENDFS#bm > /dev/null"
68*6ccda740Sloli	log_mustnot eval "zfs send -b$opt -i $SENDFS#bm $SENDFS@s2 > /dev/null"
69*6ccda740Slolidone
70*6ccda740Sloli
71*6ccda740Sloli# Do 3..6 in a loop to verify various combination of "zfs send" options
72*6ccda740Slolitypeset opts=("" "p" "R" "pR" "cew")
73*6ccda740Slolifor opt in ${opts[@]}; do
74*6ccda740Sloli	# 3. Send the dataset and its properties to a new "backup" destination
75*6ccda740Sloli	# NOTE: only need to send properties (-p) here
76*6ccda740Sloli	log_must eval "zfs send -p $SENDFS@s1 | zfs recv $BACKUP"
77*6ccda740Sloli
78*6ccda740Sloli	# 4. Set some properties on the new "backup" dataset
79*6ccda740Sloli	# NOTE: override "received" values and set some new properties as well
80*6ccda740Sloli	log_must zfs set "compression=lz4" $BACKUP
81*6ccda740Sloli	log_must zfs set "exec=off" $BACKUP
82*6ccda740Sloli	log_must zfs set "org.zfsonlinux:prop=newval" $BACKUP
83*6ccda740Sloli	log_must zfs set "org.zfsonlinux:newprop=newval" $BACKUP
84*6ccda740Sloli	log_must zfs set "org.zfsonlinux:snapprop=newval" "$BACKUP@s1"
85*6ccda740Sloli	log_must zfs set "org.zfsonlinux:newsnapprop=newval" "$BACKUP@s1"
86*6ccda740Sloli
87*6ccda740Sloli	# 5. Restore the "backup" dataset to a new destination
88*6ccda740Sloli	log_must eval "zfs send -b$opt $BACKUP@s1 | zfs recv $RESTORE"
89*6ccda740Sloli
90*6ccda740Sloli	# 6. Verify only original (received) properties are sent from "backup"
91*6ccda740Sloli	log_must eval "check_prop_source $RESTORE compression gzip received"
92*6ccda740Sloli	log_must eval "check_prop_source $RESTORE org.zfsonlinux:prop val received"
93*6ccda740Sloli	log_must eval "check_prop_source $RESTORE@s1 org.zfsonlinux:snapprop val received"
94*6ccda740Sloli	log_must eval "check_prop_source $RESTORE exec on default"
95*6ccda740Sloli	log_must eval "check_prop_missing $RESTORE org.zfsonlinux:newprop"
96*6ccda740Sloli	log_must eval "check_prop_missing $RESTORE@s1 org.zfsonlinux:newsnapprop"
97*6ccda740Sloli
98*6ccda740Sloli	# cleanup
99*6ccda740Sloli	log_must zfs destroy -r $BACKUP
100*6ccda740Sloli	log_must zfs destroy -r $RESTORE
101*6ccda740Slolidone
102*6ccda740Sloli
103*6ccda740Slolilog_pass "'zfs send -b' works as expected."
104