[AMQP 1.0] Update setup test environment dispatch router backend

This commit updates the setup environment for the driver functional
tests to support either a qpidd (broker) or qdrouterd (router)
backend.

This patch:
* configures and runs either qpidd or qdrouterd backend
* removes support of older qpidd versions
* skips batch notification test for qdrouterd backend

Change-Id: Ifcdc187bae4a28dd29c1faa73e239d7e4d77015d
This commit is contained in:
Andrew Smith 2016-08-25 15:52:18 -04:00
parent fcf114294b
commit c5d142b441
4 changed files with 217 additions and 121 deletions

View File

@ -11,6 +11,7 @@
# License for the specific language governing permissions and limitations
# under the License.
import os
import time
import uuid
@ -331,6 +332,13 @@ class NotifyTestCase(utils.SkipIfNoTransportURL):
self.assertEqual(expected[3], actual[2])
def test_simple_batch(self):
if self.url.startswith("amqp:"):
backend = os.environ.get("AMQP1_BACKEND")
if backend == "qdrouterd":
# end-to-end acknowledgement with router intermediary
# sender pends until batch_size or timeout reached
self.skipTest("qdrouterd backend")
listener = self.useFixture(
utils.BatchNotificationFixture(self.conf, self.url,
['test_simple_batch'],

191
setup-test-env-amqp1.sh Executable file
View File

@ -0,0 +1,191 @@
#!/bin/bash
#
# Usage: setup-test-env-amqp.sh <command to run>
# where AMQP1_BACKEND is the AMQP 1.0 intermediary to use. Valid
# values are "qdrouterd" for router and "qpidd" for broker.
set -e
# router requires qdrouterd, sasl2-bin/cyrus-sasl-plain+cyrus-sasl-lib
# broker requires qpidd, qpid-tools sasl2-bin/cyrus-sasl-plain+cyrus-sasl-lib
. tools/functions.sh
DATADIR=$(mktemp -d /tmp/OSLOMSG-${AMQP1_BACKEND}.XXXXX)
trap "clean_exit $DATADIR" EXIT
function _setup_qdrouterd_user {
echo secretqpid | saslpasswd2 -c -p -f ${DATADIR}/qdrouterd.sasldb stackqpid
}
function _setup_qpidd_user {
echo secretqpid | saslpasswd2 -c -p -f ${DATADIR}/qpidd.sasldb -u QPID stackqpid
}
function _configure_qdrouterd {
# create a stand alone router
cat > ${DATADIR}/qdrouterd.conf <<EOF
router {
mode: standalone
id: Router.A
workerThreads: 4
saslConfigPath: ${DATADIR}/sasl2
saslConfigName: qdrouterd
}
EOF
# create a listener for incoming connect to the router
cat >> ${DATADIR}/qdrouterd.conf <<EOF
listener {
addr: 0.0.0.0
port: 65123
role: normal
authenticatePeer: yes
}
EOF
# create fixed address prefixes
cat >> ${DATADIR}/qdrouterd.conf <<EOF
address {
prefix: unicast
distribution: closest
}
address {
prefix: exclusive
distribution: closest
}
address {
prefix: broadcast
distribution: multicast
}
address {
prefix: openstack.org/om/rpc/multicast
distribution: multicast
}
address {
prefix: openstack.org/om/rpc/unicast
distribution: closest
}
address {
prefix: openstack.org/om/rpc/anycast
distribution: balanced
}
address {
prefix: openstack.org/om/notify/multicast
distribution: multicast
}
address {
prefix: openstack.org/om/notify/unicast
distribution: closest
}
address {
prefix: openstack.org/om/notify/anycast
distribution: balanced
}
EOF
# create log file configuration
cat >> ${DATADIR}/qdrouterd.conf <<EOF
log {
module: DEFAULT
enable: trace+
output: ${DATADIR}/out
}
EOF
# sasl2 config
mkdir -p ${DATADIR}/sasl2
cat > ${DATADIR}/sasl2/qdrouterd.conf <<EOF
pwcheck_method: auxprop
auxprop_plugin: sasldb
sasldb_path: ${DATADIR}/qdrouterd.sasldb
mech_list: PLAIN ANONYMOUS
EOF
}
function _configure_qpidd {
[ -f "/usr/lib/qpid/daemon/acl.so" ] && LIBACL="load-module=/usr/lib/qpid/daemon/acl.so"
cat > ${DATADIR}/qpidd.conf <<EOF
port=65123
sasl-config=${DATADIR}/sasl2
${LIBACL}
mgmt-enable=yes
log-to-stderr=no
EOF
if ! `$(which qpidd 2>/dev/null) --help | grep -q "sasl-service-name"`; then
echo "This version of $QPIDD does not support SASL authentication with AMQP 1.0"
cat >> ${DATADIR}/qpidd.conf <<EOF
auth=no
EOF
else
cat >> ${DATADIR}/qpidd.conf <<EOF
auth=yes
acl-file=${DATADIR}/qpidd.acl
sasl-service-name=amqp
EOF
fi
cat >> ${DATADIR}/qpidd.conf <<EOF
queue-patterns=exclusive
queue-patterns=unicast
topic-patterns=broadcast
EOF
cat > ${DATADIR}/qpidd.acl <<EOF
group admin stackqpid@QPID
acl allow admin all
acl deny all all
EOF
mkdir -p ${DATADIR}/sasl2
cat > ${DATADIR}/sasl2/qpidd.conf <<EOF
pwcheck_method: auxprop
auxprop_plugin: sasldb
sasldb_path: ${DATADIR}/qpidd.sasldb
mech_list: PLAIN ANONYMOUS
EOF
}
function _start_qdrouterd {
MAJOR=$(python -c 'import sys; print sys.version_info.major')
MINOR=$(python -c 'import sys; print sys.version_info.minor')
# qdrouterd needs access to global site packages
# create path file and place in virtual env working directory
SITEDIR=${WORKDIR}/${ENVNAME}/lib/python${MAJOR}.${MINOR}/site-packages
cat > ${SITEDIR}/dispatch.pth <<EOF
/usr/lib/python${MAJOR}.${MINOR}/site-packages
EOF
QDR=$(which qdrouterd 2>/dev/null)
mkfifo ${DATADIR}/out
$QDR --config ${DATADIR}/qdrouterd.conf &
wait_for_line "Router .*started" "error" ${DATADIR}/out
rm ${SITEDIR}/dispatch.pth
}
function _start_qpidd {
QPIDD=$(which qpidd 2>/dev/null)
mkfifo ${DATADIR}/out
$QPIDD --log-enable trace+ --log-to-file ${DATADIR}/out --config ${DATADIR}/qpidd.conf &
wait_for_line "Broker .*running" "error" ${DATADIR}/out
}
_configure_${AMQP1_BACKEND}
_setup_${AMQP1_BACKEND}_user
_start_${AMQP1_BACKEND}
$*

View File

@ -1,115 +0,0 @@
#!/bin/bash
#
# Usage: setup-test-env-qpid.sh PROTOCOL <command to run>
# where PROTOCOL is the version of the AMQP protocol to use with
# qpidd. Valid values for PROTOCOL are "1", "1.0", "0-10", "0.10"
set -e
# require qpidd, qpid-tools sasl2-bin/cyrus-sasl-plain+cyrus-sasl-lib
. tools/functions.sh
DATADIR=$(mktemp -d /tmp/OSLOMSG-QPID.XXXXX)
trap "clean_exit $DATADIR" EXIT
QPIDD=$(which qpidd 2>/dev/null)
# which protocol should be used with qpidd?
# 1 for AMQP 1.0, 0.10 for AMQP 0.10
#
PROTOCOL=$1
case $PROTOCOL in
"1" | "1.0")
PROTOCOL="1"
shift
;;
"0.10" | "0-10")
PROTOCOL="0-10"
shift
;;
*)
# assume the old protocol
echo "No protocol specified, assuming 0.10"
PROTOCOL="0-10"
;;
esac
# ensure that the version of qpidd does support AMQP 1.0
if [ $PROTOCOL == "1" ] && ! `$QPIDD --help | grep -q "queue-patterns"`; then
echo "This version of $QPIDD does not support AMQP 1.0"
exit 1
fi
[ -f "/usr/lib/qpid/daemon/acl.so" ] && LIBACL="load-module=/usr/lib/qpid/daemon/acl.so"
cat > ${DATADIR}/qpidd.conf <<EOF
port=65123
sasl-config=${DATADIR}/sasl2
${LIBACL}
mgmt-enable=yes
log-to-stderr=no
EOF
# sadly, older versions of qpidd (<=0.32) cannot authenticate against
# newer versions of proton (>=0.10). If this version of qpidd does
# not support the fix, then do not require authentication
if [ $PROTOCOL == "1" ] && ! `$QPIDD --help | grep -q "sasl-service-name"`; then
echo "This version of $QPIDD does not support SASL authentication with AMQP 1.0"
cat >> ${DATADIR}/qpidd.conf <<EOF
auth=no
EOF
else
cat >> ${DATADIR}/qpidd.conf <<EOF
auth=yes
acl-file=${DATADIR}/qpidd.acl
EOF
fi
if [ $PROTOCOL == "1" ]; then
cat >> ${DATADIR}/qpidd.conf <<EOF
# Used by AMQP1.0 only
queue-patterns=exclusive
queue-patterns=unicast
topic-patterns=broadcast
EOF
# versions of qpidd >0.32 require this for AMQP 1 and SASL:
if `$QPIDD --help | grep -q "sasl-service-name"`; then
cat >> ${DATADIR}/qpidd.conf <<EOF
sasl-service-name=amqp
EOF
fi
fi
cat > ${DATADIR}/qpidd.acl <<EOF
group admin stackqpid@QPID
acl allow admin all
acl deny all all
EOF
mkdir -p ${DATADIR}/sasl2
cat > ${DATADIR}/sasl2/qpidd.conf <<EOF
pwcheck_method: auxprop
auxprop_plugin: sasldb
sasldb_path: ${DATADIR}/qpidd.sasldb
EOF
# TODO(kgiusti): we can remove "ANONYMOUS" once proton 0.10.1+ is released:
# https://issues.apache.org/jira/browse/PROTON-974
if [ $PROTOCOL == "1" ]; then
cat >> ${DATADIR}/sasl2/qpidd.conf <<EOF
mech_list: PLAIN ANONYMOUS
EOF
else
cat >> ${DATADIR}/sasl2/qpidd.conf <<EOF
mech_list: PLAIN
EOF
fi
echo secretqpid | saslpasswd2 -c -p -f ${DATADIR}/qpidd.sasldb -u QPID stackqpid
mkfifo ${DATADIR}/out
$QPIDD --log-enable info+ --log-to-file ${DATADIR}/out --config ${DATADIR}/qpidd.conf &
wait_for_line "Broker .*running" "error" ${DATADIR}/out
$*

