# 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 {
    # The quoted command must be a single command and not include an
    # shell metacharacters, redirections or shell builtins.
    # run_process XXXX "$XXXX_DIR/bin/XXXX-bin"
    :
}

# stop_XXXX() - Stop running processes (non-screen)
function stop_XXXX {
    # for serv in serv-a serv-b; do
    #     stop_process $serv
    # done
    :
}

# Restore xtrace
$XTRACE

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