1*6f793812SPavel Zakharov#!/usr/bin/ksh -p
2*6f793812SPavel Zakharov
3*6f793812SPavel Zakharov#
4*6f793812SPavel Zakharov# This file and its contents are supplied under the terms of the
5*6f793812SPavel Zakharov# Common Development and Distribution License ("CDDL"), version 1.0.
6*6f793812SPavel Zakharov# You may only use this file in accordance with the terms of version
7*6f793812SPavel Zakharov# 1.0 of the CDDL.
8*6f793812SPavel Zakharov#
9*6f793812SPavel Zakharov# A full copy of the text of the CDDL should have accompanied this
10*6f793812SPavel Zakharov# source.  A copy of the CDDL is also available via the Internet at
11*6f793812SPavel Zakharov# http://www.illumos.org/license/CDDL.
12*6f793812SPavel Zakharov#
13*6f793812SPavel Zakharov
14*6f793812SPavel Zakharov#
15*6f793812SPavel Zakharov# Copyright (c) 2016 by Delphix. All rights reserved.
16*6f793812SPavel Zakharov#
17*6f793812SPavel Zakharov
18*6f793812SPavel Zakharov. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.kshlib
19*6f793812SPavel Zakharov
20*6f793812SPavel Zakharov#
21*6f793812SPavel Zakharov# DESCRIPTION:
22*6f793812SPavel Zakharov#	A pool should be importable using an outdated cachefile that is unaware
23*6f793812SPavel Zakharov#	that one or more vdevs were removed.
24*6f793812SPavel Zakharov#
25*6f793812SPavel Zakharov# STRATEGY:
26*6f793812SPavel Zakharov#	1. Create a pool with some devices and an alternate cachefile.
27*6f793812SPavel Zakharov#	2. Backup the cachefile.
28*6f793812SPavel Zakharov#	3. Remove device(s) from the pool and remove them.
29*6f793812SPavel Zakharov#	4. (Optionally) Add device(s) to pool.
30*6f793812SPavel Zakharov#	5. Export the pool.
31*6f793812SPavel Zakharov#	6. Verify that we can import the pool using the backed-up cachefile.
32*6f793812SPavel Zakharov#
33*6f793812SPavel Zakharov
34*6f793812SPavel Zakharovverify_runnable "global"
35*6f793812SPavel Zakharov
36*6f793812SPavel Zakharovfunction custom_cleanup
37*6f793812SPavel Zakharov{
38*6f793812SPavel Zakharov	cleanup
39*6f793812SPavel Zakharov}
40*6f793812SPavel Zakharov
41*6f793812SPavel Zakharovlog_onexit custom_cleanup
42*6f793812SPavel Zakharov
43*6f793812SPavel Zakharovfunction test_remove_vdev
44*6f793812SPavel Zakharov{
45*6f793812SPavel Zakharov	typeset poolcreate="$1"
46*6f793812SPavel Zakharov	typeset removevdev="$2"
47*6f793812SPavel Zakharov	typeset poolcheck="$3"
48*6f793812SPavel Zakharov
49*6f793812SPavel Zakharov	log_note "$0: pool '$poolcreate', remove $2."
50*6f793812SPavel Zakharov
51*6f793812SPavel Zakharov	log_must zpool create -o cachefile=$CPATH $TESTPOOL1 $poolcreate
52*6f793812SPavel Zakharov
53*6f793812SPavel Zakharov	log_must cp $CPATH $CPATHBKP
54*6f793812SPavel Zakharov
55*6f793812SPavel Zakharov	log_must zpool remove $TESTPOOL1 $removevdev
56*6f793812SPavel Zakharov	log_must wait_for_pool_config $TESTPOOL1 "$poolcheck"
57*6f793812SPavel Zakharov	log_must rm $removevdev
58*6f793812SPavel Zakharov
59*6f793812SPavel Zakharov	log_must zpool export $TESTPOOL1
60*6f793812SPavel Zakharov
61*6f793812SPavel Zakharov	log_must zpool import -c $CPATHBKP $TESTPOOL1
62*6f793812SPavel Zakharov	log_must check_pool_config $TESTPOOL1 "$poolcheck"
63*6f793812SPavel Zakharov
64*6f793812SPavel Zakharov	# Cleanup
65*6f793812SPavel Zakharov	log_must zpool destroy $TESTPOOL1
66*6f793812SPavel Zakharov	log_must rm -f $CPATH $CPATHBKP
67*6f793812SPavel Zakharov	log_must mkfile $FILE_SIZE $removevdev
68*6f793812SPavel Zakharov
69*6f793812SPavel Zakharov	log_note ""
70*6f793812SPavel Zakharov}
71*6f793812SPavel Zakharov
72*6f793812SPavel Zakharov#
73*6f793812SPavel Zakharov# We have to remove top-level non-log vdevs one by one, else there is a high
74*6f793812SPavel Zakharov# chance pool will report busy and command will fail for the second vdev.
75*6f793812SPavel Zakharov#
76*6f793812SPavel Zakharovfunction test_remove_two_vdevs
77*6f793812SPavel Zakharov{
78*6f793812SPavel Zakharov	log_note "$0."
79*6f793812SPavel Zakharov	log_must zpool create -o cachefile=$CPATH $TESTPOOL1 \
80*6f793812SPavel Zakharov	    $VDEV0 $VDEV1 $VDEV2 $VDEV3 $VDEV4
81*6f793812SPavel Zakharov
82*6f793812SPavel Zakharov	log_must cp $CPATH $CPATHBKP
83*6f793812SPavel Zakharov
84*6f793812SPavel Zakharov	log_must zpool remove $TESTPOOL1 $VDEV4
85*6f793812SPavel Zakharov	log_must wait_for_pool_config $TESTPOOL1 \
86*6f793812SPavel Zakharov	    "$VDEV0 $VDEV1 $VDEV2 $VDEV3"
87*6f793812SPavel Zakharov	log_must zpool remove $TESTPOOL1 $VDEV3
88*6f793812SPavel Zakharov	log_must wait_for_pool_config $TESTPOOL1 "$VDEV0 $VDEV1 $VDEV2"
89*6f793812SPavel Zakharov	log_must rm $VDEV3 $VDEV4
90*6f793812SPavel Zakharov
91*6f793812SPavel Zakharov	log_must zpool export $TESTPOOL1
92*6f793812SPavel Zakharov
93*6f793812SPavel Zakharov	log_must zpool import -c $CPATHBKP $TESTPOOL1
94*6f793812SPavel Zakharov	log_must check_pool_config $TESTPOOL1 "$VDEV0 $VDEV1 $VDEV2"
95*6f793812SPavel Zakharov
96*6f793812SPavel Zakharov	# Cleanup
97*6f793812SPavel Zakharov	log_must zpool destroy $TESTPOOL1
98*6f793812SPavel Zakharov	log_must rm -f $CPATH $CPATHBKP
99*6f793812SPavel Zakharov	log_must mkfile $FILE_SIZE $VDEV3 $VDEV4
100*6f793812SPavel Zakharov
101*6f793812SPavel Zakharov	log_note ""
102*6f793812SPavel Zakharov}
103*6f793812SPavel Zakharov
104*6f793812SPavel Zakharov#
105*6f793812SPavel Zakharov# We want to test the case where a whole created by a log device is filled
106*6f793812SPavel Zakharov# by a regular device
107*6f793812SPavel Zakharov#
108*6f793812SPavel Zakharovfunction test_remove_log_then_add_vdev
109*6f793812SPavel Zakharov{
110*6f793812SPavel Zakharov	log_note "$0."
111*6f793812SPavel Zakharov	log_must zpool create -o cachefile=$CPATH $TESTPOOL1 \
112*6f793812SPavel Zakharov	    $VDEV0 $VDEV1 $VDEV2 log $VDEV3
113*6f793812SPavel Zakharov
114*6f793812SPavel Zakharov	log_must cp $CPATH $CPATHBKP
115*6f793812SPavel Zakharov
116*6f793812SPavel Zakharov	log_must zpool remove $TESTPOOL1 $VDEV1
117*6f793812SPavel Zakharov	log_must wait_for_pool_config $TESTPOOL1 "$VDEV0 $VDEV2 log $VDEV3"
118*6f793812SPavel Zakharov	log_must zpool remove $TESTPOOL1 $VDEV3
119*6f793812SPavel Zakharov	log_must check_pool_config $TESTPOOL1 "$VDEV0 $VDEV2"
120*6f793812SPavel Zakharov	log_must rm $VDEV1 $VDEV3
121*6f793812SPavel Zakharov	log_must zpool add $TESTPOOL1 $VDEV4
122*6f793812SPavel Zakharov
123*6f793812SPavel Zakharov	log_must zpool export $TESTPOOL1
124*6f793812SPavel Zakharov
125*6f793812SPavel Zakharov	log_must zpool import -c $CPATHBKP $TESTPOOL1
126*6f793812SPavel Zakharov	log_must check_pool_config $TESTPOOL1 "$VDEV0 $VDEV2 $VDEV4"
127*6f793812SPavel Zakharov
128*6f793812SPavel Zakharov	# Cleanup
129*6f793812SPavel Zakharov	log_must zpool destroy $TESTPOOL1
130*6f793812SPavel Zakharov	log_must rm -f $CPATH $CPATHBKP
131*6f793812SPavel Zakharov	log_must mkfile $FILE_SIZE $VDEV1 $VDEV3
132*6f793812SPavel Zakharov
133*6f793812SPavel Zakharov	log_note ""
134*6f793812SPavel Zakharov}
135*6f793812SPavel Zakharov
136*6f793812SPavel Zakharovtest_remove_vdev "$VDEV0 $VDEV1 $VDEV2" "$VDEV2" "$VDEV0 $VDEV1"
137*6f793812SPavel Zakharovtest_remove_vdev "$VDEV0 $VDEV1 $VDEV2" "$VDEV1" "$VDEV0 $VDEV2"
138*6f793812SPavel Zakharovtest_remove_vdev "$VDEV0 log $VDEV1" "$VDEV1" "$VDEV0"
139*6f793812SPavel Zakharovtest_remove_vdev "$VDEV0 log $VDEV1 $VDEV2" "$VDEV1 $VDEV2" "$VDEV0"
140*6f793812SPavel Zakharovtest_remove_vdev "$VDEV0 $VDEV1 $VDEV2 log $VDEV3" "$VDEV2" \
141*6f793812SPavel Zakharov    "$VDEV0 $VDEV1 log $VDEV3"
142*6f793812SPavel Zakharovtest_remove_two_vdevs
143*6f793812SPavel Zakharovtest_remove_log_then_add_vdev
144*6f793812SPavel Zakharov
145*6f793812SPavel Zakharovlog_pass "zpool import -c cachefile_unaware_of_remove passed."
146