24
tox.ini
View File

@ -43,21 +43,33 @@ setenv = TRANSPORT_DRIVER=pika
commands = pifpaf run rabbitmq -- python setup.py testr --slowest --testr-args='{posargs:oslo_messaging.tests.functional}'
[testenv:py27-func-amqp1]
setenv = TRANSPORT_URL=amqp://stackqpid:secretqpid@127.0.0.1:65123//
setenv =
TRANSPORT_URL=amqp://stackqpid:secretqpid@127.0.0.1:65123//
AMQP1_BACKEND=qpidd
ENVNAME={envname}
WORKDIR={toxworkdir}
# NOTE(kgiusti): This gate job runs on Centos 7 for now.
commands = {toxinidir}/setup-test-env-qpid.sh 1.0 python setup.py testr --slowest --testr-args='{posargs:oslo_messaging.tests.functional}'
commands = {toxinidir}/setup-test-env-amqp1.sh python setup.py testr --slowest --testr-args='oslo_messaging.tests.functional'
[testenv:py34-func-amqp1]
basepython = python3.4
setenv = TRANSPORT_URL=amqp://stackqpid:secretqpid@127.0.0.1:65123//
setenv =
TRANSPORT_URL=amqp://stackqpid:secretqpid@127.0.0.1:65123//
AMQP1_BACKEND=qpidd
ENVNAME={envname}
WORKDIR={toxworkdir}
# NOTE(kgiusti): This gate job runs on Centos 7 for now.
commands = {toxinidir}/setup-test-env-qpid.sh 1.0 python setup.py testr --slowest --testr-args='{posargs:oslo_messaging.tests.functional}'
commands = {toxinidir}/setup-test-env-amqp1.sh python setup.py testr --slowest --testr-args='oslo_messaging.tests.functional'
[testenv:py35-func-amqp1]
basepython = python3.5
setenv = TRANSPORT_URL=amqp://stackqpid:secretqpid@127.0.0.1:65123//
setenv =
TRANSPORT_URL=amqp://stackqpid:secretqpid@127.0.0.1:65123//
AMQP1_BACKEND=qpidd
ENVNAME={envname}
WORKDIR={toxworkdir}
# NOTE(kgiusti): This gate job runs on Centos 7 for now.
commands = {toxinidir}/setup-test-env-qpid.sh 1.0 python setup.py testr --slowest --testr-args='{posargs:oslo_messaging.tests.functional}'
commands = {toxinidir}/setup-test-env-amqp1.sh python setup.py testr --slowest --testr-args='oslo_messaging.tests.functional'
[testenv:py27-func-zeromq]
commands = {toxinidir}/setup-test-env-zmq.sh python setup.py testr --slowest --testr-args='{posargs:oslo_messaging.tests.functional}'