2017-07-02 22:38:32 +03:00
#!/usr/bin/env bash
2015-03-05 23:00:44 +03:00
# Copyright (C) 2014 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,
2016-01-21 13:49:46 +03:00
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2015-03-05 23:00:44 +03:00
test_description = 'Exercise toollib process_each_pv with vgreduce'
2018-05-24 17:49:48 +03:00
2016-03-09 14:32:10 +03:00
SKIP_WITH_LVMPOLLD = 1
2016-02-23 01:13:42 +03:00
2015-03-05 23:00:44 +03:00
. lib/inittest
aux prepare_devs 14
#
# set up
#
# FIXME: some of the setup may not be used by the tests
# since this was split out from process-each-pv, where
# some of the setup was used by other tests that only
# remain in process-each-pv.
#
# use use dev10 instead of dev1 because simple grep for
# dev1 matchines dev10,dev11,etc
#
2018-05-24 17:49:48 +03:00
vgcreate $SHARED $vg1 " $dev10 "
vgcreate $SHARED $vg2 " $dev2 " " $dev3 " " $dev4 " " $dev5 "
vgcreate $SHARED $vg3 " $dev6 " " $dev7 " " $dev8 " " $dev9 "
2015-03-05 23:00:44 +03:00
pvchange --addtag V2D3 " $dev3 "
pvchange --addtag V2D4 " $dev4 "
pvchange --addtag V2D45 " $dev4 "
pvchange --addtag V2D5 " $dev5 "
pvchange --addtag V2D45 " $dev5 "
pvchange --addtag V3 " $dev6 " " $dev7 " " $dev8 " " $dev9 "
pvchange --addtag V3D9 " $dev9 "
# orphan
pvcreate " $dev11 "
# dev (a non-pv device)
pvcreate " $dev12 "
pvremove " $dev12 "
# dev13 is intentionally untouched so we can
# test that it is handled appropriately as a non-pv
# orphan
pvcreate " $dev14 "
# fail without dev
not vgreduce $vg2
# fail with dev and -a
not vgreduce $vg2 " $dev2 " -a
check pv_field " $dev2 " vg_name $vg2
check pv_field " $dev3 " vg_name $vg2
check pv_field " $dev4 " vg_name $vg2
check pv_field " $dev5 " vg_name $vg2
check pv_field " $dev6 " vg_name $vg3
check pv_field " $dev7 " vg_name $vg3
check pv_field " $dev8 " vg_name $vg3
check pv_field " $dev9 " vg_name $vg3
# remove one pv
vgreduce $vg2 " $dev2 "
not check pv_field " $dev2 " vg_name $vg2
check pv_field " $dev3 " vg_name $vg2
check pv_field " $dev4 " vg_name $vg2
check pv_field " $dev5 " vg_name $vg2
check pv_field " $dev6 " vg_name $vg3
check pv_field " $dev7 " vg_name $vg3
check pv_field " $dev8 " vg_name $vg3
check pv_field " $dev9 " vg_name $vg3
# reset
vgextend $vg2 " $dev2 "
# remove two pvs
vgreduce $vg2 " $dev2 " " $dev3 "
not check pv_field " $dev2 " vg_name $vg2
not check pv_field " $dev3 " vg_name $vg2
check pv_field " $dev4 " vg_name $vg2
check pv_field " $dev5 " vg_name $vg2
check pv_field " $dev6 " vg_name $vg3
check pv_field " $dev7 " vg_name $vg3
check pv_field " $dev8 " vg_name $vg3
check pv_field " $dev9 " vg_name $vg3
# reset
vgextend $vg2 " $dev2 " " $dev3 "
pvchange --addtag V2D3 " $dev3 "
# remove one pv with tag
vgreduce $vg2 @V2D3
check pv_field " $dev2 " vg_name $vg2
not check pv_field " $dev3 " vg_name $vg2
check pv_field " $dev4 " vg_name $vg2
check pv_field " $dev5 " vg_name $vg2
check pv_field " $dev6 " vg_name $vg3
check pv_field " $dev7 " vg_name $vg3
check pv_field " $dev8 " vg_name $vg3
check pv_field " $dev9 " vg_name $vg3
# reset
vgextend $vg2 " $dev3 "
pvchange --addtag V2D3 " $dev3 "
# remove two pvs, each with different tag
vgreduce $vg2 @V2D3 @V2D4
check pv_field " $dev2 " vg_name $vg2
not check pv_field " $dev3 " vg_name $vg2
not check pv_field " $dev4 " vg_name $vg2
check pv_field " $dev5 " vg_name $vg2
check pv_field " $dev6 " vg_name $vg3
check pv_field " $dev7 " vg_name $vg3
check pv_field " $dev8 " vg_name $vg3
check pv_field " $dev9 " vg_name $vg3
# reset
vgextend $vg2 " $dev3 " " $dev4 "
pvchange --addtag V2D3 " $dev3 "
pvchange --addtag V2D4 " $dev4 "
pvchange --addtag V2D45 " $dev4 "
# remove two pvs, both with same tag
vgreduce $vg2 @V2D45
check pv_field " $dev2 " vg_name $vg2
check pv_field " $dev3 " vg_name $vg2
not check pv_field " $dev4 " vg_name $vg2
not check pv_field " $dev5 " vg_name $vg2
check pv_field " $dev6 " vg_name $vg3
check pv_field " $dev7 " vg_name $vg3
check pv_field " $dev8 " vg_name $vg3
check pv_field " $dev9 " vg_name $vg3
# reset
vgextend $vg2 " $dev4 " " $dev5 "
pvchange --addtag V2D4 " $dev4 "
pvchange --addtag V2D45 " $dev4 "
pvchange --addtag V2D5 " $dev5 "
pvchange --addtag V2D45 " $dev5 "
# remove two pvs, one by name, one by tag
vgreduce $vg2 " $dev2 " @V2D3
not check pv_field " $dev2 " vg_name $vg2
not check pv_field " $dev3 " vg_name $vg2
check pv_field " $dev4 " vg_name $vg2
check pv_field " $dev5 " vg_name $vg2
check pv_field " $dev6 " vg_name $vg3
check pv_field " $dev7 " vg_name $vg3
check pv_field " $dev8 " vg_name $vg3
check pv_field " $dev9 " vg_name $vg3
# reset
vgextend $vg2 " $dev2 " " $dev3 "
pvchange --addtag V2D3 " $dev3 "
# remove one pv by tag, where another vg has a pv with same tag
pvchange --addtag V2D5V3D9 " $dev5 "
pvchange --addtag V2D5V3D9 " $dev9 "
vgreduce $vg2 @V2D5V3D9
check pv_field " $dev2 " vg_name $vg2
check pv_field " $dev3 " vg_name $vg2
check pv_field " $dev4 " vg_name $vg2
not check pv_field " $dev5 " vg_name $vg2
check pv_field " $dev6 " vg_name $vg3
check pv_field " $dev7 " vg_name $vg3
check pv_field " $dev8 " vg_name $vg3
check pv_field " $dev9 " vg_name $vg3
# reset
vgextend $vg2 " $dev5 "
pvchange --addtag V2D5 " $dev5 "
pvchange --addtag V2D45 " $dev5 "
# fail to remove last pv (don't know which will be last)
not vgreduce -a $vg2
# reset
vgremove $vg2
2018-05-24 17:49:48 +03:00
vgcreate $SHARED $vg2 " $dev2 " " $dev3 " " $dev4 " " $dev5 "
2015-03-05 23:00:44 +03:00
pvchange --addtag V2D3 " $dev3 "
pvchange --addtag V2D4 " $dev4 "
pvchange --addtag V2D45 " $dev4 "
pvchange --addtag V2D5 " $dev5 "
pvchange --addtag V2D45 " $dev5 "
# lvcreate on one pv to make it used
# remove all unused pvs
lvcreate -n $lv1 -l 2 $vg2 " $dev2 "
not vgreduce -a $vg2
check pv_field " $dev2 " vg_name $vg2
not check pv_field " $dev3 " vg_name $vg2
not check pv_field " $dev4 " vg_name $vg2
not check pv_field " $dev5 " vg_name $vg2
check pv_field " $dev6 " vg_name $vg3
check pv_field " $dev7 " vg_name $vg3
check pv_field " $dev8 " vg_name $vg3
check pv_field " $dev9 " vg_name $vg3
# reset
vgextend $vg2 " $dev3 " " $dev4 " " $dev5 "
pvchange --addtag V2D3 " $dev3 "
pvchange --addtag V2D4 " $dev4 "
pvchange --addtag V2D45 " $dev4 "
pvchange --addtag V2D5 " $dev5 "
pvchange --addtag V2D45 " $dev5 "
lvchange -an $vg2 /$lv1
lvremove $vg2 /$lv1
#
# tests including pvs without mdas
#
# remove old config
vgremove $vg1
vgremove $vg2
vgremove $vg3
pvremove " $dev11 "
pvremove " $dev14 "
# new config with some pvs that have zero mdas
# for vg1
pvcreate " $dev10 "
# for vg2
pvcreate " $dev2 " --metadatacopies 0
pvcreate " $dev3 "
pvcreate " $dev4 "
pvcreate " $dev5 "
# for vg3
pvcreate " $dev6 " --metadatacopies 0
pvcreate " $dev7 " --metadatacopies 0
pvcreate " $dev8 " --metadatacopies 0
pvcreate " $dev9 "
# orphan with mda
pvcreate " $dev11 "
# orphan without mda
pvcreate " $dev14 " --metadatacopies 0
# non-pv devs
# dev12
# dev13
2018-05-24 17:49:48 +03:00
vgcreate $SHARED $vg1 " $dev10 "
vgcreate $SHARED $vg2 " $dev2 " " $dev3 " " $dev4 " " $dev5 "
vgcreate $SHARED $vg3 " $dev6 " " $dev7 " " $dev8 " " $dev9 "
2015-03-05 23:00:44 +03:00
pvchange --addtag V2D3 " $dev3 "
pvchange --addtag V2D4 " $dev4 "
pvchange --addtag V2D45 " $dev4 "
pvchange --addtag V2D5 " $dev5 "
pvchange --addtag V2D45 " $dev5 "
pvchange --addtag V3 " $dev6 " " $dev7 " " $dev8 " " $dev9 "
pvchange --addtag V3D8 " $dev8 "
pvchange --addtag V3D9 " $dev9 "
#
# vgreduce including pvs without mdas
#
# remove pv without mda
vgreduce $vg2 " $dev2 "
not check pv_field " $dev2 " vg_name $vg2
check pv_field " $dev3 " vg_name $vg2
check pv_field " $dev4 " vg_name $vg2
check pv_field " $dev5 " vg_name $vg2
check pv_field " $dev6 " vg_name $vg3
check pv_field " $dev7 " vg_name $vg3
check pv_field " $dev8 " vg_name $vg3
check pv_field " $dev9 " vg_name $vg3
# reset
vgextend $vg2 " $dev2 "
# remove pv with mda and pv without mda
vgreduce $vg2 " $dev2 " " $dev3 "
not check pv_field " $dev2 " vg_name $vg2
not check pv_field " $dev3 " vg_name $vg2
check pv_field " $dev4 " vg_name $vg2
check pv_field " $dev5 " vg_name $vg2
check pv_field " $dev6 " vg_name $vg3
check pv_field " $dev7 " vg_name $vg3
check pv_field " $dev8 " vg_name $vg3
check pv_field " $dev9 " vg_name $vg3
# reset
vgextend $vg2 " $dev2 "
vgextend $vg2 " $dev3 "
# fail to remove only pv with mda
not vgreduce $vg3 " $dev9 "
check pv_field " $dev6 " vg_name $vg3
check pv_field " $dev7 " vg_name $vg3
check pv_field " $dev8 " vg_name $vg3
check pv_field " $dev9 " vg_name $vg3
check pv_field " $dev2 " vg_name $vg2
check pv_field " $dev3 " vg_name $vg2
check pv_field " $dev4 " vg_name $vg2
check pv_field " $dev5 " vg_name $vg2
# remove by tag a pv without mda
vgreduce $vg3 @V3D8
check pv_field " $dev6 " vg_name $vg3
check pv_field " $dev7 " vg_name $vg3
not check pv_field " $dev8 " vg_name $vg3
check pv_field " $dev9 " vg_name $vg3
check pv_field " $dev2 " vg_name $vg2
check pv_field " $dev3 " vg_name $vg2
check pv_field " $dev4 " vg_name $vg2
check pv_field " $dev5 " vg_name $vg2
# reset
vgextend $vg3 " $dev8 "
vgremove $vg1 $vg2 $vg3