#!/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_DLM=$(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 environment.
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_DLM

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