Skip to content

Commit 6897114

Browse files
authored
fix rest api aiohttp timeout (#337)
* fix rest api aiohttp timeout * Added test cases for rest api timeout parameter * handled scenario when request_timeout is ClientTimeout object
1 parent 089f487 commit 6897114

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

kubernetes_asyncio/client/rest.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,8 @@ async def request(self, method, url, query_params=None, headers=None,
104104
:param _request_timeout: timeout setting for this request. If one
105105
number provided, it will be total request
106106
timeout. It can also be a pair (tuple) of
107-
(connection, read) timeouts.
107+
(connection, read) timeouts or object
108+
of aiohttp.ClientTimeout.
108109
"""
109110
method = method.upper()
110111
assert method in ['GET', 'HEAD', 'DELETE', 'POST', 'PUT',
@@ -117,7 +118,18 @@ async def request(self, method, url, query_params=None, headers=None,
117118

118119
post_params = post_params or {}
119120
headers = headers or {}
120-
timeout = _request_timeout or 5 * 60
121+
timeout = aiohttp.ClientTimeout()
122+
if _request_timeout:
123+
if isinstance(_request_timeout, (int, float)):
124+
timeout = aiohttp.ClientTimeout(total=_request_timeout)
125+
elif isinstance(_request_timeout, tuple) and len(_request_timeout) == 2:
126+
timeout = aiohttp.ClientTimeout(
127+
connect=_request_timeout[0],
128+
sock_connect=_request_timeout[0],
129+
sock_read=_request_timeout[1],
130+
)
131+
elif isinstance(_request_timeout, aiohttp.ClientTimeout):
132+
timeout = _request_timeout
121133

122134
if 'Content-Type' not in headers:
123135
headers['Content-Type'] = 'application/json'
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import asyncio
2+
import unittest
3+
from unittest.mock import AsyncMock
4+
import aiohttp
5+
from kubernetes_asyncio.client.rest import RESTClientObject
6+
from kubernetes_asyncio.client.configuration import Configuration
7+
class TestRESTClientObject(unittest.IsolatedAsyncioTestCase):
8+
9+
@classmethod
10+
def setUpClass(cls):
11+
cls.config = Configuration()
12+
13+
14+
async def test_rest_request_timeout(self):
15+
rest_api = RESTClientObject(configuration=self.config)
16+
for request_timeout, expected_timeout_arg in [
17+
(None, aiohttp.ClientTimeout()),
18+
(5.0, aiohttp.ClientTimeout(total=5.0)),
19+
(3, aiohttp.ClientTimeout(total=3)),
20+
((5, 7), aiohttp.ClientTimeout(connect=5, sock_connect=5, sock_read=7)),
21+
(aiohttp.ClientTimeout(total=None), aiohttp.ClientTimeout(total=None)),
22+
]:
23+
with self.subTest(request_timeout=request_timeout, expected_timeout_arg=expected_timeout_arg):
24+
mock_request = AsyncMock()
25+
rest_api.pool_manager.request = mock_request
26+
await rest_api.request(method="GET", url="http://test-api", _preload_content=False, _request_timeout=request_timeout)
27+
mock_request.assert_called_once_with(
28+
method="GET",
29+
url="http://test-api",
30+
timeout=expected_timeout_arg,
31+
headers={"Content-Type": "application/json"}
32+
)

0 commit comments

Comments
 (0)