1#!/bin/sh
2# Copyright (C) 2007 Red Hat, Inc. All rights reserved.
3#
4# This copyrighted material is made available to anyone wishing to use,
5# modify, copy, or redistribute it subject to the terms and conditions
6# of the GNU General Public License v.2.
7#
8# You should have received a copy of the GNU General Public License
9# along with this program; if not, write to the Free Software Foundation,
10# Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
11
12# Test vgsplit operation, including different LV types
13
14. ./test-utils.sh
15
16COMM() {
17	LAST_TEST="$@"
18}
19
20prepare_pvs 5 257
21# FIXME: paramaterize lvm1 vs lvm2 metadata; most of these tests should run
22# fine with lvm1 metadata as well; for now, just add disks 5 and 6 as lvm1
23# metadata
24
25#
26# vgsplit can be done into a new or existing VG
27#
28for i in new existing
29do
30	#
31	# We can have PVs or LVs on the cmdline
32	#
33	for j in PV LV
34	do
35COMM "vgsplit correctly splits single linear LV into $i VG ($j args)"
36		vgcreate $vg1 $dev1 $dev2
37		if [ $i = existing ]; then
38		   vgcreate $vg2 $dev3 $dev4
39		fi
40		lvcreate -l 4 -n $lv1 $vg1 $dev1
41		vgchange -an $vg1
42		if [ $j = PV ]; then
43		  vgsplit $vg1 $vg2 $dev1
44		else
45		  vgsplit -n $lv1 $vg1 $vg2
46		fi
47		vg_validate_pvlv_counts_ $vg1 1 0 0
48		if [ $i = existing ]; then
49		   aux vg_validate_pvlv_counts_ $vg2 3 1 0
50		else
51		   aux vg_validate_pvlv_counts_ $vg2 1 1 0
52		fi
53		lvremove -f $vg2/$lv1
54		vgremove -f $vg2
55		vgremove -f $vg1
56
57COMM "vgsplit correctly splits single striped LV into $i VG ($j args)"
58		vgcreate $vg1 $dev1 $dev2
59		if [ $i = existing ]; then
60		   vgcreate $vg2 $dev3 $dev4
61		fi
62		lvcreate -l 4 -i 2 -n $lv1 $vg1 $dev1 $dev2
63		vgchange -an $vg1
64		if [ $j = PV ]; then
65		  vgsplit $vg1 $vg2 $dev1 $dev2
66		else
67		  vgsplit -n $lv1 $vg1 $vg2
68		fi
69		if [ $i = existing ]; then
70		  aux vg_validate_pvlv_counts_ $vg2 4 1 0
71		else
72		  aux vg_validate_pvlv_counts_ $vg2 2 1 0
73		fi
74		lvremove -f $vg2/$lv1
75		vgremove -f $vg2
76
77COMM "vgsplit correctly splits mirror LV into $i VG ($j args)"
78		vgcreate $vg1 $dev1 $dev2 $dev3
79		if [ $i = existing ]; then
80		  vgcreate $vg2 $dev4
81		fi
82		lvcreate -l 64 -m1 -n $lv1 $vg1 $dev1 $dev2 $dev3
83		vgchange -an $vg1
84		if [ $j = PV ]; then
85		  vgsplit $vg1 $vg2 $dev1 $dev2 $dev3
86		else
87		  vgsplit -n $lv1 $vg1 $vg2
88		fi
89		if [ $i = existing ]; then
90		  aux vg_validate_pvlv_counts_ $vg2 4 1 0
91		else
92		  aux vg_validate_pvlv_counts_ $vg2 3 1 0
93		fi
94		lvremove -f $vg2/$lv1
95		vgremove -f $vg2
96
97COMM "vgsplit correctly splits origin and snapshot LV into $i VG ($j args)"
98		vgcreate $vg1 $dev1 $dev2
99		if [ $i = existing ]; then
100		  vgcreate $vg2 $dev3 $dev4
101		fi
102		lvcreate -l 64 -i 2 -n $lv1 $vg1 $dev1 $dev2
103		lvcreate -l 4 -i 2 -s -n $lv2 $vg1/$lv1
104		vgchange -an $vg1
105		if [ $j = PV ]; then
106		  vgsplit $vg1 $vg2 $dev1 $dev2
107		else
108		  vgsplit -n $lv1 $vg1 $vg2
109		fi
110		if [ $i = existing ]; then
111		  aux vg_validate_pvlv_counts_ $vg2 4 2 1
112		else
113		  aux vg_validate_pvlv_counts_ $vg2 2 2 1
114		fi
115		lvremove -f $vg2/$lv2
116		lvremove -f $vg2/$lv1
117		vgremove -f $vg2
118
119COMM "vgsplit correctly splits linear LV but not snap+origin LV into $i VG ($j args)"
120		vgcreate $vg1 $dev1 $dev2
121		if [ $i = existing ]; then
122		  vgcreate $vg2 $dev3
123		fi
124		lvcreate -l 64 -i 2 -n $lv1 $vg1
125		lvcreate -l 4 -i 2 -s -n $lv2 $vg1/$lv1
126		vgextend $vg1 $dev4
127		lvcreate -l 64 -n $lv3 $vg1 $dev4
128		vgchange -an $vg1
129		if [ $j = PV ]; then
130		  vgsplit $vg1 $vg2 $dev4
131		else
132		  vgsplit -n $lv3 $vg1 $vg2
133		fi
134		if [ $i = existing ]; then
135		  aux vg_validate_pvlv_counts_ $vg2 2 1 0
136		  aux vg_validate_pvlv_counts_ $vg1 2 2 1
137		else
138		  aux vg_validate_pvlv_counts_ $vg2 1 1 0
139		  aux vg_validate_pvlv_counts_ $vg1 2 2 1
140		fi
141		lvremove -f $vg1/$lv2
142		lvremove -f $vg1/$lv1
143		lvremove -f $vg2/$lv3
144		vgremove -f $vg1
145		vgremove -f $vg2
146
147COMM "vgsplit correctly splits linear LV but not mirror LV into $i VG ($j args)"
148		vgcreate $vg1 $dev1 $dev2 $dev3
149		if [ $i = existing ]; then
150		  vgcreate $vg2 $dev5
151		fi
152		lvcreate -l 64 -m1 -n $lv1 $vg1 $dev1 $dev2 $dev3
153		vgextend $vg1 $dev4
154		lvcreate -l 64 -n $lv2 $vg1 $dev4
155		vgchange -an $vg1
156		vgs
157		lvs
158		pvs
159		if [ $j = PV ]; then
160		  vgsplit $vg1 $vg2 $dev4
161		else
162		  vgsplit -n $lv2 $vg1 $vg2
163		fi
164		if [ $i = existing ]; then
165		  aux vg_validate_pvlv_counts_ $vg1 3 1 0
166		  aux vg_validate_pvlv_counts_ $vg2 2 1 0
167		else
168		vgs
169		lvs
170		pvs
171		  aux vg_validate_pvlv_counts_ $vg1 3 1 0
172		  aux vg_validate_pvlv_counts_ $vg2 1 1 0
173		fi
174		lvremove -f $vg1/$lv1
175		lvremove -f $vg2/$lv2
176		vgremove -f $vg1
177		vgremove -f $vg2
178
179	done
180done
181
182#
183# Test more complex setups where the code has to find associated PVs and
184# LVs to split the VG correctly
185#
186COMM "vgsplit fails splitting 3 striped LVs into VG when only 1 LV specified"
187vgcreate $vg1 $dev1 $dev2 $dev3 $dev4
188lvcreate -l 4 -n $lv1 -i 2 $vg1 $dev1 $dev2
189lvcreate -l 4 -n $lv2 -i 2 $vg1 $dev2 $dev3
190lvcreate -l 4 -n $lv3 -i 2 $vg1 $dev3 $dev4
191vgchange -an $vg1
192not vgsplit -n $lv1 $vg1 $vg2
193vgremove -ff $vg1
194
195COMM "vgsplit fails splitting one LV with 2 snapshots, only origin LV specified"
196vgcreate $vg1 $dev1 $dev2 $dev3 $dev4
197lvcreate -l 16 -n $lv1 $vg1 $dev1 $dev2
198lvcreate -l 4 -n $lv2 -s $vg1/$lv1
199lvcreate -l 4 -n $lv3 -s $vg1/$lv1
200vg_validate_pvlv_counts_ $vg1 4 3 2
201vgchange -an $vg1
202not vgsplit -n $lv1 $vg1 $vg2;
203lvremove -f $vg1/$lv2
204lvremove -f $vg1/$lv3
205lvremove -f $vg1/$lv1
206vgremove -ff $vg1
207
208COMM "vgsplit fails splitting one LV with 2 snapshots, only snapshot LV specified"
209vgcreate $vg1 $dev1 $dev2 $dev3 $dev4
210lvcreate -l 16 -n $lv1 $vg1 $dev1 $dev2
211lvcreate -l 4 -n $lv2 -s $vg1/$lv1
212lvcreate -l 4 -n $lv3 -s $vg1/$lv1
213vg_validate_pvlv_counts_ $vg1 4 3 2
214vgchange -an $vg1
215not vgsplit -n $lv2 $vg1 $vg2
216lvremove -f $vg1/$lv2
217lvremove -f $vg1/$lv3
218lvremove -f $vg1/$lv1
219vgremove -ff $vg1
220
221COMM "vgsplit fails splitting one mirror LV, only one PV specified"
222vgcreate $vg1 $dev1 $dev2 $dev3 $dev4
223lvcreate -l 16 -n $lv1 -m1 $vg1 $dev1 $dev2 $dev3
224vg_validate_pvlv_counts_ $vg1 4 1 0
225vgchange -an $vg1
226not vgsplit $vg1 $vg2 $dev2
227vgremove -ff $vg1
228
229COMM "vgsplit fails splitting 1 mirror + 1 striped LV, only striped LV specified"
230vgcreate $vg1 $dev1 $dev2 $dev3 $dev4
231lvcreate -l 16 -n $lv1 -m1 $vg1 $dev1 $dev2 $dev3
232lvcreate -l 16 -n $lv2 -i 2 $vg1 $dev3 $dev4
233vg_validate_pvlv_counts_ $vg1 4 2 0
234vgchange -an $vg1
235not vgsplit -n $lv2 $vg1 $vg2 2>err
236vgremove -ff $vg1
237
238#
239# Verify vgsplit rejects active LVs only when active LVs involved in split
240#
241COMM "vgsplit fails, active mirror involved in split"
242vgcreate $vg1 $dev1 $dev2 $dev3 $dev4
243lvcreate -l 16 -n $lv1 -m1 $vg1 $dev1 $dev2 $dev3
244lvcreate -l 16 -n $lv2 $vg1 $dev4
245lvchange -an $vg1/$lv2
246vg_validate_pvlv_counts_ $vg1 4 2 0
247not vgsplit -n $lv1 $vg1 $vg2;
248vg_validate_pvlv_counts_ $vg1 4 2 0
249vgremove -ff $vg1
250
251COMM "vgsplit succeeds, active mirror not involved in split"
252vgcreate $vg1 $dev1 $dev2 $dev3 $dev4
253lvcreate -l 16 -n $lv1 -m1 $vg1 $dev1 $dev2 $dev3
254lvcreate -l 16 -n $lv2 $vg1 $dev4
255lvchange -an $vg1/$lv2
256vg_validate_pvlv_counts_ $vg1 4 2 0
257vgsplit -n $lv2 $vg1 $vg2
258vg_validate_pvlv_counts_ $vg1 3 1 0
259vg_validate_pvlv_counts_ $vg2 1 1 0
260vgremove -ff $vg1
261vgremove -ff $vg2
262
263COMM "vgsplit fails, active snapshot involved in split"
264vgcreate $vg1 $dev1 $dev2 $dev3 $dev4
265lvcreate -l 64 -i 2 -n $lv1 $vg1 $dev1 $dev2
266lvcreate -l 4 -i 2 -s -n $lv2 $vg1/$lv1
267lvcreate -l 64 -i 2 -n $lv3 $vg1 $dev3 $dev4
268lvchange -an $vg1/$lv3
269vg_validate_pvlv_counts_ $vg1 4 3 1
270not vgsplit -n $lv2 $vg1 $vg2;
271vg_validate_pvlv_counts_ $vg1 4 3 1
272lvremove -f $vg1/$lv2
273vgremove -ff $vg1
274
275COMM "vgsplit succeeds, active snapshot not involved in split"
276vgcreate $vg1 $dev1 $dev2 $dev3
277lvcreate -l 64 -i 2 -n $lv1 $vg1 $dev1 $dev2
278lvcreate -l 4 -s -n $lv2 $vg1/$lv1
279vgextend $vg1 $dev4
280lvcreate -l 64 -n $lv3 $vg1 $dev4
281lvchange -an $vg1/$lv3
282vg_validate_pvlv_counts_ $vg1 4 3 1
283vgsplit -n $lv3 $vg1 $vg2
284vg_validate_pvlv_counts_ $vg1 3 2 1
285vg_validate_pvlv_counts_ $vg2 1 1 0
286vgchange -an $vg1
287lvremove -f $vg1/$lv2
288vgremove -ff $vg1
289vgremove -ff $vg2
290
291