Skip to content

Commit 1e51631

Browse files
authored
CLOUDDST-28603: Add retry on ErrataClient._call_et (#666)
This commit adds a retry on `ErrataClientBase._call_et` in order to re-attempt failed requests with the Errata Tool. Refers to CLOUDDST-28603 --------- Signed-off-by: Jonathan Gangi <[email protected]>
1 parent 8674808 commit 1e51631

File tree

3 files changed

+22
-1
lines changed

3 files changed

+22
-1
lines changed

src/pushsource/_impl/backend/errata_source/errata_client.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@
77
import threading
88
import xmlrpc.client as xmlrpc_client # nosec B411
99
from urllib.parse import urljoin
10+
from urllib3.util.retry import Retry
1011
import warnings
1112

1213
import gssapi
1314
from more_executors import Executors
1415
from more_executors.futures import f_zip, f_map
1516
import requests
17+
import requests.adapters
1618
import requests_gssapi
1719

1820
from ...compat_attr import attr
@@ -21,6 +23,14 @@
2123

2224
USE_XMLRPC_CLIENT = os.environ.get("PUSHSOURCE_ERRATA_USE_XMLRPC_API") == "1"
2325

26+
ERRATA_RETRY_STRATEGY = Retry(
27+
total=5,
28+
status_forcelist=range(500, 600),
29+
backoff_factor=2,
30+
allowed_methods=frozenset(["GET", "POST"]),
31+
raise_on_status=False,
32+
)
33+
2434

2535
def get_errata_client(
2636
threads,
@@ -289,6 +299,9 @@ def _errata_service(self):
289299

290300
session = requests.Session()
291301
session.auth = requests_gssapi.HTTPSPNEGOAuth(creds=creds)
302+
adapter = requests.adapters.HTTPAdapter(max_retries=ERRATA_RETRY_STRATEGY)
303+
session.mount("https://", adapter)
304+
session.mount("http://", adapter)
292305
self._tls.session = session
293306

294307
return self._tls.session

tests/errata/fake_errata_tool.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import yaml
55
import json
66
from xmlrpc.client import Fault # nosec B411
7+
from urllib3.util.retry import Retry
78

89
import requests
910

@@ -54,6 +55,7 @@ class FakeErrataToolProxy(object):
5455
def __init__(self, controller):
5556
self._ctrl = controller
5657
self.auth = None
58+
self.mount = Mock(spec=Retry)
5759
self.url_map = [
5860
(".*/api/v1/erratum/(.*)", self.get_advisory_data),
5961
(

tests/errata/test_errata_client.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import requests
88

99
from pushsource._impl.backend.errata_source.errata_client import (
10+
ERRATA_RETRY_STRATEGY,
1011
ErrataHTTPClient,
1112
get_errata_client,
1213
)
@@ -35,11 +36,14 @@ def test_init_env_vars():
3536
assert client.principal == "[email protected]"
3637

3738

39+
@mock.patch("requests.adapters.HTTPAdapter")
3840
@mock.patch("gssapi.Name")
3941
@mock.patch("gssapi.Credentials.acquire")
4042
@mock.patch("requests.Session")
4143
@mock.patch("requests_gssapi.HTTPSPNEGOAuth")
42-
def test_get_session(mock_auth, mock_session, mock_acquire, mock_name, caplog):
44+
def test_get_session(
45+
mock_auth, mock_session, mock_acquire, mock_name, mock_adapter, caplog
46+
):
4347
caplog.set_level(logging.DEBUG)
4448

4549
client = ErrataHTTPClient(
@@ -57,6 +61,8 @@ def test_get_session(mock_auth, mock_session, mock_acquire, mock_name, caplog):
5761
)
5862
mock_session.assert_called_once_with()
5963
mock_auth.assert_called_once_with(creds=mock_acquire.return_value.creds)
64+
mock_adapter.assert_called_once_with(max_retries=ERRATA_RETRY_STRATEGY)
65+
assert session.mount.call_count == 2
6066

6167
assert session == mock_session.return_value
6268
assert client._tls.session == mock_session.return_value

0 commit comments

Comments
 (0)