# lib/gantt
# Install and start **Gantt** scheduler service

# Dependencies:
#
# - functions
# - DEST, DATA_DIR, STACK_USER must be defined

# stack.sh
# ---------
# - install_gantt
# - configure_gantt
# - init_gantt
# - start_gantt
# - stop_gantt
# - cleanup_gantt

# Save trace setting
XTRACE=$(set +o | grep xtrace)
set +o xtrace

# Defaults
# --------

# set up default directories
GANTT_DIR=$DEST/gantt
GANTT_STATE_PATH=${GANTT_STATE_PATH:=$DATA_DIR/gantt}
GANTT_REPO=${GANTT_REPO:-${GIT_BASE}/openstack/gantt.git}
GANTT_BRANCH=${GANTT_BRANCH:-master}

GANTTCLIENT_DIR=$DEST/python-ganttclient
GANTTCLIENT_REPO=${GANTT_REPO:-${GIT_BASE}/openstack/python-ganttclient.git}
GANTTCLIENT_BRANCH=${GANTT_BRANCH:-master}

# eventually we will have a separate gantt config
# file but for compatibility reasone stick with
# nova.conf for now
GANTT_CONF_DIR=${GANTT_CONF_DIR:-/etc/nova}
GANTT_CONF=$GANTT_CONF_DIR/nova.conf

# Support entry points installation of console scripts
GANTT_BIN_DIR=$(get_python_exec_prefix)


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

# cleanup_gantt() - Remove residual data files, anything left over from previous
# runs that a clean run would need to clean up
function cleanup_gantt() {
    echo "Cleanup Gantt"
}

# configure_gantt() - Set config files, create data dirs, etc
function configure_gantt() {
    echo "Configure Gantt"
}

# init_gantt() - Initialize database and volume group
function init_gantt() {
    echo "Initialize Gantt"
}

# install_gantt() - Collect source and prepare
function install_gantt() {
    git_clone $GANTT_REPO $GANTT_DIR $GANTT_BRANCH
    setup_develop $GANTT_DIR
}

# install_ganttclient() - Collect source and prepare
function install_ganttclient() {
    echo "Install Gantt Client"
#    git_clone $GANTTCLIENT_REPO $GANTTCLIENT_DIR $GANTTCLIENT_BRANCH
#    setup_develop $GANTTCLIENT_DIR
}

# start_gantt() - Start running processes, including screen
function start_gantt() {
    if is_service_enabled gantt; then
        screen_it gantt "cd $GANTT_DIR && $GANTT_BIN_DIR/gantt-scheduler --config-file $GANTT_CONF"
    fi
}

# stop_gantt() - Stop running processes
function stop_gantt() {
    echo "Stop Gantt"
    screen_stop gantt
}

# Restore xtrace
$XTRACE

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