-#!/bin/bash -x
-exit 0
+#!/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="--os-username ceilometer --os-password ceilometer --os-tenant-name ceilometer --os-auth-url http://127.0.0.1:35357/v2.0"
+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"
+ command_to_install="apt-get install -y --force-yes"
+ keystone_package="keystone"
+ keystone_service="keystone"
+ mysql_service="mysql"
+ mongodb_service="mongodb"
+ ceilometer_packages_and_services=(
+ ceilometer-agent-central
+ ceilometer-agent-compute
+ ceilometer-collector
+ ceilometer-agent-notification
+ ceilometer-polling
+ ceilometer-api
+ ceilometer-alarm-notifier
+ ceilometer-alarm-evaluator
+ )
+else
+ echo "Disable tests for Centos"
+ exit 0
+ os="centos"
+ packages_list="python-pip curl"
+ command_to_install="yum install -y"
+ keystone_package="openstack-keystone"
+ keystone_service="openstack-keystone"
+ mysql_service="mysqld"
+ mongodb_service="mongod"
+ ceilometer_packages_and_services=(
+ openstack-ceilometer-central
+ openstack-ceilometer-compute
+ openstack-ceilometer-collector
+ openstack-ceilometer-notification
+ openstack-ceilometer-polling
+ openstack-ceilometer-api
+ openstack-ceilometer-alarm
+ )
+fi
+
+ceilometer_binaries=(
+ ceilometer-agent-central
+ ceilometer-agent-compute
+ 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
+ deprecated_pipeline.yaml
+ event_definitions.yaml
+ event_pipeline.yaml
+ gabbi_pipeline.yaml
+ pipeline.yaml
+ policy.json
+ rootwrap.conf
+)
+
+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@localhost/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://localhost:5000/ | grep '^{"versions":')" ]; then
+ cat ${keystone_log_file}
+ exit_on_error 1 "Failed to get to keystone API.\nTests failed because of keystone problem"
+ fi
+}
+
+install_and_setup_mysql() {
+ 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-5.6 mysql-client-core-5.6 python-mysqldb
+ if [ -f "/etc/mysql/conf.d/wsrep.cnf" ]; then
+ rm -f /etc/mysql/conf.d/wsrep.cnf
+ fi
+
+ service ${mysql_service} restart
+ sleep 5
+
+ if [ -z "$(service ${mysql_service} status | grep "start/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 "flush privileges"
+}
+
+install_and_setup_rabbit() {
+ install_packages rabbitmq-server
+ echo "127.0.10.1 $(hostname)" >> /etc/hosts
+ service rabbitmq-server restart
+ sleep 5
+
+ if [ ! -z "$(service rabbitmq-server status | grep "Error: unable to connect to node")" ]; then
+ cat /var/log/rabbitmq/startup_log
+ cat /var/log/rabbitmq/startup_err
+
+ exit_on_error 1 "DB sync command has failures"
+ fi
+}
+
+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}
+rpc_backend = ceilometer.openstack.common.rpc.impl_kombu
+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/v2.0
+
+[database]
+connection=mongodb://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/
+}
+
+install_and_setup_mongo() {
+ install_packages "mongodb mongodb-clients"
+ cat > /etc/mongodb.conf << EOF
+logappend=true
+bind_ip = 127.0.0.1
+port = 27017
+dbpath=/var/lib/mongo
+pidfilepath = /var/run/mongodb/mongodb.pid
+journal = true
+logpath = ${mongodb_log}
+setParameter = logLevel=1
+EOF
+ [ -d "/var/log/mongo" ] || mkdir /var/log/mongo
+ [ -d "/var/lib/mongo" ] || mkdir /var/lib/mongo
+ [ -d "/var/run/mongodb" ] || mkdir /var/run/mongodb
+ chown -R mongodb:mongodb /var/log/mongo /var/lib/mongo /var/run/mongodb /etc/mongodb.conf
+
+ service ${mongodb_service} restart
+ sleep 5
+
+ if [ -z "$(service ${mongodb_service} status | grep "start/running")" ]; then
+ cat ${mongodb_log}
+ exit_on_error 1 "Mongo service has failed to start"
+ fi
+
+ try=0
+ while [ ${try} -le '5' ]; do
+ mongo --host 127.0.0.1 --eval "db.getSiblingDB('admin')"
+ if [ "$?" -ne '0' ]; then
+ try=$((try + 1))
+ sleep 5
+ else
+ break
+ fi
+ done
+ if [ "${try}" -ge '5' ]; then
+ exit_on_error 1 "Mongo shell is not available. Mongo work is broken"
+ fi
+}
+
+send_fake_instance_notification() {
+ pip install pika==0.9.8
+ echo '#!/usr/bin/env python
+import pika
+connection = pika.BlockingConnection(pika.ConnectionParameters(host="127.0.0.1"))
+channel = connection.channel()
+channel.queue_declare(queue="notifications.info")
+test=r'"'"'{"event_type": "compute.instance.update", "_unique_id": "fake", "payload": {"ephemeral_gb": 0, "instance_id": "fake", "user_id": "fake", "root_gb": 0, "tenant_id": "fake", "memory_mb": 64, "vcpus": 1}, "priority": "INFO"}'"'"'
+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_and_services[@]}; 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_and_services[@]}"
+ install_and_setup_rabbit
+ install_and_setup_mysql
+ install_and_setup_keystone
+ install_and_setup_mongo
+ 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_packages_and_services[@]}; do
+ service ${service} restart
+ sleep 5
+ if [ -z "$(service ${service} status | grep "start/running")" ]; then
+ cat /var/log/ceilometer/${service}.log
+ exit_on_error 1 "Service ${service} has failed to start"
+ fi
+ done
+
+ repsonce=$(curl "http://localhost: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}
+ if [ "$?" -ne '0' ]; then
+ exit_on_error 1 "Command ${Command} has failed"
+ fi
+ done
+
+ # Keystone notifications
+ if [ -z "$(ceilometer ${ceilometer_auth_string} meter-list | grep identity)" ]; then
+ exit_on_error 1 "Keystone notifications don't work"
+ fi
+
+ # Instance notification
+ send_fake_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 [ -z "$(which ceilometer)" ]; then
+ exit_on_error 1 "Can't find command 'ceilometer'"
+ fi
+ ;;
+ *)
+ if ! ${found}; then
+ echo "Test not defined. Please create test for package ${package_to_test}"
+ fi
+ ;;
+esac
+
+exit ${RES}