#!/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 {
    [[ ,${DISABLED_SERVICES} =~ ,"XXXX" ]] && return 1
    [[ ,${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
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
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:
