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