#!/bin/bash set -eux package_to_test=${1} RES=0 mysql_pass="admin" token=$(openssl rand -hex 10) auth_string="--os-auth-url http://127.0.0.1:35357 --os-token ${token} --os-endpoint http://127.0.0.1:35357/v2.0/" ceilometer_auth_string="--debug --os-username ceilometer --os-password ceilometer --os-tenant-name ceilometer --os-auth-url http://127.0.0.1:35357" ceilometer_service= keystone_log_file="/var/log/keystone/keystone.log" ceilometer_log_dir="/var/log/ceilometer" mongodb_log="/var/log/mongodb/mongodb.log" if [[ `cat /etc/*-release | head -n 1 | awk '{print $1}'` =~ Ubuntu ]]; then os="ubuntu" packages_list="python-pip curl" export DEBIAN_FRONTEND=noninteractive command_to_install="apt-get install -y --force-yes" keystone_package="keystone" keystone_service="keystone" mysql_service="mysql" mongodb_service="mongodb" ceilometer_packages=( ceilometer-agent-central ceilometer-agent-compute ceilometer-collector ceilometer-agent-notification ceilometer-polling ceilometer-api ceilometer-alarm-notifier ceilometer-alarm-evaluator ) ceilometer_services=("${ceilometer_packages[@]}") ceilometer_binaries=( ceilometer-collector ceilometer-agent-notification ceilometer-polling ceilometer-api ceilometer-alarm-notifier ceilometer-alarm-evaluator ceilometer-dbsync ceilometer-expirer ceilometer-rootwrap ceilometer-send-sample ) config_files=( api_paste.ini ceilometer.conf event_definitions.yaml event_pipeline.yaml pipeline.yaml policy.json ) else setenforce 0 || : service firewalld stop || : os="centos" packages_list="python-pip curl" command_to_install="yum install -y" keystone_package="openstack-keystone" keystone_service="openstack-keystone" mysql_service="mysql" mongodb_service="mongod" ceilometer_packages=( python-ceilometerclient openstack-ceilometer-central openstack-ceilometer-compute openstack-ceilometer-collector openstack-ceilometer-notification openstack-ceilometer-polling openstack-ceilometer-api openstack-ceilometer-alarm ) ceilometer_services=( openstack-ceilometer-central openstack-ceilometer-compute openstack-ceilometer-collector openstack-ceilometer-notification openstack-ceilometer-polling openstack-ceilometer-api openstack-ceilometer-alarm-notifier openstack-ceilometer-alarm-evaluator ) ceilometer_binaries=( ceilometer-agent-notification ceilometer-alarm-evaluator ceilometer-alarm-notifier ceilometer-api ceilometer-collector ceilometer-dbsync ceilometer-expirer ceilometer-polling ceilometer-send-sample ) config_files=( api_paste.ini ceilometer.conf event_definitions.yaml event_pipeline.yaml pipeline.yaml policy.json ) fi list_commands=( alarm-list event-list meter-list resource-list sample-list ) install_packages() { ${command_to_install} $@ } prepare_vm() { install_packages ${packages_list} } install_and_setup_keystone() { install_packages ${keystone_package} service ${keystone_service} stop cat > /etc/keystone/keystone.conf << EOF [DEFAULT] admin_token=${token} log_file=${keystone_log_file} rabbit_password = guest rabbit_hosts = 127.0.0.1 notification_driver = messaging notification_topics = notifications [database] connection=mysql://keystone:keystone@127.0.0.1/keystone [token] provider=keystone.token.providers.uuid.Provider EOF [ -d "/var/log/keystone/" ] || mkdir /var/log/keystone/ touch ${keystone_log_file} chown -R keystone:keystone /var/log/keystone/ chown -R keystone:keystone /etc/keystone keystone-manage db_sync service ${keystone_service} restart sleep 5 if [ -z "$(curl -s http://127.0.0.1:5000/ | grep '^{"versions":')" ]; then exit_on_error 1 "Failed to get to keystone API.\nTests failed because of keystone problem" fi } install_and_setup_mysql() { if [[ "$os" == "ubuntu" ]]; then echo "mysql-server mysql-server/root_password select ${mysql_pass}" | debconf-set-selections echo "mysql-server mysql-server/root_password_again select ${mysql_pass}" | debconf-set-selections ${command_to_install} mysql-server mysql-client python-mysqldb MYSQL_PASSWORD='' else ${command_to_install} mysql-client mysql-server mysql-libs MySQL-python MYSQL_PASSWORD=$(cat /root/.mysql_secret | head -1 | awk -F': ' '{print $2}') fi service mysql restart sleep 10 if [ ! -z "${MYSQL_PASSWORD}" ]; then mysqladmin -u root -p${MYSQL_PASSWORD} password ${mysql_pass} fi if [ -z "$(service ${mysql_service} status | grep "running" )" ]; then exit_on_error 1 "Mysql service has failed to start" fi mysql -uroot -p${mysql_pass} -Bse "drop database if exists keystone" mysql -uroot -p${mysql_pass} -Bse "create database keystone" mysql -uroot -p${mysql_pass} -Bse "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'keystone'" mysql -uroot -p${mysql_pass} -Bse "drop database if exists ceilometer" mysql -uroot -p${mysql_pass} -Bse "create database ceilometer" mysql -uroot -p${mysql_pass} -Bse "GRANT ALL PRIVILEGES ON ceilometer.* TO 'ceilometer'@'localhost' IDENTIFIED BY 'ceilometer'" mysql -uroot -p${mysql_pass} -Bse "flush privileges" } install_and_setup_rabbit() { install_packages rabbitmq-server echo "127.0.0.1 $(hostname)" >> /etc/hosts if [[ "$os" == "ubuntu" ]]; then update-rc.d rabbitmq-server defaults else systemctl enable rabbitmq-server fi service rabbitmq-server restart sleep 5 } ceilometer_configuration() { cat > /etc/ceilometer/ceilometer.conf << EOF [DEFAULT] api_paste_config = /etc/ceilometer/api_paste.ini policy_file = /etc/ceilometer/policy.json debug = True verbose = True log_dir = ${ceilometer_log_dir} auth_strategy = keystone rabbit_password = guest rabbit_hosts = 127.0.0.1 [keystone_authtoken] auth_host = 127.0.0.1 auth_port = 35357 auth_protocol = http admin_tenant_name = ceilometer admin_user = ceilometer admin_password = ceilometer auth_url=http://127.0.0.1:35357 [database] connection=mysql://ceilometer:ceilometer@127.0.0.1/ceilometer [notification] store_events = True EOF [ -e /etc/default/ceilometer-polling ] && rm -f /etc/default/ceilometer-polling echo "DAEMON_ARGS=\"--polling-namespaces=central\"" > /etc/default/ceilometer-polling [ -d "${ceilometer_log_dir}" ] || mkdir ${ceilometer_log_dir} chown -R ceilometer:ceilometer ${ceilometer_log_dir} chown -R ceilometer:ceilometer /etc/ceilometer ceilometer-dbsync --config-file /etc/ceilometer/ceilometer.conf if [ "$?" -ne '0' ]; then cat ${ceilometer_log_dir}/ceilometer-dbsync.log exit_on_error 1 "DB sync command has failures" fi keystone ${auth_string} user-create --name ceilometer --pass ceilometer keystone ${auth_string} tenant-create --name ceilometer keystone ${auth_string} role-create --name=admin keystone ${auth_string} user-role-add --user ceilometer --role admin --tenant ceilometer ceilometer_service=$(keystone ${auth_string} service-create --name=ceilometer\ --type=metering --description="ceilometer" | grep id | awk -F '|' '{print $3}' | tr -d ' ') keystone ${auth_string} endpoint-create --region RegionOne --service-id=${ceilometer_service}\ --publicurl=http://127.0.0.1:8777/ --internalurl=http://127.0.0.1:8777/ --adminurl=http://127.0.0.1:8777/ } send_fake_instance_notification() { if [ $os == "centos" ]; then curl -LO https://bootstrap.pypa.io/get-pip.py python get-pip.py fi pip install pika==0.9.8 echo '#!/usr/bin/env python import pika import uuid connection = pika.BlockingConnection(pika.ConnectionParameters(host="127.0.0.1")) channel = connection.channel() channel.queue_declare(queue="notifications.info") test='"'"'{"event_type": "compute.instance.create", "payload": {"instance_id": "fake", "memory_mb": 512, "disk_gb": 20, "root_gb": 20, "ephemeral_gb": 0, "vcpus": 1, "instance_type_id": 1, "state": "fake"}, "publisher_id": "fake", "priority":"INFO", "message_id": "%s"}'"'"' % uuid.uuid4() channel.basic_publish(exchange="nova", routing_key="notifications.info", properties=pika.BasicProperties(priority=0, delivery_mode=2, headers="", content_encoding="utf-8", content_type="application/json"), body=test) print " [x] Message was sent!" connection.close()' > $(pwd)/send.py python $(pwd)/send.py } exit_on_error() { # $1 - responce code # $2 - message if [ "${1}" -ne '0' ]; then echo -e "${2}" RES=${1} exit ${RES} fi } found=false for i in ${ceilometer_packages[@]}; do if [ "${i}" == "${package_to_test}" ]; then found=true fi done if ${found}; then echo "Test for package ${package_to_test} will be run with ceilometer-common package" RES=0 fi case ${package_to_test} in ceilometer-common|openstack-ceilometer-common) prepare_vm install_packages "${ceilometer_packages[@]}" install_and_setup_rabbit install_and_setup_mysql install_and_setup_keystone ceilometer_configuration for binary in ${ceilometer_binaries[@]}; do if [ ! -f "/usr/bin/${binary}" ]; then exit_on_error 1 "Ceilometer binary ${binary} is missed" fi done for config in ${config_files[@]}; do if [ ! -f "/etc/ceilometer/${config}" ]; then exit_on_error 1 "Ceilometer configuration file ${config} is missed" fi done for service in ${ceilometer_services[@]}; do service ${service} restart sleep 5 if [ -z "$(service ${service} status | grep "running")" ]; then cat /var/log/ceilometer/${service}.log exit_on_error 1 "Service ${service} has failed to start" fi done repsonce=$(curl "http://127.0.0.1:8777" | grep "Authentication required") if [ -z "$repsonce" ]; then exit_on_error 1 "Ceilometer api doesn't work.\n No one process is listening on 8777 port" fi for Command in ${list_commands[@]}; do ceilometer ${ceilometer_auth_string} ${Command} || true cat $keystone_log_file if [ "$?" -ne '0' ]; then exit_on_error 1 "Command ${Command} has failed" fi done send_fake_instance_notification # Keystone notifications if [ -z "$(ceilometer ${ceilometer_auth_string} meter-list | grep fake)" ]; then exit_on_error 1 "Keystone notifications don't work" fi # Instance notification resource_id=$(ceilometer ${ceilometer_auth_string} resource-list | grep fake) if [ -z "${resource_id}" ]; then exit_on_error 1 "Notification is not received" fi # Events if [ -z "$(ceilometer ${ceilometer_auth_string} event-list | grep fake)" ]; then exit_on_error 1 "Events wasn't created" fi # Alarming ceilometer -dv ${ceilometer_auth_string} alarm-threshold-create --name cpu_high --description 'instance running hot' \ --meter-name cpu_util --threshold 70.0 --comparison-operator gt --statistic avg \ --period 600 --evaluation-periods 3 --alarm-action 'log://' --query resource_id="${resource_id}" if [ "$?" -ne '0' -a -z "$(ceilometer ${ceilometer_auth_string} alarm-list | grep cpu_high)" ]; then exit_on_error 1 "Alarm creation has failed" fi # Samples ceilometer -dv ${ceilometer_auth_string} sample-create -m fake_sample --meter-type gauge --meter-unit '%' --sample-volume 100 -r "fake" if [ "$?" -ne '0' -a -z "$(ceilometer ${ceilometer_auth_string} sample-list | grep fake_sample)" ]; then exit_on_error 1 "Sample creation has failed" fi ;; ceilometer-agent-ipmi|openstack-ceilometer-ipmi) # Ceilometer-agent-ipmi is not included in common testing # because it is not used in Fuel now #if [ ! -f "/usr/bin/ceilometer-agent-ipmi" ]; then # exit_on_error 1 "Ceilometer ipmi binary is missed" #fi ;; python-ceilometer) python -c 'import ceilometer' if [ $? -ne '0' ]; then exit_on_error 1 "Couldn't import module 'ceilometer'" fi ;; *) if ! ${found}; then echo "Test not defined. Please create test for package ${package_to_test}" fi ;; esac exit ${RES}