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