# lib/ceilometer
# Install and start **Ceilometer** service

# To enable Ceilometer services, add the following to localrc
# enable_service ceilometer-acompute ceilometer-acentral ceilometer-collector ceilometer-api

# Dependencies:
# - functions
# - OS_AUTH_URL for auth in api
# - DEST set to the destination directory
# - SERVICE_PASSWORD, SERVICE_TENANT_NAME for auth in api
# - STACK_USER service user

# stack.sh
# ---------
# install_ceilometer
# configure_ceilometer
# init_ceilometer
# start_ceilometer
# stop_ceilometer
# cleanup_ceilometer

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


# Defaults
# --------

# Set up default directories
CEILOMETER_DIR=$DEST/ceilometer
CEILOMETERCLIENT_DIR=$DEST/python-ceilometerclient
CEILOMETER_CONF_DIR=/etc/ceilometer
CEILOMETER_CONF=$CEILOMETER_CONF_DIR/ceilometer.conf
CEILOMETER_API_LOG_DIR=/var/log/ceilometer-api
CEILOMETER_AUTH_CACHE_DIR=${CEILOMETER_AUTH_CACHE_DIR:-/var/cache/ceilometer}

# Support potential entry-points console scripts
if [[ -d $CEILOMETER_DIR/bin ]]; then
    CEILOMETER_BIN_DIR=$CEILOMETER_DIR/bin
else
    CEILOMETER_BIN_DIR=$(get_python_exec_prefix)
fi


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

# cleanup_ceilometer() - Remove residual data files, anything left over from previous
# runs that a clean run would need to clean up
function cleanup_ceilometer() {
    mongo ceilometer --eval "db.dropDatabase();"
}

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

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

    [ ! -d $CEILOMETER_CONF_DIR ] && sudo mkdir -m 755 -p $CEILOMETER_CONF_DIR
    sudo chown $USER $CEILOMETER_CONF_DIR

    [ ! -d $CEILOMETER_API_LOG_DIR ] &&  sudo mkdir -m 755 -p $CEILOMETER_API_LOG_DIR
    sudo chown $USER $CEILOMETER_API_LOG_DIR

    iniset_rpc_backend ceilometer $CEILOMETER_CONF DEFAULT

    iniset $CEILOMETER_CONF DEFAULT notification_topics 'notifications,glance_notifications'
    iniset $CEILOMETER_CONF DEFAULT verbose True

    # Install the policy file for the API server
    cp $CEILOMETER_DIR/etc/ceilometer/policy.json $CEILOMETER_CONF_DIR
    cp $CEILOMETER_DIR/etc/ceilometer/pipeline.yaml $CEILOMETER_CONF_DIR
    iniset $CEILOMETER_CONF DEFAULT policy_file $CEILOMETER_CONF_DIR/policy.json

    # the compute and central agents need these credentials in order to
    # call out to the public nova and glance APIs
    iniset $CEILOMETER_CONF DEFAULT os_username ceilometer
    iniset $CEILOMETER_CONF DEFAULT os_password $SERVICE_PASSWORD
    iniset $CEILOMETER_CONF DEFAULT os_tenant_name $SERVICE_TENANT_NAME
    iniset $CEILOMETER_CONF DEFAULT os_auth_url $OS_AUTH_URL

    iniset $CEILOMETER_CONF keystone_authtoken auth_protocol http
    iniset $CEILOMETER_CONF keystone_authtoken admin_user ceilometer
    iniset $CEILOMETER_CONF keystone_authtoken admin_password $SERVICE_PASSWORD
    iniset $CEILOMETER_CONF keystone_authtoken admin_tenant_name $SERVICE_TENANT_NAME
    iniset $CEILOMETER_CONF keystone_authtoken signing_dir $CEILOMETER_AUTH_CACHE_DIR

    configure_mongodb

    cleanup_ceilometer
}

function configure_mongodb() {
    if is_fedora; then
        # ensure smallfiles selected to minimize freespace requirements
        sudo sed -i '/--smallfiles/!s/OPTIONS=\"/OPTIONS=\"--smallfiles /' /etc/sysconfig/mongod

        restart_service mongod
    fi
}

# init_ceilometer() - Initialize etc.
function init_ceilometer() {
    # Create cache dir
    sudo mkdir -p $CEILOMETER_AUTH_CACHE_DIR
    sudo chown $STACK_USER $CEILOMETER_AUTH_CACHE_DIR
    rm -f $CEILOMETER_AUTH_CACHE_DIR/*
}

# install_ceilometer() - Collect source and prepare
function install_ceilometer() {
    git_clone $CEILOMETER_REPO $CEILOMETER_DIR $CEILOMETER_BRANCH
}

# install_ceilometerclient() - Collect source and prepare
function install_ceilometerclient() {
    git_clone $CEILOMETERCLIENT_REPO $CEILOMETERCLIENT_DIR $CEILOMETERCLIENT_BRANCH
}

# start_ceilometer() - Start running processes, including screen
function start_ceilometer() {
    screen_it ceilometer-acompute "cd $CEILOMETER_DIR && sg $LIBVIRT_GROUP \"$CEILOMETER_BIN_DIR/ceilometer-agent-compute --config-file $CEILOMETER_CONF\""
    screen_it ceilometer-acentral "cd $CEILOMETER_DIR && $CEILOMETER_BIN_DIR/ceilometer-agent-central --config-file $CEILOMETER_CONF"
    screen_it ceilometer-collector "cd $CEILOMETER_DIR && $CEILOMETER_BIN_DIR/ceilometer-collector --config-file $CEILOMETER_CONF"
    screen_it ceilometer-api "cd $CEILOMETER_DIR && $CEILOMETER_BIN_DIR/ceilometer-api -d -v --log-dir=$CEILOMETER_API_LOG_DIR --config-file $CEILOMETER_CONF"
}

# stop_ceilometer() - Stop running processes
function stop_ceilometer() {
    # Kill the ceilometer screen windows
    for serv in ceilometer-acompute ceilometer-acentral ceilometer-collector ceilometer-api; do
        screen -S $SCREEN_NAME -p $serv -X kill
    done
}


# Restore xtrace
$XTRACE

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