Merge "Ensure the amqp options are present in config file"
This commit is contained in:
commit
d375e76feb
@ -1,14 +0,0 @@
|
|||||||
# Copyright 2014, Red Hat, Inc.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
from .driver import ProtonDriver
|
|
@ -35,55 +35,10 @@ from six import moves
|
|||||||
|
|
||||||
from oslo.config import cfg
|
from oslo.config import cfg
|
||||||
from oslo.messaging._drivers.protocols.amqp import eventloop
|
from oslo.messaging._drivers.protocols.amqp import eventloop
|
||||||
|
from oslo.messaging._drivers.protocols.amqp import opts
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
_amqp1_opts = [
|
|
||||||
cfg.StrOpt('server_request_prefix',
|
|
||||||
default='exclusive',
|
|
||||||
help="address prefix used when sending to a specific server"),
|
|
||||||
|
|
||||||
cfg.StrOpt('broadcast_prefix',
|
|
||||||
default='broadcast',
|
|
||||||
help="address prefix used when broadcasting to all servers"),
|
|
||||||
|
|
||||||
cfg.StrOpt('group_request_prefix',
|
|
||||||
default='unicast',
|
|
||||||
help="address prefix when sending to any server in group"),
|
|
||||||
|
|
||||||
cfg.StrOpt('container_name',
|
|
||||||
default=None,
|
|
||||||
help='Name for the AMQP container'),
|
|
||||||
|
|
||||||
cfg.IntOpt('idle_timeout',
|
|
||||||
default=0, # disabled
|
|
||||||
help='Timeout for inactive connections (in seconds)'),
|
|
||||||
|
|
||||||
cfg.BoolOpt('trace',
|
|
||||||
default=False,
|
|
||||||
help='Debug: dump AMQP frames to stdout'),
|
|
||||||
|
|
||||||
cfg.StrOpt('ssl_ca_file',
|
|
||||||
default='',
|
|
||||||
help="CA certificate PEM file for verifing server certificate"),
|
|
||||||
|
|
||||||
cfg.StrOpt('ssl_cert_file',
|
|
||||||
default='',
|
|
||||||
help='Identifying certificate PEM file to present to clients'),
|
|
||||||
|
|
||||||
cfg.StrOpt('ssl_key_file',
|
|
||||||
default='',
|
|
||||||
help='Private key PEM file used to sign cert_file certificate'),
|
|
||||||
|
|
||||||
cfg.StrOpt('ssl_key_password',
|
|
||||||
default=None,
|
|
||||||
help='Password for decrypting ssl_key_file (if encrypted)'),
|
|
||||||
|
|
||||||
cfg.BoolOpt('allow_insecure_clients',
|
|
||||||
default=False,
|
|
||||||
help='Accept clients using either SSL or plain TCP')
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
class Task(object):
|
class Task(object):
|
||||||
"""Perform a messaging operation via the Controller."""
|
"""Perform a messaging operation via the Controller."""
|
||||||
@ -287,24 +242,27 @@ class Controller(pyngus.ConnectionEventHandler):
|
|||||||
self._servers = {}
|
self._servers = {}
|
||||||
self.hosts = Hosts(hosts)
|
self.hosts = Hosts(hosts)
|
||||||
|
|
||||||
opt_group = cfg.OptGroup(name='amqp1',
|
opt_group = cfg.OptGroup(name='oslo_messaging_amqp',
|
||||||
title='AMQP 1.0 options')
|
title='AMQP 1.0 driver options')
|
||||||
config.register_group(opt_group)
|
config.register_group(opt_group)
|
||||||
config.register_opts(_amqp1_opts, group=opt_group)
|
config.register_opts(opts.amqp1_opts, group=opt_group)
|
||||||
|
|
||||||
self.server_request_prefix = config.amqp1.server_request_prefix
|
self.server_request_prefix = \
|
||||||
self.broadcast_prefix = config.amqp1.broadcast_prefix
|
config.oslo_messaging_amqp.server_request_prefix
|
||||||
self.group_request_prefix = config.amqp1.group_request_prefix
|
self.broadcast_prefix = config.oslo_messaging_amqp.broadcast_prefix
|
||||||
self._container_name = config.amqp1.container_name
|
self.group_request_prefix = \
|
||||||
|
config.oslo_messaging_amqp.group_request_prefix
|
||||||
|
self._container_name = config.oslo_messaging_amqp.container_name
|
||||||
if not self._container_name:
|
if not self._container_name:
|
||||||
self._container_name = "container-%s" % uuid.uuid4().hex
|
self._container_name = "container-%s" % uuid.uuid4().hex
|
||||||
self.idle_timeout = config.amqp1.idle_timeout
|
self.idle_timeout = config.oslo_messaging_amqp.idle_timeout
|
||||||
self.trace_protocol = config.amqp1.trace
|
self.trace_protocol = config.oslo_messaging_amqp.trace
|
||||||
self.ssl_ca_file = config.amqp1.ssl_ca_file
|
self.ssl_ca_file = config.oslo_messaging_amqp.ssl_ca_file
|
||||||
self.ssl_cert_file = config.amqp1.ssl_cert_file
|
self.ssl_cert_file = config.oslo_messaging_amqp.ssl_cert_file
|
||||||
self.ssl_key_file = config.amqp1.ssl_key_file
|
self.ssl_key_file = config.oslo_messaging_amqp.ssl_key_file
|
||||||
self.ssl_key_password = config.amqp1.ssl_key_password
|
self.ssl_key_password = config.oslo_messaging_amqp.ssl_key_password
|
||||||
self.ssl_allow_insecure = config.amqp1.allow_insecure_clients
|
self.ssl_allow_insecure = \
|
||||||
|
config.oslo_messaging_amqp.allow_insecure_clients
|
||||||
self.separator = "."
|
self.separator = "."
|
||||||
self.fanout_qualifier = "all"
|
self.fanout_qualifier = "all"
|
||||||
self.default_exchange = default_exchange
|
self.default_exchange = default_exchange
|
||||||
|
@ -24,57 +24,16 @@ import logging
|
|||||||
import threading
|
import threading
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
import proton
|
||||||
from six import moves
|
from six import moves
|
||||||
|
|
||||||
from oslo import messaging
|
from oslo import messaging
|
||||||
from oslo.messaging._drivers import base
|
from oslo.messaging._drivers import base
|
||||||
from oslo.messaging._drivers import common
|
from oslo.messaging._drivers import common
|
||||||
from oslo.messaging.openstack.common import importutils
|
from oslo.messaging._drivers.protocols.amqp import controller
|
||||||
from oslo.messaging.openstack.common import jsonutils
|
from oslo.messaging.openstack.common import jsonutils
|
||||||
from oslo.messaging import target as messaging_target
|
from oslo.messaging import target as messaging_target
|
||||||
|
|
||||||
# TODO(kgiusti): this module depends on platform specific libraries (proton)
|
|
||||||
# which are not available on all systems (yet). The unittest loader will
|
|
||||||
# attempt to directly import this driver even if the dependent libraries are
|
|
||||||
# not installed. Since the default set of unit tests do not exercise this
|
|
||||||
# driver, we shouldn't cause them to fail due to the missing
|
|
||||||
# dependencies. These hacks allow the import to succeed without raising an
|
|
||||||
# import error and causing all the tests to fail. [Note: to run the set of test
|
|
||||||
# for this driver, use the 'amqp1' test environment - e.g. 'tox -eamqp1']
|
|
||||||
#
|
|
||||||
# Remove these hacks once the qpid-proton C libraries are available via Ubuntu
|
|
||||||
# base repos and can be added to the base test-requirements.txt [they are
|
|
||||||
# already available via EPEL]:
|
|
||||||
|
|
||||||
|
|
||||||
class _FakeController(object):
|
|
||||||
"""A mocked Controller to use if the controller module fails to import
|
|
||||||
due to missing dependencies. Stubs out the _amqp1_opts option list and
|
|
||||||
provides a fake 'Task' superclass so the sub-classes SendTask, ListenTask,
|
|
||||||
and ReplyTask defined by this module will parse correctly on import.
|
|
||||||
|
|
||||||
This allows the tests to import the driver.py module without failing even
|
|
||||||
if the proton libraries are not installed. Be aware that attempting to use
|
|
||||||
(instantiate) the PythonDriver will raise a NotImplementedError if the fake
|
|
||||||
controller is in use. This is by design since the driver really cannot
|
|
||||||
work without the real controller and its dependencies.
|
|
||||||
"""
|
|
||||||
fake_controller = True
|
|
||||||
Task = type('Task', (object,), {})
|
|
||||||
_amqp1_opts = list()
|
|
||||||
|
|
||||||
|
|
||||||
proton = importutils.try_import("proton")
|
|
||||||
try:
|
|
||||||
from oslo.messaging._drivers.protocols.amqp import controller
|
|
||||||
except ImportError:
|
|
||||||
controller = _FakeController()
|
|
||||||
|
|
||||||
|
|
||||||
def get_opts():
|
|
||||||
"""Provide access to the controller's configuration options."""
|
|
||||||
return controller._amqp1_opts
|
|
||||||
# TODO(kgiusti) End of hack
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
62
oslo/messaging/_drivers/protocols/amqp/opts.py
Normal file
62
oslo/messaging/_drivers/protocols/amqp/opts.py
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
# Copyright 2014, Red Hat, Inc.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from oslo.config import cfg
|
||||||
|
|
||||||
|
|
||||||
|
amqp1_opts = [
|
||||||
|
cfg.StrOpt('server_request_prefix',
|
||||||
|
default='exclusive',
|
||||||
|
help="address prefix used when sending to a specific server"),
|
||||||
|
|
||||||
|
cfg.StrOpt('broadcast_prefix',
|
||||||
|
default='broadcast',
|
||||||
|
help="address prefix used when broadcasting to all servers"),
|
||||||
|
|
||||||
|
cfg.StrOpt('group_request_prefix',
|
||||||
|
default='unicast',
|
||||||
|
help="address prefix when sending to any server in group"),
|
||||||
|
|
||||||
|
cfg.StrOpt('container_name',
|
||||||
|
default=None,
|
||||||
|
help='Name for the AMQP container'),
|
||||||
|
|
||||||
|
cfg.IntOpt('idle_timeout',
|
||||||
|
default=0, # disabled
|
||||||
|
help='Timeout for inactive connections (in seconds)'),
|
||||||
|
|
||||||
|
cfg.BoolOpt('trace',
|
||||||
|
default=False,
|
||||||
|
help='Debug: dump AMQP frames to stdout'),
|
||||||
|
|
||||||
|
cfg.StrOpt('ssl_ca_file',
|
||||||
|
default='',
|
||||||
|
help="CA certificate PEM file for verifing server certificate"),
|
||||||
|
|
||||||
|
cfg.StrOpt('ssl_cert_file',
|
||||||
|
default='',
|
||||||
|
help='Identifying certificate PEM file to present to clients'),
|
||||||
|
|
||||||
|
cfg.StrOpt('ssl_key_file',
|
||||||
|
default='',
|
||||||
|
help='Private key PEM file used to sign cert_file certificate'),
|
||||||
|
|
||||||
|
cfg.StrOpt('ssl_key_password',
|
||||||
|
default=None,
|
||||||
|
help='Password for decrypting ssl_key_file (if encrypted)'),
|
||||||
|
|
||||||
|
cfg.BoolOpt('allow_insecure_clients',
|
||||||
|
default=False,
|
||||||
|
help='Accept clients using either SSL or plain TCP')
|
||||||
|
]
|
@ -27,7 +27,7 @@ from oslo.messaging._drivers import impl_zmq
|
|||||||
from oslo.messaging._drivers import matchmaker
|
from oslo.messaging._drivers import matchmaker
|
||||||
from oslo.messaging._drivers import matchmaker_redis
|
from oslo.messaging._drivers import matchmaker_redis
|
||||||
from oslo.messaging._drivers import matchmaker_ring
|
from oslo.messaging._drivers import matchmaker_ring
|
||||||
from oslo.messaging._drivers.protocols.amqp import driver as amqp1_driver
|
from oslo.messaging._drivers.protocols.amqp import opts as amqp_opts
|
||||||
from oslo.messaging._executors import impl_eventlet
|
from oslo.messaging._executors import impl_eventlet
|
||||||
from oslo.messaging.notify import notifier
|
from oslo.messaging.notify import notifier
|
||||||
from oslo.messaging.rpc import client
|
from oslo.messaging.rpc import client
|
||||||
@ -43,13 +43,13 @@ _global_opt_lists = [
|
|||||||
notifier._notifier_opts,
|
notifier._notifier_opts,
|
||||||
client._client_opts,
|
client._client_opts,
|
||||||
transport._transport_opts,
|
transport._transport_opts,
|
||||||
amqp1_driver.get_opts()
|
|
||||||
]
|
]
|
||||||
|
|
||||||
_opts = [
|
_opts = [
|
||||||
(None, list(itertools.chain(*_global_opt_lists))),
|
(None, list(itertools.chain(*_global_opt_lists))),
|
||||||
('matchmaker_redis', matchmaker_redis.matchmaker_redis_opts),
|
('matchmaker_redis', matchmaker_redis.matchmaker_redis_opts),
|
||||||
('matchmaker_ring', matchmaker_ring.matchmaker_opts),
|
('matchmaker_ring', matchmaker_ring.matchmaker_opts),
|
||||||
|
('oslo_messaging_amqp', amqp_opts.amqp1_opts),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ oslo.messaging.drivers =
|
|||||||
rabbit = oslo.messaging._drivers.impl_rabbit:RabbitDriver
|
rabbit = oslo.messaging._drivers.impl_rabbit:RabbitDriver
|
||||||
qpid = oslo.messaging._drivers.impl_qpid:QpidDriver
|
qpid = oslo.messaging._drivers.impl_qpid:QpidDriver
|
||||||
zmq = oslo.messaging._drivers.impl_zmq:ZmqDriver
|
zmq = oslo.messaging._drivers.impl_zmq:ZmqDriver
|
||||||
amqp = oslo.messaging._drivers.protocols.amqp:ProtonDriver
|
amqp = oslo.messaging._drivers.protocols.amqp.driver:ProtonDriver
|
||||||
|
|
||||||
# To avoid confusion
|
# To avoid confusion
|
||||||
kombu = oslo.messaging._drivers.impl_rabbit:RabbitDriver
|
kombu = oslo.messaging._drivers.impl_rabbit:RabbitDriver
|
||||||
|
@ -24,7 +24,6 @@ from six import moves
|
|||||||
import testtools
|
import testtools
|
||||||
|
|
||||||
from oslo import messaging
|
from oslo import messaging
|
||||||
from oslo.messaging._drivers.protocols.amqp import driver as amqp_driver
|
|
||||||
from oslo.messaging.openstack.common import importutils
|
from oslo.messaging.openstack.common import importutils
|
||||||
from tests import utils as test_utils
|
from tests import utils as test_utils
|
||||||
|
|
||||||
@ -32,6 +31,9 @@ from tests import utils as test_utils
|
|||||||
# dependencies are installed. This should be removed once the proton libraries
|
# dependencies are installed. This should be removed once the proton libraries
|
||||||
# are available in the base repos for all supported platforms.
|
# are available in the base repos for all supported platforms.
|
||||||
pyngus = importutils.try_import("pyngus")
|
pyngus = importutils.try_import("pyngus")
|
||||||
|
if pyngus:
|
||||||
|
from oslo.messaging._drivers.protocols.amqp import driver as amqp_driver
|
||||||
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -29,12 +29,13 @@ class OptsTestCase(test_utils.BaseTestCase):
|
|||||||
super(OptsTestCase, self).setUp()
|
super(OptsTestCase, self).setUp()
|
||||||
|
|
||||||
def _test_list_opts(self, result):
|
def _test_list_opts(self, result):
|
||||||
self.assertEqual(3, len(result))
|
self.assertEqual(4, len(result))
|
||||||
|
|
||||||
groups = [g for (g, l) in result]
|
groups = [g for (g, l) in result]
|
||||||
self.assertIn(None, groups)
|
self.assertIn(None, groups)
|
||||||
self.assertIn('matchmaker_ring', groups)
|
self.assertIn('matchmaker_ring', groups)
|
||||||
self.assertIn('matchmaker_redis', groups)
|
self.assertIn('matchmaker_redis', groups)
|
||||||
|
self.assertIn('oslo_messaging_amqp', groups)
|
||||||
|
|
||||||
opt_names = [o.name for (g, l) in result for o in l]
|
opt_names = [o.name for (g, l) in result for o in l]
|
||||||
self.assertIn('rpc_backend', opt_names)
|
self.assertIn('rpc_backend', opt_names)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user