summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Brassow <jbrassow@redhat.com>2013-08-26 16:38:54 -0500
committerJonathan Brassow <jbrassow@redhat.com>2013-08-26 16:38:54 -0500
commit0799e81ee08a76c877d774b2f7df75ad3ec29897 (patch)
treedac4a9fb4bdcb1de05e3d176202dfbced009b559
parent2ef48b91ed74f732b6150a9492da624d204b331d (diff)
downloadlvm2-0799e81ee08a76c877d774b2f7df75ad3ec29897.tar.gz
test: pvmove tests for all the different segment types.
Test moving linear, mirror, snapshot, RAID1,5,10, thinpool, thin and thin on RAID. Perform the moves along with a dummy LV and also without the dummy LV by specifying a logical volume name as an argument to pvmove.
-rw-r--r--test/shell/pvmove-all-segtypes.sh304
1 files changed, 304 insertions, 0 deletions
diff --git a/test/shell/pvmove-all-segtypes.sh b/test/shell/pvmove-all-segtypes.sh
new file mode 100644
index 000000000..13b8fba54
--- /dev/null
+++ b/test/shell/pvmove-all-segtypes.sh
@@ -0,0 +1,304 @@
+#!/bin/sh
+# Copyright (C) 2013 Red Hat, Inc. All rights reserved.
+#
+# This copyrighted material is made available to anyone wishing to use,
+# modify, copy, or redistribute it subject to the terms and conditions
+# of the GNU General Public License v.2.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+test_description="ensure pvmove works with all segment types"
+
+. lib/test
+
+which mkfs.ext2 || skip
+which md5sum || skip
+
+# ---------------------------------------------------------------------
+# Utilities
+lvdev_() {
+ echo "$DM_DEV_DIR/$1/$2"
+}
+
+# lv_is_on_pvs <VG> <LV> <PV1> <PV2> ...
+lv_is_on_pvs() {
+ local vg=$1
+ local lv_list=( $2 )
+ local new_lv_list=()
+ local run_again=true
+
+ shift 2
+
+ while $run_again; do
+ run_again=false
+ for tmplv in ${lv_list[*]}; do
+ if [[ $(lvs -a --noheadings -o attr $vg/$tmplv) =~ ^[[:space:]]*r.* ]] ||
+ [[ $(lvs -a --noheadings -o attr $vg/$tmplv) =~ ^[[:space:]]*R.* ]]; then
+ # Expand RAID
+ echo "$tmplv is a RAID LV"
+ new_lv_list=( ${new_lv_list[*]} `lvs -a --noheadings -o name | grep ${tmplv}_r` )
+ run_again=true
+ elif [[ $(lvs -a --noheadings -o attr $vg/$tmplv) =~ ^[[:space:]]*m.* ]] ||
+ [[ $(lvs -a --noheadings -o attr $vg/$tmplv) =~ ^[[:space:]]*M.* ]]; then
+ # Expand Mirror
+ echo "$tmplv is a mirror LV"
+ new_lv_list=( ${new_lv_list[*]} `lvs -a --noheadings -o devices $vg/$tmplv | sed s/,/' '/g` )
+ new_lv_list=( ${new_lv_list[*]} `lvs -a --noheadings -o mirror_log $vg/$tmplv | sed s/,/' '/g` )
+ run_again=true
+ elif [[ $(lvs -a --noheadings -o attr $vg/$tmplv) =~ ^[[:space:]]*t.* ]]; then
+ # Expand Thin Pool
+ echo "$tmplv is a thin-pool LV"
+ new_lv_list=( ${new_lv_list[*]} `lvs -a --noheadings -o data_lv,metadata_lv $vg/$tmplv | sed s/,/' '/g` )
+ run_again=true
+ elif [[ $(lvs -a --noheadings -o attr $vg/$tmplv) =~ ^[[:space:]]*V.* ]]; then
+ # Expand Thin-LV
+ echo "$tmplv is a thin-LV"
+ new_lv_list=( ${new_lv_list[*]} `lvs -a --noheadings -o pool_lv $vg/$tmplv | sed s/,/' '/g` )
+ run_again=true
+ elif [[ $(lvs -a --noheadings -o attr $vg/$tmplv) =~ ^[[:space:]]*e.* ]] &&
+ lvs -a --noheadings -o devices $vg/$tmplv | grep $tmplv; then
+ # Expand Thin Pool Meta, which is also RAID
+ echo "$tmplv is a thinpool (RAID) metadata"
+ new_lv_list=( ${new_lv_list[*]} `lvs -a --noheadings -o name | grep ${tmplv}_r` )
+ run_again=true
+ else
+ new_lv_list=( ${new_lv_list[*]} $tmplv )
+ fi
+ done
+ printf "\nOld LV list: ${lv_list[*]}\n\n"
+
+ lv_list=()
+ for tmplv in ${new_lv_list[*]}; do
+ lv_list=( ${lv_list[*]} $(echo $tmplv | sed s/\(.*\)/''/ | sed s/\\[/''/ | sed s/]/''/) )
+ done
+ printf "\nExpanded LV list: ${lv_list[*]}\n\n"
+
+ new_lv_list=()
+ done
+
+ [ -e out-$$ ] && rm out-$$
+ for tmplv in ${lv_list[*]}; do
+ lvs -a -odevices --noheadings $vg/$tmplv | sed 's/,/\n/g' >> out-$$
+ done
+
+ #is on all specified devs
+ for d in $*; do
+ if ! grep "$d(" out-$$; then
+ cat out-$$
+ false
+ fi
+ done
+
+ #isn't on any other dev (we are set -e remember)
+ cat out-$$
+ [ -e tmp-$$ ] && rm tmp-$$
+ for d in $*; do
+ echo "Removing $d"
+ ! grep -v "$d(" out-$$ >> tmp-$$
+ mv tmp-$$ out-$$
+ cat out-$$
+ done
+ # out-$$ must be empty - no additional devs allowed
+ [ ! -s out-$$ ]
+
+ rm out-$$
+ return 0
+}
+
+save_dev_sum_() {
+ mkfs.ext2 $1 > /dev/null && md5sum $1 > md5.$(basename $1)
+}
+
+check_dev_sum_() {
+ md5sum -c md5.$(basename $1)
+}
+# ---------------------------------------------------------------------
+
+aux prepare_vg 5 30
+
+# Each of the following tests does:
+# 1) Create two LVs - one linear and one other segment type
+# The two LVs will share a PV.
+# 2) Move both LVs together
+# 3) Move only the second LV by name
+
+printf "##\n# Testing pvmove of linear LV\n##\n"
+lvcreate -l 2 -n ${lv1}_foo $vg "$dev1"
+lvcreate -l 2 -n $lv1 $vg "$dev1"
+lv_is_on_pvs $vg ${lv1}_foo "$dev1"
+lv_is_on_pvs $vg $lv1 "$dev1"
+save_dev_sum_ $(lvdev_ $vg $lv1)
+pvmove "$dev1" "$dev5"
+lv_is_on_pvs $vg ${lv1}_foo "$dev5"
+lv_is_on_pvs $vg $lv1 "$dev5"
+check_dev_sum_ $(lvdev_ $vg $lv1)
+pvmove -n $lv1 "$dev5" "$dev4"
+lv_is_on_pvs $vg $lv1 "$dev4"
+lv_is_on_pvs $vg ${lv1}_foo "$dev5"
+check_dev_sum_ $(lvdev_ $vg $lv1)
+lvremove -ff $vg
+
+printf "##\n# Testing pvmove of stripe LV\n##\n"
+lvcreate -l 2 -n ${lv1}_foo $vg "$dev1"
+lvcreate -l 4 -i 2 -n $lv1 $vg "$dev1" "$dev2"
+lv_is_on_pvs $vg ${lv1}_foo "$dev1"
+lv_is_on_pvs $vg $lv1 "$dev1" "$dev2"
+save_dev_sum_ $(lvdev_ $vg $lv1)
+pvmove "$dev1" "$dev5"
+lv_is_on_pvs $vg ${lv1}_foo "$dev5"
+lv_is_on_pvs $vg $lv1 "$dev2" "$dev5"
+check_dev_sum_ $(lvdev_ $vg $lv1)
+pvmove -n $lv1 "$dev5" "$dev4"
+lv_is_on_pvs $vg $lv1 "$dev2" "$dev4"
+lv_is_on_pvs $vg ${lv1}_foo "$dev5"
+check_dev_sum_ $(lvdev_ $vg $lv1)
+lvremove -ff $vg
+
+printf "##\n# Testing pvmove of mirror LV\n##\n"
+lvcreate -l 2 -n ${lv1}_foo $vg "$dev1"
+lvcreate -l 2 --type mirror -m 1 -n $lv1 $vg "$dev1" "$dev2"
+lv_is_on_pvs $vg ${lv1}_foo "$dev1"
+lv_is_on_pvs $vg $lv1 "$dev1" "$dev2"
+save_dev_sum_ $(lvdev_ $vg $lv1)
+pvmove "$dev1" "$dev5"
+lv_is_on_pvs $vg ${lv1}_foo "$dev5"
+lv_is_on_pvs $vg $lv1 "$dev2" "$dev5"
+check_dev_sum_ $(lvdev_ $vg $lv1)
+pvmove -n $lv1 "$dev5" "$dev4"
+lv_is_on_pvs $vg $lv1 "$dev2" "$dev4"
+lv_is_on_pvs $vg ${lv1}_foo "$dev5"
+check_dev_sum_ $(lvdev_ $vg $lv1)
+lvremove -ff $vg
+
+# Dummy LV and snap share dev1, while origin is on dev2
+printf "##\n# Testing pvmove of snapshot LV\n##\n"
+lvcreate -l 2 -n ${lv1}_foo $vg "$dev1"
+lvcreate -l 2 -n $lv1 $vg "$dev2"
+lvcreate -s $vg/$lv1 -l 2 -n snap "$dev1"
+lv_is_on_pvs $vg ${lv1}_foo "$dev1"
+lv_is_on_pvs $vg snap "$dev1"
+save_dev_sum_ $(lvdev_ $vg snap)
+pvmove "$dev1" "$dev5"
+lv_is_on_pvs $vg ${lv1}_foo "$dev5"
+lv_is_on_pvs $vg snap "$dev5"
+check_dev_sum_ $(lvdev_ $vg snap)
+pvmove -n snap "$dev5" "$dev4"
+lv_is_on_pvs $vg snap "$dev4"
+lv_is_on_pvs $vg ${lv1}_foo "$dev5"
+check_dev_sum_ $(lvdev_ $vg snap)
+lvremove -ff $vg
+
+##
+# RAID
+##
+if aux target_at_least dm-raid 1 3 5; then
+ printf "##\n# Testing pvmove of RAID1 LV\n##\n"
+ lvcreate -l 2 -n ${lv1}_foo $vg "$dev1"
+ lvcreate -l 2 --type raid1 -m 1 -n $lv1 $vg "$dev1" "$dev2"
+ lv_is_on_pvs $vg ${lv1}_foo "$dev1"
+ lv_is_on_pvs $vg $lv1 "$dev1" "$dev2"
+ save_dev_sum_ $(lvdev_ $vg $lv1)
+ pvmove "$dev1" "$dev5"
+ lv_is_on_pvs $vg ${lv1}_foo "$dev5"
+ lv_is_on_pvs $vg $lv1 "$dev2" "$dev5"
+ check_dev_sum_ $(lvdev_ $vg $lv1)
+ pvmove -n $lv1 "$dev5" "$dev4"
+ lv_is_on_pvs $vg $lv1 "$dev2" "$dev4"
+ lv_is_on_pvs $vg ${lv1}_foo "$dev5"
+ check_dev_sum_ $(lvdev_ $vg $lv1)
+ lvremove -ff $vg
+
+ printf "##\n# Testing pvmove of RAID10 LV\n##\n"
+ lvcreate -l 2 -n ${lv1}_foo $vg "$dev1"
+ lvcreate -l 4 --type raid10 -i 2 -m 1 -n $lv1 $vg \
+ "$dev1" "$dev2" "$dev3" "$dev4"
+ lv_is_on_pvs $vg ${lv1}_foo "$dev1"
+ lv_is_on_pvs $vg $lv1 "$dev1" "$dev2" "$dev3" "$dev4"
+ save_dev_sum_ $(lvdev_ $vg $lv1)
+ pvmove "$dev1" "$dev5"
+ lv_is_on_pvs $vg ${lv1}_foo "$dev5"
+ lv_is_on_pvs $vg $lv1 "$dev2" "$dev3" "$dev4" "$dev5"
+ check_dev_sum_ $(lvdev_ $vg $lv1)
+ pvmove -n $lv1 "$dev5" "$dev1"
+ lv_is_on_pvs $vg $lv1 "$dev1" "$dev2" "$dev3" "$dev4"
+ lv_is_on_pvs $vg ${lv1}_foo "$dev5"
+ check_dev_sum_ $(lvdev_ $vg $lv1)
+ lvremove -ff $vg
+
+ printf "##\n# Testing pvmove of RAID5 LV\n##\n"
+ lvcreate -l 2 -n ${lv1}_foo $vg "$dev1"
+ lvcreate -l 4 --type raid5 -i 2 -n $lv1 $vg \
+ "$dev1" "$dev2" "$dev3"
+ lv_is_on_pvs $vg ${lv1}_foo "$dev1"
+ lv_is_on_pvs $vg $lv1 "$dev1" "$dev2" "$dev3"
+ save_dev_sum_ $(lvdev_ $vg $lv1)
+ pvmove "$dev1" "$dev5"
+ lv_is_on_pvs $vg ${lv1}_foo "$dev5"
+ lv_is_on_pvs $vg $lv1 "$dev2" "$dev3" "$dev5"
+ check_dev_sum_ $(lvdev_ $vg $lv1)
+ pvmove -n $lv1 "$dev5" "$dev4"
+ lv_is_on_pvs $vg $lv1 "$dev2" "$dev3" "$dev4"
+ lv_is_on_pvs $vg ${lv1}_foo "$dev5"
+ check_dev_sum_ $(lvdev_ $vg $lv1)
+ lvremove -ff $vg
+fi
+
+##
+# Thin
+##
+if aux target_at_least dm-thin-pool 1 8 0; then
+
+ printf "##\n# Testing pvmove of thin-pool LV\n##\n"
+ lvcreate -l 2 -n ${lv1}_foo $vg "$dev1"
+ lvcreate -T $vg/$lv1 -l 4 "$dev1"
+ lv_is_on_pvs $vg ${lv1}_foo "$dev1"
+ lv_is_on_pvs $vg $lv1 "$dev1"
+ save_dev_sum_ $(lvdev_ $vg $lv1)
+ pvmove "$dev1" "$dev5"
+ lv_is_on_pvs $vg ${lv1}_foo "$dev5"
+ lv_is_on_pvs $vg $lv1 "$dev5"
+ check_dev_sum_ $(lvdev_ $vg $lv1)
+ pvmove -n $lv1 "$dev5" "$dev4"
+ lv_is_on_pvs $vg $lv1 "$dev4"
+ lv_is_on_pvs $vg ${lv1}_foo "$dev5"
+ check_dev_sum_ $(lvdev_ $vg $lv1)
+ lvremove -ff $vg
+
+ printf "##\n# Testing pvmove of thin LV\n##\n"
+ lvcreate -l 2 -n ${lv1}_foo $vg "$dev1"
+ lvcreate -T $vg/${lv1}_pool -l 4 -V 8 -n $lv1 "$dev1"
+ lv_is_on_pvs $vg ${lv1}_foo "$dev1"
+ lv_is_on_pvs $vg $lv1 "$dev1"
+ save_dev_sum_ $(lvdev_ $vg $lv1)
+ pvmove "$dev1" "$dev5"
+ lv_is_on_pvs $vg ${lv1}_foo "$dev5"
+ lv_is_on_pvs $vg $lv1 "$dev5"
+ check_dev_sum_ $(lvdev_ $vg $lv1)
+ pvmove -n $lv1 "$dev5" "$dev4"
+ lv_is_on_pvs $vg $lv1 "$dev4"
+ lv_is_on_pvs $vg ${lv1}_foo "$dev5"
+ check_dev_sum_ $(lvdev_ $vg $lv1)
+ lvremove -ff $vg
+
+ printf "##\n# Testing pvmove of thin LV on RAID\n##\n"
+ lvcreate -l 2 -n ${lv1}_foo $vg "$dev1"
+ lvcreate --type raid1 -m 1 -l 4 -n ${lv1}_raid1_pool $vg "$dev1" "$dev2"
+ lvcreate --type raid1 -m 1 -l 4 -n ${lv1}_raid1_meta $vg "$dev1" "$dev2"
+ lvconvert --thinpool $vg/${lv1}_raid1_pool \
+ --poolmetadata ${lv1}_raid1_meta
+ lvcreate -T $vg/${lv1}_raid1_pool -V 8 -n $lv1
+ lv_is_on_pvs $vg ${lv1}_foo "$dev1"
+ lv_is_on_pvs $vg $lv1 "$dev1" "$dev2"
+ save_dev_sum_ $(lvdev_ $vg $lv1)
+ pvmove "$dev1" "$dev5"
+ lv_is_on_pvs $vg ${lv1}_foo "$dev5"
+ lv_is_on_pvs $vg $lv1 "$dev2" "$dev5"
+ check_dev_sum_ $(lvdev_ $vg $lv1)
+ pvmove -n $lv1 "$dev5" "$dev4"
+ lv_is_on_pvs $vg $lv1 "$dev2" "$dev4"
+ lv_is_on_pvs $vg ${lv1}_foo "$dev5"
+ check_dev_sum_ $(lvdev_ $vg $lv1)
+ lvremove -ff $vg
+fi