# 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_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:
