#!/bin/bash
#
# 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_TEMPLATE=$(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


# Functions
# ---------

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

# create_XXXX_accounts() - Create required service accounts
function create_XXXX_accounts {
    :
}

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

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