#!/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
MY_XTRACE=$(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}" | 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
$MY_XTRACE

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