Remove patch from Ceilometer source package
[openstack-build/ceilometer-build.git] / tests / runtests.sh
1 #!/bin/bash
2
3 set -eux
4
5 package_to_test=${1}
6 RES=0
7
8 mysql_pass="admin"
9 token=$(openssl rand -hex 10)
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/"
11 ceilometer_auth_string="--os-username ceilometer --os-password ceilometer --os-tenant-name ceilometer --os-auth-url http://127.0.0.1:35357/v2.0"
12 ceilometer_service=
13
14 keystone_log_file="/var/log/keystone/keystone.log"
15 ceilometer_log_dir="/var/log/ceilometer"
16 mongodb_log="/var/log/mongodb/mongodb.log"
17
18 if [[ `cat /etc/*-release | head -n 1 | awk '{print $1}'` =~ Ubuntu ]]; then
19    os="ubuntu"
20    packages_list="python-pip curl"
21    command_to_install="apt-get install -y --force-yes"
22    keystone_package="keystone"
23    keystone_service="keystone"
24    mysql_service="mysql"
25    mongodb_service="mongodb"
26    ceilometer_packages_and_services=(
27       ceilometer-agent-central
28       ceilometer-agent-compute
29       ceilometer-collector
30       ceilometer-agent-notification
31       ceilometer-polling
32       ceilometer-api
33       ceilometer-alarm-notifier
34       ceilometer-alarm-evaluator
35    )
36 else
37    echo "Disable tests for Centos"
38    exit 0
39    os="centos"
40    packages_list="python-pip curl"
41    command_to_install="yum install -y"
42    keystone_package="openstack-keystone"
43    keystone_service="openstack-keystone"
44    mysql_service="mysqld"
45    mongodb_service="mongod"
46    ceilometer_packages_and_services=(
47       openstack-ceilometer-central
48       openstack-ceilometer-compute
49       openstack-ceilometer-collector
50       openstack-ceilometer-notification
51       openstack-ceilometer-polling
52       openstack-ceilometer-api
53       openstack-ceilometer-alarm
54    )
55 fi
56
57 ceilometer_binaries=(
58    ceilometer-agent-central
59    ceilometer-agent-compute
60    ceilometer-collector
61    ceilometer-agent-notification
62    ceilometer-polling
63    ceilometer-api
64    ceilometer-alarm-notifier
65    ceilometer-alarm-evaluator
66    ceilometer-dbsync
67    ceilometer-expirer
68    ceilometer-rootwrap
69    ceilometer-send-sample
70 )
71
72 config_files=(
73    api_paste.ini
74    ceilometer.conf
75    deprecated_pipeline.yaml
76    event_definitions.yaml
77    event_pipeline.yaml
78    gabbi_pipeline.yaml
79    pipeline.yaml
80    policy.json
81    rootwrap.conf
82 )
83
84 list_commands=(
85    alarm-list
86    event-list
87    meter-list
88    resource-list
89    sample-list
90 )
91
92 install_packages() {
93    ${command_to_install} $@
94 }
95
96 prepare_vm() {
97    install_packages ${packages_list}
98 }
99
100 install_and_setup_keystone() {
101    install_packages ${keystone_package}
102    service ${keystone_service} stop
103
104    cat > /etc/keystone/keystone.conf << EOF
105 [DEFAULT]
106 admin_token=${token}
107 log_file=${keystone_log_file}
108 rabbit_password = guest
109 rabbit_hosts = 127.0.0.1
110 notification_driver = messaging
111 notification_topics = notifications
112 [database]
113 connection=mysql://keystone:keystone@localhost/keystone
114 [token]
115 provider=keystone.token.providers.uuid.Provider
116 EOF
117    [ -d "/var/log/keystone/" ] || mkdir /var/log/keystone/
118    touch ${keystone_log_file}
119    chown -R keystone:keystone /var/log/keystone/
120    chown -R keystone:keystone /etc/keystone
121
122    keystone-manage db_sync
123    service ${keystone_service} restart
124    sleep 5
125
126    if [ -z "$(curl -s http://localhost:5000/ | grep '^{"versions":')" ]; then
127       cat ${keystone_log_file}
128       exit_on_error 1 "Failed to get to keystone API.\nTests failed because of keystone problem"
129    fi
130 }
131
132 install_and_setup_mysql() {
133    echo "mysql-server mysql-server/root_password select ${mysql_pass}" | debconf-set-selections
134    echo "mysql-server mysql-server/root_password_again select ${mysql_pass}" | debconf-set-selections
135    ${command_to_install} mysql-server-5.6 mysql-client-core-5.6 python-mysqldb
136    if [ -f "/etc/mysql/conf.d/wsrep.cnf" ]; then
137      rm -f /etc/mysql/conf.d/wsrep.cnf
138    fi
139
140    service ${mysql_service} restart
141    sleep 5
142
143    if [ -z "$(service ${mysql_service} status | grep "start/running" )" ]; then
144       exit_on_error 1 "Mysql service has failed to start"
145    fi
146
147    mysql -uroot -p${mysql_pass} -Bse "drop database if exists keystone"
148    mysql -uroot -p${mysql_pass} -Bse "create database keystone"
149    mysql -uroot -p${mysql_pass} -Bse "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'keystone'"
150    mysql -uroot -p${mysql_pass} -Bse "flush privileges"
151 }
152
153 install_and_setup_rabbit() {
154    install_packages rabbitmq-server
155    echo "127.0.10.1 $(hostname)" >> /etc/hosts
156    service rabbitmq-server restart
157    sleep 5
158
159    if [ ! -z "$(service rabbitmq-server status | grep "Error: unable to connect to node")" ]; then
160       cat /var/log/rabbitmq/startup_log
161       cat /var/log/rabbitmq/startup_err
162
163       exit_on_error 1 "DB sync command has failures"
164    fi
165 }
166
167 ceilometer_configuration() {
168    cat > /etc/ceilometer/ceilometer.conf << EOF
169 [DEFAULT]
170 api_paste_config = /etc/ceilometer/api_paste.ini
171 policy_file = /etc/ceilometer/policy.json
172 debug = True
173 verbose = True
174 log_dir = ${ceilometer_log_dir}
175 rpc_backend = ceilometer.openstack.common.rpc.impl_kombu
176 auth_strategy = keystone
177 rabbit_password = guest
178 rabbit_hosts = 127.0.0.1
179
180 [keystone_authtoken]
181 auth_host = 127.0.0.1
182 auth_port = 35357
183 auth_protocol = http
184 admin_tenant_name = ceilometer
185 admin_user = ceilometer
186 admin_password = ceilometer
187 auth_url=http://127.0.0.1:35357/v2.0
188
189 [database]
190 connection=mongodb://127.0.0.1/ceilometer
191
192 [notification]
193 store_events = True
194 EOF
195    [ -e /etc/default/ceilometer-polling ] && rm -f /etc/default/ceilometer-polling
196    echo "DAEMON_ARGS=\"--polling-namespaces=central\"" > /etc/default/ceilometer-polling
197
198    [ -d "${ceilometer_log_dir}" ] || mkdir ${ceilometer_log_dir}
199    chown -R ceilometer:ceilometer ${ceilometer_log_dir}
200    chown -R ceilometer:ceilometer /etc/ceilometer
201
202    ceilometer-dbsync --config-file /etc/ceilometer/ceilometer.conf
203    if [ "$?" -ne '0' ]; then
204       cat ${ceilometer_log_dir}/ceilometer-dbsync.log
205       exit_on_error 1 "DB sync command has failures"
206    fi
207
208    keystone ${auth_string} user-create --name ceilometer --pass ceilometer
209    keystone ${auth_string} tenant-create --name ceilometer
210    keystone ${auth_string} role-create --name=admin
211    keystone ${auth_string} user-role-add --user ceilometer --role admin --tenant ceilometer
212    ceilometer_service=$(keystone ${auth_string} service-create --name=ceilometer\
213  --type=metering --description="ceilometer" | grep id | awk -F '|' '{print $3}' | tr -d ' ')
214    keystone ${auth_string} endpoint-create --region RegionOne --service-id=${ceilometer_service}\
215  --publicurl=http://127.0.0.1:8777/ --internalurl=http://127.0.0.1:8777/ --adminurl=http://127.0.0.1:8777/
216 }
217
218 install_and_setup_mongo() {
219    install_packages "mongodb mongodb-clients"
220    cat > /etc/mongodb.conf << EOF
221 logappend=true
222 bind_ip = 127.0.0.1
223 port = 27017
224 dbpath=/var/lib/mongo
225 pidfilepath = /var/run/mongodb/mongodb.pid
226 journal = true
227 logpath = ${mongodb_log}
228 setParameter = logLevel=1
229 EOF
230    [ -d "/var/log/mongo" ] || mkdir /var/log/mongo
231    [ -d "/var/lib/mongo" ] || mkdir /var/lib/mongo
232    [ -d "/var/run/mongodb" ] || mkdir /var/run/mongodb
233    chown -R mongodb:mongodb /var/log/mongo /var/lib/mongo /var/run/mongodb /etc/mongodb.conf
234
235    service ${mongodb_service} restart
236    sleep 5
237
238    if [ -z "$(service ${mongodb_service} status | grep "start/running")" ]; then
239       cat ${mongodb_log}
240       exit_on_error 1 "Mongo service has failed to start"
241    fi
242
243    try=0
244    while [ ${try} -le '5' ]; do
245       mongo --host 127.0.0.1 --eval "db.getSiblingDB('admin')"
246       if [ "$?" -ne '0' ]; then
247          try=$((try + 1))
248          sleep 5
249       else
250          break
251       fi
252    done
253    if [ "${try}" -ge '5' ]; then
254       exit_on_error 1 "Mongo shell is not available. Mongo work is broken"
255    fi
256 }
257
258 send_fake_instance_notification() {
259    pip install pika==0.9.8
260    echo '#!/usr/bin/env python
261 import pika
262 connection = pika.BlockingConnection(pika.ConnectionParameters(host="127.0.0.1"))
263 channel = connection.channel()
264 channel.queue_declare(queue="notifications.info")
265 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"}'"'"'
266 channel.basic_publish(exchange="nova", routing_key="notifications.info",
267                       properties=pika.BasicProperties(priority=0, delivery_mode=2, headers="", content_encoding="utf-8", content_type="application/json"),
268                       body=test)
269 print " [x] Message was sent!"
270 connection.close()' > $(pwd)/send.py
271    python $(pwd)/send.py
272 }
273
274 exit_on_error() {
275    # $1 - responce code
276    # $2 - message
277    if [ "${1}" -ne '0' ]; then
278       echo -e "${2}"
279       RES=${1}
280       exit ${RES}
281    fi
282 }
283
284 found=false
285 for i in ${ceilometer_packages_and_services[@]}; do
286    if [ "${i}" == "${package_to_test}" ]; then
287       found=true
288    fi
289 done
290
291 if ${found}; then
292    echo "Test for package ${package_to_test} will be run with ceilometer-common package"
293    RES=0
294 fi
295
296 case ${package_to_test} in
297    ceilometer-common|openstack-ceilometer-common)
298       prepare_vm
299       install_packages "${ceilometer_packages_and_services[@]}"
300       install_and_setup_rabbit
301       install_and_setup_mysql
302       install_and_setup_keystone
303       install_and_setup_mongo
304       ceilometer_configuration
305
306       for binary in ${ceilometer_binaries[@]}; do
307          if [ ! -f "/usr/bin/${binary}" ]; then
308             exit_on_error 1 "Ceilometer binary ${binary} is missed"
309          fi
310       done
311
312       for config in ${config_files[@]}; do
313          if [ ! -f "/etc/ceilometer/${config}" ]; then
314             exit_on_error 1 "Ceilometer configuration file ${config} is missed"
315          fi
316       done
317
318       for service in ${ceilometer_packages_and_services[@]}; do
319          service ${service} restart
320          sleep 5
321          if [ -z "$(service ${service} status | grep "start/running")" ]; then
322             cat /var/log/ceilometer/${service}.log
323             exit_on_error 1 "Service ${service} has failed to start"
324          fi
325       done
326
327       repsonce=$(curl "http://localhost:8777" | grep "Authentication required")
328       if [ -z "$repsonce" ]; then
329          exit_on_error 1 "Ceilometer api doesn't work.\n No one process is listening on 8777 port"
330       fi
331
332       for Command in ${list_commands[@]}; do
333          ceilometer ${ceilometer_auth_string} ${Command}
334          if [ "$?" -ne '0' ]; then
335              exit_on_error 1 "Command ${Command} has failed"
336          fi
337       done
338
339       # Keystone notifications
340       if [ -z "$(ceilometer ${ceilometer_auth_string} meter-list | grep identity)" ]; then
341          exit_on_error 1 "Keystone notifications don't work"
342       fi
343
344       # Instance notification
345       send_fake_instance_notification
346       resource_id=$(ceilometer ${ceilometer_auth_string} resource-list | grep fake)
347       if [ -z ${resource_id} ]; then
348          exit_on_error 1 "Notification is not received"
349       fi
350
351       # Events
352       if [ -z "$(ceilometer ${ceilometer_auth_string} event-list | grep fake)" ]; then
353          exit_on_error 1 "Events wasn't created"
354       fi
355
356       # Alarming
357       ceilometer -dv ${ceilometer_auth_string} alarm-threshold-create --name cpu_high --description 'instance running hot' \
358  --meter-name cpu_util  --threshold 70.0 --comparison-operator gt  --statistic avg \
359  --period 600 --evaluation-periods 3 --alarm-action 'log://' --query resource_id="${resource_id}"
360
361       if [ "$?" -ne '0' -a -z "$(ceilometer ${ceilometer_auth_string} alarm-list | grep cpu_high)" ]; then
362          exit_on_error 1 "Alarm creation has failed"
363       fi
364
365       # Samples
366       ceilometer -dv ${ceilometer_auth_string} sample-create -m fake_sample --meter-type gauge --meter-unit '%' --sample-volume 100 -r "fake"
367
368       if [ "$?" -ne '0' -a -z "$(ceilometer ${ceilometer_auth_string} sample-list | grep fake_sample)" ]; then
369          exit_on_error 1 "Sample creation has failed"
370       fi
371    ;;
372    ceilometer-agent-ipmi|openstack-ceilometer-ipmi)
373       # Ceilometer-agent-ipmi is not included in common testing
374       # because it is not used in Fuel now
375       if [ ! -f "/usr/bin/ceilometer-agent-ipmi" ]; then
376          exit_on_error 1 "Ceilometer ipmi binary is missed"
377       fi
378    ;;
379    python-ceilometer)
380       python -c 'import ceilometer'
381       if [ $? -ne '0' ]; then
382          exit_on_error 1 "Couldn't import module 'ceilometer'"
383       fi
384       if [ -z "$(which ceilometer)" ]; then
385          exit_on_error 1 "Can't find command 'ceilometer'"
386       fi
387    ;;
388    *)
389       if ! ${found}; then
390          echo "Test not defined. Please create test for package ${package_to_test}"
391       fi
392    ;;
393 esac
394
395 exit ${RES}