blob: ff87aae2afe292d3ea53aa62043e9d90ab2322f1 [file] [log] [blame]
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +09001# lib/rpc_backend
2# Interface for interactig with different rpc backend
3# rpc backend settings
4
5# Dependencies:
6# ``functions`` file
7# ``RABBIT_{HOST|PASSWORD}`` must be defined when RabbitMQ is used
8
9# ``stack.sh`` calls the entry points in this order:
10#
11# check_rpc_backend
12# install_rpc_backend
13# restart_rpc_backend
14# iniset_rpc_backend
15
16# Save trace setting
17XTRACE=$(set +o | grep xtrace)
18set +o xtrace
19
Dean Troyercc6b4432013-04-08 15:38:03 -050020
21# Functions
22# ---------
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +090023
Matthieu Huin7a7a4662013-04-15 17:13:41 +020024
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +090025# Make sure we only have one rpc backend enabled.
26# Also check the specified rpc backend is available on your platform.
27function check_rpc_backend() {
Matthieu Huin7a7a4662013-04-15 17:13:41 +020028 local rpc_needed=1
29 # We rely on the fact that filenames in lib/* match the service names
30 # that can be passed as arguments to is_service_enabled.
31 # We check for a call to iniset_rpc_backend in these files, meaning
32 # the service needs a backend.
Vishvananda Ishaya78a53d92013-05-09 17:20:31 -070033 rpc_candidates=$(grep -rl iniset_rpc_backend $TOP_DIR/lib/ | awk -F/ '{print $NF}')
Matthieu Huin7a7a4662013-04-15 17:13:41 +020034 for c in ${rpc_candidates}; do
35 if is_service_enabled $c; then
36 rpc_needed=0
37 break
38 fi
39 done
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +090040 local rpc_backend_cnt=0
41 for svc in qpid zeromq rabbit; do
42 is_service_enabled $svc &&
43 ((rpc_backend_cnt++))
44 done
45 if [ "$rpc_backend_cnt" -gt 1 ]; then
46 echo "ERROR: only one rpc backend may be enabled,"
47 echo " set only one of 'rabbit', 'qpid', 'zeromq'"
48 echo " via ENABLED_SERVICES."
Matthieu Huin7a7a4662013-04-15 17:13:41 +020049 elif [ "$rpc_backend_cnt" == 0 ] && [ "$rpc_needed" == 0 ]; then
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +090050 echo "ERROR: at least one rpc backend must be enabled,"
51 echo " set one of 'rabbit', 'qpid', 'zeromq'"
52 echo " via ENABLED_SERVICES."
53 fi
54
55 if is_service_enabled qpid && ! qpid_is_supported; then
Nachi Ueno07115eb2013-02-26 12:38:18 -080056 die $LINENO "Qpid support is not available for this version of your distribution."
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +090057 fi
58}
59
Dean Troyer995eb922013-03-07 16:11:40 -060060# clean up after rpc backend - eradicate all traces so changing backends
61# produces a clean switch
62function cleanup_rpc_backend {
63 if is_service_enabled rabbit; then
64 # Obliterate rabbitmq-server
65 uninstall_package rabbitmq-server
66 sudo killall epmd
67 if is_ubuntu; then
68 # And the Erlang runtime too
69 sudo aptitude purge -y ~nerlang
70 fi
71 elif is_service_enabled qpid; then
72 if is_fedora; then
zhhuabj5595fdc2013-05-08 18:27:20 +080073 uninstall_package qpid-cpp-server
Dean Troyer995eb922013-03-07 16:11:40 -060074 elif is_ubuntu; then
75 uninstall_package qpidd
76 else
77 exit_distro_not_supported "qpid installation"
78 fi
79 elif is_service_enabled zeromq; then
80 if is_fedora; then
Eric Windisch800bf382013-05-24 11:21:11 -040081 uninstall_package zeromq python-zmq redis
Dean Troyer995eb922013-03-07 16:11:40 -060082 elif is_ubuntu; then
Eric Windisch800bf382013-05-24 11:21:11 -040083 uninstall_package libzmq1 python-zmq redis-server
Dean Troyer995eb922013-03-07 16:11:40 -060084 elif is_suse; then
Eric Windisch800bf382013-05-24 11:21:11 -040085 uninstall_package libzmq1 python-pyzmq redis
Dean Troyer995eb922013-03-07 16:11:40 -060086 else
87 exit_distro_not_supported "zeromq installation"
88 fi
Eric Windisch767c6df2013-05-23 11:55:40 -040089
90 # Necessary directory for socket location.
91 sudo mkdir -p /var/run/openstack
92 sudo chown $STACK_USER /var/run/openstack
Dean Troyer995eb922013-03-07 16:11:40 -060093 fi
94}
95
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +090096# install rpc backend
97function install_rpc_backend() {
98 if is_service_enabled rabbit; then
99 # Install rabbitmq-server
100 # the temp file is necessary due to LP: #878600
101 tfile=$(mktemp)
102 install_package rabbitmq-server > "$tfile" 2>&1
103 cat "$tfile"
104 rm -f "$tfile"
105 elif is_service_enabled qpid; then
106 if is_fedora; then
zhhuabj5595fdc2013-05-08 18:27:20 +0800107 install_package qpid-cpp-server
Ian Wienand64dd03d2013-04-11 12:01:09 +1000108 if [[ $DISTRO =~ (rhel6) ]]; then
Ian Wienand64dd03d2013-04-11 12:01:09 +1000109 # RHEL6 leaves "auth=yes" in /etc/qpidd.conf, it needs to
110 # be no or you get GSS authentication errors as it
111 # attempts to default to this.
112 sudo sed -i.bak 's/^auth=yes$/auth=no/' /etc/qpidd.conf
Ian Wienand64dd03d2013-04-11 12:01:09 +1000113 fi
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +0900114 elif is_ubuntu; then
115 install_package qpidd
Eoghan Glynn8c11f562013-03-01 12:09:01 +0000116 sudo sed -i '/PLAIN/!s/mech_list: /mech_list: PLAIN /' /etc/sasl2/qpidd.conf
117 sudo chmod o+r /etc/qpid/qpidd.sasldb
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +0900118 else
119 exit_distro_not_supported "qpid installation"
120 fi
121 elif is_service_enabled zeromq; then
Eric Windisch800bf382013-05-24 11:21:11 -0400122 # NOTE(ewindisch): Redis is not strictly necessary
123 # but there is a matchmaker driver that works
124 # really well & out of the box for multi-node.
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +0900125 if is_fedora; then
Eric Windisch800bf382013-05-24 11:21:11 -0400126 install_package zeromq python-zmq redis
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +0900127 elif is_ubuntu; then
Eric Windisch800bf382013-05-24 11:21:11 -0400128 install_package libzmq1 python-zmq redis-server
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +0900129 elif is_suse; then
Eric Windisch800bf382013-05-24 11:21:11 -0400130 install_package libzmq1 python-pyzmq redis
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +0900131 else
132 exit_distro_not_supported "zeromq installation"
133 fi
134 fi
135}
136
137# restart the rpc backend
138function restart_rpc_backend() {
139 if is_service_enabled rabbit; then
140 # Start rabbitmq-server
141 echo_summary "Starting RabbitMQ"
142 if is_fedora || is_suse; then
143 # service is not started by default
144 restart_service rabbitmq-server
145 fi
146 # change the rabbit password since the default is "guest"
147 sudo rabbitmqctl change_password guest $RABBIT_PASSWORD
Kieran Spearfb2a3ae2013-03-11 23:55:49 +0000148 if is_service_enabled n-cell; then
149 # Add partitioned access for the child cell
150 if [ -z `sudo rabbitmqctl list_vhosts | grep child_cell` ]; then
151 sudo rabbitmqctl add_vhost child_cell
152 sudo rabbitmqctl set_permissions -p child_cell guest ".*" ".*" ".*"
153 fi
154 fi
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +0900155 elif is_service_enabled qpid; then
156 echo_summary "Starting qpid"
157 restart_service qpidd
158 fi
159}
160
161# iniset cofiguration
162function iniset_rpc_backend() {
163 local package=$1
164 local file=$2
165 local section=$3
166 if is_service_enabled zeromq; then
167 iniset $file $section rpc_backend ${package}.openstack.common.rpc.impl_zmq
Eric Windisch800bf382013-05-24 11:21:11 -0400168 iniset $file $section rpc_zmq_matchmaker \
169 ${package}.openstack.common.rpc.matchmaker_redis.MatchMakerRedis
170 # Set MATCHMAKER_REDIS_HOST if running multi-node.
171 MATCHMAKER_REDIS_HOST=${MATCHMAKER_REDIS_HOST:-127.0.0.1}
172 iniset $file matchmaker_redis host $MATCHMAKER_REDIS_HOST
Jason Dillaman056df822013-07-01 08:52:13 -0400173 elif is_service_enabled qpid || [ -n "$QPID_HOST" ]; then
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +0900174 iniset $file $section rpc_backend ${package}.openstack.common.rpc.impl_qpid
Attila Fazekasa3dc3992013-07-11 11:26:35 +0200175 iniset $file $section qpid_hostname ${QPID_HOST:-$SERVICE_HOST}
Eoghan Glynn8c11f562013-03-01 12:09:01 +0000176 if is_ubuntu; then
177 QPID_PASSWORD=`sudo strings /etc/qpid/qpidd.sasldb | grep -B1 admin | head -1`
178 iniset $file $section qpid_password $QPID_PASSWORD
179 iniset $file $section qpid_username admin
180 fi
jiajun xu4a30b842013-01-22 11:49:03 +0800181 elif is_service_enabled rabbit || { [ -n "$RABBIT_HOST" ] && [ -n "$RABBIT_PASSWORD" ]; }; then
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +0900182 iniset $file $section rpc_backend ${package}.openstack.common.rpc.impl_kombu
183 iniset $file $section rabbit_host $RABBIT_HOST
184 iniset $file $section rabbit_password $RABBIT_PASSWORD
185 fi
186}
187
188# Check if qpid can be used on the current distro.
189# qpid_is_supported
190function qpid_is_supported() {
191 if [[ -z "$DISTRO" ]]; then
192 GetDistro
193 fi
194
195 # Qpid was introduced to Ubuntu in precise, disallow it on oneiric; it is
196 # not in openSUSE either right now.
197 ( ! ([[ "$DISTRO" = "oneiric" ]] || is_suse) )
198}
199
Dean Troyercc6b4432013-04-08 15:38:03 -0500200
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +0900201# Restore xtrace
202$XTRACE
Sean Dague584d90e2013-03-29 14:34:53 -0400203
204# Local variables:
205# mode: shell-script
206# End: