1#!/bin/ksh -p
2#
3# CDDL HEADER START
4#
5# The contents of this file are subject to the terms of the
6# Common Development and Distribution License (the "License").
7# You may not use this file except in compliance with the License.
8#
9# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10# or https://opensource.org/licenses/CDDL-1.0.
11# See the License for the specific language governing permissions
12# and limitations under the License.
13#
14# When distributing Covered Code, include this CDDL HEADER in each
15# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16# If applicable, add the following below this CDDL HEADER, with the
17# fields enclosed by brackets "[]" replaced with your own identifying
18# information: Portions Copyright [yyyy] [name of copyright owner]
19#
20# CDDL HEADER END
21#
22
23#
24# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
25# Use is subject to license terms.
26#
27
28#
29# Copyright (c) 2012, 2016 by Delphix. All rights reserved.
30#
31
32. $STF_SUITE/include/libtest.shlib
33. $STF_SUITE/tests/functional/cli_root/zpool_create/zpool_create.shlib
34
35#
36# DESCRIPTION:
37#	Verify zpool create succeed with multiple keywords combination.
38#
39# STRATEGY:
40#	1. Create base filesystem to hold virtual disk files.
41#	2. Create several files == $MINVDEVSIZE.
42#	3. Verify 'zpool create' succeed with valid keywords combination.
43#
44
45verify_runnable "global"
46
47function cleanup
48{
49	poolexists $TESTPOOL1 && destroy_pool $TESTPOOL1
50	poolexists $TESTPOOL && destroy_pool $TESTPOOL
51}
52
53
54log_assert "Verify 'zpool create' succeed with keywords combination."
55log_onexit cleanup
56
57create_pool $TESTPOOL $DISKS
58mntpnt=$(get_prop mountpoint $TESTPOOL)
59
60typeset -i i=0
61while ((i < 10)); do
62	log_must truncate -s $MINVDEVSIZE $mntpnt/vdev$i
63
64	eval vdev$i=$mntpnt/vdev$i
65	((i += 1))
66done
67
68set -A valid_args \
69	"mirror $vdev0 $vdev1 $vdev2 mirror $vdev3 $vdev4 $vdev5" \
70	"mirror $vdev0 $vdev1 mirror $vdev2 $vdev3 mirror $vdev4 $vdev5" \
71	"mirror $vdev0 $vdev1 $vdev2 mirror $vdev3 $vdev4 $vdev5 \
72		spare $vdev6" \
73	"mirror $vdev0 $vdev1 mirror $vdev2 $vdev3 mirror $vdev4 $vdev5 \
74		spare $vdev6 $vdev7" \
75	"mirror $vdev0 $vdev1 spare $vdev2 mirror $vdev3 $vdev4" \
76	"mirror $vdev0 $vdev1 raidz $vdev2 $vdev3" \
77	"mirror $vdev0 $vdev1 raidz $vdev2 $vdev3 $vdev4" \
78	"mirror $vdev0 $vdev1 $vdev2 raidz2 $vdev3 $vdev4 $vdev5" \
79	"mirror $vdev0 $vdev1 $vdev2 $vdev3 \
80		raidz3 $vdev4 $vdev5 $vdev6 $vdev7" \
81	"raidz $vdev0 $vdev1 $vdev2 mirror $vdev3 $vdev4" \
82	"raidz $vdev0 $vdev1 $vdev2 raidz1 $vdev3 $vdev4 $vdev5" \
83	"raidz $vdev0 $vdev1 raidz1 $vdev2 $vdev3 raidz $vdev4 $vdev5" \
84	"raidz $vdev0 $vdev1 $vdev2 raidz1 $vdev3 $vdev4 $vdev5 \
85		spare $vdev6" \
86	"raidz $vdev0 $vdev1 raidz1 $vdev2 $vdev3 raidz $vdev4 $vdev5 \
87		spare $vdev6 $vdev7" \
88	"raidz $vdev0 $vdev1 spare $vdev2 raidz $vdev3 $vdev4" \
89	"raidz2 $vdev0 $vdev1 $vdev2 mirror $vdev3 $vdev4 $vdev5" \
90	"raidz2 $vdev0 $vdev1 $vdev2 raidz2 $vdev3 $vdev4 $vdev5" \
91	"raidz2 $vdev0 $vdev1 $vdev2 raidz2 $vdev3 $vdev4 $vdev5 \
92		raidz2 $vdev6 $vdev7 $vdev8" \
93	"raidz2 $vdev0 $vdev1 $vdev2 raidz2 $vdev3 $vdev4 $vdev5 \
94		spare $vdev6" \
95	"raidz2 $vdev0 $vdev1 $vdev2 raidz2 $vdev3 $vdev4 $vdev5 \
96		raidz2 $vdev6 $vdev7 $vdev8 spare $vdev9" \
97	"raidz2 $vdev0 $vdev1 $vdev2 spare $vdev3 raidz2 $vdev4 $vdev5 $vdev6" \
98	"raidz3 $vdev0 $vdev1 $vdev2 $vdev3 \
99		mirror $vdev4 $vdev5 $vdev6 $vdev7" \
100	"draid $vdev0 $vdev1 $vdev2 mirror $vdev3 $vdev4" \
101	"draid $vdev0 $vdev1 $vdev2 raidz1 $vdev3 $vdev4 $vdev5" \
102	"draid $vdev0 $vdev1 $vdev2 draid1 $vdev3 $vdev4 $vdev5" \
103	"draid $vdev0 $vdev1 $vdev2 special mirror $vdev3 $vdev4" \
104	"draid2 $vdev0 $vdev1 $vdev2 $vdev3 mirror $vdev4 $vdev5 $vdev6" \
105	"draid2 $vdev0 $vdev1 $vdev2 $vdev3 raidz2 $vdev4 $vdev5 $vdev6" \
106	"draid2 $vdev0 $vdev1 $vdev2 $vdev3 draid2 $vdev4 $vdev5 $vdev6 $vdev7"\
107	"draid2 $vdev0 $vdev1 $vdev2 $vdev3 \
108		special mirror $vdev4 $vdev5 $vdev6" \
109	"draid2 $vdev0 $vdev1 $vdev2 $vdev3 \
110		special mirror $vdev4 $vdev5 $vdev6 \
111		cache $vdev7 log mirror $vdev8 $vdev9" \
112	"draid $vdev0 $vdev1 $vdev2 draid $vdev4 $vdev5 $vdev6 $vdev7 \
113		special mirror $vdev8 $vdev9" \
114	"spare $vdev0 $vdev1 $vdev2 mirror $vdev3 $vdev4 raidz $vdev5 $vdev6"
115
116set -A forced_args \
117	"$vdev0 raidz $vdev1 $vdev2 raidz1 $vdev3 $vdev4 $vdev5" \
118	"$vdev0 raidz2 $vdev1 $vdev2 $vdev3 raidz2 $vdev4 $vdev5 $vdev6" \
119	"$vdev0 mirror $vdev1 $vdev2 mirror $vdev3 $vdev4" \
120	"$vdev0 mirror $vdev1 $vdev2 raidz $vdev3 $vdev4 \
121		raidz2 $vdev5 $vdev6 $vdev7 spare $vdev8" \
122	"$vdev0 mirror $vdev1 $vdev2 spare $vdev3 raidz $vdev4 $vdev5" \
123	"raidz $vdev0 $vdev1 raidz2 $vdev2 $vdev3 $vdev4" \
124	"raidz $vdev0 $vdev1 raidz2 $vdev2 $vdev3 $vdev4 spare $vdev5" \
125	"raidz $vdev0 $vdev1 spare $vdev2 raidz2 $vdev3 $vdev4 $vdev5" \
126	"raidz $vdev0 $vdev1 draid2 $vdev2 $vdev3 $vdev4 $vdev5" \
127	"raidz $vdev0 $vdev1 draid3 $vdev2 $vdev3 $vdev4 $vdev5 $vdev6" \
128	"mirror $vdev0 $vdev1 raidz $vdev2 $vdev3 raidz2 $vdev4 $vdev5 $vdev6" \
129	"mirror $vdev0 $vdev1 raidz $vdev2 $vdev3 \
130		raidz2 $vdev4 $vdev5 $vdev6 spare $vdev7" \
131	"mirror $vdev0 $vdev1 raidz $vdev2 $vdev3 \
132		spare $vdev4 raidz2 $vdev5 $vdev6 $vdev7" \
133	"mirror $vdev0 $vdev1 draid $vdev2 $vdev3 $vdev4 \
134		draid2 $vdev5 $vdev6 $vdev7 $vdev8 spare $vdev9" \
135	"draid $vdev0 $vdev1 $vdev2 $vdev3 \
136		draid2 $vdev4 $vdev5 $vdev6 $vdev7 $vdev8" \
137	"draid $vdev0 $vdev1 $vdev2 draid $vdev4 $vdev5 $vdev6 \
138		special mirror $vdev7 $vdev8 $vdev9" \
139	"spare $vdev0 $vdev1 $vdev2 mirror $vdev3 $vdev4 \
140		raidz2 $vdev5 $vdev6 $vdev7"
141
142i=0
143while ((i < ${#valid_args[@]})); do
144	log_must zpool create $TESTPOOL1 ${valid_args[$i]}
145	log_must zpool destroy -f $TESTPOOL1
146
147	((i += 1))
148done
149
150i=0
151while ((i < ${#forced_args[@]})); do
152	log_mustnot zpool create $TESTPOOL1 ${forced_args[$i]}
153	log_must zpool create -f $TESTPOOL1 ${forced_args[$i]}
154	log_must zpool destroy -f $TESTPOOL1
155
156	((i += 1))
157done
158
159log_pass "'zpool create' succeed with keywords combination."
160