#!/bin/bash
#
# lib/cinder_backups/ceph
# Configure the ceph backup driver

# Enable with:
#
#   CINDER_BACKUP_DRIVER=ceph

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

# 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}


function configure_cinder_backup_ceph {
    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.CephBackupDriver"
    iniset $CINDER_CONF DEFAULT backup_ceph_conf "$CEPH_CONF_FILE"
    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
}

# init_cinder_backup_ceph: nothing to do
# cleanup_cinder_backup_ceph: nothing to do

# Restore xtrace
$_XTRACE_CINDER_CEPH

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