From 7e58c06a06bffc7b57386f9aed5ebb1829feeb07 Mon Sep 17 00:00:00 2001 From: Kenneth Giusti Date: Wed, 23 Jul 2014 16:44:37 -0400 Subject: [PATCH] Add an option to enable version 1.0 of the AMQP messaging protocol This change adds the RPC_MESSAGING_PROTOCOL configuration option that selects the messaging protocol that is used by the RPC backend and client. Some brokers can support different kinds of 'on the wire' messaging protocols. Qpid, for example, supports both AMQP 0-10 (the default), and AMQP 1.0. Use the RPC_MESSAGING_PROTOCOL configuration variable to override the default protocol for those brokers that support multiple protocol options. This new option is necessary in order to enable the new AMQP 1.0 oslo.messaging transport as described in the blueprint. Note well: currently this AMQP 1.0 functionality is only available on fedora 19+ platforms. Support is WIP on ubuntu/debian and rhel/centos 7. Enabling the RPC_MESSAGING_PROTOCOL option on an unsupported platform will cause devstack to exit with an approriate error message. Change-Id: Ib8dea59922844e87d6c947b5dca557f5b5fc1160 Implements: blueprint amqp10-driver-implementation --- files/rpms/qpid | 3 +++ lib/rpc_backend | 61 +++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 files/rpms/qpid diff --git a/files/rpms/qpid b/files/rpms/qpid new file mode 100644 index 0000000000..62148ba231 --- /dev/null +++ b/files/rpms/qpid @@ -0,0 +1,3 @@ +qpid-proton-c-devel # NOPRIME +python-qpid-proton # NOPRIME + diff --git a/lib/rpc_backend b/lib/rpc_backend index 38da50c4f8..8342aefa6a 100644 --- a/lib/rpc_backend +++ b/lib/rpc_backend @@ -6,6 +6,7 @@ # # - ``functions`` file # - ``RABBIT_{HOST|PASSWORD}`` must be defined when RabbitMQ is used +# - ``RPC_MESSAGING_PROTOCOL`` option for configuring the messaging protocol # ``stack.sh`` calls the entry points in this order: # @@ -90,21 +91,56 @@ function cleanup_rpc_backend { exit_distro_not_supported "zeromq installation" fi fi + + # Remove the AMQP 1.0 messaging libraries + if [ "$RPC_MESSAGING_PROTOCOL" == "AMQP1" ]; then + if is_fedora; then + uninstall_package qpid-proton-c-devel + uninstall_package python-qpid-proton + fi + # TODO(kgiusti) ubuntu cleanup + fi } # install rpc backend function install_rpc_backend { + # Regardless of the broker used, if AMQP 1.0 is configured load + # the necessary messaging client libraries for oslo.messaging + if [ "$RPC_MESSAGING_PROTOCOL" == "AMQP1" ]; then + if is_fedora; then + install_package qpid-proton-c-devel + install_package python-qpid-proton + elif is_ubuntu; then + # TODO(kgiusti) The QPID AMQP 1.0 protocol libraries + # are not yet in the ubuntu repos. Enable these installs + # once they are present: + #install_package libqpid-proton2-dev + #install_package python-qpid-proton + # Also add 'uninstall' directives in cleanup_rpc_backend()! + exit_distro_not_supported "QPID AMQP 1.0 Proton libraries" + else + exit_distro_not_supported "QPID AMQP 1.0 Proton libraries" + fi + # Install pyngus client API + # TODO(kgiusti) can remove once python qpid bindings are + # available on all supported platforms _and_ pyngus is added + # to the requirements.txt file in oslo.messaging + pip_install pyngus + fi + if is_service_enabled rabbit; then # Install rabbitmq-server install_package rabbitmq-server elif is_service_enabled qpid; then + local qpid_conf_file=/etc/qpid/qpidd.conf if is_fedora; then install_package qpid-cpp-server if [[ $DISTRO =~ (rhel6) ]]; then + qpid_conf_file=/etc/qpidd.conf # RHEL6 leaves "auth=yes" in /etc/qpidd.conf, it needs to # be no or you get GSS authentication errors as it # attempts to default to this. - sudo sed -i.bak 's/^auth=yes$/auth=no/' /etc/qpidd.conf + sudo sed -i.bak 's/^auth=yes$/auth=no/' $qpid_conf_file fi elif is_ubuntu; then install_package qpidd @@ -113,6 +149,22 @@ function install_rpc_backend { else exit_distro_not_supported "qpid installation" fi + # If AMQP 1.0 is specified, ensure that the version of the + # broker can support AMQP 1.0 and configure the queue and + # topic address patterns used by oslo.messaging. + if [ "$RPC_MESSAGING_PROTOCOL" == "AMQP1" ]; then + QPIDD=$(type -p qpidd) + if ! $QPIDD --help | grep -q "queue-patterns"; then + exit_distro_not_supported "qpidd with AMQP 1.0 support" + fi + if ! grep -q "queue-patterns=exclusive" $qpid_conf_file; then + cat <