blob: 743b4ae17045bc651f3706a9ab258b7afa1b697a [file] [log] [blame]
Sean Daguee263c822014-12-05 14:25:28 -05001#!/bin/bash
2#
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +09003# lib/rpc_backend
Sean Dague37eca482015-06-16 07:19:22 -04004# Interface for installing RabbitMQ on the system
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +09005
6# Dependencies:
Adam Spiers6a5aa7c2013-10-24 11:27:02 +01007#
8# - ``functions`` file
Abhishek Chandad5b74c62014-12-12 02:15:55 +05309# - ``RABBIT_{HOST|PASSWORD|USERID}`` must be defined when RabbitMQ is used
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +090010
11# ``stack.sh`` calls the entry points in this order:
12#
Adam Spiers6a5aa7c2013-10-24 11:27:02 +010013# - check_rpc_backend
14# - install_rpc_backend
15# - restart_rpc_backend
Sean Dague37eca482015-06-16 07:19:22 -040016# - iniset_rpc_backend (stable interface)
17#
18# Note: if implementing an out of tree plugin for an RPC backend, you
19# should install all services through normal plugin methods, then
20# redefine ``iniset_rpc_backend`` in your code. That's the one portion
21# of this file which is a standard interface.
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +090022
23# Save trace setting
Ian Wienand523f4882015-10-13 11:03:03 +110024_XTRACE_RPC_BACKEND=$(set +o | grep xtrace)
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +090025set +o xtrace
26
melanie witt0bf25502016-08-30 22:14:04 +000027RABBIT_USERID=${RABBIT_USERID:-stackrabbit}
Pawel Koniszewski20eb2742016-12-21 13:27:09 +010028if is_service_enabled rabbit; then
29 RABBIT_HOST=${RABBIT_HOST:-$SERVICE_HOST}
30fi
melanie witt0bf25502016-08-30 22:14:04 +000031
Dean Troyercc6b4432013-04-08 15:38:03 -050032# Functions
33# ---------
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +090034
Dean Troyer995eb922013-03-07 16:11:40 -060035# clean up after rpc backend - eradicate all traces so changing backends
36# produces a clean switch
37function cleanup_rpc_backend {
38 if is_service_enabled rabbit; then
39 # Obliterate rabbitmq-server
40 uninstall_package rabbitmq-server
Sean Dague9a413ab2015-02-04 12:44:18 -050041 # in case it's not actually running, /bin/true at the end
42 sudo killall epmd || sudo killall -9 epmd || /bin/true
Dean Troyer995eb922013-03-07 16:11:40 -060043 if is_ubuntu; then
44 # And the Erlang runtime too
Sahid Orentino Ferdjaouie9648272014-02-23 18:55:51 +010045 apt_get purge -y erlang*
Dean Troyer995eb922013-03-07 16:11:40 -060046 fi
Kenneth Giusti7e58c062014-07-23 16:44:37 -040047 fi
Dean Troyer995eb922013-03-07 16:11:40 -060048}
49
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +090050# install rpc backend
Ian Wienandaee18c72014-02-21 15:35:08 +110051function install_rpc_backend {
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +090052 if is_service_enabled rabbit; then
53 # Install rabbitmq-server
Ian Wienand7ccf4e02014-07-23 14:24:11 +100054 install_package rabbitmq-server
Dirk Mueller4404f682018-03-02 00:37:58 +010055 if is_suse; then
56 install_package rabbitmq-server-plugins
57 # the default systemd socket activation only listens on the loopback interface
58 # which causes rabbitmq to try to start its own epmd
59 sudo mkdir -p /etc/systemd/system/epmd.socket.d
60 cat <<EOF | sudo tee /etc/systemd/system/epmd.socket.d/ports.conf >/dev/null
61[Socket]
62ListenStream=
63ListenStream=[::]:4369
64EOF
65 sudo systemctl daemon-reload
66 sudo systemctl restart epmd.socket epmd.service
67 fi
68 if is_fedora || is_suse; then
Jan Gutter97096e02019-07-26 17:46:44 +020069 # NOTE(jangutter): If rabbitmq is not running (as in a fresh
70 # install) then rabbit_setuser triggers epmd@0.0.0.0.socket with
71 # socket activation. This fails the first time and does not get
72 # cleared. It is benign, but the workaround is to start rabbitmq a
73 # bit earlier for RPM based distros.
74 sudo systemctl --now enable rabbitmq-server
Kyle Mestery75633262016-01-07 16:46:37 -060075 fi
Zhang Jinnan4d8c03a2015-08-20 10:00:20 -040076 fi
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +090077}
78
79# restart the rpc backend
Ian Wienandaee18c72014-02-21 15:35:08 +110080function restart_rpc_backend {
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +090081 if is_service_enabled rabbit; then
82 # Start rabbitmq-server
83 echo_summary "Starting RabbitMQ"
Ben Nemecec5918f2014-01-30 16:07:23 +000084 # NOTE(bnemec): Retry initial rabbitmq configuration to deal with
85 # the fact that sometimes it fails to start properly.
Ian Wienand64b56a52014-12-16 09:53:36 +110086 # Reference: https://bugzilla.redhat.com/show_bug.cgi?id=1144100
Atsushi SAKAIfe7b56c2015-11-13 17:06:16 +090087 # NOTE(tonyb): Extend the original retry logic to only restart rabbitmq
Tony Breeds6bc905c2015-05-15 12:51:43 +100088 # every second time around the loop.
89 # See: https://bugs.launchpad.net/devstack/+bug/1449056 for details on
90 # why this is needed. This can bee seen on vivid and Debian unstable
91 # (May 2015)
92 # TODO(tonyb): Remove this when Debian and Ubuntu have a fixed systemd
93 # service file.
Dean Troyer3ef23bc2014-07-25 14:56:22 -050094 local i
Tony Breeds6bc905c2015-05-15 12:51:43 +100095 for i in `seq 20`; do
Ian Wienand64b56a52014-12-16 09:53:36 +110096 local rc=0
97
Tony Breeds6bc905c2015-05-15 12:51:43 +100098 [[ $i -eq "20" ]] && die $LINENO "Failed to set rabbitmq password"
Ian Wienand64b56a52014-12-16 09:53:36 +110099
Tony Breeds6bc905c2015-05-15 12:51:43 +1000100 if [[ $(( i % 2 )) == "0" ]] ; then
101 restart_service rabbitmq-server
102 fi
Ian Wienand64b56a52014-12-16 09:53:36 +1100103
104 rabbit_setuser "$RABBIT_USERID" "$RABBIT_PASSWORD" || rc=$?
105 if [ $rc -ne 0 ]; then
106 continue
107 fi
108
Ben Nemecec5918f2014-01-30 16:07:23 +0000109 # change the rabbit password since the default is "guest"
Ian Wienand64b56a52014-12-16 09:53:36 +1100110 sudo rabbitmqctl change_password \
111 $RABBIT_USERID $RABBIT_PASSWORD || rc=$?
112 if [ $rc -ne 0 ]; then
113 continue;
114 fi
115
116 break
Ben Nemecec5918f2014-01-30 16:07:23 +0000117 done
Jens Harbott81f67fd2017-08-29 09:52:58 +0000118 # NOTE(frickler): Remove the default guest user
119 sudo rabbitmqctl delete_user guest || true
Dan Smith6f0205b2017-02-22 05:59:30 -0800120 fi
121}
122
123# adds a vhost to the rpc backend
124function rpc_backend_add_vhost {
125 local vhost="$1"
126 if is_service_enabled rabbit; then
127 if [ -z `sudo rabbitmqctl list_vhosts | grep $vhost` ]; then
128 sudo rabbitmqctl add_vhost $vhost
129 sudo rabbitmqctl set_permissions -p $vhost $RABBIT_USERID ".*" ".*" ".*"
Kieran Spearfb2a3ae2013-03-11 23:55:49 +0000130 fi
Dan Smith6f0205b2017-02-22 05:59:30 -0800131 else
132 echo 'RPC backend does not support vhosts'
133 return 1
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +0900134 fi
135}
136
Kenneth Giustib6459042017-08-04 18:08:37 -0400137# Returns the address of the RPC backend in URL format.
gordon chungb6197e62015-02-12 15:33:35 -0500138function get_transport_url {
Mehdi Abaakouk6176ae62016-05-18 12:10:08 +0200139 local virtual_host=$1
Sean Dague37eca482015-06-16 07:19:22 -0400140 if is_service_enabled rabbit || { [ -n "$RABBIT_HOST" ] && [ -n "$RABBIT_PASSWORD" ]; }; then
Mehdi Abaakouk6176ae62016-05-18 12:10:08 +0200141 echo "rabbit://$RABBIT_USERID:$RABBIT_PASSWORD@$RABBIT_HOST:5672/$virtual_host"
gordon chungb6197e62015-02-12 15:33:35 -0500142 fi
143}
144
Kenneth Giustib6459042017-08-04 18:08:37 -0400145# Returns the address of the Notification backend in URL format. This
146# should be used to set the transport_url option in the
147# oslo_messaging_notifications group.
Thomas Herve26e431d2017-04-13 14:27:35 +0200148function get_notification_url {
149 local virtual_host=$1
150 if is_service_enabled rabbit || { [ -n "$RABBIT_HOST" ] && [ -n "$RABBIT_PASSWORD" ]; }; then
151 echo "rabbit://$RABBIT_USERID:$RABBIT_PASSWORD@$RABBIT_HOST:5672/$virtual_host"
152 fi
153}
154
Atsushi SAKAIfe7b56c2015-11-13 17:06:16 +0900155# iniset configuration
Ian Wienandaee18c72014-02-21 15:35:08 +1100156function iniset_rpc_backend {
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +0900157 local package=$1
158 local file=$2
Brant Knudson2dd110c2015-03-14 12:39:14 -0500159 local section=${3:-DEFAULT}
Mehdi Abaakouk6176ae62016-05-18 12:10:08 +0200160 local virtual_host=$4
Sean Dague37eca482015-06-16 07:19:22 -0400161 if is_service_enabled rabbit || { [ -n "$RABBIT_HOST" ] && [ -n "$RABBIT_PASSWORD" ]; }; then
Mehdi Abaakouk6176ae62016-05-18 12:10:08 +0200162 iniset $file $section transport_url $(get_transport_url "$virtual_host")
Mehdi Abaakouk7cf7a8f2015-04-09 11:46:56 +0200163 if [ -n "$RABBIT_HEARTBEAT_TIMEOUT_THRESHOLD" ]; then
164 iniset $file oslo_messaging_rabbit heartbeat_timeout_threshold $RABBIT_HEARTBEAT_TIMEOUT_THRESHOLD
165 fi
166 if [ -n "$RABBIT_HEARTBEAT_RATE" ]; then
167 iniset $file oslo_messaging_rabbit heartbeat_rate $RABBIT_HEARTBEAT_RATE
168 fi
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +0900169 fi
170}
171
Abhishek Chandad5b74c62014-12-12 02:15:55 +0530172function rabbit_setuser {
173 local user="$1" pass="$2" found="" out=""
174 out=$(sudo rabbitmqctl list_users) ||
175 { echo "failed to list users" 1>&2; return 1; }
176 found=$(echo "$out" | awk '$1 == user { print $1 }' "user=$user")
177 if [ "$found" = "$user" ]; then
178 sudo rabbitmqctl change_password "$user" "$pass" ||
179 { echo "failed changing pass for '$user'" 1>&2; return 1; }
180 else
181 sudo rabbitmqctl add_user "$user" "$pass" ||
182 { echo "failed changing pass for $user"; return 1; }
183 fi
184 sudo rabbitmqctl set_permissions "$user" ".*" ".*" ".*"
185}
186
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +0900187# Restore xtrace
Ian Wienand523f4882015-10-13 11:03:03 +1100188$_XTRACE_RPC_BACKEND
Sean Dague584d90e2013-03-29 14:34:53 -0400189
Adam Spiers6a5aa7c2013-10-24 11:27:02 +0100190# Tell emacs to use shell-script-mode
191## Local variables:
192## mode: shell-script
193## End: