@@ -26,6 +26,10 @@ async def badfish_factory(_host, _username, _password, loop=None, _retries=RETRI
2626 return badfish
2727
2828
29+ class BadfishException (Exception ):
30+ pass
31+
32+
2933class Badfish :
3034 def __init__ (self , _host , _username , _password , loop = None , _retries = RETRIES ):
3135 self .host = _host
@@ -69,13 +73,13 @@ async def error_handler(_response):
6973 data = await _response .json (content_type = "application/json" )
7074 except Exception :
7175 logger .error ("Error reading response from host." )
72- sys . exit ( 1 )
76+ raise BadfishException
7377
7478 if "error" in data :
7579 detail_message = str (data ["error" ]["@Message.ExtendedInfo" ][0 ]["Message" ])
7680 logger .warning (detail_message )
7781
78- sys . exit ( 1 )
82+ raise BadfishException
7983
8084 async def get_request (self , uri , _continue = False ):
8185 try :
@@ -93,7 +97,7 @@ async def get_request(self, uri, _continue=False):
9397 else :
9498 logger .debug (ex )
9599 logger .error ("Failed to communicate with server." )
96- sys . exit ( 1 )
100+ raise BadfishException
97101 return _response
98102
99103 async def post_request (self , uri , payload , headers ):
@@ -112,7 +116,7 @@ async def post_request(self, uri, payload, headers):
112116 await _response .json (content_type = "application/json" )
113117 except (Exception , TimeoutError ):
114118 logger .exception ("Failed to communicate with server." )
115- sys . exit ( 1 )
119+ raise BadfishException
116120 return _response
117121
118122 async def patch_request (self , uri , payload , headers , _continue = False ):
@@ -135,7 +139,7 @@ async def patch_request(self, uri, payload, headers, _continue=False):
135139 else :
136140 logger .debug (ex )
137141 logger .error ("Failed to communicate with server." )
138- sys . exit ( 1 )
142+ raise BadfishException
139143 return _response
140144
141145 async def delete_request (self , uri , headers ):
@@ -153,7 +157,7 @@ async def delete_request(self, uri, headers):
153157 await _response .json (content_type = "application/json" )
154158 except (Exception , TimeoutError ):
155159 logger .exception ("Failed to communicate with server." )
156- sys . exit ( 1 )
160+ raise BadfishException
157161 return
158162
159163 async def get_boot_seq (self ):
@@ -172,7 +176,7 @@ async def get_bios_boot_mode(self):
172176 data = await _response .json (content_type = "application/json" )
173177 except ValueError :
174178 logger .error ("Could not retrieve Bios Boot mode." )
175- sys . exit ( 1 )
179+ raise BadfishException
176180
177181 try :
178182 bios_boot_mode = data [u"Attributes" ]["BootMode" ]
@@ -192,7 +196,7 @@ async def get_boot_devices(self):
192196 else :
193197 logger .debug (data )
194198 logger .error ("Boot order modification is not supported by this host." )
195- sys . exit ( 1 )
199+ raise BadfishException
196200
197201 async def get_job_queue (self ):
198202 logger .debug ("Getting job queue." )
@@ -231,7 +235,7 @@ async def get_job_status(self, _job_id):
231235 logger .warning ("JobStatus not scheduled, current status is: %s." % data [u"Message" ])
232236
233237 logger .error ("Not able to successfully schedule the job." )
234- sys . exit ( 1 )
238+ raise BadfishException
235239
236240 async def get_host_type (self , _interfaces_path ):
237241 boot_devices = await self .get_boot_devices ()
@@ -243,7 +247,7 @@ async def get_host_type(self, _interfaces_path):
243247 except yaml .YAMLError as ex :
244248 logger .error ("Couldn't read file: %s" % _interfaces_path )
245249 logger .debug (ex )
246- sys . exit ( 1 )
250+ raise BadfishException
247251
248252 host_model = self .host .split ("." )[0 ].split ("-" )[- 1 ]
249253 interfaces = {}
@@ -266,13 +270,13 @@ async def find_systems_resource(self):
266270
267271 if response .status == 401 :
268272 logger .error (f"Failed to authenticate. Verify your credentials for { self .host } " )
269- sys . exit ( 1 )
273+ raise BadfishException
270274
271275 if response :
272276 data = await response .json (content_type = "application/json" )
273277 if 'Systems' not in data :
274278 logger .error ("Systems resource not found" )
275- sys . exit ( 1 )
279+ raise BadfishException
276280 else :
277281 systems = data ["Systems" ]["@odata.id" ]
278282 _response = await self .get_request (self .host_uri + systems )
@@ -285,15 +289,15 @@ async def find_systems_resource(self):
285289 return systems_service
286290 else :
287291 logger .error ("ComputerSystem's Members array is either empty or missing" )
288- sys . exit ( 1 )
292+ raise BadfishException
289293
290294 async def find_managers_resource (self ):
291295 response = await self .get_request (self .root_uri )
292296 if response :
293297 data = await response .json (content_type = "application/json" )
294298 if 'Managers' not in data :
295299 logger .error ("Managers resource not found" )
296- sys . exit ( 1 )
300+ raise BadfishException
297301 else :
298302 managers = data ["Managers" ]["@odata.id" ]
299303 response = await self .get_request (self .host_uri + managers )
@@ -306,7 +310,7 @@ async def find_managers_resource(self):
306310 return managers_service
307311 else :
308312 logger .error ("Manager's Members array is either empty or missing" )
309- sys . exit ( 1 )
313+ raise BadfishException
310314
311315 async def get_power_state (self ):
312316 _uri = '%s%s' % (self .host_uri , self .system_resource )
@@ -328,17 +332,17 @@ async def get_power_state(self):
328332 async def change_boot (self , host_type , interfaces_path , pxe = False ):
329333 if host_type .lower () not in ("foreman" , "director" ):
330334 logger .error ('Expected values for -t argument are "foreman" or "director"' )
331- sys . exit ( 1 )
335+ raise BadfishException
332336
333337 if interfaces_path :
334338 if not os .path .exists (interfaces_path ):
335339 logger .error ("No such file or directory: %s." % interfaces_path )
336- sys . exit ( 1 )
340+ raise BadfishException
337341 else :
338342 logger .error (
339343 "You must provide a path to the interfaces yaml via `-i` optional argument."
340344 )
341- sys . exit ( 1 )
345+ raise BadfishException
342346
343347 _type = await self .get_host_type (interfaces_path )
344348 if _type and _type .lower () != host_type .lower ():
@@ -359,7 +363,7 @@ async def change_boot(self, host_type, interfaces_path, pxe=False):
359363
360364 else :
361365 logger .error ("Couldn't communicate with host after %s attempts." % self .retries )
362- sys . exit ( 1 )
366+ raise BadfishException
363367 else :
364368 logger .warning (
365369 "No changes were made since the boot order already matches the requested."
@@ -372,7 +376,7 @@ async def change_boot_order(self, _interfaces_path, _host_type):
372376 definitions = yaml .safe_load (f )
373377 except yaml .YAMLError as ex :
374378 logger .error (ex )
375- sys . exit ( 1 )
379+ raise BadfishException
376380
377381 host_model = self .host .split ("." )[0 ].split ("-" )[- 1 ]
378382 interfaces = definitions ["%s_%s_interfaces" % (_host_type , host_model )].split ("," )
@@ -392,7 +396,6 @@ async def change_boot_order(self, _interfaces_path, _host_type):
392396
393397 else :
394398 logger .warning ("No changes were made since the boot order already matches the requested." )
395- sys .exit ()
396399
397400 async def patch_boot_seq (self , boot_devices ):
398401 _boot_seq = await self .get_boot_seq ()
@@ -452,7 +455,7 @@ async def delete_job_queue(self):
452455 logger .info ("Job queue for iDRAC %s successfully cleared." % self .host )
453456 else :
454457 logger .error ("Job queue not cleared, there was something wrong with your request." )
455- sys . exit ( 1 )
458+ raise BadfishException
456459
457460 async def clear_job_list (self , _job_queue ):
458461 _url = "%s%s/Jobs" % (self .host_uri , self .manager_resource )
@@ -468,7 +471,7 @@ async def clear_job_list(self, _job_queue):
468471 logger .info ("Job queue for iDRAC %s successfully cleared." % self .host )
469472 else :
470473 logger .error ("Job queue not cleared, current job queue contains jobs: %s." % job_queue )
471- sys . exit ( 1 )
474+ raise BadfishException
472475
473476 async def clear_job_queue (self ):
474477 _job_queue = await self .get_job_queue ()
@@ -573,7 +576,7 @@ async def reset_idrac(self):
573576 else :
574577 data = await _response .json ()
575578 logger .error ("Status code %s returned, error is: \n %s." % (status_code , data ))
576- sys . exit ( 1 )
579+ raise BadfishException
577580 time .sleep (15 )
578581
579582 logger .info ("iDRAC will now reset and be back online within a few minutes." )
@@ -588,18 +591,18 @@ async def boot_to(self, device):
588591 if job_id :
589592 await self .get_job_status (job_id )
590593 else :
591- sys . exit ( 1 )
594+ raise BadfishException
592595 return True
593596
594597 async def boot_to_type (self , host_type , _interfaces_path ):
595598 if host_type .lower () not in ("foreman" , "director" ):
596599 logger .error ('Expected values for -t argument are "foreman" or "director"' )
597- sys . exit ( 1 )
600+ raise BadfishException
598601
599602 if _interfaces_path :
600603 if not os .path .exists (_interfaces_path ):
601604 logger .error ("No such file or directory: %s." % _interfaces_path )
602- sys . exit ( 1 )
605+ raise BadfishException
603606
604607 device = self .get_host_type_boot_device (host_type , _interfaces_path )
605608
@@ -691,12 +694,12 @@ async def get_firmware_inventory(self):
691694 data = await _response .json (content_type = "application/json" )
692695 except ValueError :
693696 logger .error ("Not able to access Firmware inventory." )
694- sys . exit ( 1 )
697+ raise BadfishException
695698 installed_devices = []
696699 if "error" in data :
697700 logger .debug (data ["error" ])
698701 logger .error ("Not able to access Firmware inventory." )
699- sys . exit ( 1 )
702+ raise BadfishException
700703 for device in data [u'Members' ]:
701704 a = device [u'@odata.id' ]
702705 a = a .replace ("/redfish/v1/UpdateService/FirmwareInventory/" , "" )
@@ -759,7 +762,7 @@ async def export_configuration(self):
759762 time .sleep (1 )
760763 else :
761764 logger .error ("Execute job ID command failed, error code is: %s" % status_code )
762- sys . exit ( 1 )
765+ raise BadfishException
763766
764767 logger .error ("Could not export settings after %s attempts." % self .retries )
765768
@@ -771,7 +774,7 @@ def get_host_type_boot_device(self, host_type, _interfaces_path):
771774 except yaml .YAMLError as ex :
772775 logger .error ("Couldn't read file: %s" % _interfaces_path )
773776 logger .debug (ex )
774- sys . exit ( 1 )
777+ raise BadfishException
775778
776779 host_model = self .host .split ("." )[0 ].split ("-" )[- 1 ]
777780 return definitions ["%s_%s_interfaces" % (host_type , host_model )].split ("," )[0 ]
0 commit comments