Skip to content

Commit a38e935

Browse files
authored
Fix #345: Retry ConnectionError in Jira client (#507)
Fix #345: Retry ConnectionError in Jira client
1 parent d159792 commit a38e935

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

jbi/services/jira.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
from functools import lru_cache
1111
from typing import TYPE_CHECKING, Any
1212

13-
from atlassian import Jira, errors
13+
from atlassian import Jira
14+
from atlassian import errors as atlassian_errors
15+
from requests import exceptions as requests_exceptions
1416

1517
from jbi import Operation, environment
1618
from jbi.models import ActionContext, BugzillaBug
@@ -27,14 +29,24 @@
2729

2830
JIRA_DESCRIPTION_CHAR_LIMIT = 32767
2931

30-
instrumented_method = instrument(prefix="jira", exceptions=(errors.ApiError,))
32+
instrumented_method = instrument(
33+
prefix="jira",
34+
exceptions=(
35+
atlassian_errors.ApiError,
36+
requests_exceptions.RequestException,
37+
),
38+
)
3139

3240

3341
class JiraClient(Jira):
3442
"""Adapted Atlassian Jira client that wraps methods in our instrumentation
3543
decorator.
3644
"""
3745

46+
get_server_info = instrumented_method(Jira.get_server_info)
47+
get_permissions = instrumented_method(Jira.get_permissions)
48+
get_project_components = instrumented_method(Jira.get_project_components)
49+
projects = instrumented_method(Jira.projects)
3850
update_issue_field = instrumented_method(Jira.update_issue_field)
3951
set_issue_status = instrumented_method(Jira.set_issue_status)
4052
issue_add_comment = instrumented_method(Jira.issue_add_comment)

tests/unit/services/test_jira.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import pytest
44
import responses
5+
from requests.exceptions import ConnectionError
56

67
from jbi.environment import get_settings
78
from jbi.services import jira
@@ -89,3 +90,23 @@ def test_create_issue_with_components(mocked_responses, context_create_example):
8990
posted_data = json.loads(mocked_responses.calls[-1].request.body)
9091

9192
assert posted_data["fields"]["components"] == [{"id": "42"}]
93+
94+
95+
@pytest.mark.no_mocked_jira
96+
def test_jira_retries_failing_connections_in_health_check(
97+
mocked_responses, actions_example
98+
):
99+
url = f"{get_settings().jira_base_url}rest/api/2/serverInfo?doHealthCheck=True"
100+
101+
# When the request does not match any mocked URL, we also obtain
102+
# a `ConnectionError`, but let's mock it explicitly.
103+
mocked_responses.add(
104+
responses.GET,
105+
url,
106+
body=ConnectionError(),
107+
)
108+
109+
with pytest.raises(ConnectionError):
110+
jira.check_health(actions_example)
111+
112+
assert len(mocked_responses.calls) == 4

0 commit comments

Comments
 (0)