Skip to content

Commit a512146

Browse files
committed
fix: better session handling
closes: redhat-performance#447
1 parent 65b9b3f commit a512146

File tree

1 file changed

+36
-5
lines changed

1 file changed

+36
-5
lines changed

src/badfish/main.py

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,16 @@ def __init__(self, _host, _username, _password, _logger, _retries, _loop=None):
6969
self.token = None
7070
self.vendor = None
7171

72+
async def __aenter__(self):
73+
await self.init()
74+
return self
75+
76+
async def __aexit__(self, exc_type, exc_val, exc_tb):
77+
await self.delete_session()
78+
if exc_type is not None:
79+
self.logger.debug(f"Exiting context with exception: {exc_type.__name__}: {exc_val}")
80+
return False
81+
7282
async def init(self):
7383
self.session_uri = await self.find_session_uri()
7484
self.token = await self.validate_credentials()
@@ -2126,12 +2136,26 @@ async def take_screenshot(self):
21262136
return True
21272137

21282138
async def delete_session(self):
2139+
if not self.session_id:
2140+
self.logger.debug("No session ID found, skipping session deletion")
2141+
return
2142+
21292143
headers = {"content-type": "application/json"}
21302144
_uri = "%s%s" % (self.host_uri, self.session_id)
2131-
_response = await self.delete_request(_uri, headers=headers)
2132-
if _response.status not in [200, 201]:
2133-
raise BadfishException(f"Failed to delete X-Auth-Token for {self.host}")
2134-
return
2145+
2146+
try:
2147+
_response = await self.delete_request(_uri, headers=headers)
2148+
if _response.status in [200, 201]:
2149+
self.logger.debug(f"Session successfully deleted for {self.host}")
2150+
elif _response.status == 404:
2151+
self.logger.debug(f"Session not found (404) for {self.host}, may have been already deleted")
2152+
else:
2153+
self.logger.warning(f"Unexpected status {_response.status} when deleting session for {self.host}")
2154+
except BadfishException as ex:
2155+
self.logger.warning(f"Failed to delete session for {self.host}: {ex}")
2156+
finally:
2157+
self.session_id = None
2158+
self.token = None
21352159

21362160
async def get_scp_targets(self, op):
21372161
uri = "%s%s" % (self.host_uri, self.manager_resource)
@@ -2564,6 +2588,7 @@ async def execute_badfish(_host, _args, logger, format_handler=None):
25642588
get_nic_attribute = _args["get_nic_attribute"]
25652589
set_nic_attribute = _args["set_nic_attribute"]
25662590
result = True
2591+
badfish = None
25672592

25682593
try:
25692594
badfish = await badfish_factory(
@@ -2684,10 +2709,16 @@ async def execute_badfish(_host, _args, logger, format_handler=None):
26842709
if pxe and not host_type:
26852710
await badfish.set_next_boot_pxe()
26862711

2687-
await badfish.delete_session()
26882712
except BadfishException as ex:
26892713
logger.error(ex)
26902714
result = False
2715+
finally:
2716+
if badfish and badfish.session_id:
2717+
try:
2718+
await badfish.delete_session()
2719+
logger.debug(f"Session closed for host: {_host}")
2720+
except BadfishException as ex:
2721+
logger.warning(f"Failed to close session for {_host}: {ex}")
26912722

26922723
if _args["host_list"]:
26932724
logger.info("*" * 48)

0 commit comments

Comments
 (0)