devstack/lib/lvm
Bogdan Katynski 8175df1912 Remove VGs when cleaning LVM up in devstack
This patch adds removing of the volume group
before removing the loopback device and
the backing file when performing LVM cleanup
in unstack.sh

Without this commit:

unstack.sh removes logical volumes, removes the
loopback devices and deletes the backing file
but leaves a dangling volume group

  $ ./stack.sh && ./unstack.sh
  $ sudo vgs
  VG                    #PV #LV #SN Attr   VSize  VFree
  stack-volumes-default   1   0   0 wz--n- 10.01g 10.01g
  $ sudo losetup -a
  $ sudo vgremove stack-volumes-default
  /dev/loop0: lseek 4096 failed: Invalid argument
  vg_remove_mdas stack-volumes-default failed

With this commit:

unstack.sh removes volume groups after removing
all logical volumes but before removing
the loopback device and deleting the backing file

Partial-Bug: 1441236
Change-Id: Id9c06fa50f6cad28764f5a3396f559cac9999649
2017-07-12 09:34:52 +00:00

198 lines
5.4 KiB
Bash

#!/bin/bash
#
# lib/lvm
# Configure the default LVM volume group used by Cinder and Nova
# Dependencies:
#
# - ``functions`` file
# - ``cinder`` configurations
# DATA_DIR
# clean_default_volume_group - called from clean()
# configure_default_volume_group - called from configure()
# init_default_volume_group - called from init()
# Save trace setting
_XTRACE_LVM=$(set +o | grep xtrace)
set +o xtrace
# Defaults
# --------
# Name of the lvm volume groups to use/create for iscsi volumes
VOLUME_GROUP_NAME=${VOLUME_GROUP_NAME:-stack-volumes}
DEFAULT_VOLUME_GROUP_NAME=$VOLUME_GROUP_NAME-default
# Backing file name is of the form $VOLUME_GROUP$BACKING_FILE_SUFFIX
BACKING_FILE_SUFFIX=-backing-file
# Functions
# ---------
# _clean_lvm_volume_group removes all default LVM volumes
#
# Usage: _clean_lvm_volume_group $vg
function _clean_lvm_volume_group {
local vg=$1
# Clean out existing volumes
sudo lvremove -f $vg
}
# _remove_lvm_volume_group removes the volume group
#
# Usage: _remove_lvm_volume_group $vg
function _remove_lvm_volume_group {
local vg=$1
# Remove the volume group
sudo vgremove -f $vg
}
# _clean_lvm_backing_file() removes the backing file of the
# volume group
#
# Usage: _clean_lvm_backing_file() $backing_file
function _clean_lvm_backing_file {
local backing_file=$1
# If the backing physical device is a loop device, it was probably setup by DevStack
if [[ -n "$backing_file" ]] && [[ -e "$backing_file" ]]; then
local vg_dev
vg_dev=$(sudo losetup -j $backing_file | awk -F':' '/'$BACKING_FILE_SUFFIX'/ { print $1}')
if [[ -n "$vg_dev" ]]; then
sudo losetup -d $vg_dev
fi
rm -f $backing_file
fi
}
# clean_lvm_volume_group() cleans up the volume group and removes the
# backing file
#
# Usage: clean_lvm_volume_group $vg
function clean_lvm_volume_group {
local vg=$1
_clean_lvm_volume_group $vg
_remove_lvm_volume_group $vg
# if there is no logical volume left, it's safe to attempt a cleanup
# of the backing file
if [[ -z "$(sudo lvs --noheadings -o lv_name $vg 2>/dev/null)" ]]; then
_clean_lvm_backing_file $DATA_DIR/$vg$BACKING_FILE_SUFFIX
fi
}
# _create_lvm_volume_group creates default volume group
#
# Usage: _create_lvm_volume_group() $vg $size
function _create_lvm_volume_group {
local vg=$1
local size=$2
local backing_file=$DATA_DIR/$vg$BACKING_FILE_SUFFIX
if ! sudo vgs $vg; then
# Only create if the file doesn't already exists
[[ -f $backing_file ]] || truncate -s $size $backing_file
local vg_dev
vg_dev=`sudo losetup -f --show $backing_file`
# Only create volume group if it doesn't already exist
if ! sudo vgs $vg; then
sudo vgcreate $vg $vg_dev
fi
fi
}
# init_lvm_volume_group() initializes the volume group creating the backing
# file if necessary
#
# Usage: init_lvm_volume_group() $vg $size
function init_lvm_volume_group {
local vg=$1
local size=$2
# Start the lvmetad and tgtd services
if is_fedora || is_suse; then
# services is not started by default
start_service lvm2-lvmetad
if [ "$CINDER_ISCSI_HELPER" = "tgtadm" ]; then
start_service tgtd
fi
fi
# Start with a clean volume group
_create_lvm_volume_group $vg $size
# Remove iscsi targets
if [ "$CINDER_ISCSI_HELPER" = "lioadm" ]; then
sudo cinder-rtstool get-targets | sudo xargs -rn 1 cinder-rtstool delete
else
sudo tgtadm --op show --mode target | awk '/Target/ {print $3}' | sudo xargs -r -n1 tgt-admin --delete
fi
_clean_lvm_volume_group $vg
}
# Sentinal value to ensure that init of default lvm volume group is
# only performed once across calls of init_default_lvm_volume_group.
_DEFAULT_LVM_INIT=${_DEFAULT_LVM_INIT:-0}
# init_default_lvm_volume_group() initializes a default volume group
# intended to be shared between cinder and nova. It is idempotent;
# the init of the default volume group is guaranteed to be performed
# only once so that either or both of the dependent services can
# safely call this function.
#
# Usage: init_default_lvm_volume_group()
function init_default_lvm_volume_group {
if [[ "$_DEFAULT_LVM_INIT" = "0" ]]; then
init_lvm_volume_group $DEFAULT_VOLUME_GROUP_NAME $VOLUME_BACKING_FILE_SIZE
_DEFAULT_LVM_INIT=1
fi
}
# clean_lvm_filter() Remove the filter rule set in set_lvm_filter()
#
# Usage: clean_lvm_filter()
function clean_lvm_filter {
sudo sed -i "s/^.*# from devstack$//" /etc/lvm/lvm.conf
}
# set_lvm_filter() Gather all devices configured for LVM and
# use them to build a global device filter
# set_lvm_filter() Create a device filter
# and add to /etc/lvm.conf. Note this uses
# all current PV's in use by LVM on the
# system to build it's filter.
#
# Usage: set_lvm_filter()
function set_lvm_filter {
local filter_suffix='"r|.*|" ] # from devstack'
local filter_string="global_filter = [ "
local pv
local vg
local line
for pv_info in $(sudo pvs --noheadings -o name); do
pv=$(echo -e "${pv_info}" | sed 's/ //g' | sed 's/\/dev\///g')
new="\"a|$pv|\", "
filter_string=$filter_string$new
done
filter_string=$filter_string$filter_suffix
clean_lvm_filter
sudo sed -i "/# global_filter = \[*\]/a\ $global_filter$filter_string" /etc/lvm/lvm.conf
echo_summary "set lvm.conf device global_filter to: $filter_string"
}
# Restore xtrace
$_XTRACE_LVM
# mode: shell-script
# End: