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