1d583b39bSJohn Wren Kennedy#!/bin/ksh -p
2d583b39bSJohn Wren Kennedy#
3d583b39bSJohn Wren Kennedy# CDDL HEADER START
4d583b39bSJohn Wren Kennedy#
5d583b39bSJohn Wren Kennedy# The contents of this file are subject to the terms of the
6d583b39bSJohn Wren Kennedy# Common Development and Distribution License (the "License").
7d583b39bSJohn Wren Kennedy# You may not use this file except in compliance with the License.
8d583b39bSJohn Wren Kennedy#
9d583b39bSJohn Wren Kennedy# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10d583b39bSJohn Wren Kennedy# or http://www.opensolaris.org/os/licensing.
11d583b39bSJohn Wren Kennedy# See the License for the specific language governing permissions
12d583b39bSJohn Wren Kennedy# and limitations under the License.
13d583b39bSJohn Wren Kennedy#
14d583b39bSJohn Wren Kennedy# When distributing Covered Code, include this CDDL HEADER in each
15d583b39bSJohn Wren Kennedy# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16d583b39bSJohn Wren Kennedy# If applicable, add the following below this CDDL HEADER, with the
17d583b39bSJohn Wren Kennedy# fields enclosed by brackets "[]" replaced with your own identifying
18d583b39bSJohn Wren Kennedy# information: Portions Copyright [yyyy] [name of copyright owner]
19d583b39bSJohn Wren Kennedy#
20d583b39bSJohn Wren Kennedy# CDDL HEADER END
21d583b39bSJohn Wren Kennedy#
22d583b39bSJohn Wren Kennedy
23d583b39bSJohn Wren Kennedy#
24d583b39bSJohn Wren Kennedy# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
25d583b39bSJohn Wren Kennedy# Use is subject to license terms.
26d583b39bSJohn Wren Kennedy#
27d583b39bSJohn Wren Kennedy
28d583b39bSJohn Wren Kennedy#
29*1d32ba66SJohn Wren Kennedy# Copyright (c) 2012, 2016 by Delphix. All rights reserved.
30d583b39bSJohn Wren Kennedy#
31d583b39bSJohn Wren Kennedy
32d583b39bSJohn Wren Kennedy. $STF_SUITE/include/libtest.shlib
33d583b39bSJohn Wren Kennedy. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib
34d583b39bSJohn Wren Kennedy. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg
35d583b39bSJohn Wren Kennedy
36d583b39bSJohn Wren Kennedy#
37d583b39bSJohn Wren Kennedy# DESCRIPTION:
38d583b39bSJohn Wren Kennedy# Once a pool has been exported, it should be recreated after a
39d583b39bSJohn Wren Kennedy# successful import, all the sub-filesystems within it should all be restored,
40d583b39bSJohn Wren Kennedy# include mount & share status. Verify that is true.
41d583b39bSJohn Wren Kennedy#
42d583b39bSJohn Wren Kennedy# STRATEGY:
43d583b39bSJohn Wren Kennedy#	1. Create the test pool and hierarchical filesystems.
44d583b39bSJohn Wren Kennedy#	2. Export the test pool, or destroy the test pool,
45d583b39bSJohn Wren Kennedy#		depend on testing import [-Df].
46d583b39bSJohn Wren Kennedy#	3. Import it using the various combinations.
47d583b39bSJohn Wren Kennedy#		- Regular import
48d583b39bSJohn Wren Kennedy#		- Alternate Root Specified
49d583b39bSJohn Wren Kennedy#	4. Verify the mount & share status is restored.
50d583b39bSJohn Wren Kennedy#
51d583b39bSJohn Wren Kennedy
52d583b39bSJohn Wren Kennedyverify_runnable "global"
53d583b39bSJohn Wren Kennedy
54d583b39bSJohn Wren Kennedyset -A pools "$TESTPOOL" "$TESTPOOL1"
55d583b39bSJohn Wren Kennedyset -A devs "" "-d $DEVICE_DIR"
56d583b39bSJohn Wren Kennedyset -A options "" "-R $ALTER_ROOT"
57d583b39bSJohn Wren Kennedyset -A mtpts "$TESTDIR" "$TESTDIR1"
58d583b39bSJohn Wren Kennedy
59d583b39bSJohn Wren Kennedy
60d583b39bSJohn Wren Kennedyfunction cleanup
61d583b39bSJohn Wren Kennedy{
62d583b39bSJohn Wren Kennedy	typeset -i i=0
63d583b39bSJohn Wren Kennedy
64d583b39bSJohn Wren Kennedy	while ((i < ${#pools[*]})); do
65d583b39bSJohn Wren Kennedy		if poolexists ${pools[i]}; then
66*1d32ba66SJohn Wren Kennedy			log_must zpool export ${pools[i]}
67d583b39bSJohn Wren Kennedy			log_note "Try to import ${devs[i]} ${pools[i]}"
68*1d32ba66SJohn Wren Kennedy			zpool import ${devs[i]} ${pools[i]}
69d583b39bSJohn Wren Kennedy		else
70d583b39bSJohn Wren Kennedy			log_note "Try to import $option ${devs[i]} ${pools[i]}"
71*1d32ba66SJohn Wren Kennedy			zpool import $option ${devs[i]} ${pools[i]}
72d583b39bSJohn Wren Kennedy		fi
73d583b39bSJohn Wren Kennedy
74d583b39bSJohn Wren Kennedy		if poolexists ${pools[i]}; then
75d583b39bSJohn Wren Kennedy			is_shared ${pools[i]} && \
76*1d32ba66SJohn Wren Kennedy			    log_must zfs set sharenfs=off ${pools[i]}
77d583b39bSJohn Wren Kennedy
78d583b39bSJohn Wren Kennedy			ismounted "${pools[i]}/$TESTFS" || \
79*1d32ba66SJohn Wren Kennedy			    log_must zfs mount ${pools[i]}/$TESTFS
80d583b39bSJohn Wren Kennedy		fi
81d583b39bSJohn Wren Kennedy
82d583b39bSJohn Wren Kennedy		((i = i + 1))
83d583b39bSJohn Wren Kennedy	done
84d583b39bSJohn Wren Kennedy
85d583b39bSJohn Wren Kennedy	destroy_pool $TESTPOOL1
86d583b39bSJohn Wren Kennedy
87d583b39bSJohn Wren Kennedy	if datasetexists $TESTPOOL/$TESTFS; then
88*1d32ba66SJohn Wren Kennedy		log_must zfs destroy -Rf $TESTPOOL/$TESTFS
89d583b39bSJohn Wren Kennedy	fi
90*1d32ba66SJohn Wren Kennedy	log_must zfs create $TESTPOOL/$TESTFS
91*1d32ba66SJohn Wren Kennedy	log_must zfs set mountpoint=$TESTDIR $TESTPOOL/$TESTFS
92d583b39bSJohn Wren Kennedy
93d583b39bSJohn Wren Kennedy	[[ -d $ALTER_ROOT ]] && \
94*1d32ba66SJohn Wren Kennedy		log_must rm -rf $ALTER_ROOT
95d583b39bSJohn Wren Kennedy}
96d583b39bSJohn Wren Kennedy
97d583b39bSJohn Wren Kennedylog_onexit cleanup
98d583b39bSJohn Wren Kennedy
99d583b39bSJohn Wren Kennedylog_assert "Verify all mount & share status of sub-filesystems within a pool \
100d583b39bSJohn Wren Kennedy	can be restored after import [-Df]."
101d583b39bSJohn Wren Kennedy
102d583b39bSJohn Wren Kennedysetup_filesystem "$DEVICE_FILES" $TESTPOOL1 $TESTFS $TESTDIR1
103d583b39bSJohn Wren Kennedy# create a heirarchy of filesystem
104d583b39bSJohn Wren Kennedyfor pool in ${pools[@]} ; do
105*1d32ba66SJohn Wren Kennedy	log_must zfs create $pool/$TESTFS/$TESTCTR
106*1d32ba66SJohn Wren Kennedy	log_must zfs create $pool/$TESTFS/$TESTCTR/$TESTCTR1
107*1d32ba66SJohn Wren Kennedy	log_must zfs set canmount=off $pool/$TESTFS/$TESTCTR
108*1d32ba66SJohn Wren Kennedy	log_must zfs set canmount=off $pool/$TESTFS/$TESTCTR/$TESTCTR1
109*1d32ba66SJohn Wren Kennedy	log_must zfs create $pool/$TESTFS/$TESTCTR/$TESTFS1
110*1d32ba66SJohn Wren Kennedy	log_must zfs create $pool/$TESTFS/$TESTCTR/$TESTCTR1/$TESTFS1
111*1d32ba66SJohn Wren Kennedy	log_must zfs create $pool/$TESTFS/$TESTFS1
112*1d32ba66SJohn Wren Kennedy	log_must zfs snapshot $pool/$TESTFS/$TESTFS1@snap
113*1d32ba66SJohn Wren Kennedy	log_must zfs clone $pool/$TESTFS/$TESTFS1@snap $pool/$TESTCLONE1
114d583b39bSJohn Wren Kennedydone
115d583b39bSJohn Wren Kennedy
116d583b39bSJohn Wren Kennedytypeset mount_fs="$TESTFS $TESTFS/$TESTFS1 $TESTCLONE1 \
117d583b39bSJohn Wren Kennedy		$TESTFS/$TESTCTR/$TESTFS1 $TESTFS/$TESTCTR/$TESTCTR1/$TESTFS1"
118d583b39bSJohn Wren Kennedytypeset nomount_fs="$TESTFS/$TESTCTR $TESTFS/$TESTCTR/$TESTCTR1"
119d583b39bSJohn Wren Kennedy
120d583b39bSJohn Wren Kennedytypeset -i i=0
121d583b39bSJohn Wren Kennedytypeset -i j=0
122d583b39bSJohn Wren Kennedytypeset -i nfs_share_bit=0
123d583b39bSJohn Wren Kennedytypeset -i guid_bit=0
124d583b39bSJohn Wren Kennedytypeset basedir
125d583b39bSJohn Wren Kennedy
126d583b39bSJohn Wren Kennedyfor option in "" "-Df"; do
127d583b39bSJohn Wren Kennedy	i=0
128d583b39bSJohn Wren Kennedy	while ((i < ${#pools[*]})); do
129d583b39bSJohn Wren Kennedy		pool=${pools[i]}
130d583b39bSJohn Wren Kennedy		guid=$(get_pool_prop guid $pool)
131d583b39bSJohn Wren Kennedy		j=0
132d583b39bSJohn Wren Kennedy		while ((j < ${#options[*]})); do
133d583b39bSJohn Wren Kennedy			# set sharenfs property off/on
134d583b39bSJohn Wren Kennedy			nfs_share_bit=0
135d583b39bSJohn Wren Kennedy			while ((nfs_share_bit <= 1)); do
136d583b39bSJohn Wren Kennedy				typeset f_share=""
137d583b39bSJohn Wren Kennedy				typeset nfs_flag="sharenfs=off"
138d583b39bSJohn Wren Kennedy				if ((nfs_share_bit == 1)); then
139d583b39bSJohn Wren Kennedy					log_note "Set sharenfs=on $pool"
140*1d32ba66SJohn Wren Kennedy					log_must zfs set sharenfs=on $pool
141d583b39bSJohn Wren Kennedy					log_must is_shared $pool
142d583b39bSJohn Wren Kennedy					f_share="true"
143d583b39bSJohn Wren Kennedy					nfs_flag="sharenfs=on"
144d583b39bSJohn Wren Kennedy				fi
145d583b39bSJohn Wren Kennedy				# for every off/on nfs bit import guid/pool_name
146d583b39bSJohn Wren Kennedy				guid_bit=0
147d583b39bSJohn Wren Kennedy				while ((guid_bit <= 1)); do
148d583b39bSJohn Wren Kennedy					typeset guid_flag="pool name"
149d583b39bSJohn Wren Kennedy					if [[ -z $option ]]; then
150*1d32ba66SJohn Wren Kennedy						log_must zpool export $pool
151d583b39bSJohn Wren Kennedy					else
152*1d32ba66SJohn Wren Kennedy						log_must zpool destroy $pool
153d583b39bSJohn Wren Kennedy					fi
154d583b39bSJohn Wren Kennedy
155d583b39bSJohn Wren Kennedy					typeset target=$pool
156d583b39bSJohn Wren Kennedy					if ((guid_bit == 1)); then
157d583b39bSJohn Wren Kennedy						log_note "Import by guid."
158d583b39bSJohn Wren Kennedy						if [[ -z $guid ]]; then
159d583b39bSJohn Wren Kennedy							log_fail "guid should "\
160d583b39bSJohn Wren Kennedy							    "not be empty!"
161d583b39bSJohn Wren Kennedy						else
162d583b39bSJohn Wren Kennedy							target=$guid
163d583b39bSJohn Wren Kennedy							guid_flag="$guid"
164d583b39bSJohn Wren Kennedy						fi
165d583b39bSJohn Wren Kennedy					fi
166d583b39bSJohn Wren Kennedy					log_note "Import with $nfs_flag and " \
167d583b39bSJohn Wren Kennedy					    "$guid_flag"
168*1d32ba66SJohn Wren Kennedy					zpool import $option ${devs[i]} \
169d583b39bSJohn Wren Kennedy					    ${options[j]} $target
170d583b39bSJohn Wren Kennedy					#import by GUID if import by pool name fails
171d583b39bSJohn Wren Kennedy					if [[ $? != 0 ]]; then
172d583b39bSJohn Wren Kennedy						log_note "Possible pool name" \
173d583b39bSJohn Wren Kennedy						    "duplicates. Try GUID import"
174d583b39bSJohn Wren Kennedy						target=$guid
175*1d32ba66SJohn Wren Kennedy						log_must zpool import $option \
176d583b39bSJohn Wren Kennedy						    ${devs[i]} ${options[j]} \
177d583b39bSJohn Wren Kennedy						    $target
178d583b39bSJohn Wren Kennedy					fi
179d583b39bSJohn Wren Kennedy					log_must poolexists $pool
180d583b39bSJohn Wren Kennedy
181d583b39bSJohn Wren Kennedy					for fs in $mount_fs; do
182d583b39bSJohn Wren Kennedy						log_must ismounted $pool/$fs
183d583b39bSJohn Wren Kennedy						[[ -n $f_share ]] && \
184d583b39bSJohn Wren Kennedy						    log_must is_shared $pool/$fs
185d583b39bSJohn Wren Kennedy					done
186d583b39bSJohn Wren Kennedy
187d583b39bSJohn Wren Kennedy					for fs in $nomount_fs; do
188d583b39bSJohn Wren Kennedy						log_mustnot ismounted $pool/$fs
189d583b39bSJohn Wren Kennedy						log_mustnot is_shared $pool/$fs
190d583b39bSJohn Wren Kennedy					done
191d583b39bSJohn Wren Kennedy					((guid_bit = guid_bit + 1))
192d583b39bSJohn Wren Kennedy				done
193d583b39bSJohn Wren Kennedy				# reset nfsshare=off
194d583b39bSJohn Wren Kennedy				if [[ -n $f_share ]]; then
195*1d32ba66SJohn Wren Kennedy					log_must zfs set sharenfs=off $pool
196d583b39bSJohn Wren Kennedy					log_mustnot is_shared $pool
197d583b39bSJohn Wren Kennedy				fi
198d583b39bSJohn Wren Kennedy				((nfs_share_bit = nfs_share_bit + 1))
199d583b39bSJohn Wren Kennedy			done
200d583b39bSJohn Wren Kennedy
201d583b39bSJohn Wren Kennedy			((j = j + 1))
202d583b39bSJohn Wren Kennedy		done
203d583b39bSJohn Wren Kennedy
204d583b39bSJohn Wren Kennedy		((i = i + 1))
205d583b39bSJohn Wren Kennedy	done
206d583b39bSJohn Wren Kennedydone
207d583b39bSJohn Wren Kennedy
208d583b39bSJohn Wren Kennedylog_pass "All mount & share status of sub-filesystems within a pool \
209d583b39bSJohn Wren Kennedy	can be restored after import [-Df]."
210