Skip to content

Commit b64967d

Browse files
sadsfaegerritforge-inc
authored andcommitted
Merge "fix: removed bafish sys exit"
2 parents 2da1cca + f24b613 commit b64967d

File tree

3 files changed

+38
-36
lines changed

3 files changed

+38
-36
lines changed

bin/quads-cli

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import os
3030
from json import JSONDecodeError
3131
from quads.config import conf, API_URL
3232
from quads.quads import Api as QuadsApi
33-
from quads.tools import make_instackenv_json
3433
from quads.tools.move_and_rebuild_hosts import move_and_rebuild, switch_config
3534
from quads.model import Cloud, Schedule, Host
3635

quads/tools/badfish.py

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
2933
class 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]

quads/tools/move_and_rebuild_hosts.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from quads.config import conf
99
from quads.helpers import is_supported, is_supermicro, get_vlan
1010
from quads.model import Host, Cloud
11-
from quads.tools.badfish import badfish_factory
11+
from quads.tools.badfish import badfish_factory, BadfishException
1212
from quads.tools.foreman import Foreman
1313
from quads.tools.juniper_convert_port_public import juniper_convert_port_public
1414
from quads.tools.juniper_set_port import juniper_set_port
@@ -180,7 +180,7 @@ async def move_and_rebuild(host, old_cloud, new_cloud, semaphore, rebuild=False,
180180
if is_supported(host):
181181
try:
182182
badfish = await badfish_factory("mgmt-%s" % host, conf["ipmi_username"], conf["ipmi_password"])
183-
except SystemExit:
183+
except BadfishException:
184184
logger.error(f"Could not initialize Badfish. Verify ipmi credentials for mgmt-{host}.")
185185
return False
186186
try:
@@ -191,7 +191,7 @@ async def move_and_rebuild(host, old_cloud, new_cloud, semaphore, rebuild=False,
191191
"../../conf/idrac_interfaces.yml"
192192
)
193193
), loop)
194-
except (SystemExit, Exception):
194+
except BadfishException:
195195
logger.error(f"Could not set boot order via Badfish for mgmt-{host}.")
196196
return False
197197

@@ -226,7 +226,7 @@ async def move_and_rebuild(host, old_cloud, new_cloud, semaphore, rebuild=False,
226226
)
227227
)
228228
await badfish.reboot_server(graceful=False)
229-
except (SystemExit, Exception):
229+
except BadfishException:
230230
logger.error(f"Error setting PXE boot via Badfish on {host}.")
231231
return False
232232
else:

0 commit comments

Comments
 (0)