# 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

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

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

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

# Restore xtrace
$XTRACE
