def run_module(): module_args = dict( address=dict(type="str", required=True), username=dict(type="str", required=True), password=dict(type="str", required=True, no_log=True), bios=dict(type="dict", required=True), ) module = AnsibleModule(argument_spec=module_args, supports_check_mode=True) result = dict(changed=False) # Skip if check mode if module.check_mode: module.exit_json(**result) client = dracclient.client.DRACClient( host=module.params["address"], username=module.params["username"], password=module.params["password"], ) client.is_idrac_ready() jobs = client.list_jobs(only_unfinished=True) if len(jobs) > 0: module.fail_json(msg="pending idrac jobs") # check boot order, drop request if its really a no op bios_settings = module.params["bios"] if "SetBootOrderFqdd1" in bios_settings: requested = ( f"{bios_settings['SetBootOrderFqdd1']}," f"{bios_settings.get('SetBootOrderFqdd2')}," f"{bios_settings.get('SetBootOrderFqdd3')}," f"{bios_settings.get('SetBootOrderFqdd4')}" ) # Remove any trailing commas, if we have three interfaces requested = requested.strip(",") current_settings = to_dict(client.list_bios_settings()) current = current_settings["SetBootOrderEn"]["current_value"] result["requested_setting"] = requested result["current_settings"] = current if requested == current: del bios_settings["SetBootOrderFqdd1"] del bios_settings["SetBootOrderFqdd2"] del bios_settings["SetBootOrderFqdd3"] del bios_settings["SetBootOrderFqdd4"] bios_result = client.set_bios_settings(bios_settings) if bios_result and bios_result["is_commit_required"]: result["changed"] = True reboot_required = bios_result["is_reboot_required"] client.commit_pending_bios_changes(reboot=reboot_required) wait_for_jobs({module.params["address"]: client}) module.exit_json(**result)
def test_is_idrac_ready_not_ready(self, mock_requests): expected_text = test_utils.LifecycleControllerInvocations[ uris.DCIM_LCService]['GetRemoteServicesAPIStatus']['is_not_ready'] mock_requests.post('https://1.2.3.4:443/wsman', text=expected_text) client = dracclient.client.WSManClient(**test_utils.FAKE_ENDPOINT) self.assertFalse(client.is_idrac_ready())
def update_settings(client, bios_settings=None, idrac_settings=None): if not client.is_idrac_ready(): print("iDRAC not ready for update settings, skipping") return jobs = client.list_jobs(only_unfinished=True) if len(jobs) > 0: pprint.pprint(jobs) print("skip update settings, jobs in progress") return if bios_settings is None: bios_settings = { "LogicalProc": "Disabled", "SysProfile": "PerfOptimized", #"SetBootOrderEn": "NIC.Embedded.1-1-1,HardDisk.List.1-1", #"SetBootOrderEn": "NIC.Slot.4-1,InfiniBand.Slot.4-1,NIC.Embedded.1-1-1,HardDisk.List.1-1", #"SetBootOrderEn": "NIC.Embedded.1-1-1,HardDisk.List.1-1", "SetBootOrderFqdd1": "NIC.Embedded.1-1-1", "SetBootOrderFqdd2": "HardDisk.List.1-1", #"SetBootOrderFqdd3": "InfiniBand.Slot.4-1", "SetBootOrderFqdd3": "", #"SetBootOrderFqdd4": "InfiniBand.Slot.4-2", "SetBootOrderFqdd4": "", #"EmbNic1": "DisabledOs", "EmbNic1": "Enabled", # this is the default } bios_result = None if bios_settings: bios_result = client.set_bios_settings(bios_settings) print(bios_result) if idrac_settings is None: idrac_settings = { "IPMILan.1#Enable": "Enabled", } idrac_result = None if idrac_settings: idrac_result = client.set_idrac_settings(idrac_settings) print(idrac_result) reboot_required = bios_result['is_reboot_required'] if bios_result and bios_result['is_commit_required']: reboot_required = bios_result['is_reboot_required'] print(client.commit_pending_bios_changes(reboot=reboot_required)) if idrac_result and idrac_result['is_commit_required']: reboot_required = idrac_result['is_reboot_required'] print(client.commit_pending_idrac_changes(reboot=reboot_required)) return { "rebooted": reboot_required }
def wait_for_jobs(clients): pending = {} for name, client in clients.items(): if not client.is_idrac_ready(): pending[name] = client else: jobs = client.list_jobs(only_unfinished=True) if len(jobs) > 0: pending[name] = client else: # TODO: check job was a success print(name + " has no unfinished jobs") if len(pending) > 0: hosts = ",".join(list(pending.keys())) print("Unfinished jobs found: " + hosts) time.sleep(5) wait_for_jobs(pending)
conn = openstack.connection.from_config(cloud="arcus", debug=True) nodes = get_nodes_in_rack(conn, "DR06") clients = {} for node in nodes: ip = node["driver_info"]["drac_address"] name = node["name"] client = dracclient.client.DRACClient( host=ip, username="******", password="******") #print(json.dumps(get_all_settings(client), indent=2)) #exit(0) #print("Try BIOS Update for " + ip + " " + name) #update_settings(client) #print("Submitted BIOS Update for " + ip + " " + name) #double check we can talk to idrac is_working = False try: client.is_idrac_ready() is_working = True except Exception as e: print("ERROR: host %s has error: %s", name, e) if is_working: clients[name] = client wait_for_jobs(clients)