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