# lib/template
# Functions to control the configuration and operation of the XXXX service
# <do not include this template file in ``stack.sh``!>

# Dependencies:
#
# - ``functions`` file
# - ``SERVICE_{TENANT_NAME|PASSWORD}`` must be defined
# - <list other global vars that are assumed to be defined>

# ``stack.sh`` calls the entry points in this order:
#
# - is_XXXX_enabled
# - install_XXXX
# - configure_XXXX
# - init_XXXX
# - start_XXXX
# - stop_XXXX
# - cleanup_XXXX

# 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
XXXX_DIR=$DEST/XXXX
XXX_CONF_DIR=/etc/XXXX


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

# Test if any XXXX services are enabled
# is_XXXX_enabled
function is_XXXX_enabled {
    [[ ,${ENABLED_SERVICES} =~ ,"XX-" ]] && return 0
    return 1
}

# cleanup_XXXX() - Remove residual data files, anything left over from previous
# runs that a clean run would need to clean up
function cleanup_XXXX() {
    # kill instances (nova)
    # delete image files (glance)
    # This function intentionally left blank
    :
}

# configure_XXXX() - Set config files, create data dirs, etc
function configure_XXXX() {
    # sudo python setup.py deploy
    # iniset $XXXX_CONF ...
    # This function intentionally left blank
    :
}

# init_XXXX() - Initialize databases, etc.
function init_XXXX() {
    # clean up from previous (possibly aborted) runs
    # create required data files
    :
}

# install_XXXX() - Collect source and prepare
function install_XXXX() {
    # git clone xxx
    :
}

# start_XXXX() - Start running processes, including screen
function start_XXXX() {
    # screen_it XXXX "cd $XXXX_DIR && $XXXX_DIR/bin/XXXX-bin"
    :
}

# stop_XXXX() - Stop running processes (non-screen)
function stop_XXXX() {
    # FIXME(dtroyer): stop only our screen screen window?
    :
}

# Restore xtrace
$XTRACE

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