Skip to content

Commit d81b052

Browse files
authored
feat(python): enhance retry configuration in REST client (#22867)
* feat(python): enhance retry configuration in REST client Updated the retry parameter in the Configuration class to support different types based on the library used (urllib3 or asyncio). Adjusted the RESTClientObject to handle the new retry configuration, allowing for more flexible retry options. This change improves the handling of retries in API requests, ensuring compatibility with various retry strategies. * add samples * use async context for retry doc string
1 parent 54fe232 commit d81b052

File tree

9 files changed

+58
-37
lines changed

9 files changed

+58
-37
lines changed

modules/openapi-generator/src/main/resources/python/asyncio/rest.mustache

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,20 @@ class RESTClientObject:
6868
self.proxy = configuration.proxy
6969
self.proxy_headers = configuration.proxy_headers
7070

71-
self.retries = configuration.retries
71+
retries = configuration.retries
72+
if retries is None:
73+
self._effective_retry_options = None
74+
elif isinstance(retries, aiohttp_retry.RetryOptionsBase):
75+
self._effective_retry_options = retries
76+
elif isinstance(retries, int):
77+
self._effective_retry_options = aiohttp_retry.ExponentialRetry(
78+
attempts=retries,
79+
factor=2.0,
80+
start_timeout=0.1,
81+
max_timeout=120.0
82+
)
83+
else:
84+
self._effective_retry_options = None
7285

7386
self.pool_manager: Optional[aiohttp.ClientSession] = None
7487
self.retry_client: Optional[aiohttp_retry.RetryClient] = None
@@ -191,16 +204,11 @@ class RESTClientObject:
191204
)
192205
pool_manager = self.pool_manager
193206

194-
if self.retries is not None and method in ALLOW_RETRY_METHODS:
207+
if self._effective_retry_options is not None and method in ALLOW_RETRY_METHODS:
195208
if self.retry_client is None:
196209
self.retry_client = aiohttp_retry.RetryClient(
197210
client_session=self.pool_manager,
198-
retry_options=aiohttp_retry.ExponentialRetry(
199-
attempts=self.retries,
200-
factor=2.0,
201-
start_timeout=0.1,
202-
max_timeout=120.0
203-
)
211+
retry_options=self._effective_retry_options
204212
)
205213
pool_manager = self.retry_client
206214

modules/openapi-generator/src/main/resources/python/configuration.mustache

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,12 @@ class Configuration:
188188
values before.
189189
:param ssl_ca_cert: str - the path to a file of concatenated CA certificates
190190
in PEM format.
191-
:param retries: Number of retries for API requests.
191+
{{#async}}
192+
:param retries: int | aiohttp_retry.RetryOptionsBase - Retry configuration.
193+
{{/async}}
194+
{{^async}}
195+
:param retries: int | urllib3.util.retry.Retry - Retry configuration.
196+
{{/async}}
192197
:param ca_cert_data: verify the peer using concatenated CA certificate data
193198
in PEM (str) or DER (bytes) format.
194199
:param cert_file: the path to a client certificate file, for mTLS.
@@ -298,7 +303,7 @@ conf = {{{packageName}}}.Configuration(
298303
server_operation_variables: Optional[Dict[int, ServerVariablesT]]=None,
299304
ignore_operation_servers: bool=False,
300305
ssl_ca_cert: Optional[str]=None,
301-
retries: Optional[int] = None,
306+
retries: Optional[Union[int, Any]] = None,
302307
ca_cert_data: Optional[Union[str, bytes]] = None,
303308
cert_file: Optional[str]=None,
304309
key_file: Optional[str]=None,
@@ -432,7 +437,7 @@ conf = {{{packageName}}}.Configuration(
432437
"""Safe chars for path_param
433438
"""
434439
self.retries = retries
435-
"""Adding retries to override urllib3 default value 3
440+
"""Retry configuration
436441
"""
437442
# Enable client side validation
438443
self.client_side_validation = True

samples/client/echo_api/python-disallowAdditionalPropertiesIfNotPresent/openapi_client/configuration.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ class Configuration:
162162
values before.
163163
:param ssl_ca_cert: str - the path to a file of concatenated CA certificates
164164
in PEM format.
165-
:param retries: Number of retries for API requests.
165+
:param retries: int | urllib3.util.retry.Retry - Retry configuration.
166166
:param ca_cert_data: verify the peer using concatenated CA certificate data
167167
in PEM (str) or DER (bytes) format.
168168
:param cert_file: the path to a client certificate file, for mTLS.
@@ -203,7 +203,7 @@ def __init__(
203203
server_operation_variables: Optional[Dict[int, ServerVariablesT]]=None,
204204
ignore_operation_servers: bool=False,
205205
ssl_ca_cert: Optional[str]=None,
206-
retries: Optional[int] = None,
206+
retries: Optional[Union[int, Any]] = None,
207207
ca_cert_data: Optional[Union[str, bytes]] = None,
208208
cert_file: Optional[str]=None,
209209
key_file: Optional[str]=None,
@@ -320,7 +320,7 @@ def __init__(
320320
"""Safe chars for path_param
321321
"""
322322
self.retries = retries
323-
"""Adding retries to override urllib3 default value 3
323+
"""Retry configuration
324324
"""
325325
# Enable client side validation
326326
self.client_side_validation = True

samples/client/echo_api/python/openapi_client/configuration.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ class Configuration:
162162
values before.
163163
:param ssl_ca_cert: str - the path to a file of concatenated CA certificates
164164
in PEM format.
165-
:param retries: Number of retries for API requests.
165+
:param retries: int | urllib3.util.retry.Retry - Retry configuration.
166166
:param ca_cert_data: verify the peer using concatenated CA certificate data
167167
in PEM (str) or DER (bytes) format.
168168
:param cert_file: the path to a client certificate file, for mTLS.
@@ -203,7 +203,7 @@ def __init__(
203203
server_operation_variables: Optional[Dict[int, ServerVariablesT]]=None,
204204
ignore_operation_servers: bool=False,
205205
ssl_ca_cert: Optional[str]=None,
206-
retries: Optional[int] = None,
206+
retries: Optional[Union[int, Any]] = None,
207207
ca_cert_data: Optional[Union[str, bytes]] = None,
208208
cert_file: Optional[str]=None,
209209
key_file: Optional[str]=None,
@@ -320,7 +320,7 @@ def __init__(
320320
"""Safe chars for path_param
321321
"""
322322
self.retries = retries
323-
"""Adding retries to override urllib3 default value 3
323+
"""Retry configuration
324324
"""
325325
# Enable client side validation
326326
self.client_side_validation = True

samples/openapi3/client/petstore/python-aiohttp/petstore_api/configuration.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ class Configuration:
167167
values before.
168168
:param ssl_ca_cert: str - the path to a file of concatenated CA certificates
169169
in PEM format.
170-
:param retries: Number of retries for API requests.
170+
:param retries: int | aiohttp_retry.RetryOptionsBase - Retry configuration.
171171
:param ca_cert_data: verify the peer using concatenated CA certificate data
172172
in PEM (str) or DER (bytes) format.
173173
:param cert_file: the path to a client certificate file, for mTLS.
@@ -267,7 +267,7 @@ def __init__(
267267
server_operation_variables: Optional[Dict[int, ServerVariablesT]]=None,
268268
ignore_operation_servers: bool=False,
269269
ssl_ca_cert: Optional[str]=None,
270-
retries: Optional[int] = None,
270+
retries: Optional[Union[int, Any]] = None,
271271
ca_cert_data: Optional[Union[str, bytes]] = None,
272272
cert_file: Optional[str]=None,
273273
key_file: Optional[str]=None,
@@ -385,7 +385,7 @@ def __init__(
385385
"""Safe chars for path_param
386386
"""
387387
self.retries = retries
388-
"""Adding retries to override urllib3 default value 3
388+
"""Retry configuration
389389
"""
390390
# Enable client side validation
391391
self.client_side_validation = True

samples/openapi3/client/petstore/python-aiohttp/petstore_api/rest.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,20 @@ def __init__(self, configuration) -> None:
7777
self.proxy = configuration.proxy
7878
self.proxy_headers = configuration.proxy_headers
7979

80-
self.retries = configuration.retries
80+
retries = configuration.retries
81+
if retries is None:
82+
self._effective_retry_options = None
83+
elif isinstance(retries, aiohttp_retry.RetryOptionsBase):
84+
self._effective_retry_options = retries
85+
elif isinstance(retries, int):
86+
self._effective_retry_options = aiohttp_retry.ExponentialRetry(
87+
attempts=retries,
88+
factor=2.0,
89+
start_timeout=0.1,
90+
max_timeout=120.0
91+
)
92+
else:
93+
self._effective_retry_options = None
8194

8295
self.pool_manager: Optional[aiohttp.ClientSession] = None
8396
self.retry_client: Optional[aiohttp_retry.RetryClient] = None
@@ -200,16 +213,11 @@ async def request(
200213
)
201214
pool_manager = self.pool_manager
202215

203-
if self.retries is not None and method in ALLOW_RETRY_METHODS:
216+
if self._effective_retry_options is not None and method in ALLOW_RETRY_METHODS:
204217
if self.retry_client is None:
205218
self.retry_client = aiohttp_retry.RetryClient(
206219
client_session=self.pool_manager,
207-
retry_options=aiohttp_retry.ExponentialRetry(
208-
attempts=self.retries,
209-
factor=2.0,
210-
start_timeout=0.1,
211-
max_timeout=120.0
212-
)
220+
retry_options=self._effective_retry_options
213221
)
214222
pool_manager = self.retry_client
215223

samples/openapi3/client/petstore/python-httpx/petstore_api/configuration.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ class Configuration:
167167
values before.
168168
:param ssl_ca_cert: str - the path to a file of concatenated CA certificates
169169
in PEM format.
170-
:param retries: Number of retries for API requests.
170+
:param retries: int | aiohttp_retry.RetryOptionsBase - Retry configuration.
171171
:param ca_cert_data: verify the peer using concatenated CA certificate data
172172
in PEM (str) or DER (bytes) format.
173173
:param cert_file: the path to a client certificate file, for mTLS.
@@ -267,7 +267,7 @@ def __init__(
267267
server_operation_variables: Optional[Dict[int, ServerVariablesT]]=None,
268268
ignore_operation_servers: bool=False,
269269
ssl_ca_cert: Optional[str]=None,
270-
retries: Optional[int] = None,
270+
retries: Optional[Union[int, Any]] = None,
271271
ca_cert_data: Optional[Union[str, bytes]] = None,
272272
cert_file: Optional[str]=None,
273273
key_file: Optional[str]=None,
@@ -385,7 +385,7 @@ def __init__(
385385
"""Safe chars for path_param
386386
"""
387387
self.retries = retries
388-
"""Adding retries to override urllib3 default value 3
388+
"""Retry configuration
389389
"""
390390
# Enable client side validation
391391
self.client_side_validation = True

samples/openapi3/client/petstore/python-lazyImports/petstore_api/configuration.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ class Configuration:
168168
values before.
169169
:param ssl_ca_cert: str - the path to a file of concatenated CA certificates
170170
in PEM format.
171-
:param retries: Number of retries for API requests.
171+
:param retries: int | urllib3.util.retry.Retry - Retry configuration.
172172
:param ca_cert_data: verify the peer using concatenated CA certificate data
173173
in PEM (str) or DER (bytes) format.
174174
:param cert_file: the path to a client certificate file, for mTLS.
@@ -268,7 +268,7 @@ def __init__(
268268
server_operation_variables: Optional[Dict[int, ServerVariablesT]]=None,
269269
ignore_operation_servers: bool=False,
270270
ssl_ca_cert: Optional[str]=None,
271-
retries: Optional[int] = None,
271+
retries: Optional[Union[int, Any]] = None,
272272
ca_cert_data: Optional[Union[str, bytes]] = None,
273273
cert_file: Optional[str]=None,
274274
key_file: Optional[str]=None,
@@ -390,7 +390,7 @@ def __init__(
390390
"""Safe chars for path_param
391391
"""
392392
self.retries = retries
393-
"""Adding retries to override urllib3 default value 3
393+
"""Retry configuration
394394
"""
395395
# Enable client side validation
396396
self.client_side_validation = True

samples/openapi3/client/petstore/python/petstore_api/configuration.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ class Configuration:
168168
values before.
169169
:param ssl_ca_cert: str - the path to a file of concatenated CA certificates
170170
in PEM format.
171-
:param retries: Number of retries for API requests.
171+
:param retries: int | urllib3.util.retry.Retry - Retry configuration.
172172
:param ca_cert_data: verify the peer using concatenated CA certificate data
173173
in PEM (str) or DER (bytes) format.
174174
:param cert_file: the path to a client certificate file, for mTLS.
@@ -268,7 +268,7 @@ def __init__(
268268
server_operation_variables: Optional[Dict[int, ServerVariablesT]]=None,
269269
ignore_operation_servers: bool=False,
270270
ssl_ca_cert: Optional[str]=None,
271-
retries: Optional[int] = None,
271+
retries: Optional[Union[int, Any]] = None,
272272
ca_cert_data: Optional[Union[str, bytes]] = None,
273273
cert_file: Optional[str]=None,
274274
key_file: Optional[str]=None,
@@ -390,7 +390,7 @@ def __init__(
390390
"""Safe chars for path_param
391391
"""
392392
self.retries = retries
393-
"""Adding retries to override urllib3 default value 3
393+
"""Retry configuration
394394
"""
395395
# Enable client side validation
396396
self.client_side_validation = True

0 commit comments

Comments
 (0)