# 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:
# - functions

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

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


# Defaults
# --------

# set up default directories
HEAT_DIR=$DEST/heat
HEATCLIENT_DIR=$DEST/python-heatclient
HEAT_AUTH_CACHE_DIR=${HEAT_AUTH_CACHE_DIR:-/var/cache/heat}


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

# 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
}

# configure_heatclient() - Set config files, create data dirs, etc
function configure_heatclient() {
    setup_develop $HEATCLIENT_DIR
}

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

    HEAT_CONF_DIR=/etc/heat
    if [[ ! -d $HEAT_CONF_DIR ]]; then
        sudo mkdir -p $HEAT_CONF_DIR
    fi
    sudo chown $STACK_USER $HEAT_CONF_DIR

    HEAT_API_CFN_HOST=${HEAT_API_CFN_HOST:-$SERVICE_HOST}
    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:-$SERVICE_HOST}
    HEAT_API_CW_PORT=${HEAT_API_CW_PORT:-8003}
    HEAT_API_HOST=${HEAT_API_HOST:-$SERVICE_HOST}
    HEAT_API_PORT=${HEAT_API_PORT:-8004}
    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

    # Cloudformation API
    HEAT_API_CFN_CONF=$HEAT_CONF_DIR/heat-api-cfn.conf
    cp $HEAT_DIR/etc/heat/heat-api-cfn.conf $HEAT_API_CFN_CONF
    iniset $HEAT_API_CFN_CONF DEFAULT debug True
    inicomment $HEAT_API_CFN_CONF DEFAULT log_file
    iniset $HEAT_API_CFN_CONF DEFAULT use_syslog $SYSLOG
    iniset $HEAT_API_CFN_CONF DEFAULT bind_host $HEAT_API_CFN_HOST
    iniset $HEAT_API_CFN_CONF DEFAULT bind_port $HEAT_API_CFN_PORT
    iniset $HEAT_API_CFN_CONF keystone_authtoken auth_host $KEYSTONE_AUTH_HOST
    iniset $HEAT_API_CFN_CONF keystone_authtoken auth_port $KEYSTONE_AUTH_PORT
    iniset $HEAT_API_CFN_CONF keystone_authtoken auth_protocol $KEYSTONE_AUTH_PROTOCOL
    iniset $HEAT_API_CFN_CONF keystone_authtoken auth_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0
    iniset $HEAT_API_CFN_CONF keystone_authtoken admin_tenant_name $SERVICE_TENANT_NAME
    iniset $HEAT_API_CFN_CONF keystone_authtoken admin_user heat
    iniset $HEAT_API_CFN_CONF keystone_authtoken admin_password $SERVICE_PASSWORD
    iniset $HEAT_API_CFN_CONF keystone_authtoken signing_dir $HEAT_AUTH_CACHE_DIR/api-cfn
    iniset $HEAT_API_CFN_CONF ec2authtoken auth_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0
    iniset $HEAT_API_CFN_CONF ec2authtoken keystone_ec2_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0/ec2tokens

    iniset_rpc_backend heat $HEAT_API_CFN_CONF DEFAULT

    # OpenStack API
    HEAT_API_CONF=$HEAT_CONF_DIR/heat-api.conf
    cp $HEAT_DIR/etc/heat/heat-api.conf $HEAT_API_CONF
    iniset $HEAT_API_CONF DEFAULT debug True
    inicomment $HEAT_API_CONF DEFAULT log_file
    iniset $HEAT_API_CONF DEFAULT use_syslog $SYSLOG
    iniset $HEAT_API_CONF DEFAULT bind_host $HEAT_API_HOST
    iniset $HEAT_API_CONF DEFAULT bind_port $HEAT_API_PORT
    iniset $HEAT_API_CONF keystone_authtoken auth_host $KEYSTONE_AUTH_HOST
    iniset $HEAT_API_CONF keystone_authtoken auth_port $KEYSTONE_AUTH_PORT
    iniset $HEAT_API_CONF keystone_authtoken auth_protocol $KEYSTONE_AUTH_PROTOCOL
    iniset $HEAT_API_CONF keystone_authtoken auth_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0
    iniset $HEAT_API_CONF keystone_authtoken admin_tenant_name $SERVICE_TENANT_NAME
    iniset $HEAT_API_CONF keystone_authtoken admin_user heat
    iniset $HEAT_API_CONF keystone_authtoken admin_password $SERVICE_PASSWORD
    iniset $HEAT_API_CONF keystone_authtoken signing_dir $HEAT_AUTH_CACHE_DIR/api
    iniset $HEAT_API_CONF ec2authtoken auth_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0
    iniset $HEAT_API_CONF ec2authtoken keystone_ec2_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0/ec2tokens

    iniset_rpc_backend heat $HEAT_API_CONF DEFAULT


    # engine
    HEAT_ENGINE_CONF=$HEAT_CONF_DIR/heat-engine.conf
    cp $HEAT_DIR/etc/heat/heat-engine.conf $HEAT_ENGINE_CONF
    iniset $HEAT_ENGINE_CONF DEFAULT debug True
    inicomment $HEAT_ENGINE_CONF DEFAULT log_file
    iniset $HEAT_ENGINE_CONF DEFAULT use_syslog $SYSLOG
    iniset $HEAT_ENGINE_CONF DEFAULT bind_host $HEAT_ENGINE_HOST
    iniset $HEAT_ENGINE_CONF DEFAULT bind_port $HEAT_ENGINE_PORT
    iniset $HEAT_ENGINE_CONF DEFAULT heat_metadata_server_url http://$HEAT_API_CFN_HOST:$HEAT_API_CFN_PORT
    iniset $HEAT_ENGINE_CONF DEFAULT heat_waitcondition_server_url http://$HEAT_API_CFN_HOST:$HEAT_API_CFN_PORT/v1/waitcondition
    iniset $HEAT_ENGINE_CONF DEFAULT heat_watch_server_url http://$HEAT_API_CW_HOST:$HEAT_API_CW_PORT
    iniset $HEAT_ENGINE_CONF DEFAULT sql_connection `database_connection_url heat`
    iniset $HEAT_ENGINE_CONF DEFAULT auth_encryption_key `hexdump -n 16 -v -e '/1 "%02x"' /dev/random`

    iniset_rpc_backend heat $HEAT_ENGINE_CONF DEFAULT

    # Cloudwatch API
    HEAT_API_CW_CONF=$HEAT_CONF_DIR/heat-api-cloudwatch.conf
    cp $HEAT_DIR/etc/heat/heat-api-cloudwatch.conf $HEAT_API_CW_CONF
    iniset $HEAT_API_CW_CONF DEFAULT debug True
    inicomment $HEAT_API_CW_CONF DEFAULT log_file
    iniset $HEAT_API_CW_CONF DEFAULT use_syslog $SYSLOG
    iniset $HEAT_API_CW_CONF DEFAULT bind_host $HEAT_API_CW_HOST
    iniset $HEAT_API_CW_CONF DEFAULT bind_port $HEAT_API_CW_PORT
    iniset $HEAT_API_CW_CONF keystone_authtoken auth_host $KEYSTONE_AUTH_HOST
    iniset $HEAT_API_CW_CONF keystone_authtoken auth_port $KEYSTONE_AUTH_PORT
    iniset $HEAT_API_CW_CONF keystone_authtoken auth_protocol $KEYSTONE_AUTH_PROTOCOL
    iniset $HEAT_API_CW_CONF keystone_authtoken auth_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0
    iniset $HEAT_API_CW_CONF keystone_authtoken admin_tenant_name $SERVICE_TENANT_NAME
    iniset $HEAT_API_CW_CONF keystone_authtoken admin_user heat
    iniset $HEAT_API_CW_CONF keystone_authtoken admin_password $SERVICE_PASSWORD
    iniset $HEAT_API_CW_CONF keystone_authtoken signing_dir $HEAT_AUTH_CACHE_DIR/api-cloudwatch
    iniset $HEAT_API_CW_CONF ec2authtoken auth_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0
    iniset $HEAT_API_CW_CONF ec2authtoken keystone_ec2_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0/ec2tokens

    iniset_rpc_backend heat $HEAT_API_CW_CONF DEFAULT

}

