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