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