aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLukasz Rajewski <lukasz.rajewski@t-mobile.pl>2023-06-16 10:31:14 +0000
committerLukasz Rajewski <lukasz.rajewski@t-mobile.pl>2023-06-16 13:01:28 +0000
commit903bfe4ad9e19df6a8d891677d9e023019d5d920 (patch)
treebc7a545dbc64881a3660f82293a9ab7b47d9255f
parenta13ff9ac968ddced994205539a494ecbdb2d6b34 (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.py2
-rw-r--r--src/onapsdk/onap_service.py32
-rw-r--r--tests/test_onap_service.py26
-rw-r--r--tests/test_settings.py3
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")