X-Git-Url: https://review.fuel-infra.org/gitweb?a=blobdiff_plain;f=tests%2Fruntests.sh;h=f92d02cdf679f399bae4b550e3c940755d7489ac;hb=refs%2Fheads%2Fopenstack-ci%2Ffuel-8.0%2Fliberty;hp=47c00260b78d3a36a8ba886c934ec2c54f381619;hpb=f118dda94ae3c5573049ece7bdae379113b32008;p=openstack-build%2Fceilometer-build.git diff --git a/tests/runtests.sh b/tests/runtests.sh index 47c0026..163281e 100755 --- a/tests/runtests.sh +++ b/tests/runtests.sh @@ -1,2 +1,388 @@ -#!/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="--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}