diff options
author | Lukasz Rajewski <lukasz.rajewski@t-mobile.pl> | 2023-06-16 10:31:14 +0000 |
---|---|---|
committer | Lukasz Rajewski <lukasz.rajewski@t-mobile.pl> | 2023-06-16 13:01:28 +0000 |
commit | 903bfe4ad9e19df6a8d891677d9e023019d5d920 (patch) | |
tree | bc7a545dbc64881a3660f82293a9ab7b47d9255f | |
parent | a13ff9ac968ddced994205539a494ecbdb2d6b34 (diff) |
Add timeout option for requests
Timeout option added for session creation with
default value.
Issue-ID: TEST-398
Signed-off-by: Lukasz Rajewski <lukasz.rajewski@t-mobile.pl>
Change-Id: I3eaeb3feafc702aa237824c1302f5b83e6800182
-rw-r--r-- | src/onapsdk/configuration/global_settings.py | 2 | ||||
-rw-r--r-- | src/onapsdk/onap_service.py | 32 | ||||
-rw-r--r-- | tests/test_onap_service.py | 26 | ||||
-rw-r--r-- | tests/test_settings.py | 3 |
4 files changed, 36 insertions, 27 deletions
diff --git a/src/onapsdk/configuration/global_settings.py b/src/onapsdk/configuration/global_settings.py index fa0ec58..063e462 100644 --- a/src/onapsdk/configuration/global_settings.py +++ b/src/onapsdk/configuration/global_settings.py @@ -72,3 +72,5 @@ POLICY_CLAMP_GUI_SERVICE = f"{CLAMP_URL}/" PROJECT = "Onapsdk_project" LOB = "Onapsdk_lob" PLATFORM = "Onapsdk_platform" + +DEFAULT_REQUEST_TIMEOUT = 60 diff --git a/src/onapsdk/onap_service.py b/src/onapsdk/onap_service.py index 9298715..872d384 100644 --- a/src/onapsdk/onap_service.py +++ b/src/onapsdk/onap_service.py @@ -12,25 +12,23 @@ # 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 functools +import logging from abc import ABC from dataclasses import dataclass, field from typing import Any, Callable, Dict, Iterator, List, Optional, Union -import logging import requests -import urllib3 -from urllib3.util.retry import Retry import simplejson.errors - +import urllib3 +from requests import (ConnectionError, # pylint: disable=redefined-builtin + HTTPError, RequestException) from requests.adapters import HTTPAdapter -from requests import ( # pylint: disable=redefined-builtin - HTTPError, RequestException, ConnectionError -) +from urllib3.util.retry import Retry -from onapsdk.exceptions import ( - RequestError, APIError, ResourceNotFound, InvalidResponse, - ConnectionFailed, NoGuiError -) +from onapsdk.configuration import settings +from onapsdk.exceptions import (APIError, ConnectionFailed, InvalidResponse, + NoGuiError, RequestError, ResourceNotFound) urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) @@ -124,6 +122,7 @@ class OnapService(ABC): cert = kwargs.pop('cert', None) basic_auth: Dict[str, str] = kwargs.pop('basic_auth', None) exception = kwargs.pop('exception', None) + timeout = kwargs.pop('timeout', None) headers = kwargs.pop('headers', cls.headers).copy() if OnapService.permanent_headers: for header in OnapService.permanent_headers: @@ -131,7 +130,7 @@ class OnapService(ABC): data = kwargs.get('data', None) try: # build the request with the requested method - session = cls.__requests_retry_session() + session = cls.__requests_retry_session(timeout=timeout) if cert: session.cert = cert OnapService._set_basic_auth_if_needed(basic_auth, session) @@ -252,7 +251,8 @@ class OnapService(ABC): @staticmethod def __requests_retry_session(retries: int = 10, backoff_factor: float = 0.3, - session: requests.Session = None + session: requests.Session = None, + timeout: int = None ) -> requests.Session: """ Create a request Session with retries. @@ -262,12 +262,18 @@ class OnapService(ABC): backoff_factor (float, optional): backoff_factor. Defaults to 0.3. session (requests.Session, optional): an existing session to enhance. Defaults to None. + timeout (int, optional): timeout for request execution Returns: requests.Session: the session with retries set """ session = session or requests.Session() + if timeout is None and settings.DEFAULT_REQUEST_TIMEOUT > 0: + timeout = settings.DEFAULT_REQUEST_TIMEOUT + if timeout is not None and timeout > 0: + OnapService._logger.debug("TIMEOUT: %s", timeout) + session.request = functools.partial(session.request, timeout=timeout) retry = Retry( total=retries, read=retries, diff --git a/tests/test_onap_service.py b/tests/test_onap_service.py index 685f906..cfc0d1f 100644 --- a/tests/test_onap_service.py +++ b/tests/test_onap_service.py @@ -81,7 +81,7 @@ def test_send_message_OK(mock_request): "Accept": "application/json", } response = svc.send_message("GET", 'test get', 'http://my.url/') - mock_request.assert_called_once_with('GET', 'http://my.url/', + mock_request.assert_called_once_with('GET', 'http://my.url/', timeout=60, headers=expect_headers, verify=False, proxies=None) assert response == mocked_response @@ -100,7 +100,7 @@ def test_send_message_custom_header_OK(mock_request): } response = svc.send_message("GET", 'test get', 'http://my.url/', headers=expect_headers) - mock_request.assert_called_once_with('GET', 'http://my.url/', + mock_request.assert_called_once_with('GET', 'http://my.url/', timeout=60, headers=expect_headers, verify=False, proxies=None) assert response == mocked_response @@ -122,7 +122,7 @@ def test_send_message_with_basic_auth(mock_request, mock_set_basic_auth_if_neede response = svc.send_message("GET", 'test get', 'http://my.url/', headers=expect_headers, basic_auth=basic_auth) mock_set_basic_auth_if_needed.assert_called_once_with(basic_auth, ANY) - mock_request.assert_called_once_with('GET', 'http://my.url/', + mock_request.assert_called_once_with('GET', 'http://my.url/', timeout=60, headers=expect_headers, verify=False, proxies=None) assert response == mocked_response @@ -304,28 +304,28 @@ def test_send_message_json_custom_error(mock_send): @mock.patch("onapsdk.onap_service.requests.Session") def test_set_header(mock_session): - OnapService.send_message("GET", 'test get', 'http://my.url/') + OnapService.send_message(method="GET", action='test get', url='http://my.url/', timeout=0) _, _, kwargs = mock_session.return_value.request.mock_calls[0] headers = kwargs["headers"] assert "test-header-key" not in headers mock_session.reset_mock() OnapService.set_header({"test-header-key": "test-header-value"}) - OnapService.send_message("GET", 'test get', 'http://my.url/') + OnapService.send_message("GET", 'test get', 'http://my.url/', timeout=0) _, _, kwargs = mock_session.return_value.request.mock_calls[0] headers = kwargs["headers"] assert "test-header-key" in headers assert headers["test-header-key"] == "test-header-value" mock_session.reset_mock() - OnapService.send_message("GET", 'test get', 'http://my.url/', headers={}) + OnapService.send_message("GET", 'test get', 'http://my.url/', headers={}, timeout=0) _, _, kwargs = mock_session.return_value.request.mock_calls[0] headers = kwargs["headers"] assert "test-header-key" in headers assert headers["test-header-key"] == "test-header-value" mock_session.reset_mock() - OnapService.send_message("GET", 'test get', 'http://my.url/', headers={"test-header-key": "test-header-another-value"}) + OnapService.send_message("GET", 'test get', 'http://my.url/', headers={"test-header-key": "test-header-another-value"}, timeout=0) _, _, kwargs = mock_session.return_value.request.mock_calls[0] headers = kwargs["headers"] assert "test-header-key" in headers @@ -333,7 +333,7 @@ def test_set_header(mock_session): mock_session.reset_mock() OnapService.set_header(None) - OnapService.send_message("GET", 'test get', 'http://my.url/') + OnapService.send_message("GET", 'test get', 'http://my.url/', timeout=0) _, _, kwargs = mock_session.return_value.request.mock_calls[0] headers = kwargs["headers"] assert "test-header-key" not in headers @@ -343,14 +343,14 @@ def test_set_header(mock_session): mock_session.reset_mock() OnapService.set_header(test_header_method) - OnapService.send_message("GET", 'test get', 'http://my.url/', headers={}) + OnapService.send_message("GET", 'test get', 'http://my.url/', headers={}, timeout=0) _, _, kwargs = mock_session.return_value.request.mock_calls[0] headers = kwargs["headers"] assert "test-header-callable-key" in headers assert headers["test-header-callable-key"] == "test-header-callable-value" mock_session.reset_mock() - OnapService.send_message("GET", 'test get', 'http://my.url/', headers={"test-header-key": "test-header-value"}) + OnapService.send_message("GET", 'test get', 'http://my.url/', headers={"test-header-key": "test-header-value"}, timeout=0) _, _, kwargs = mock_session.return_value.request.mock_calls[0] headers = kwargs["headers"] assert "test-header-callable-key" in headers @@ -360,7 +360,7 @@ def test_set_header(mock_session): mock_session.reset_mock() OnapService.set_header({"test-header-dict-key": "test-header-dict-value"}) - OnapService.send_message("GET", 'test get', 'http://my.url/', headers={}) + OnapService.send_message("GET", 'test get', 'http://my.url/', headers={}, timeout=0) _, _, kwargs = mock_session.return_value.request.mock_calls[0] headers = kwargs["headers"] assert "test-header-callable-key" in headers @@ -369,7 +369,7 @@ def test_set_header(mock_session): assert headers["test-header-dict-key"] == "test-header-dict-value" mock_session.reset_mock() - OnapService.send_message("GET", 'test get', 'http://my.url/', headers={"test-header-common-key": "test-header-common-value"}) + OnapService.send_message("GET", 'test get', 'http://my.url/', headers={"test-header-common-key": "test-header-common-value"}, timeout=0) _, _, kwargs = mock_session.return_value.request.mock_calls[0] headers = kwargs["headers"] assert "test-header-callable-key" in headers @@ -381,7 +381,7 @@ def test_set_header(mock_session): mock_session.reset_mock() cert = mock.MagicMock(name="test-cert") - OnapService.send_message("GET", 'test get', 'http://my.url/', headers={"test-header-common-key": "test-header-common-value"}, cert=cert) + OnapService.send_message("GET", 'test get', 'http://my.url/', headers={"test-header-common-key": "test-header-common-value"}, cert=cert, timeout=0) _, _, kwargs = mock_session.return_value.request.mock_calls[0] headers = kwargs["headers"] assert "test-header-callable-key" in headers diff --git a/tests/test_settings.py b/tests/test_settings.py index 438b3c5..20101f6 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -24,7 +24,7 @@ from onapsdk.exceptions import ModuleError def test_global_settings(): """Test global settings.""" - assert len(settings._settings) == 46 + assert len(settings._settings) == 47 assert settings.AAI_URL == "https://aai.api.sparky.simpledemo.onap.org:30233" assert settings.CDS_URL == "http://portal.api.simpledemo.onap.org:30449" assert settings.SDNC_URL == "https://sdnc.api.simpledemo.onap.org:30267" @@ -56,6 +56,7 @@ def test_global_settings(): assert settings.PROJECT == "Onapsdk_project" assert settings.LOB == "Onapsdk_lob" assert settings.PLATFORM == "Onapsdk_platform" + assert settings.DEFAULT_REQUEST_TIMEOUT == 60 assert hasattr(settings, "AAI_AUTH") assert hasattr(settings, "CDS_AUTH") assert hasattr(settings, "SDC_AUTH") |