Skip to content

Commit 0a97f53

Browse files
chore: update aiohttp ClientSession to exit gracefully. (#53)
* update service and test client session
1 parent 70fb828 commit 0a97f53

File tree

3 files changed

+28
-24
lines changed

3 files changed

+28
-24
lines changed

iam_groups_authn/sync.py

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,11 @@ async def groups_sync(iam_groups, sql_instances, credentials, private_ip=False):
5454
# set ip_type to proper type for connector
5555
ip_type = IPTypes.PRIVATE if private_ip else IPTypes.PUBLIC
5656

57+
# create aiohttp client session for async API calls
58+
client_session = ClientSession(headers={"Content-Type": "application/json"})
59+
5760
# create UserService object for API calls
58-
user_service = UserService(credentials)
61+
user_service = UserService(client_session, credentials)
5962

6063
# keep track of IAM group and database instance tasks
6164
group_tasks = {}
@@ -178,20 +181,23 @@ async def groups_sync(iam_groups, sql_instances, credentials, private_ip=False):
178181
"[%s][%s] Users granted role: %s." % (instance, group, granted_users)
179182
)
180183

184+
# close aiohttp client session for graceful exit
185+
if not client_session.closed:
186+
await client_session.close()
187+
181188

182189
class UserService:
183190
"""Helper class for building googleapis service calls."""
184191

185-
def __init__(self, creds):
192+
def __init__(self, client_session, creds):
186193
"""Initialize UserService instance.
187194
188195
Args:
196+
client_session: aiohttp client session object for API calls.
189197
creds: OAuth2 credentials to call admin APIs.
190198
"""
199+
self.client_session = client_session
191200
self.creds = creds
192-
self.client_session = ClientSession(
193-
headers={"Content-Type": "application/json"}
194-
)
195201

196202
async def get_group_members(self, group):
197203
"""Get all members of an IAM group.
@@ -316,17 +322,6 @@ async def get_database_version(self, instance_connection_name):
316322
f"Error: Failed to get the database version for `{instance_connection_name}`. Verify instance connection name and instance details."
317323
) from e
318324

319-
def __del__(self):
320-
"""Deconstructor for UserService to close ClientSession and have
321-
graceful exit.
322-
"""
323-
324-
async def deconstruct():
325-
if not self.client_session.closed:
326-
await self.client_session.close()
327-
328-
asyncio.run_coroutine_threadsafe(deconstruct(), loop=asyncio.get_event_loop())
329-
330325

331326
class RequestType(Enum):
332327
"""Helper class for supported aiohttp request types."""

tests/integration/test_mysql_sync.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from google.auth import default
1818
from google.auth.transport.requests import Request
1919
import sqlalchemy
20+
from aiohttp import ClientSession
2021
from helpers import delete_database_user, delete_iam_member, add_iam_member
2122
from iam_groups_authn.iam_admin import get_iam_users
2223
from iam_groups_authn.mysql import init_mysql_connection_engine, mysql_username
@@ -89,8 +90,11 @@ async def test_service_mysql(credentials):
8990
- Verifies test user no longer has group role
9091
"""
9192

93+
# create aiohttp client session for async API calls
94+
client_session = ClientSession(headers={"Content-Type": "application/json"})
95+
9296
# check that test_user is not a database user
93-
user_service = UserService(credentials)
97+
user_service = UserService(client_session, credentials)
9498
db_users = await get_instance_users(user_service, sql_instance)
9599
assert mysql_username(test_user) not in db_users
96100

@@ -130,6 +134,6 @@ async def test_service_mysql(credentials):
130134
users_with_role = check_role_mysql(pool, mysql_username(iam_groups[0]))
131135
assert mysql_username(test_user) not in users_with_role
132136

133-
# close user_service session
134-
if not user_service.client_session.closed:
135-
await user_service.client_session.close()
137+
# close aiohttp client session for graceful exit
138+
if not client_session.closed:
139+
await client_session.close()

tests/integration/test_postgres_sync.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from google.auth import default
1818
from google.auth.transport.requests import Request
1919
import sqlalchemy
20+
from aiohttp import ClientSession
2021
from helpers import delete_database_user, delete_iam_member, add_iam_member
2122
from iam_groups_authn.iam_admin import get_iam_users
2223
from iam_groups_authn.mysql import mysql_username
@@ -89,8 +90,12 @@ async def test_service_postgres(credentials):
8990
- Run GroupSync
9091
- Verifies test user no longer has group role
9192
"""
93+
94+
# create aiohttp client session for async API calls
95+
client_session = ClientSession(headers={"Content-Type": "application/json"})
96+
9297
# check that test_user is not a database user
93-
user_service = UserService(credentials)
98+
user_service = UserService(client_session, credentials)
9499
db_users = await get_instance_users(user_service, sql_instance)
95100
assert test_user not in db_users
96101

@@ -130,6 +135,6 @@ async def test_service_postgres(credentials):
130135
users_with_role = check_role_postgres(pool, mysql_username(iam_groups[0]))
131136
assert test_user not in users_with_role
132137

133-
# close user_service session
134-
if not user_service.client_session.closed:
135-
await user_service.client_session.close()
138+
# close aiohttp client session for graceful exit
139+
if client_session.closed:
140+
await client_session.close()

0 commit comments

Comments
 (0)