#!/bin/bash
#
# lib/heat
# Install and start **Heat** service

# To enable, add the following to localrc
#
#   ENABLED_SERVICES+=,heat,h-api,h-api-cfn,h-api-cw,h-eng

# Dependencies:
# (none)

# stack.sh
# ---------
# - install_heatclient
# - install_heat
# - configure_heatclient
# - configure_heat
# - _config_heat_apache_wsgi
# - init_heat
# - start_heat
# - stop_heat
# - cleanup_heat

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


# Defaults
# --------

# set up default directories
GITDIR["python-heatclient"]=$DEST/python-heatclient

# Toggle for deploying Heat-API under HTTPD + mod_wsgi
HEAT_USE_MOD_WSGI=${HEAT_USE_MOD_WSGI:-False}

HEAT_DIR=$DEST/heat
HEAT_CFNTOOLS_DIR=$DEST/heat-cfntools
HEAT_TEMPLATES_REPO_DIR=$DEST/heat-templates
OCC_DIR=$DEST/os-collect-config
DIB_UTILS_DIR=$DEST/dib-utils
ORC_DIR=$DEST/os-refresh-config
OAC_DIR=$DEST/os-apply-config

HEAT_PIP_REPO=$DATA_DIR/heat-pip-repo
HEAT_PIP_REPO_PORT=${HEAT_PIP_REPO_PORT:-8899}

HEAT_AUTH_CACHE_DIR=${HEAT_AUTH_CACHE_DIR:-/var/cache/heat}
HEAT_STANDALONE=$(trueorfalse False HEAT_STANDALONE)
HEAT_ENABLE_ADOPT_ABANDON=$(trueorfalse False HEAT_ENABLE_ADOPT_ABANDON)
HEAT_CONF_DIR=/etc/heat
HEAT_CONF=$HEAT_CONF_DIR/heat.conf
HEAT_ENV_DIR=$HEAT_CONF_DIR/environment.d
HEAT_TEMPLATES_DIR=$HEAT_CONF_DIR/templates
HEAT_API_HOST=${HEAT_API_HOST:-$HOST_IP}
HEAT_API_PORT=${HEAT_API_PORT:-8004}
HEAT_SERVICE_USER=${HEAT_SERVICE_USER:-heat}
HEAT_TRUSTEE_USER=${HEAT_TRUSTEE_USER:-$HEAT_SERVICE_USER}
HEAT_TRUSTEE_PASSWORD=${HEAT_TRUSTEE_PASSWORD:-$SERVICE_PASSWORD}
HEAT_TRUSTEE_DOMAIN=${HEAT_TRUSTEE_DOMAIN:-default}

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

# other default options
if [[ "$HEAT_STANDALONE" = "True" ]]; then
    # for standalone, use defaults which require no service user
    HEAT_STACK_DOMAIN=$(trueorfalse False HEAT_STACK_DOMAIN)
    HEAT_DEFERRED_AUTH=${HEAT_DEFERRED_AUTH:-password}
    if [[ ${HEAT_DEFERRED_AUTH} != "password" ]]; then
        # Heat does not support keystone trusts when deployed in
        # standalone mode
        die $LINENO \
            'HEAT_DEFERRED_AUTH can only be set to "password" when HEAT_STANDALONE is True.'
    fi
else
    HEAT_STACK_DOMAIN=$(trueorfalse True HEAT_STACK_DOMAIN)
    HEAT_DEFERRED_AUTH=${HEAT_DEFERRED_AUTH:-}
fi
HEAT_PLUGIN_DIR=${HEAT_PLUGIN_DIR:-$DATA_DIR/heat/plugins}
ENABLE_HEAT_PLUGINS=${ENABLE_HEAT_PLUGINS:-}

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

# Test if any Heat services are enabled
# is_heat_enabled
function is_heat_enabled {
    [[ ,${ENABLED_SERVICES} =~ ,"h-" ]] && return 0
    return 1
}

# cleanup_heat() - Remove residual data files, anything left over from previous
# runs that a clean run would need to clean up
function cleanup_heat {
    sudo rm -rf $HEAT_AUTH_CACHE_DIR
    sudo rm -rf $HEAT_ENV_DIR
    sudo rm -rf $HEAT_TEMPLATES_DIR
    sudo rm -rf $HEAT_CONF_DIR
}

