# lib/oslo
#
# Functions to install oslo libraries from git
#
# We need this to handle the fact that projects would like to use
# pre-released versions of oslo libraries.

# Dependencies:
#
# - ``functions`` file

# ``stack.sh`` calls the entry points in this order:
#
# - install_oslo

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


# Defaults
# --------
CLIFF_DIR=$DEST/cliff
OSLOCFG_DIR=$DEST/oslo.config
OSLODB_DIR=$DEST/oslo.db
OSLOMSG_DIR=$DEST/oslo.messaging
OSLORWRAP_DIR=$DEST/oslo.rootwrap
OSLOVMWARE_DIR=$DEST/oslo.vmware
PYCADF_DIR=$DEST/pycadf
STEVEDORE_DIR=$DEST/stevedore
TASKFLOW_DIR=$DEST/taskflow

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

# install_oslo() - Collect source and prepare
function install_oslo {
    # TODO(sdague): remove this once we get to Icehouse, this just makes
    # for a smoother transition of existing users.
    cleanup_oslo

    git_clone $CLIFF_REPO $CLIFF_DIR $CLIFF_BRANCH
    setup_install $CLIFF_DIR

    git_clone $OSLOCFG_REPO $OSLOCFG_DIR $OSLOCFG_BRANCH
    setup_install $OSLOCFG_DIR

    git_clone $OSLOMSG_REPO $OSLOMSG_DIR $OSLOMSG_BRANCH
    setup_install $OSLOMSG_DIR

    git_clone $OSLORWRAP_REPO $OSLORWRAP_DIR $OSLORWRAP_BRANCH
    setup_install $OSLORWRAP_DIR

    git_clone $OSLODB_REPO $OSLODB_DIR $OSLODB_BRANCH
    setup_install $OSLODB_DIR

    git_clone $OSLOVMWARE_REPO $OSLOVMWARE_DIR $OSLOVMWARE_BRANCH
    setup_install $OSLOVMWARE_DIR

    git_clone $PYCADF_REPO $PYCADF_DIR $PYCADF_BRANCH
    setup_install $PYCADF_DIR

    git_clone $STEVEDORE_REPO $STEVEDORE_DIR $STEVEDORE_BRANCH
    setup_install $STEVEDORE_DIR

    git_clone $TASKFLOW_REPO $TASKFLOW_DIR $TASKFLOW_BRANCH
    setup_install $TASKFLOW_DIR
}

# cleanup_oslo() - purge possibly old versions of oslo
function cleanup_oslo {
    # this means we've got an old oslo installed, lets get rid of it
    if ! python -c 'import oslo.config' 2>/dev/null; then
        echo "Found old oslo.config... removing to ensure consistency"
        local PIP_CMD=$(get_pip_command)
        pip_install oslo.config
        sudo $PIP_CMD uninstall -y oslo.config
    fi
}

# Restore xtrace
$XTRACE

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