#!/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
# VOLUME_GROUP_NAME

# clean_cinder_backend_lvm - called from clean_cinder()
# configure_cinder_backend_lvm - called from configure_cinder()
# init_cinder_backend_lvm - called from init_cinder()
# configure_cinder_backend_conf_lvm - called from configure_cinder()


# Save trace setting
MY_XTRACE=$(set +o | grep xtrace)
set +o xtrace


# TODO: resurrect backing device...need to know how to set values
#VOLUME_BACKING_DEVICE=${VOLUME_BACKING_DEVICE:-}

# Entry Points
# ------------

# cleanup_cinder_backend_lvm - Delete volume group and remove backing file
# cleanup_cinder_backend_lvm $be_name
function cleanup_cinder_backend_lvm {
    local be_name=$1

    # Campsite rule: leave behind a volume group at least as clean as we found it
    clean_lvm_volume_group $VOLUME_GROUP_NAME-$be_name
}

# configure_cinder_backend_lvm - Set config files, create data dirs, etc
# configure_cinder_backend_lvm $be_name
function configure_cinder_backend_lvm {
    local be_name=$1

    iniset $CINDER_CONF $be_name volume_backend_name $be_name
    iniset $CINDER_CONF $be_name volume_driver "cinder.volume.drivers.lvm.LVMVolumeDriver"
    iniset $CINDER_CONF $be_name volume_group $VOLUME_GROUP_NAME-$be_name
    iniset $CINDER_CONF $be_name iscsi_helper "tgtadm"

    if [[ "$CINDER_SECURE_DELETE" == "False" ]]; then
        iniset $CINDER_CONF $be_name volume_clear none
    fi
}

# init_cinder_backend_lvm - Initialize volume group
# init_cinder_backend_lvm $be_name
function init_cinder_backend_lvm {
    local be_name=$1

    # Start with a clean volume group
    init_lvm_volume_group $VOLUME_GROUP_NAME-$be_name $VOLUME_BACKING_FILE_SIZE
}

# configure_cinder_backend_conf_lvm - Sets device filter in /etc/cinder/lvm.conf
# init_cinder_backend_lvm
function configure_cinder_backend_conf_lvm {
    local filter_suffix='"r/.*/" ]'
    local filter_string="filter = [ "
    local conf_entries=$(grep volume_group /etc/cinder/cinder.conf | sed "s/ //g")
    local pv
    local vg
    local line

    for pv_info in $(sudo pvs --noheadings -o name,vg_name --separator ';'); do
        echo_summary "Evaluate PV info for Cinder lvm.conf: $pv_info"
        IFS=';' read pv vg <<< "$pv_info"
        for line in ${conf_entries}; do
            IFS='=' read label group <<< "$line"
            group=$(echo $group|sed "s/^ *//g")
            if [[ "$vg" == "$group" ]]; then
                new="\"a$pv/\", "
                filter_string=$filter_string$new
            fi
        done
    done
    filter_string=$filter_string$filter_suffix

    # FIXME(jdg): Possible odd case that the lvm.conf file has been modified
    # and doesn't have a filter entry to search/replace.  For devstack don't
    # know that we care, but could consider adding a check and add
    sudo sed -i "s#^[ \t]*filter.*#    $filter_string#g" /etc/cinder/lvm.conf
    echo "set LVM filter_strings: $filter_string"
}
# Restore xtrace
$MY_XTRACE

# mode: shell-script
# End:
