From 92921c6016ee2b51ce72014d57336f574c71ab24 Mon Sep 17 00:00:00 2001 From: Dmitry Tantsur Date: Wed, 19 Jun 2019 15:24:11 +0200 Subject: [PATCH] Allow setting retry counts for Adapter via configuration options Change-Id: I67ba69bfff69676ceb28b8a7515f10f5eff21c4c --- keystoneauth1/loading/adapter.py | 62 ++++++++++++------- .../tests/unit/loading/test_adapter.py | 26 ++++++-- .../retries-options-99e4dbc240941557.yaml | 6 ++ 3 files changed, 67 insertions(+), 27 deletions(-) create mode 100644 releasenotes/notes/retries-options-99e4dbc240941557.yaml diff --git a/keystoneauth1/loading/adapter.py b/keystoneauth1/loading/adapter.py index 7ebe55e9..5fe6b54b 100644 --- a/keystoneauth1/loading/adapter.py +++ b/keystoneauth1/loading/adapter.py @@ -135,6 +135,16 @@ class Adapter(base.BaseLoader): 'intended to be used as the upper bound of a ' 'range with min_version. Mutually exclusive ' 'with version.'), + cfg.IntOpt('connect-retries', + deprecated_opts=deprecated_opts.get( + 'connect-retries'), + help='The maximum number of retries that should be ' + 'attempted for connection errors.'), + cfg.IntOpt('status-code-retries', + deprecated_opts=deprecated_opts.get( + 'status-code-retries'), + help='The maximum number of retries that should be ' + 'attempted for retriable HTTP status codes.'), ] if include_deprecated: opts += [ @@ -154,29 +164,33 @@ class Adapter(base.BaseLoader): """Register the oslo_config options that are needed for an Adapter. The options that are set are: - :service_type: The default service_type for URL discovery. - :service_name: The default service_name for URL discovery. - :interface: The default interface for URL discovery. - (deprecated) - :valid_interfaces: List of acceptable interfaces for URL - discovery. Can be a list of any of - 'public', 'internal' or 'admin'. - :region_name: The default region_name for URL discovery. - :endpoint_override: Always use this endpoint URL for requests - for this client. - :version: The minimum version restricted to a given Major - API. Mutually exclusive with min_version and - max_version. - :min_version: The minimum major version of a given API, - intended to be used as the lower bound of a - range with max_version. Mutually exclusive with - version. If min_version is given with no - max_version it is as if max version is - 'latest'. - :max_version: The maximum major version of a given API, - intended to be used as the upper bound of a - range with min_version. Mutually exclusive with - version. + :service_type: The default service_type for URL discovery. + :service_name: The default service_name for URL discovery. + :interface: The default interface for URL discovery. + (deprecated) + :valid_interfaces: List of acceptable interfaces for URL + discovery. Can be a list of any of + 'public', 'internal' or 'admin'. + :region_name: The default region_name for URL discovery. + :endpoint_override: Always use this endpoint URL for requests + for this client. + :version: The minimum version restricted to a given + Major API. Mutually exclusive with + min_version and max_version. + :min_version: The minimum major version of a given API, + intended to be used as the lower bound of a + range with max_version. Mutually exclusive + with version. If min_version is given with no + max_version it is as if max version is + 'latest'. + :max_version: The maximum major version of a given API, + intended to be used as the upper bound of a + range with min_version. Mutually exclusive + with version. + :connect_retries: The maximum number of retries that should be + attempted for connection errors. + :status_code_retries: The maximum number of retries that should be + attempted for retriable HTTP status codes. :param oslo_config.Cfg conf: config object to register with. :param string group: The ini group to register options in. @@ -256,6 +270,8 @@ def process_conf_options(confgrp, kwargs): raise TypeError( "version is mutually exclusive with min_version and" " max_version") + kwargs.setdefault('connect_retries', confgrp.connect_retries) + kwargs.setdefault('status_code_retries', confgrp.status_code_retries) def register_argparse_arguments(*args, **kwargs): diff --git a/keystoneauth1/tests/unit/loading/test_adapter.py b/keystoneauth1/tests/unit/loading/test_adapter.py index b2032999..f38c98c2 100644 --- a/keystoneauth1/tests/unit/loading/test_adapter.py +++ b/keystoneauth1/tests/unit/loading/test_adapter.py @@ -154,29 +154,47 @@ class ConfLoadingTests(utils.TestCase): loading.load_adapter_from_conf_options, self.conf_fx.conf, self.GROUP, session='session', auth='auth') + def test_load_retries(self): + self.conf_fx.config( + service_type='type', service_name='name', + connect_retries=3, status_code_retries=5, + group=self.GROUP) + adap = loading.load_adapter_from_conf_options( + self.conf_fx.conf, self.GROUP, session='session', auth='auth') + self.assertEqual('type', adap.service_type) + self.assertEqual('name', adap.service_name) + self.assertEqual(3, adap.connect_retries) + self.assertEqual(5, adap.status_code_retries) + def test_get_conf_options(self): opts = loading.get_adapter_conf_options() for opt in opts: - if opt.name != 'valid-interfaces': + if opt.name.endswith('-retries'): + self.assertIsInstance(opt, cfg.IntOpt) + elif opt.name != 'valid-interfaces': self.assertIsInstance(opt, cfg.StrOpt) else: self.assertIsInstance(opt, cfg.ListOpt) self.assertEqual({'service-type', 'service-name', 'interface', 'valid-interfaces', 'region-name', 'endpoint-override', 'version', - 'min-version', 'max-version'}, + 'min-version', 'max-version', 'connect-retries', + 'status-code-retries'}, {opt.name for opt in opts}) def test_get_conf_options_undeprecated(self): opts = loading.get_adapter_conf_options(include_deprecated=False) for opt in opts: - if opt.name != 'valid-interfaces': + if opt.name.endswith('-retries'): + self.assertIsInstance(opt, cfg.IntOpt) + elif opt.name != 'valid-interfaces': self.assertIsInstance(opt, cfg.StrOpt) else: self.assertIsInstance(opt, cfg.ListOpt) self.assertEqual({'service-type', 'service-name', 'valid-interfaces', 'region-name', 'endpoint-override', 'version', - 'min-version', 'max-version'}, + 'min-version', 'max-version', 'connect-retries', + 'status-code-retries'}, {opt.name for opt in opts}) def test_deprecated(self): diff --git a/releasenotes/notes/retries-options-99e4dbc240941557.yaml b/releasenotes/notes/retries-options-99e4dbc240941557.yaml new file mode 100644 index 00000000..9855ffd9 --- /dev/null +++ b/releasenotes/notes/retries-options-99e4dbc240941557.yaml @@ -0,0 +1,6 @@ +--- +features: + - | + The Adapter parameters ``connect_retries`` and ``status_code_retries`` can + now be set via configuration options ``connect-retries`` and + ``status-code-retries`` accordingly.