# lib/heat
# Install and start Heat service
# To enable, add the following to localrc
# ENABLED_SERVICES+=,heat,h-api-cfn,h-api-cw,h-eng,h-meta

# Dependencies:
# - functions

# stack.sh
# ---------
# install_XXX
# configure_XXX
# init_XXX
# start_XXX
# stop_XXX
# cleanup_XXX

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


# Defaults
# --------
HEAT_DIR=$DEST/heat
HEATCLIENT_DIR=$DEST/python-heatclient
# set up default directories

# cleanup_heat() - Remove residual data files, anything left over from previous
# runs that a clean run would need to clean up
function cleanup_heat() {
    # This function intentionally left blank
    :
}

# 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 `whoami` $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_METADATA_HOST=${HEAT_METADATA_HOST:-$SERVICE_HOST}
    HEAT_METADATA_PORT=${HEAT_METADATA_PORT:-8002}
    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}

    # 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

    if is_service_enabled rabbit; then
        iniset $HEAT_API_CFN_CONF DEFAULT rpc_backend heat.openstack.common.rpc.impl_kombu
        iniset $HEAT_API_CFN_CONF DEFAULT rabbit_password $RABBIT_PASSWORD
        iniset $HEAT_API_CFN_CONF DEFAULT rabbit_host $RABBIT_HOST
    elif is_service_enabled qpid; then
        iniset $HEAT_API_CFN_CONF DEFAULT rpc_backend heat.openstack.common.rpc.impl_qpid
    fi

    HEAT_API_CFN_PASTE_INI=$HEAT_CONF_DIR/heat-api-cfn-paste.ini
    cp $HEAT_DIR/etc/heat/heat-api-cfn-paste.ini $HEAT_API_CFN_PASTE_INI
    iniset $HEAT_API_CFN_PASTE_INI filter:authtoken auth_host $KEYSTONE_AUTH_HOST
    iniset $HEAT_API_CFN_PASTE_INI filter:authtoken auth_port $KEYSTONE_AUTH_PORT
    iniset $HEAT_API_CFN_PASTE_INI filter:authtoken auth_protocol $KEYSTONE_AUTH_PROTOCOL
    iniset $HEAT_API_CFN_PASTE_INI filter:authtoken auth_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0
    iniset $HEAT_API_CFN_PASTE_INI filter:authtoken admin_tenant_name $SERVICE_TENANT_NAME
    iniset $HEAT_API_CFN_PASTE_INI filter:authtoken admin_user heat
    iniset $HEAT_API_CFN_PASTE_INI filter:authtoken admin_password $SERVICE_PASSWORD
    iniset $HEAT_API_CFN_PASTE_INI filter:ec2authtoken auth_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0
    iniset $HEAT_API_CFN_PASTE_INI filter:ec2authtoken keystone_ec2_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0/ec2tokens

    # 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

    if is_service_enabled rabbit; then
        iniset $HEAT_API_CONF DEFAULT rpc_backend heat.openstack.common.rpc.impl_kombu
        iniset $HEAT_API_CONF DEFAULT rabbit_password $RABBIT_PASSWORD
        iniset $HEAT_API_CONF DEFAULT rabbit_host $RABBIT_HOST
    elif is_service_enabled qpid; then
        iniset $HEAT_API_CONF DEFAULT rpc_backend heat.openstack.common.rpc.impl_qpid
    fi

    HEAT_API_PASTE_INI=$HEAT_CONF_DIR/heat-api-paste.ini
    cp $HEAT_DIR/etc/heat/heat-api-paste.ini $HEAT_API_PASTE_INI
    iniset $HEAT_API_PASTE_INI filter:authtoken auth_host $KEYSTONE_AUTH_HOST
    iniset $HEAT_API_PASTE_INI filter:authtoken auth_port $KEYSTONE_AUTH_PORT
    iniset $HEAT_API_PASTE_INI filter:authtoken auth_protocol $KEYSTONE_AUTH_PROTOCOL
    iniset $HEAT_API_PASTE_INI filter:authtoken auth_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0
    iniset $HEAT_API_PASTE_INI filter:authtoken admin_tenant_name $SERVICE_TENANT_NAME
    iniset $HEAT_API_PASTE_INI filter:authtoken admin_user heat
    iniset $HEAT_API_PASTE_INI filter:authtoken admin_password $SERVICE_PASSWORD
    iniset $HEAT_API_PASTE_INI filter:ec2authtoken auth_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0
    iniset $HEAT_API_PASTE_INI filter:ec2authtoken keystone_ec2_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0/ec2tokens

    # 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_METADATA_HOST:$HEAT_METADATA_PORT
    iniset $HEAT_ENGINE_CONF DEFAULT heat_watch_server_url http://$HEAT_API_CW_HOST:$HEAT_API_CW_PORT
    local dburl
    database_connection_url dburl heat
    iniset $HEAT_ENGINE_CONF DEFAULT sql_connection $dburl
    iniset $HEAT_ENGINE_CONF DEFAULT auth_encryption_key `hexdump -n 16 -v -e '/1 "%02x"' /dev/random`

    if is_service_enabled rabbit; then
        iniset $HEAT_ENGINE_CONF DEFAULT rpc_backend heat.openstack.common.rpc.impl_kombu
        iniset $HEAT_ENGINE_CONF DEFAULT rabbit_password $RABBIT_PASSWORD
        iniset $HEAT_ENGINE_CONF DEFAULT rabbit_host $RABBIT_HOST
    elif is_service_enabled qpid; then
        iniset $HEAT_ENGINE_CONF DEFAULT rpc_backend heat.openstack.common.rpc.impl_qpid
    fi

    # metadata api
    HEAT_METADATA_CONF=$HEAT_CONF_DIR/heat-metadata.conf
    cp $HEAT_DIR/etc/heat/heat-metadata.conf $HEAT_METADATA_CONF
    iniset $HEAT_METADATA_CONF DEFAULT debug True
    inicomment $HEAT_METADATA_CONF DEFAULT log_file
    iniset $HEAT_METADATA_CONF DEFAULT use_syslog $SYSLOG
    iniset $HEAT_METADATA_CONF DEFAULT bind_host $HEAT_METADATA_HOST
    iniset $HEAT_METADATA_CONF DEFAULT bind_port $HEAT_METADATA_PORT

    if is_service_enabled rabbit; then
        iniset $HEAT_METADATA_CONF DEFAULT rpc_backend heat.openstack.common.rpc.impl_kombu
        iniset $HEAT_METADATA_CONF DEFAULT rabbit_password $RABBIT_PASSWORD
        iniset $HEAT_METADATA_CONF DEFAULT rabbit_host $RABBIT_HOST
    elif is_service_enabled qpid; then
        iniset $HEAT_METADATA_CONF DEFAULT rpc_backend heat.openstack.common.rpc.impl_qpid
    fi

    HEAT_METADATA_PASTE_INI=$HEAT_CONF_DIR/heat-metadata-paste.ini
    cp $HEAT_DIR/etc/heat/heat-metadata-paste.ini $HEAT_METADATA_PASTE_INI

    # 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

    if is_service_enabled rabbit; then
        iniset $HEAT_API_CW_CONF DEFAULT rpc_backend heat.openstack.common.rpc.impl_kombu
        iniset $HEAT_API_CW_CONF DEFAULT rabbit_password $RABBIT_PASSWORD
        iniset $HEAT_API_CW_CONF DEFAULT rabbit_host $RABBIT_HOST
    elif is_service_enabled qpid; then
        iniset $HEAT_API_CW_CONF DEFAULT rpc_backend heat.openstack.common.rpc.impl_qpid
    fi

    HEAT_API_CW_PASTE_INI=$HEAT_CONF_DIR/heat-api-cloudwatch-paste.ini
    cp $HEAT_DIR/etc/heat/heat-api-cloudwatch-paste.ini $HEAT_API_CW_PASTE_INI
    iniset $HEAT_API_CW_PASTE_INI filter:authtoken auth_host $KEYSTONE_AUTH_HOST
    iniset $HEAT_API_CW_PASTE_INI filter:authtoken auth_port $KEYSTONE_AUTH_PORT
    iniset $HEAT_API_CW_PASTE_INI filter:authtoken auth_protocol $KEYSTONE_AUTH_PROTOCOL
    iniset $HEAT_API_CW_PASTE_INI filter:authtoken auth_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0
    iniset $HEAT_API_CW_PASTE_INI filter:authtoken admin_tenant_name $SERVICE_TENANT_NAME
    iniset $HEAT_API_CW_PASTE_INI filter:authtoken admin_user heat
    iniset $HEAT_API_CW_PASTE_INI filter:authtoken admin_password $SERVICE_PASSWORD
    iniset $HEAT_API_CW_PASTE_INI filter:ec2authtoken auth_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0
    iniset $HEAT_API_CW_PASTE_INI filter:ec2authtoken keystone_ec2_uri $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0/ec2tokens
}

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

    # (re)create heat database
    recreate_database heat utf8

    $HEAT_DIR/bin/heat-db-setup $os_PACKAGE -r $MYSQL_PASSWORD
    $HEAT_DIR/tools/nova_create_flavors.sh
}

# 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"
    screen_it h-meta "cd $HEAT_DIR; bin/heat-metadata --config-dir=$HEAT_CONF_DIR/heat-metadata.conf"
}

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

# Restore xtrace
$XTRACE
