#!/bin/bash
#
# lib/oslo
#
# Functions to install 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_libraries

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


# Defaults
# --------
GITDIR["automaton"]=$DEST/automaton
GITDIR["castellan"]=$DEST/castellan
GITDIR["cliff"]=$DEST/cliff
GITDIR["cursive"]=$DEST/cursive
GITDIR["debtcollector"]=$DEST/debtcollector
GITDIR["futurist"]=$DEST/futurist
GITDIR["openstacksdk"]=$DEST/openstacksdk
GITDIR["os-client-config"]=$DEST/os-client-config
GITDIR["osc-lib"]=$DEST/osc-lib
GITDIR["osc-placement"]=$DEST/osc-placement
GITDIR["oslo.cache"]=$DEST/oslo.cache
GITDIR["oslo.concurrency"]=$DEST/oslo.concurrency
GITDIR["oslo.config"]=$DEST/oslo.config
GITDIR["oslo.context"]=$DEST/oslo.context
GITDIR["oslo.db"]=$DEST/oslo.db
GITDIR["oslo.i18n"]=$DEST/oslo.i18n
GITDIR["oslo.limit"]=$DEST/oslo.limit
GITDIR["oslo.log"]=$DEST/oslo.log
GITDIR["oslo.messaging"]=$DEST/oslo.messaging
GITDIR["oslo.middleware"]=$DEST/oslo.middleware
GITDIR["oslo.policy"]=$DEST/oslo.policy
GITDIR["oslo.privsep"]=$DEST/oslo.privsep
GITDIR["oslo.reports"]=$DEST/oslo.reports
GITDIR["oslo.rootwrap"]=$DEST/oslo.rootwrap
GITDIR["oslo.serialization"]=$DEST/oslo.serialization
GITDIR["oslo.service"]=$DEST/oslo.service
GITDIR["oslo.utils"]=$DEST/oslo.utils
GITDIR["oslo.versionedobjects"]=$DEST/oslo.versionedobjects
GITDIR["oslo.vmware"]=$DEST/oslo.vmware
GITDIR["osprofiler"]=$DEST/osprofiler
GITDIR["pycadf"]=$DEST/pycadf
GITDIR["stevedore"]=$DEST/stevedore
GITDIR["taskflow"]=$DEST/taskflow
GITDIR["tooz"]=$DEST/tooz

# Non oslo libraries are welcomed below as well, this prevents
# duplication of this code.
GITDIR["os-brick"]=$DEST/os-brick
GITDIR["os-resource-classes"]=$DEST/os-resource-classes
GITDIR["os-traits"]=$DEST/os-traits

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


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

function _install_lib_from_source {
    local name=$1
    if use_library_from_git "$name"; then
        git_clone_by_name "$name"
        setup_dev_lib -bindep "$name"
    fi
}

# install_oslo - install libraries that oslo needs
function install_oslo {
    install_libs
}

# install_libs() - Install additional libraries that we need and want
# on all environments. Some will only install here if from source,
# others will always install.
function install_libs {
    _install_lib_from_source "automaton"
    _install_lib_from_source "castellan"
    _install_lib_from_source "cliff"
    _install_lib_from_source "cursive"
    _install_lib_from_source "debtcollector"
    _install_lib_from_source "futurist"
    _install_lib_from_source "openstacksdk"
    _install_lib_from_source "osc-lib"
    _install_lib_from_source "osc-placement"
    _install_lib_from_source "os-client-config"
    _install_lib_from_source "oslo.cache"
    _install_lib_from_source "oslo.concurrency"
    _install_lib_from_source "oslo.config"
    _install_lib_from_source "oslo.context"
    _install_lib_from_source "oslo.db"
    _install_lib_from_source "oslo.i18n"
    _install_lib_from_source "oslo.limit"
    _install_lib_from_source "oslo.log"
    _install_lib_from_source "oslo.messaging"
    _install_lib_from_source "oslo.middleware"
    _install_lib_from_source "oslo.policy"
    _install_lib_from_source "oslo.privsep"
    _install_lib_from_source "oslo.reports"
    _install_lib_from_source "oslo.rootwrap"
    _install_lib_from_source "oslo.serialization"
    _install_lib_from_source "oslo.service"
    _install_lib_from_source "oslo.utils"
    _install_lib_from_source "oslo.versionedobjects"
    _install_lib_from_source "oslo.vmware"
    _install_lib_from_source "osprofiler"
    _install_lib_from_source "pycadf"
    _install_lib_from_source "stevedore"
    _install_lib_from_source "taskflow"
    _install_lib_from_source "tooz"
    # installation of additional libraries
    #
    # os-traits for nova
    _install_lib_from_source "os-brick"
    _install_lib_from_source "os-resource-classes"
    _install_lib_from_source "os-traits"
    #
    # python client libraries we might need from git can go here
    _install_lib_from_source "python-barbicanclient"


    # etcd (because tooz does not have a hard dependency on these)
    #
    # NOTE(sdague): this is currently a work around because tooz
    # doesn't pull in etcd3.
    pip_install etcd3
    pip_install etcd3gw
}

# Restore xtrace
$_XTRACE_LIB_LIBRARIES

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