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