1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-22 17:35:59 +03:00
lvm2/test/lib/get.sh
Zdenek Kabelac 8e5305f630 tests: correct usage of pipe
This is somewhat tricky - for test suite we keep using
'set -e -o pipefail'  - the effect here is - we get error report
from any 'failing' command in whole pipeline - thus when something
like this:   'lvs | head -1'  is used - and  'head' finishes before
lead 'lvs' is done - it recieves SIGPIPE and exits with error,
and somewhat misleading gets occasionally reported depending
of speed of commands.

For this case we have to avoid using standard pipes and rather
switch to using streamed results with temporary output file.
This is all nicely handled with bash feature '< <()'.

For more info:
https://stackoverflow.com/questions/41516177/bash-zcat-head-causes-pipefail
2018-02-19 16:45:10 +01:00

122 lines
2.8 KiB
Bash

#!/usr/bin/env bash
# Copyright (C) 2011-2017 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
# get.sh: get various values from volumes
#
# USAGE:
# get pv_field PV field [pvs params]
# get vg_field VG field [vgs params]
# get lv_field LV field [lvs params]
#
# get lv_devices LV [lvs params]
test -z "$BASH" || set -e -o pipefail
# trims only leading prefix and suffix
trim_() {
rm -f debug.log # drop log, command was ok
local var=${1%${1##*[! ]}} # remove trailing space characters
echo "${var#${var%%[! ]*}}" # remove leading space characters
}
pv_field() {
local r
r=$(pvs --config 'log{prefix=""}' --noheadings -o "$2" "${@:3}" "$1")
trim_ "$r"
}
vg_field() {
local r
r=$(vgs --config 'log{prefix=""}' --noheadings -o "$2" "${@:3}" "$1")
trim_ "$r"
}
lv_field() {
local r
r=$(lvs --config 'log{prefix=""}' --noheadings -o "$2" "${@:3}" "$1")
trim_ "$r"
}
lv_first_seg_field() {
local r
r=$(head -1 < <(lvs --config 'log{prefix=""}' --unbuffered --noheadings -o "$2" "${@:3}" "$1"))
trim_ "$r"
}
lvh_field() {
local r
r=$(lvs -H --config 'log{prefix=""}' --noheadings -o "$2" "${@:3}" "$1")
trim_ "$r"
}
lva_field() {
local r
r=$(lvs -a --config 'log{prefix=""}' --noheadings -o "$2" "${@:3}" "$1")
trim_ "$r"
}
lv_devices() {
lv_field "$1" devices -a "${@:2}" | sed 's/([^)]*)//g; s/,/\n/g'
}
lv_field_lv_() {
lv_field "$1" "$2" -a --unbuffered | tr -d []
}
lv_tree_devices_() {
local lv="$1/$2"
local type
type=$(lv_first_seg_field "$lv" segtype -a)
#local orig
#orig=$(lv_field_lv_ "$lv" origin)
# FIXME: should we count in also origins ?
#test -z "$orig" || lv_tree_devices_ $1 $orig
case "$type" in
linear|striped)
lv_devices "$lv"
;;
mirror|raid*)
local log
log=$(lv_field_lv_ "$lv" mirror_log)
test -z "$log" || lv_tree_devices_ "$1" "$log"
for i in $(lv_devices "$lv")
do lv_tree_devices_ "$1" "$i"; done
;;
thin)
lv_tree_devices_ "$1" "$(lv_field_lv_ "$lv" pool_lv)"
;;
thin-pool)
lv_tree_devices_ "$1" "$(lv_field_lv_ "$lv" data_lv)"
lv_tree_devices_ "$1" "$(lv_field_lv_ "$lv" metadata_lv)"
;;
cache)
lv_tree_devices_ "$1" "$(lv_devices "$lv")"
;;
cache-pool)
lv_tree_devices_ "$1" "$(lv_field_lv_ "$lv" data_lv)"
lv_tree_devices_ "$1" "$(lv_field_lv_ "$lv" metadata_lv)"
;;
esac
}
lv_tree_devices() {
lv_tree_devices_ "$@" | sort | uniq
}
first_extent_sector() {
pv_field "$@" pe_start --units s --nosuffix
}
#set -x
unset LVM_VALGRIND
unset LVM_LOG_FILE_EPOCH
"$@"