diff --git a/doc/source/index.rst b/doc/source/index.rst index 45e806337..7b13f182f 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -17,6 +17,7 @@ Contents notifier serializer exceptions + opts conffixture Release Notes diff --git a/oslo/messaging/opts.py b/oslo/messaging/opts.py new file mode 100644 index 000000000..9266bebb3 --- /dev/null +++ b/oslo/messaging/opts.py @@ -0,0 +1,75 @@ + +# 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. + +__all__ = [ + 'list_opts' +] + +import copy +import itertools + +from oslo.messaging._drivers import amqp +from oslo.messaging._drivers import common as drivers_common +from oslo.messaging._drivers import impl_qpid +from oslo.messaging._drivers import impl_rabbit +from oslo.messaging._drivers import impl_zmq +from oslo.messaging._drivers import matchmaker +from oslo.messaging._drivers import matchmaker_redis +from oslo.messaging._drivers import matchmaker_ring +from oslo.messaging._executors import impl_eventlet +from oslo.messaging.notify import notifier +from oslo.messaging.rpc import client +from oslo.messaging import transport + +_global_opt_lists = [ + amqp.amqp_opts, + drivers_common._exception_opts, + impl_qpid.qpid_opts, + impl_rabbit.rabbit_opts, + impl_zmq.zmq_opts, + matchmaker.matchmaker_opts, + matchmaker_redis.matchmaker_redis_opts, + impl_eventlet._eventlet_opts, + notifier._notifier_opts, + client._client_opts, + transport._transport_opts +] + +_opts = [ + (None, list(itertools.chain(*_global_opt_lists))), + ('matchmaker_ring', matchmaker_ring.matchmaker_opts), +] + + +def list_opts(): + """Return a list of oslo.config options available in the library. + + The returned list includes all oslo.config options which may be registered + at runtime by the library. + + Each element of the list is a tuple. The first element is the name of the + group under which the list of elements in the second element will be + registered. A group name of None corresponds to the [DEFAULT] group in + config files. + + This function is also discoverable via the 'oslo.messaging' entry point + under the 'oslo.config.opts' namespace. + + The purpose of this is to allow tools like the Oslo sample config file + generator to discover the options exposed to users by this library. + + :returns: a list of (group_name, opts) tuples + """ + return [(g, copy.deepcopy(o)) for g, o in _opts] diff --git a/setup.cfg b/setup.cfg index a1e6715a5..b246cb409 100644 --- a/setup.cfg +++ b/setup.cfg @@ -49,6 +49,9 @@ oslo.messaging.notify.drivers = test = oslo.messaging.notify._impl_test:TestDriver noop = oslo.messaging.notify._impl_noop:NoOpDriver +oslo.config.opts = + oslo.messaging = oslo.messaging.opts:list_opts + [build_sphinx] source-dir = doc/source build-dir = doc/build diff --git a/tests/test_opts.py b/tests/test_opts.py new file mode 100644 index 000000000..2709a5a94 --- /dev/null +++ b/tests/test_opts.py @@ -0,0 +1,47 @@ + +# 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. + +import pkg_resources + +from oslo.messaging import opts +from tests import utils as test_utils + + +class OptsTestCase(test_utils.BaseTestCase): + + def _test_list_opts(self, result): + self.assertEqual(2, len(result)) + + groups = [g for (g, l) in result] + self.assertIn(None, groups) + self.assertIn('matchmaker_ring', groups) + + opt_names = [o.name for (g, l) in result for o in l] + self.assertIn('rpc_backend', opt_names) + self.assertIn('allowed_rpc_exception_modules', opt_names) + + def test_list_opts(self): + self._test_list_opts(opts.list_opts()) + + def test_entry_point(self): + result = None + for ep in pkg_resources.iter_entry_points('oslo.config.opts'): + if ep.name == "oslo.messaging": + list_fn = ep.load() + result = list_fn() + break + + self.assertIsNotNone(result) + self._test_list_opts(result)