#!/bin/bash
#
# lib/dlm
#
# Functions to control the installation and configuration of software
# that provides a dlm (and possibly other functions). The default is
# **zookeeper**, and is going to be the only backend supported in the
# devstack tree.

# Dependencies:
#
# - ``functions`` file

# ``stack.sh`` calls the entry points in this order:
#
# - is_dlm_enabled
# - install_dlm
# - configure_dlm
# - cleanup_dlm

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


# Defaults
# --------

# <define global variables here that belong to this project>

# Set up default directories
ZOOKEEPER_DATA_DIR=$DEST/data/zookeeper
ZOOKEEPER_CONF_DIR=/etc/zookeeper


# Entry Points
# ------------
#
# NOTE(sdague): it is expected that when someone wants to implement
# another one of these out of tree, they'll implement the following
# functions:
#
# - dlm_backend
# - install_dlm
# - configure_dlm
# - cleanup_dlm

# This should be declared in the settings file of any plugin or
# service that needs to have a dlm in their enviroment.
function use_dlm {
    enable_service $(dlm_backend)
}

# A function to return the name of the backend in question, some users
# are going to need to know this.
function dlm_backend {
    echo "zookeeper"
}

# Test if a dlm is enabled (defaults to a zookeeper specific check)
function is_dlm_enabled {
    [[ ,${ENABLED_SERVICES}, =~ ,"$(dlm_backend)", ]] && return 0
    return 1
}

# cleanup_dlm() - Remove residual data files, anything left over from previous
# runs that a clean run would need to clean up
function cleanup_dlm {
    # NOTE(sdague): we don't check for is_enabled here because we
    # should just delete this regardless. Some times users updated
    # their service list before they run cleanup.
    sudo rm -rf $ZOOKEEPER_DATA_DIR
}

# configure_dlm() - Set config files, create data dirs, etc
function configure_dlm {
    if is_dlm_enabled; then
        sudo cp $FILES/zookeeper/* $ZOOKEEPER_CONF_DIR
        sudo sed -i -e 's|.*dataDir.*|dataDir='$ZOOKEEPER_DATA_DIR'|' $ZOOKEEPER_CONF_DIR/zoo.cfg
        # clean up from previous (possibly aborted) runs
        # create required data files
        sudo rm -rf $ZOOKEEPER_DATA_DIR
        sudo mkdir -p $ZOOKEEPER_DATA_DIR
        # restart after configuration, there is no reason to make this
        # another step, because having data files that don't match the
        # zookeeper running is just going to cause tears.
        restart_service zookeeper
    fi
}

# install_dlm() - Collect source and prepare
function install_dlm {
    if is_dlm_enabled; then
        if is_ubuntu; then
            install_package zookeeperd
        else
            die $LINENO "Don't know how to install zookeeper on this platform"
        fi
    fi
}

# Restore xtrace
$XTRACE

# Tell emacs to use shell-script-mode
## Local variables:
## mode: shell-script
## End:
