ceilometer

lib/ceilometer Install and start Ceilometer service To enable a minimal set of Ceilometer services, add the following to localrc:

enable_service ceilometer-acompute ceilometer-acentral ceilometer-anotification ceilometer-collector ceilometer-api

To ensure Ceilometer alarming services are enabled also, further add to the localrc:

enable_service ceilometer-alarm-notifier ceilometer-alarm-evaluator


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

CEILOMETER_BIN_DIR=$(get_python_exec_prefix)

Set up database backend

CEILOMETER_BACKEND=${CEILOMETER_BACKEND:-mysql}

Ceilometer connection info.

CEILOMETER_SERVICE_PROTOCOL=http
CEILOMETER_SERVICE_HOST=$SERVICE_HOST
CEILOMETER_SERVICE_PORT=${CEILOMETER_SERVICE_PORT:-8777}

To enable OSprofiler change value of this variable to "notifications,profiler"

CEILOMETER_NOTIFICATION_TOPICS=${CEILOMETER_NOTIFICATION_TOPICS:-notifications}

Tell Tempest this project is present

TEMPEST_SERVICES+=,ceilometer


Functions


Test if any Ceilometer services are enabled is_ceilometer_enabled

function is_ceilometer_enabled {
    [[ ,${ENABLED_SERVICES} =~ ,"ceilometer-" ]] && return 0
    return 1
}

create_ceilometer_accounts() - Set up common required ceilometer accounts


Project User Roles

SERVICE_TENANT_NAME ceilometer admin SERVICE_TENANT_NAME ceilometer ResellerAdmin (if Swift is enabled)


create_ceilometer_accounts() {

    SERVICE_TENANT=$(openstack project list | awk "/ $SERVICE_TENANT_NAME / { print \$2 }")
    ADMIN_ROLE=$(openstack role list | awk "/ admin / { print \$2 }")

Ceilometer

    if [[ "$ENABLED_SERVICES" =~ "ceilometer-api" ]]; then
        CEILOMETER_USER=$(get_or_create_user "ceilometer" \
            "$SERVICE_PASSWORD" $SERVICE_TENANT)
        get_or_add_user_role $ADMIN_ROLE $CEILOMETER_USER $SERVICE_TENANT

        if [[ "$KEYSTONE_CATALOG_BACKEND" = 'sql' ]]; then
            CEILOMETER_SERVICE=$(get_or_create_service "ceilometer" \
                "metering" "OpenStack Telemetry Service")
            get_or_create_endpoint $CEILOMETER_SERVICE \
                "$REGION_NAME" \
                "$CEILOMETER_SERVICE_PROTOCOL://$CEILOMETER_SERVICE_HOST:$CEILOMETER_SERVICE_PORT/" \
                "$CEILOMETER_SERVICE_PROTOCOL://$CEILOMETER_SERVICE_HOST:$CEILOMETER_SERVICE_PORT/" \
                "$CEILOMETER_SERVICE_PROTOCOL://$CEILOMETER_SERVICE_HOST:$CEILOMETER_SERVICE_PORT/"
        fi
        if is_service_enabled swift; then

Ceilometer needs ResellerAdmin role to access swift account stats.

            get_or_add_user_role "ResellerAdmin" "ceilometer" $SERVICE_TENANT_NAME
        fi
    fi
}


cleanup_ceilometer() - Remove residual data files, anything left over from previous runs that a clean run would need to clean up

function cleanup_ceilometer {
    if [ "$CEILOMETER_BACKEND" != 'mysql' ] && [ "$CEILOMETER_BACKEND" != 'postgresql' ] ; then
        mongo ceilometer --eval "db.dropDatabase();"
    fi
}

configure_ceilometer() - Set config files, create data dirs, etc

function configure_ceilometer {
    [ ! -d $CEILOMETER_CONF_DIR ] && sudo mkdir -m 755 -p $CEILOMETER_CONF_DIR
    sudo chown $STACK_USER $CEILOMETER_CONF_DIR

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

    iniset_rpc_backend ceilometer $CEILOMETER_CONF DEFAULT

    iniset $CEILOMETER_CONF DEFAULT notification_topics "$CEILOMETER_NOTIFICATION_TOPICS"
    iniset $CEILOMETER_CONF DEFAULT verbose True
    iniset $CEILOMETER_CONF DEFAULT debug "$ENABLE_DEBUG_LOG_LEVEL"

Install the policy file for the API server

    cp $CEILOMETER_DIR/etc/ceilometer/policy.json $CEILOMETER_CONF_DIR
    iniset $CEILOMETER_CONF DEFAULT policy_file $CEILOMETER_CONF_DIR/policy.json

    cp $CEILOMETER_DIR/etc/ceilometer/pipeline.yaml $CEILOMETER_CONF_DIR
    cp $CEILOMETER_DIR/etc/ceilometer/api_paste.ini $CEILOMETER_CONF_DIR
    cp $CEILOMETER_DIR/etc/ceilometer/event_definitions.yaml $CEILOMETER_CONF_DIR

    if [ "$CEILOMETER_PIPELINE_INTERVAL" ]; then
        sed -i "s/interval:.*/interval: ${CEILOMETER_PIPELINE_INTERVAL}/" $CEILOMETER_CONF_DIR/pipeline.yaml
    fi

the compute and central agents need these credentials in order to call out to other services' public APIs the alarm evaluator needs these options to call ceilometer APIs

    iniset $CEILOMETER_CONF service_credentials os_username ceilometer
    iniset $CEILOMETER_CONF service_credentials os_password $SERVICE_PASSWORD
    iniset $CEILOMETER_CONF service_credentials os_tenant_name $SERVICE_TENANT_NAME

    iniset $CEILOMETER_CONF keystone_authtoken identity_uri $KEYSTONE_AUTH_URI
    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

    if [ "$CEILOMETER_BACKEND" = 'mysql' ] || [ "$CEILOMETER_BACKEND" = 'postgresql' ] ; then
        iniset $CEILOMETER_CONF database connection `database_connection_url ceilometer`
    else
        iniset $CEILOMETER_CONF database connection mongodb://localhost:27017/ceilometer
        configure_mongodb
        cleanup_ceilometer
    fi

    if [[ "$VIRT_DRIVER" = 'vsphere' ]]; then
        iniset $CEILOMETER_CONF DEFAULT hypervisor_inspector vsphere
        iniset $CEILOMETER_CONF vmware host_ip "$VMWAREAPI_IP"
        iniset $CEILOMETER_CONF vmware host_username "$VMWAREAPI_USER"
        iniset $CEILOMETER_CONF vmware host_password "$VMWAREAPI_PASSWORD"
    fi
}

function configure_mongodb {

server package is the same on all

    local packages=mongodb-server

    if is_fedora; then

mongodb client + python bindings

        packages="${packages} mongodb pymongo"
    else
        packages="${packages} python-pymongo"
    fi

    install_package ${packages}

    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

give mongodb time to start-up

    sleep 5
}

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/*

    if is_service_enabled mysql postgresql; then
        if [ "$CEILOMETER_BACKEND" = 'mysql' ] || [ "$CEILOMETER_BACKEND" = 'postgresql' ] ; then
            recreate_database ceilometer utf8
            $CEILOMETER_BIN_DIR/ceilometer-dbsync
        fi
    fi
}

install_ceilometer() - Collect source and prepare

function install_ceilometer {
    git_clone $CEILOMETER_REPO $CEILOMETER_DIR $CEILOMETER_BRANCH
    setup_develop $CEILOMETER_DIR

}

install_ceilometerclient() - Collect source and prepare

function install_ceilometerclient {
    git_clone $CEILOMETERCLIENT_REPO $CEILOMETERCLIENT_DIR $CEILOMETERCLIENT_BRANCH
    setup_develop $CEILOMETERCLIENT_DIR
    sudo install -D -m 0644 -o $STACK_USER {$CEILOMETERCLIENT_DIR/tools/,/etc/bash_completion.d/}ceilometer.bash_completion
}

start_ceilometer() - Start running processes, including screen

function start_ceilometer {
    if [[ "$VIRT_DRIVER" = 'libvirt' ]]; then
        screen_it ceilometer-acompute "cd ; sg $LIBVIRT_GROUP 'ceilometer-agent-compute --config-file $CEILOMETER_CONF'"
    fi
    if [[ "$VIRT_DRIVER" = 'vsphere' ]]; then
        screen_it ceilometer-acompute "cd ; ceilometer-agent-compute --config-file $CEILOMETER_CONF"
    fi
    screen_it ceilometer-acentral "cd ; ceilometer-agent-central --config-file $CEILOMETER_CONF"
    screen_it ceilometer-anotification "cd ; ceilometer-agent-notification --config-file $CEILOMETER_CONF"
    screen_it ceilometer-collector "cd ; ceilometer-collector --config-file $CEILOMETER_CONF"
    screen_it ceilometer-api "cd ; ceilometer-api -d -v --log-dir=$CEILOMETER_API_LOG_DIR --config-file $CEILOMETER_CONF"

only die on API if it was actually intended to be turned on

    if is_service_enabled ceilometer-api; then
        echo "Waiting for ceilometer-api to start..."
        if ! timeout $SERVICE_TIMEOUT sh -c "while ! curl --noproxy '*' -s http://localhost:8777/v2/ >/dev/null; do sleep 1; done"; then
            die $LINENO "ceilometer-api did not start"
        fi
    fi

    screen_it ceilometer-alarm-notifier "cd ; ceilometer-alarm-notifier --config-file $CEILOMETER_CONF"
    screen_it ceilometer-alarm-evaluator "cd ; ceilometer-alarm-evaluator --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-anotification ceilometer-collector ceilometer-api ceilometer-alarm-notifier ceilometer-alarm-evaluator; do
        screen_stop $serv
    done
}


Restore xtrace

$XTRACE

Tell emacs to use shell-script-mode

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