#!/bin/bash
#
# lib/cinder_backends/ceph
# Configure the ceph backend

# Enable with:
#
#   CINDER_ENABLED_BACKENDS+=,ceph:ceph
#
# Optional parameters:
#   CINDER_BAK_CEPH_POOL=<pool-name>
#   CINDER_BAK_CEPH_USER=<user>
#   CINDER_BAK_CEPH_POOL_PG=<pg-num>
#   CINDER_BAK_CEPH_POOL_PGP=<pgp-num>

# Dependencies:
#
# - ``functions`` file
# - ``cinder`` configurations

# configure_ceph_backend_lvm - called from configure_cinder()


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


# Defaults
# --------

CINDER_BAK_CEPH_POOL=${CINDER_BAK_CEPH_POOL:-backups}
CINDER_BAK_CEPH_POOL_PG=${CINDER_BAK_CEPH_POOL_PG:-8}
CINDER_BAK_CEPH_POOL_PGP=${CINDER_BAK_CEPH_POOL_PGP:-8}
CINDER_BAK_CEPH_USER=${CINDER_BAK_CEPH_USER:-cinder-bak}


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

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

    iniset $CINDER_CONF $be_name volume_backend_name $be_name
    iniset $CINDER_CONF $be_name volume_driver "cinder.volume.drivers.rbd.RBDDriver"
    iniset $CINDER_CONF $be_name rbd_ceph_conf "$CEPH_CONF"
    iniset $CINDER_CONF $be_name rbd_pool "$CINDER_CEPH_POOL"
    iniset $CINDER_CONF $be_name rbd_user "$CINDER_CEPH_USER"
    iniset $CINDER_CONF $be_name rbd_uuid "$CINDER_CEPH_UUID"
    iniset $CINDER_CONF $be_name rbd_flatten_volume_from_snapshot False
    iniset $CINDER_CONF $be_name rbd_max_clone_depth 5
    iniset $CINDER_CONF DEFAULT glance_api_version 2

    if is_service_enabled c-bak; then
        sudo ceph -c ${CEPH_CONF_FILE} osd pool create ${CINDER_BAK_CEPH_POOL} ${CINDER_BAK_CEPH_POOL_PG} ${CINDER_BAK_CEPH_POOL_PGP}
        if [ "$REMOTE_CEPH" = "False" ]; then
            # Configure Cinder backup service options, ceph pool, ceph user and ceph key
            sudo ceph -c ${CEPH_CONF_FILE} osd pool set ${CINDER_BAK_CEPH_POOL} size ${CEPH_REPLICAS}
            if [[ $CEPH_REPLICAS -ne 1 ]]; then
                sudo ceph -c ${CEPH_CONF_FILE} osd pool set ${CINDER_BAK_CEPH_POOL} crush_ruleset ${RULE_ID}
            fi
        fi
        sudo ceph -c ${CEPH_CONF_FILE} auth get-or-create client.${CINDER_BAK_CEPH_USER} mon "allow r" osd "allow class-read object_prefix rbd_children, allow rwx pool=${CINDER_BAK_CEPH_POOL}, allow rwx pool=${CINDER_CEPH_POOL}" | sudo tee ${CEPH_CONF_DIR}/ceph.client.${CINDER_BAK_CEPH_USER}.keyring
        sudo chown $(whoami):$(whoami) ${CEPH_CONF_DIR}/ceph.client.${CINDER_BAK_CEPH_USER}.keyring

        iniset $CINDER_CONF DEFAULT backup_driver "cinder.backup.drivers.ceph"
        iniset $CINDER_CONF DEFAULT backup_ceph_conf "$CEPH_CONF"
        iniset $CINDER_CONF DEFAULT backup_ceph_pool "$CINDER_BAK_CEPH_POOL"
        iniset $CINDER_CONF DEFAULT backup_ceph_user "$CINDER_BAK_CEPH_USER"
        iniset $CINDER_CONF DEFAULT backup_ceph_stripe_unit 0
        iniset $CINDER_CONF DEFAULT backup_ceph_stripe_count 0
        iniset $CINDER_CONF DEFAULT restore_discard_excess_bytes True
    fi
}

# Restore xtrace
$_XTRACE_CINDER_CEPH

# Local variables:
# mode: shell-script
# End:
