
This makes a bunch of variable cleanups that will let -o nounset function, for the time being we hide nounset behind another setting variable so that it's not on by default. Because this is bash, and things are only executed on demand, this probably only works in the config it was run in. Expect cleaning up all the paths to be something that takes quite a while. This also includes a new set of unit tests around the trueorfalse function, because my change in how it worked, didn't. Tests are good m'kay. Change-Id: I71a896623ea9e1f042a73dc0678ce85acf0dc87d
184 lines
5.6 KiB
Bash
184 lines
5.6 KiB
Bash
#!/bin/bash
|
|
#
|
|
# lib/cinder_backends/lvm
|
|
# Configure the LVM backend
|
|
|
|
# Enable with:
|
|
#
|
|
# CINDER_ENABLED_BACKENDS+=,lvm:lvmname
|
|
|
|
# Dependencies:
|
|
#
|
|
# - ``functions`` file
|
|
# - ``cinder`` configurations
|
|
|
|
# CINDER_CONF
|
|
# DATA_DIR
|
|
|
|
# clean_cinder_backend_lvm - called from clean_cinder()
|
|
# configure_cinder_backend_lvm - called from configure_cinder()
|
|
# init_cinder_backend_lvm - called from init_cinder()
|
|
|
|
|
|
# Save trace setting
|
|
MY_XTRACE=$(set +o | grep xtrace)
|
|
set +o xtrace
|
|
|
|
|
|
# Defaults
|
|
# --------
|
|
|
|
# Name of the lvm volume groups to use/create for iscsi volumes
|
|
# This monkey-motion is for compatibility with icehouse-generation Grenade
|
|
# If ``VOLUME_GROUP`` is set, use it, otherwise we'll build a VG name based
|
|
# on ``VOLUME_GROUP_NAME`` that includes the backend name
|
|
# Grenade doesn't use ``VOLUME_GROUP2`` so it is left out
|
|
VOLUME_GROUP=${VOLUME_GROUP:-}
|
|
VOLUME_GROUP_NAME=${VOLUME_GROUP:-${VOLUME_GROUP_NAME:-stack-volumes}}
|
|
|
|
# TODO: resurrect backing device...need to know how to set values
|
|
#VOLUME_BACKING_DEVICE=${VOLUME_BACKING_DEVICE:-}
|
|
|
|
VOLUME_NAME_PREFIX=${VOLUME_NAME_PREFIX:-volume-}
|
|
|
|
|
|
# Entry Points
|
|
# ------------
|
|
|
|
# Compatibility for getting a volume group name from either ``VOLUME_GROUP``
|
|
# or from ``VOLUME_GROUP_NAME`` plus the backend name
|
|
function get_volume_group_name {
|
|
local be_name=$1
|
|
|
|
# Again with the icehouse-generation compatibility
|
|
local volume_group_name=$VOLUME_GROUP_NAME
|
|
if [[ -z $VOLUME_GROUP ]]; then
|
|
volume_group_name+="-$be_name"
|
|
fi
|
|
echo $volume_group_name
|
|
}
|
|
|
|
function cleanup_cinder_backend_lvm {
|
|
local be_name=$1
|
|
|
|
# Again with the icehouse-generation compatibility
|
|
local volume_group_name=$(get_volume_group_name $be_name)
|
|
|
|
# Campsite rule: leave behind a volume group at least as clean as we found it
|
|
_clean_lvm_lv ${volume_group_name} $VOLUME_NAME_PREFIX
|
|
_clean_lvm_backing_file ${volume_group_name} $DATA_DIR/${volume_group_name}-backing-file
|
|
}
|
|
|
|
# configure_cinder_backend_lvm - Set config files, create data dirs, etc
|
|
# configure_cinder_backend_lvm $name
|
|
function configure_cinder_backend_lvm {
|
|
local be_name=$1
|
|
|
|
# Again with the icehouse-generation compatibility
|
|
local volume_group_name=$(get_volume_group_name $be_name)
|
|
|
|
iniset $CINDER_CONF $be_name volume_backend_name $be_name
|
|
iniset $CINDER_CONF $be_name volume_driver "cinder.volume.drivers.lvm.LVMISCSIDriver"
|
|
iniset $CINDER_CONF $be_name volume_group $volume_group_name
|
|
|
|
if [[ "$CINDER_SECURE_DELETE" == "False" ]]; then
|
|
iniset $CINDER_CONF $be_name volume_clear none
|
|
fi
|
|
}
|
|
|
|
|
|
function init_cinder_backend_lvm {
|
|
local be_name=$1
|
|
|
|
# Again with the icehouse-generation compatibility
|
|
local volume_group_name=$(get_volume_group_name $be_name)
|
|
|
|
# Start with a clean volume group
|
|
_create_cinder_volume_group ${volume_group_name} $DATA_DIR/${volume_group_name}-backing-file
|
|
|
|
if is_fedora || is_suse; then
|
|
# service is not started by default
|
|
start_service tgtd
|
|
fi
|
|
|
|
# Remove iscsi targets
|
|
sudo tgtadm --op show --mode target | grep $VOLUME_NAME_PREFIX | grep Target | cut -f3 -d ' ' | sudo xargs -n1 tgt-admin --delete || true
|
|
_clean_lvm_lv ${volume_group_name} $VOLUME_NAME_PREFIX
|
|
}
|
|
|
|
|
|
# _clean_lvm_lv removes all cinder LVM volumes
|
|
#
|
|
# Usage: _clean_lvm_lv volume-group-name $VOLUME_NAME_PREFIX
|
|
function _clean_lvm_lv {
|
|
local vg=$1
|
|
local lv_prefix=$2
|
|
|
|
# Clean out existing volumes
|
|
local lv
|
|
for lv in $(sudo lvs --noheadings -o lv_name $vg 2>/dev/null); do
|
|
# lv_prefix prefixes the LVs we want
|
|
if [[ "${lv#$lv_prefix}" != "$lv" ]]; then
|
|
sudo lvremove -f $vg/$lv
|
|
fi
|
|
done
|
|
}
|
|
|
|
# _clean_lvm_backing_file() removes the backing file of the
|
|
# volume group used by cinder
|
|
#
|
|
# Usage: _clean_lvm_backing_file() volume-group-name backing-file-name
|
|
function _clean_lvm_backing_file {
|
|
local vg=$1
|
|
local backing_file=$2
|
|
|
|
# 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
|
|
# if the backing physical device is a loop device, it was probably setup by devstack
|
|
local vg_dev=$(sudo losetup -j $backing_file | awk -F':' '/backing-file/ { print $1}')
|
|
if [[ -n "$vg_dev" ]] && [[ -e "$vg_dev" ]]; then
|
|
sudo losetup -d $vg_dev
|
|
rm -f $backing_file
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# _create_cinder_volume_group volume-group-name backing-file-name
|
|
function _create_cinder_volume_group {
|
|
# According to the ``CINDER_MULTI_LVM_BACKEND`` value, configure one or two default volumes
|
|
# group called ``stack-volumes`` (and ``stack-volumes2``) for the volume
|
|
# service if it (they) does (do) not yet exist. If you don't wish to use a
|
|
# file backed volume group, create your own volume group called ``stack-volumes``
|
|
# and ``stack-volumes2`` before invoking ``stack.sh``.
|
|
#
|
|
# The two backing files are ``VOLUME_BACKING_FILE_SIZE`` in size, and they are stored in
|
|
# the ``DATA_DIR``.
|
|
|
|
local vg_name=$1
|
|
local backing_file=$2
|
|
|
|
if ! sudo vgs $vg_name; then
|
|
# TODO: fix device handling
|
|
if [ -z "$VOLUME_BACKING_DEVICE" ]; then
|
|
# Only create if the file doesn't already exists
|
|
[[ -f $backing_file ]] || truncate -s $VOLUME_BACKING_FILE_SIZE $backing_file
|
|
local vg_dev=`sudo losetup -f --show $backing_file`
|
|
|
|
# Only create if the loopback device doesn't contain $VOLUME_GROUP
|
|
if ! sudo vgs $vg_name; then
|
|
sudo vgcreate $vg_name $vg_dev
|
|
fi
|
|
else
|
|
sudo vgcreate $vg_name $VOLUME_BACKING_DEVICE
|
|
fi
|
|
fi
|
|
}
|
|
|
|
|
|
# Restore xtrace
|
|
$MY_XTRACE
|
|
|
|
# mode: shell-script
|
|
# End:
|