Skip to content

Commit bdebfc8

Browse files
authored
30817 - AUTH-API - Retry keycloak add/remove groups on failure (bcgov#3581)
1 parent 8f347e9 commit bdebfc8

File tree

3 files changed

+30
-9
lines changed

3 files changed

+30
-9
lines changed

auth-api/poetry.lock

Lines changed: 16 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

auth-api/pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ sbc-common-components = { git = "https://github.com/bcgov/sbc-common-components.
5656
cloud-sql-connector = { git = "https://github.com/bcgov/sbc-connect-common.git", subdirectory = "python/cloud-sql-connector", branch = "main" }
5757
gcp-queue = { git = "https://github.com/bcgov/sbc-connect-common.git", subdirectory = "python/gcp-queue", branch = "main" }
5858
structured-logging = { git = "https://github.com/bcgov/sbc-connect-common.git", subdirectory = "python/structured-logging", branch = "main" }
59+
aiohttp-retry = "^2.9.1"
5960

6061
[tool.poetry.group.test.dependencies]
6162
pytest = "^8.3.2"

auth-api/src/auth_api/services/keycloak.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import aiohttp
2222
import requests
23+
from aiohttp_retry import ExponentialRetry, RetryClient
2324
from flask import current_app
2425

2526
from auth_api.exceptions import BusinessException
@@ -286,15 +287,19 @@ async def add_or_remove_users_from_group(kgs: list[KeycloakGroupSubscription]):
286287
method = "PUT" if kgs[0].group_action == KeycloakGroupActions.ADD_TO_GROUP.value else "DELETE"
287288
# Normal limit is 100, cap this to 40, so it doesn't hit keycloak too aggressively.
288289
connector = aiohttp.TCPConnector(limit=40)
289-
async with aiohttp.ClientSession(connector=connector) as session:
290+
retry_options = ExponentialRetry(
291+
attempts=3,
292+
start_timeout=1,
293+
statuses={500, 502, 503, 504},
294+
exceptions={TimeoutError, aiohttp.ClientConnectionError}
295+
)
296+
async with RetryClient(connector=connector, retry_options=retry_options) as session:
290297
tasks = [
291-
asyncio.create_task(
292-
session.request(
293-
method,
294-
f"{base_url}/auth/admin/realms/{realm}/users/{kg.user_guid}/groups/{group_ids[kg.group_name]}",
295-
headers=headers,
296-
timeout=timeout,
297-
)
298+
session.request(
299+
method,
300+
f"{base_url}/auth/admin/realms/{realm}/users/{kg.user_guid}/groups/{group_ids[kg.group_name]}",
301+
headers=headers,
302+
timeout=timeout
298303
)
299304
for kg in kgs
300305
]

0 commit comments

Comments
 (0)