# init_heat() - Initialize database
function init_heat() {

    # (re)create heat database
    recreate_database heat utf8

    $HEAT_DIR/bin/heat-manage 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 mkdir -p $HEAT_AUTH_CACHE_DIR/api
    sudo chown $STACK_USER $HEAT_AUTH_CACHE_DIR/api
    sudo mkdir -p $HEAT_AUTH_CACHE_DIR/api-cfn
    sudo chown $STACK_USER $HEAT_AUTH_CACHE_DIR/api-cfn
    sudo mkdir -p $HEAT_AUTH_CACHE_DIR/api-cloudwatch
    sudo chown $STACK_USER $HEAT_AUTH_CACHE_DIR/api-cloudwatch
}

# install_heatclient() - Collect source and prepare
function install_heatclient() {
    git_clone $HEATCLIENT_REPO $HEATCLIENT_DIR $HEATCLIENT_BRANCH
}

# install_heat() - Collect source and prepare
function install_heat() {
    git_clone $HEAT_REPO $HEAT_DIR $HEAT_BRANCH
}

# start_heat() - Start running processes, including screen
function start_heat() {
    screen_it h-eng "cd $HEAT_DIR; bin/heat-engine --config-file=$HEAT_CONF_DIR/heat-engine.conf"
    screen_it h-api "cd $HEAT_DIR; bin/heat-api --config-dir=$HEAT_CONF_DIR/heat-api.conf"
    screen_it h-api-cfn "cd $HEAT_DIR; bin/heat-api-cfn --config-dir=$HEAT_CONF_DIR/heat-api-cfn.conf"
    screen_it h-api-cw "cd $HEAT_DIR; bin/heat-api-cloudwatch --config-dir=$HEAT_CONF_DIR/heat-api-cloudwatch.conf"
}

# stop_heat() - Stop running processes
function stop_heat() {
    # Kill the screen windows
    for serv in h-eng h-api h-api-cfn h-api-cw; do
        screen -S $SCREEN_NAME -p $serv -X kill
    done
}


# Restore xtrace
$XTRACE

# Local variables:
# mode: shell-script
# End:
