1eda14cbcSMatt Macy#!/bin/ksh -p
2eda14cbcSMatt Macy#
3eda14cbcSMatt Macy# CDDL HEADER START
4eda14cbcSMatt Macy#
5eda14cbcSMatt Macy# The contents of this file are subject to the terms of the
6eda14cbcSMatt Macy# Common Development and Distribution License (the "License").
7eda14cbcSMatt Macy# You may not use this file except in compliance with the License.
8eda14cbcSMatt Macy#
9eda14cbcSMatt Macy# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*271171e0SMartin Matuska# or https://opensource.org/licenses/CDDL-1.0.
11eda14cbcSMatt Macy# See the License for the specific language governing permissions
12eda14cbcSMatt Macy# and limitations under the License.
13eda14cbcSMatt Macy#
14eda14cbcSMatt Macy# When distributing Covered Code, include this CDDL HEADER in each
15eda14cbcSMatt Macy# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16eda14cbcSMatt Macy# If applicable, add the following below this CDDL HEADER, with the
17eda14cbcSMatt Macy# fields enclosed by brackets "[]" replaced with your own identifying
18eda14cbcSMatt Macy# information: Portions Copyright [yyyy] [name of copyright owner]
19eda14cbcSMatt Macy#
20eda14cbcSMatt Macy# CDDL HEADER END
21eda14cbcSMatt Macy#
22eda14cbcSMatt Macy
23eda14cbcSMatt Macy#
24eda14cbcSMatt Macy# Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
25eda14cbcSMatt Macy# Use is subject to license terms.
26eda14cbcSMatt Macy#
27eda14cbcSMatt Macy
28eda14cbcSMatt Macy#
29eda14cbcSMatt Macy# Copyright (c) 2012, 2016 by Delphix. All rights reserved.
30eda14cbcSMatt Macy#
31eda14cbcSMatt Macy
32eda14cbcSMatt Macy. $STF_SUITE/tests/functional/cli_root/cli_common.kshlib
33eda14cbcSMatt Macy
34eda14cbcSMatt Macy#
35eda14cbcSMatt Macy# DESCRIPTION:
36eda14cbcSMatt Macy#	Verifying 'zfs receive [<filesystem|snapshot>] -d <filesystem>' works.
37eda14cbcSMatt Macy#
38eda14cbcSMatt Macy# STRATEGY:
39eda14cbcSMatt Macy#	1. Fill in fs with some data
40eda14cbcSMatt Macy#	2. Create full and incremental send stream
41eda14cbcSMatt Macy#	3. Receive the send stream
42eda14cbcSMatt Macy#	4. Verify the restoring results.
43eda14cbcSMatt Macy#
44eda14cbcSMatt Macy
45eda14cbcSMatt Macyverify_runnable "both"
46eda14cbcSMatt Macy
47eda14cbcSMatt Macyfunction cleanup
48eda14cbcSMatt Macy{
49eda14cbcSMatt Macy	typeset -i i=0
50eda14cbcSMatt Macy
5181b22a98SMartin Matuska	datasetexists $rst_root && destroy_dataset $rst_root -Rf
52eda14cbcSMatt Macy	while (( i < 2 )); do
5381b22a98SMartin Matuska		snapexists ${orig_snap[$i]} && destroy_dataset ${orig_snap[$i]} -f
54eda14cbcSMatt Macy		log_must rm -f ${bkup[$i]}
55eda14cbcSMatt Macy
56eda14cbcSMatt Macy		(( i = i + 1 ))
57eda14cbcSMatt Macy	done
58eda14cbcSMatt Macy
59eda14cbcSMatt Macy	log_must rm -rf $TESTDIR1
60eda14cbcSMatt Macy}
61eda14cbcSMatt Macy
62eda14cbcSMatt Macyfunction recreate_root
63eda14cbcSMatt Macy{
6481b22a98SMartin Matuska	datasetexists $rst_root && destroy_dataset $rst_root -Rf
65eda14cbcSMatt Macy	if [[ -d $TESTDIR1 ]] ; then
66eda14cbcSMatt Macy		log_must rm -rf $TESTDIR1
67eda14cbcSMatt Macy	fi
68eda14cbcSMatt Macy	log_must zfs create $rst_root
69eda14cbcSMatt Macy	log_must zfs set mountpoint=$TESTDIR1 $rst_root
70eda14cbcSMatt Macy}
71eda14cbcSMatt Macy
72eda14cbcSMatt Macylog_assert "Verifying 'zfs receive [<filesystem|snapshot>] -d <filesystem>' works."
73eda14cbcSMatt Macylog_onexit cleanup
74eda14cbcSMatt Macy
75eda14cbcSMatt Macytypeset datasets="$TESTPOOL/$TESTFS $TESTPOOL"
76eda14cbcSMatt Macyset -A bkup "$TEST_BASE_DIR/fullbkup" "$TEST_BASE_DIR/incbkup"
77eda14cbcSMatt Macyorig_sum=""
78eda14cbcSMatt Macyrst_sum=""
79eda14cbcSMatt Macyrst_root=$TESTPOOL/rst_ctr
80eda14cbcSMatt Macyrst_fs=${rst_root}/$TESTFS
81eda14cbcSMatt Macy
82eda14cbcSMatt Macyfor orig_fs in $datasets ; do
83eda14cbcSMatt Macy	#
84eda14cbcSMatt Macy	# Preparations for testing
85eda14cbcSMatt Macy	#
86eda14cbcSMatt Macy	recreate_root
87eda14cbcSMatt Macy
88eda14cbcSMatt Macy	set -A orig_snap "${orig_fs}@init_snap" "${orig_fs}@inc_snap"
89eda14cbcSMatt Macy	typeset mntpnt=$(get_prop mountpoint ${orig_fs})
90eda14cbcSMatt Macy	set -A orig_data "${mntpnt}/$TESTFILE1" "${mntpnt}/$TESTFILE2"
91eda14cbcSMatt Macy
92eda14cbcSMatt Macy	typeset relative_path=""
93eda14cbcSMatt Macy	if [[ ${orig_fs} == *"/"* ]]; then
94eda14cbcSMatt Macy		relative_path=${orig_fs#*/}
95eda14cbcSMatt Macy	fi
96eda14cbcSMatt Macy
97eda14cbcSMatt Macy	typeset leaf_fs=${rst_root}/${relative_path}
98eda14cbcSMatt Macy	leaf_fs=${leaf_fs%/}
99eda14cbcSMatt Macy	rst_snap=${leaf_fs}@snap
100eda14cbcSMatt Macy
101eda14cbcSMatt Macy	set -A rst_snap "$rst_root/$TESTFS@init_snap" "$rst_root/$TESTFS@inc_snap"
102eda14cbcSMatt Macy	set -A rst_snap2 "${leaf_fs}@init_snap" "${leaf_fs}@inc_snap"
103eda14cbcSMatt Macy	set -A rst_data "$TESTDIR1/$TESTFS/$TESTFILE1" "$TESTDIR1/$TESTFS/$TESTFILE2"
104eda14cbcSMatt Macy	set -A rst_data2 "$TESTDIR1/${relative_path}/$TESTFILE1" "$TESTDIR1/${relative_path}/$TESTFILE2"
105eda14cbcSMatt Macy
106eda14cbcSMatt Macy	typeset -i i=0
107eda14cbcSMatt Macy	while (( i < ${#orig_snap[*]} )); do
108716fd348SMartin Matuska		log_must eval "file_write -o create -f ${orig_data[$i]} -b 512 -c 8 >/dev/null 2>&1"
109eda14cbcSMatt Macy		log_must zfs snapshot ${orig_snap[$i]}
110eda14cbcSMatt Macy		if (( i < 1 )); then
111eda14cbcSMatt Macy			log_must eval "zfs send ${orig_snap[$i]} > ${bkup[$i]}"
112eda14cbcSMatt Macy		else
113eda14cbcSMatt Macy			log_must eval "zfs send -i ${orig_snap[(( i - 1 ))]} \
114eda14cbcSMatt Macy				${orig_snap[$i]} > ${bkup[$i]}"
115eda14cbcSMatt Macy		fi
116eda14cbcSMatt Macy
117eda14cbcSMatt Macy		(( i = i + 1 ))
118eda14cbcSMatt Macy	done
119eda14cbcSMatt Macy
120eda14cbcSMatt Macy	log_note "Verifying 'zfs receive <filesystem>' works."
121eda14cbcSMatt Macy	i=0
122eda14cbcSMatt Macy	while (( i < ${#bkup[*]} )); do
123eda14cbcSMatt Macy		if (( i > 0 )); then
124eda14cbcSMatt Macy			log_must zfs rollback ${rst_snap[0]}
125eda14cbcSMatt Macy		fi
126eda14cbcSMatt Macy		log_must eval "zfs receive $rst_fs < ${bkup[$i]}"
127eda14cbcSMatt Macy		snapexists ${rst_snap[$i]} || \
128eda14cbcSMatt Macy			log_fail "Restoring filesystem fails. ${rst_snap[$i]} not exist"
129eda14cbcSMatt Macy		compare_cksum ${orig_data[$i]} ${rst_data[$i]}
130eda14cbcSMatt Macy
131eda14cbcSMatt Macy		(( i = i + 1 ))
132eda14cbcSMatt Macy	done
133eda14cbcSMatt Macy
134eda14cbcSMatt Macy	log_must zfs destroy -Rf $rst_fs
135eda14cbcSMatt Macy
136eda14cbcSMatt Macy	log_note "Verifying 'zfs receive <snapshot>' works."
137eda14cbcSMatt Macy	i=0
138eda14cbcSMatt Macy	while (( i < ${#bkup[*]} )); do
139eda14cbcSMatt Macy		if (( i > 0 )); then
140eda14cbcSMatt Macy			log_must zfs rollback ${rst_snap[0]}
141eda14cbcSMatt Macy		fi
142eda14cbcSMatt Macy		log_must eval "zfs receive ${rst_snap[$i]} <${bkup[$i]}"
143eda14cbcSMatt Macy		snapexists ${rst_snap[$i]} || \
144eda14cbcSMatt Macy			log_fail "Restoring filesystem fails. ${rst_snap[$i]} not exist"
145eda14cbcSMatt Macy		compare_cksum ${orig_data[$i]} ${rst_data[$i]}
146eda14cbcSMatt Macy
147eda14cbcSMatt Macy		(( i = i + 1 ))
148eda14cbcSMatt Macy	done
149eda14cbcSMatt Macy
150eda14cbcSMatt Macy	log_must zfs destroy -Rf $rst_fs
151eda14cbcSMatt Macy
152eda14cbcSMatt Macy	log_note "Verifying 'zfs receive -d <filesystem>' works."
153eda14cbcSMatt Macy
154eda14cbcSMatt Macy	i=0
155eda14cbcSMatt Macy	while (( i < ${#bkup[*]} )); do
156eda14cbcSMatt Macy		if (( i > 0 )); then
157eda14cbcSMatt Macy			log_must zfs rollback ${rst_snap2[0]}
158eda14cbcSMatt Macy		fi
159eda14cbcSMatt Macy		log_must eval "zfs receive -d -F $rst_root <${bkup[$i]}"
160eda14cbcSMatt Macy		snapexists ${rst_snap2[$i]} || \
161eda14cbcSMatt Macy			log_fail "Restoring filesystem fails. ${rst_snap2[$i]} not exist"
162eda14cbcSMatt Macy		compare_cksum ${orig_data[$i]} ${rst_data2[$i]}
163eda14cbcSMatt Macy
164eda14cbcSMatt Macy		(( i = i + 1 ))
165eda14cbcSMatt Macy	done
166eda14cbcSMatt Macy
167eda14cbcSMatt Macy	cleanup
168eda14cbcSMatt Macydone
169eda14cbcSMatt Macy
170eda14cbcSMatt Macylog_pass "Verifying 'zfs receive [<filesystem|snapshot>] -d <filesystem>' succeeds."
171