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