@@ -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