diff --git a/oslo_messaging/_drivers/common.py b/oslo_messaging/_drivers/common.py index 7b0e4028b..9b35c5dd9 100644 --- a/oslo_messaging/_drivers/common.py +++ b/oslo_messaging/_drivers/common.py @@ -460,13 +460,21 @@ class ConfigOptsProxy(collections.Mapping): and valid) override corresponding values from the configuration. """ - def __init__(self, conf, url): + def __init__(self, conf, url, group): self._conf = conf self._url = url + self._group = group + self._validate_query() + + def _validate_query(self): + for name in self._url.query: + self.GroupAttrProxy(self._conf, self._group, + self._conf[self._group], + self._url)[name] def __getattr__(self, name): value = getattr(self._conf, name) - if isinstance(value, self._conf.GroupAttr): + if isinstance(value, self._conf.GroupAttr) and name == self._group: return self.GroupAttrProxy(self._conf, name, value, self._url) return value diff --git a/oslo_messaging/_drivers/impl_amqp1.py b/oslo_messaging/_drivers/impl_amqp1.py index 8c17a9827..e5eb03669 100644 --- a/oslo_messaging/_drivers/impl_amqp1.py +++ b/oslo_messaging/_drivers/impl_amqp1.py @@ -200,7 +200,7 @@ class ProtonDriver(base.BaseDriver): title='AMQP 1.0 driver options') conf.register_group(opt_group) conf.register_opts(opts.amqp1_opts, group=opt_group) - conf = common.ConfigOptsProxy(conf, url) + conf = common.ConfigOptsProxy(conf, url, opt_group.name) self._hosts = url.hosts self._conf = conf diff --git a/oslo_messaging/_drivers/impl_pika.py b/oslo_messaging/_drivers/impl_pika.py index 2fe1b870a..0d413b41a 100644 --- a/oslo_messaging/_drivers/impl_pika.py +++ b/oslo_messaging/_drivers/impl_pika.py @@ -144,7 +144,7 @@ class PikaDriver(base.BaseDriver): conf.register_opts(message_opts, group=opt_group) conf.register_opts(rpc_opts, group=opt_group) conf.register_opts(notification_opts, group=opt_group) - conf = common.ConfigOptsProxy(conf, url) + conf = common.ConfigOptsProxy(conf, url, opt_group.name) self._pika_engine = pika_drv_engine.PikaEngine( conf, url, default_exchange, allowed_remote_exmods diff --git a/oslo_messaging/_drivers/impl_rabbit.py b/oslo_messaging/_drivers/impl_rabbit.py index ddcad8fe3..24baef8f8 100644 --- a/oslo_messaging/_drivers/impl_rabbit.py +++ b/oslo_messaging/_drivers/impl_rabbit.py @@ -1335,7 +1335,7 @@ class RabbitDriver(amqpdriver.AMQPDriverBase): conf.register_opts(rabbit_opts, group=opt_group) conf.register_opts(rpc_amqp.amqp_opts, group=opt_group) conf.register_opts(base.base_opts, group=opt_group) - conf = rpc_common.ConfigOptsProxy(conf, url) + conf = rpc_common.ConfigOptsProxy(conf, url, opt_group.name) self.missing_destination_retry_timeout = ( conf.oslo_messaging_rabbit.kombu_missing_consumer_retry_timeout) diff --git a/oslo_messaging/_drivers/kafka_options.py b/oslo_messaging/_drivers/kafka_options.py index fa3b06aef..0bdcde532 100644 --- a/oslo_messaging/_drivers/kafka_options.py +++ b/oslo_messaging/_drivers/kafka_options.py @@ -59,4 +59,4 @@ def register_opts(conf, url): title='Kafka driver options') conf.register_group(opt_group) conf.register_opts(KAFKA_OPTS, group=opt_group) - return common.ConfigOptsProxy(conf, url) + return common.ConfigOptsProxy(conf, url, opt_group.name) diff --git a/oslo_messaging/_drivers/zmq_driver/zmq_options.py b/oslo_messaging/_drivers/zmq_driver/zmq_options.py index 529ec94d4..426570409 100644 --- a/oslo_messaging/_drivers/zmq_driver/zmq_options.py +++ b/oslo_messaging/_drivers/zmq_driver/zmq_options.py @@ -210,4 +210,4 @@ def register_opts(conf, url): conf.register_opts(zmq_opts, group=opt_group) conf.register_opts(server._pool_opts) conf.register_opts(base.base_opts) - return common.ConfigOptsProxy(conf, url) + return common.ConfigOptsProxy(conf, url, opt_group.name) diff --git a/oslo_messaging/tests/test_config_opts_proxy.py b/oslo_messaging/tests/test_config_opts_proxy.py index 0733c5363..0dee66970 100644 --- a/oslo_messaging/tests/test_config_opts_proxy.py +++ b/oslo_messaging/tests/test_config_opts_proxy.py @@ -27,7 +27,6 @@ class TestConfigOptsProxy(test_utils.BaseTestCase): self.config(rabbit_retry_interval=1, rabbit_qos_prefetch_count=0, rabbit_max_retries=3, - kombu_reconnect_delay=5.0, group=group) dummy_opts = [cfg.ListOpt('list_str', item_type=types.String(), default=[]), @@ -40,14 +39,12 @@ class TestConfigOptsProxy(test_utils.BaseTestCase): url = transport.TransportURL.parse( self.conf, "rabbit:///" "?rabbit_qos_prefetch_count=2" - "&unknown_opt=4" - "&kombu_reconnect_delay=invalid_value" "&list_str=1&list_str=2&list_str=3" "&list_int=1&list_int=2&list_int=3" "&dict=x:1&dict=y:2&dict=z:3" "&bool=True" ) - conf = drv_cmn.ConfigOptsProxy(self.conf, url) + conf = drv_cmn.ConfigOptsProxy(self.conf, url, group) self.assertRaises(cfg.NoSuchOptError, conf.__getattr__, 'unknown_group') @@ -57,15 +54,28 @@ class TestConfigOptsProxy(test_utils.BaseTestCase): self.assertEqual(2, conf.oslo_messaging_rabbit.rabbit_qos_prefetch_count) self.assertEqual(3, conf.oslo_messaging_rabbit.rabbit_max_retries) - self.assertRaises(cfg.NoSuchOptError, - conf.oslo_messaging_rabbit.__getattr__, - 'unknown_opt') - self.assertRaises(ValueError, - conf.oslo_messaging_rabbit.__getattr__, - 'kombu_reconnect_delay') self.assertEqual(['1', '2', '3'], conf.oslo_messaging_rabbit.list_str) self.assertEqual([1, 2, 3], conf.oslo_messaging_rabbit.list_int) self.assertEqual({'x': '1', 'y': '2', 'z': '3'}, conf.oslo_messaging_rabbit.dict) self.assertEqual(True, conf.oslo_messaging_rabbit.bool) self.assertEqual('default', conf.oslo_messaging_rabbit.str) + + def test_not_in_group(self): + group = 'oslo_messaging_rabbit' + url = transport.TransportURL.parse( + self.conf, "rabbit:///?unknown_opt=4" + ) + self.assertRaises(cfg.NoSuchOptError, + drv_cmn.ConfigOptsProxy, + self.conf, url, group) + + def test_invalid_value(self): + group = 'oslo_messaging_rabbit' + self.config(kombu_reconnect_delay=5.0, + group=group) + url = transport.TransportURL.parse( + self.conf, "rabbit:///?kombu_reconnect_delay=invalid_value" + ) + self.assertRaises(ValueError, drv_cmn.ConfigOptsProxy, self.conf, + url, group)