# configure_heat() - Set config files, create data dirs, etc
function configure_heat {

    sudo install -d -o $STACK_USER $HEAT_CONF_DIR
    # remove old config files
    rm -f $HEAT_CONF_DIR/heat-*.conf

    HEAT_API_CFN_HOST=${HEAT_API_CFN_HOST:-$HOST_IP}
    HEAT_API_CFN_PORT=${HEAT_API_CFN_PORT:-8000}
    HEAT_ENGINE_HOST=${HEAT_ENGINE_HOST:-$SERVICE_HOST}
    HEAT_ENGINE_PORT=${HEAT_ENGINE_PORT:-8001}
    HEAT_API_CW_HOST=${HEAT_API_CW_HOST:-$HOST_IP}
    HEAT_API_CW_PORT=${HEAT_API_CW_PORT:-8003}
    HEAT_API_PASTE_FILE=$HEAT_CONF_DIR/api-paste.ini
    HEAT_POLICY_FILE=$HEAT_CONF_DIR/policy.json

    cp $HEAT_DIR/etc/heat/api-paste.ini $HEAT_API_PASTE_FILE
    cp $HEAT_DIR/etc/heat/policy.json $HEAT_POLICY_FILE

    # common options
    iniset_rpc_backend heat $HEAT_CONF
    iniset $HEAT_CONF DEFAULT heat_metadata_server_url http://$HEAT_API_CFN_HOST:$HEAT_API_CFN_PORT
    iniset $HEAT_CONF DEFAULT heat_waitcondition_server_url http://$HEAT_API_CFN_HOST:$HEAT_API_CFN_PORT/v1/waitcondition
    iniset $HEAT_CONF DEFAULT heat_watch_server_url http://$HEAT_API_CW_HOST:$HEAT_API_CW_PORT
    iniset $HEAT_CONF database connection `database_connection_url heat`
    iniset $HEAT_CONF DEFAULT auth_encryption_key $(generate_hex_string 16)

    iniset $HEAT_CONF DEFAULT region_name_for_services "$REGION_NAME"

    # logging
    iniset $HEAT_CONF DEFAULT debug $ENABLE_DEBUG_LOG_LEVEL
    iniset $HEAT_CONF DEFAULT use_syslog $SYSLOG
    if [ "$LOG_COLOR" == "True" ] && [ "$SYSLOG" == "False" ] && [ "$HEAT_USE_MOD_WSGI" == "False" ]  ; then
        # Add color to logging output
        setup_colorized_logging $HEAT_CONF DEFAULT tenant user
    fi

    if [ ! -z "$HEAT_DEFERRED_AUTH" ]; then
        iniset $HEAT_CONF DEFAULT deferred_auth_method $HEAT_DEFERRED_AUTH
    fi

    if [ "$HEAT_USE_MOD_WSGI" == "True" ]; then
        _config_heat_apache_wsgi
    fi

    if [[ "$HEAT_STANDALONE" = "True" ]]; then
        iniset $HEAT_CONF paste_deploy flavor standalone
        iniset $HEAT_CONF clients_heat url "http://$HEAT_API_HOST:$HEAT_API_PORT/v1/%(tenant_id)s"
    else
        configure_auth_token_middleware $HEAT_CONF heat $HEAT_AUTH_CACHE_DIR
    fi

    # If HEAT_DEFERRED_AUTH is unset or explicitly set to trusts, configure
    # the section for the client plugin associated with the trustee
    if [ -z "$HEAT_DEFERRED_AUTH" -o "trusts" == "$HEAT_DEFERRED_AUTH" ]; then
        iniset $HEAT_CONF trustee auth_plugin password
        iniset $HEAT_CONF trustee auth_url $KEYSTONE_AUTH_URI
        iniset $HEAT_CONF trustee username $HEAT_TRUSTEE_USER
        iniset $HEAT_CONF trustee password $HEAT_TRUSTEE_PASSWORD
        iniset $HEAT_CONF trustee user_domain_id $HEAT_TRUSTEE_DOMAIN
    fi

    # clients_keystone
    iniset $HEAT_CONF clients_keystone auth_uri $KEYSTONE_AUTH_URI

    # OpenStack API
    iniset $HEAT_CONF heat_api bind_port $HEAT_API_PORT
    iniset $HEAT_CONF heat_api workers "$API_WORKERS"

    # Cloudformation API
    iniset $HEAT_CONF heat_api_cfn bind_port $HEAT_API_CFN_PORT

    # Cloudwatch API
    iniset $HEAT_CONF heat_api_cloudwatch bind_port $HEAT_API_CW_PORT

    if is_ssl_enabled_service "key" || is_service_enabled tls-proxy; then
        iniset $HEAT_CONF clients_keystone ca_file $SSL_BUNDLE_FILE
    fi

    if is_ssl_enabled_service "nova" || is_service_enabled tls-proxy; then
        iniset $HEAT_CONF clients_nova ca_file $SSL_BUNDLE_FILE
    fi

    if is_ssl_enabled_service "cinder" || is_service_enabled tls-proxy; then
        iniset $HEAT_CONF clients_cinder ca_file $SSL_BUNDLE_FILE
    fi

    if [[ "$HEAT_ENABLE_ADOPT_ABANDON" = "True" ]]; then
        iniset $HEAT_CONF DEFAULT enable_stack_adopt true
        iniset $HEAT_CONF DEFAULT enable_stack_abandon true
    fi

    iniset $HEAT_CONF cache enabled "True"
    iniset $HEAT_CONF cache backend "dogpile.cache.memory"

    sudo install -d -o $STACK_USER $HEAT_ENV_DIR $HEAT_TEMPLATES_DIR

    # copy the default environment
    cp $HEAT_DIR/etc/heat/environment.d/* $HEAT_ENV_DIR/

    # copy the default templates
    cp $HEAT_DIR/etc/heat/templates/* $HEAT_TEMPLATES_DIR/

    # Enable heat plugins.
    # NOTE(nic): The symlink nonsense is necessary because when
    # plugins are installed in "developer mode", the final component
    # of their target directory is always "resources", which confuses
    # Heat's plugin loader into believing that all plugins are named
    # "resources", and therefore are all the same plugin; so it
    # will only load one of them.  Linking them all to a common
    # location with unique names avoids that type of collision,
    # while still allowing the plugins to be edited in-tree.
    local err_count=0

    if [ -n "$ENABLE_HEAT_PLUGINS" ]; then
        mkdir -p $HEAT_PLUGIN_DIR
        # Clean up cruft from any previous runs
        rm -f $HEAT_PLUGIN_DIR/*
        iniset $HEAT_CONF DEFAULT plugin_dirs $HEAT_PLUGIN_DIR
    fi

    for heat_plugin in $ENABLE_HEAT_PLUGINS; do
        if [ -d $HEAT_DIR/contrib/$heat_plugin ]; then
            setup_package $HEAT_DIR/contrib/$heat_plugin -e
            ln -s $HEAT_DIR/contrib/$heat_plugin/$heat_plugin/resources $HEAT_PLUGIN_DIR/$heat_plugin
        else
            : # clear retval on the test so that we can roll up errors
            err $LINENO "Requested Heat plugin(${heat_plugin}) not found."
            err_count=$(($err_count + 1))
        fi
    done
    [ $err_count -eq 0 ] || die $LINENO "$err_count of the requested Heat plugins could not be installed."
}

# init_heat() - Initialize database
function init_heat {

    # (re)create heat database
    recreate_database heat

    $HEAT_BIN_DIR/heat-manage --config-file $HEAT_CONF db_sync
    create_heat_cache_dir
}

# create_heat_cache_dir() - Part of the init_heat() process
function create_heat_cache_dir {
    # Create cache dirs
    sudo install -d -o $STACK_USER $HEAT_AUTH_CACHE_DIR
}

# install_heatclient() - Collect source and prepare
function install_heatclient {
    if use_library_from_git "python-heatclient"; then
        git_clone_by_name "python-heatclient"
        setup_dev_lib "python-heatclient"
        sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-heatclient"]}/tools/,/etc/bash_completion.d/}heat.bash_completion
    fi
}

# install_heat() - Collect source and prepare
function install_heat {
    git_clone $HEAT_REPO $HEAT_DIR $HEAT_BRANCH
    setup_develop $HEAT_DIR
    if [ "$HEAT_USE_MOD_WSGI" == "True" ]; then
        install_apache_wsgi
    fi
}

# install_heat_other() - Collect source and prepare
function install_heat_other {
    git_clone $HEAT_CFNTOOLS_REPO $HEAT_CFNTOOLS_DIR $HEAT_CFNTOOLS_BRANCH
    git_clone $HEAT_TEMPLATES_REPO $HEAT_TEMPLATES_REPO_DIR $HEAT_TEMPLATES_BRANCH
    git_clone $OAC_REPO $OAC_DIR $OAC_BRANCH
    git_clone $OCC_REPO $OCC_DIR $OCC_BRANCH
    git_clone $ORC_REPO $ORC_DIR $ORC_BRANCH
    git_clone $DIB_UTILS_REPO $DIB_UTILS_DIR $DIB_UTILS_BRANCH
}

# start_heat() - Start running processes, including screen
function start_heat {
    run_process h-eng "$HEAT_BIN_DIR/heat-engine --config-file=$HEAT_CONF"

    # If the site is not enabled then we are in a grenade scenario
    local enabled_site_file
    enabled_site_file=$(apache_site_config_for heat-api)
    if [ -f ${enabled_site_file} ] && [ "$HEAT_USE_MOD_WSGI" == "True" ]; then
        enable_apache_site heat-api
        enable_apache_site heat-api-cfn
        enable_apache_site heat-api-cloudwatch
        restart_apache_server
        tail_log heat-api /var/log/$APACHE_NAME/heat-api.log
        tail_log heat-api-cfn /var/log/$APACHE_NAME/heat-api-cfn.log
        tail_log heat-api-cloudwatch /var/log/$APACHE_NAME/heat-api-cloudwatch.log
    else
        run_process h-api "$HEAT_BIN_DIR/heat-api --config-file=$HEAT_CONF"
        run_process h-api-cfn "$HEAT_BIN_DIR/heat-api-cfn --config-file=$HEAT_CONF"
        run_process h-api-cw "$HEAT_BIN_DIR/heat-api-cloudwatch --config-file=$HEAT_CONF"
    fi
}

# stop_heat() - Stop running processes
function stop_heat {
    # Kill the screen windows
    stop_process h-eng

    if [ "$HEAT_USE_MOD_WSGI" == "True" ]; then
        disable_apache_site heat-api
        disable_apache_site heat-api-cfn
        disable_apache_site heat-api-cloudwatch
        restart_apache_server
    else
        local serv
        for serv in h-api h-api-cfn h-api-cw; do
            stop_process $serv
        done
    fi

}

# _cleanup_heat_apache_wsgi() - Remove wsgi files, disable and remove apache vhost file
function _cleanup_heat_apache_wsgi {
    sudo rm -f $(apache_site_config_for heat-api)
    sudo rm -f $(apache_site_config_for heat-api-cfn)
    sudo rm -f $(apache_site_config_for heat-api-cloudwatch)
}

# _config_heat_apache_wsgi() - Set WSGI config files of Heat
function _config_heat_apache_wsgi {

    local heat_apache_conf
    heat_apache_conf=$(apache_site_config_for heat-api)
    local heat_cfn_apache_conf
    heat_cfn_apache_conf=$(apache_site_config_for heat-api-cfn)
    local heat_cloudwatch_apache_conf
    heat_cloudwatch_apache_conf=$(apache_site_config_for heat-api-cloudwatch)
    local heat_ssl=""
    local heat_certfile=""
    local heat_keyfile=""
    local heat_api_port=$HEAT_API_PORT
    local heat_cfn_api_port=$HEAT_API_CFN_PORT
    local heat_cw_api_port=$HEAT_API_CW_PORT
    local venv_path=""

    sudo cp $FILES/apache-heat-api.template $heat_apache_conf
    sudo sed -e "
        s|%PUBLICPORT%|$heat_api_port|g;
        s|%APACHE_NAME%|$APACHE_NAME|g;
        s|%HEAT_BIN_DIR%|$HEAT_BIN_DIR|g;
        s|%SSLENGINE%|$heat_ssl|g;
        s|%SSLCERTFILE%|$heat_certfile|g;
        s|%SSLKEYFILE%|$heat_keyfile|g;
        s|%USER%|$STACK_USER|g;
        s|%VIRTUALENV%|$venv_path|g
    " -i $heat_apache_conf

    sudo cp $FILES/apache-heat-api-cfn.template $heat_cfn_apache_conf
    sudo sed -e "
        s|%PUBLICPORT%|$heat_cfn_api_port|g;
        s|%APACHE_NAME%|$APACHE_NAME|g;
        s|%HEAT_BIN_DIR%|$HEAT_BIN_DIR|g;
        s|%SSLENGINE%|$heat_ssl|g;
        s|%SSLCERTFILE%|$heat_certfile|g;
        s|%SSLKEYFILE%|$heat_keyfile|g;
        s|%USER%|$STACK_USER|g;
        s|%VIRTUALENV%|$venv_path|g
    " -i $heat_cfn_apache_conf

    sudo cp $FILES/apache-heat-api-cloudwatch.template $heat_cloudwatch_apache_conf
    sudo sed -e "
        s|%PUBLICPORT%|$heat_cw_api_port|g;
        s|%APACHE_NAME%|$APACHE_NAME|g;
        s|%HEAT_BIN_DIR%|$HEAT_BIN_DIR|g;
        s|%SSLENGINE%|$heat_ssl|g;
        s|%SSLCERTFILE%|$heat_certfile|g;
        s|%SSLKEYFILE%|$heat_keyfile|g;
        s|%USER%|$STACK_USER|g;
        s|%VIRTUALENV%|$venv_path|g
    " -i $heat_cloudwatch_apache_conf
}


# create_heat_accounts() - Set up common required heat accounts
function create_heat_accounts {
    if [[ "$HEAT_STANDALONE" != "True" ]]; then

        create_service_user "heat" "admin"
        get_or_create_service "heat" "orchestration" "Heat Orchestration Service"
        get_or_create_endpoint \
            "orchestration" \
            "$REGION_NAME" \
            "$SERVICE_PROTOCOL://$HEAT_API_HOST:$HEAT_API_PORT/v1/\$(project_id)s" \
            "$SERVICE_PROTOCOL://$HEAT_API_HOST:$HEAT_API_PORT/v1/\$(project_id)s" \
            "$SERVICE_PROTOCOL://$HEAT_API_HOST:$HEAT_API_PORT/v1/\$(project_id)s"

        get_or_create_service "heat-cfn" "cloudformation" "Heat CloudFormation Service"
        get_or_create_endpoint \
            "cloudformation"  \
            "$REGION_NAME" \
            "$SERVICE_PROTOCOL://$HEAT_API_CFN_HOST:$HEAT_API_CFN_PORT/v1" \
            "$SERVICE_PROTOCOL://$HEAT_API_CFN_HOST:$HEAT_API_CFN_PORT/v1" \
            "$SERVICE_PROTOCOL://$HEAT_API_CFN_HOST:$HEAT_API_CFN_PORT/v1"

        # heat_stack_user role is for users created by Heat
        get_or_create_role "heat_stack_user"
    fi

    if [[ "$HEAT_STACK_DOMAIN" == "True" ]]; then
        # domain -> heat and user -> heat_domain_admin
        domain_id=$(get_or_create_domain heat 'Owns users and projects created by heat')
        iniset $HEAT_CONF DEFAULT stack_user_domain_id ${domain_id}
        get_or_create_user heat_domain_admin $SERVICE_PASSWORD heat
        get_or_add_user_domain_role admin heat_domain_admin heat
        iniset $HEAT_CONF DEFAULT stack_domain_admin heat_domain_admin
        iniset $HEAT_CONF DEFAULT stack_domain_admin_password $SERVICE_PASSWORD
    fi
}

# build_heat_pip_mirror() - Build a pip mirror containing heat agent projects
function build_heat_pip_mirror {
    local project_dirs="$OCC_DIR $OAC_DIR $ORC_DIR $HEAT_CFNTOOLS_DIR $DIB_UTILS_DIR"
    local projpath proj package

    rm -rf $HEAT_PIP_REPO
    mkdir -p $HEAT_PIP_REPO

    echo "<html><body>" > $HEAT_PIP_REPO/index.html
    for projpath in $project_dirs; do
        proj=$(basename $projpath)
        mkdir -p $HEAT_PIP_REPO/$proj
        pushd $projpath
        rm -rf dist
        python setup.py sdist
        pushd dist
        package=$(ls *)
        mv $package $HEAT_PIP_REPO/$proj/$package
        popd

        echo "<html><body><a href=\"$package\">$package</a></body></html>" > $HEAT_PIP_REPO/$proj/index.html
        echo "<a href=\"$proj\">$proj</a><br/>" >> $HEAT_PIP_REPO/index.html

        popd
    done

    echo "</body></html>" >> $HEAT_PIP_REPO/index.html

    local heat_pip_repo_apache_conf
    heat_pip_repo_apache_conf=$(apache_site_config_for heat_pip_repo)

    sudo cp $FILES/apache-heat-pip-repo.template $heat_pip_repo_apache_conf
    sudo sed -e "
        s|%HEAT_PIP_REPO%|$HEAT_PIP_REPO|g;
        s|%HEAT_PIP_REPO_PORT%|$HEAT_PIP_REPO_PORT|g;
        s|%APACHE_NAME%|$APACHE_NAME|g;
    " -i $heat_pip_repo_apache_conf
    enable_apache_site heat_pip_repo
    restart_apache_server
    sudo iptables -I INPUT -d $HOST_IP -p tcp --dport $HEAT_PIP_REPO_PORT -j ACCEPT || true
}

# Restore xtrace
$_XTRACE_HEAT

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