#!/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-agent-ipmi 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-ipmi 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 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 = rabbit 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 # Ceilometer functionality has changed. # Remove after test rework. exit 0 # 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}