*** Settings *** Documentation Redfish BMC and PNOR software utilities keywords. Library code_update_utils.py Library gen_robot_valid.py Library tftp_update_utils.py Resource bmc_redfish_utils.robot Resource boot_utils.robot *** Keywords *** Get Software Functional State [Documentation] Return functional or active state of the software (i.e. True/False). [Arguments] ${image_id} # Description of argument(s): # image_id The image ID (e.g. "acc9e073"). ${resp}= Redfish.Get /redfish/v1/UpdateService/FirmwareInventory/${image_id} ... valid_status_codes=[${HTTP_OK}, ${HTTP_INTERNAL_SERVER_ERROR}] ${image_info} Set Variable ${resp.dict} ${sw_functional}= Run Keyword If ... '${image_info["Description"]}' == 'BMC image' or '${image_info["Description"]}' == 'BMC update' ... Redfish.Get Attribute /redfish/v1/Managers/bmc FirmwareVersion ... ELSE ... Redfish.Get Attribute /redfish/v1/Systems/system BiosVersion ${functional}= Run Keyword And Return Status ... Should Be Equal ${sw_functional} ${image_info["Version"]} [Return] ${functional} Get Software Inventory State [Documentation] Return dictionary of the image type, version and functional state ... of the software objects active on the system. # User defined state for software objects. # Note: "Functional" term refers to firmware which system is currently booted with. # sw_inv_dict: # [ace821ef]: # [image_type]: Host update # [image_id]: ace821ef # [functional]: True # [version]: witherspoon-xx.xx.xx.xx # [b9101858]: # [image_type]: BMC update # [image_id]: b9101858 # [functional]: True # [version]: 2.8.0-dev-150-g04508dc9f # [c45eafa5]: # [image_type]: BMC update # [image_id]: c45eafa5 # [functional]: False # [version]: 2.8.0-dev-149-g1a8df5077 ${sw_member_list}= Redfish_Utils.Get Member List /redfish/v1/UpdateService/FirmwareInventory &{sw_inv_dict}= Create Dictionary # sw_member_list: # [0]: /redfish/v1/UpdateService/FirmwareInventory/98744d76 # [1]: /redfish/v1/UpdateService/FirmwareInventory/9a8028ec # [2]: /redfish/v1/UpdateService/FirmwareInventory/acc9e073 FOR ${uri_path} IN @{sw_member_list} &{tmp_dict}= Create Dictionary ${resp}= Redfish.Get ${uri_path} valid_status_codes=[${HTTP_OK}, ${HTTP_INTERNAL_SERVER_ERROR}] ${image_info} Set Variable ${resp.dict} Set To Dictionary ${tmp_dict} image_type ${image_info["Description"]} Set To Dictionary ${tmp_dict} image_id ${uri_path.split("/")[-1]} ${functional}= Get Software Functional State ${uri_path.split("/")[-1]} Set To Dictionary ${tmp_dict} functional ${functional} Set To Dictionary ${tmp_dict} version ${image_info["Version"]} Set To Dictionary ${sw_inv_dict} ${uri_path.split("/")[-1]} ${tmp_dict} END [Return] &{sw_inv_dict} Get Software Inventory State By Version [Documentation] Return the software inventory record that matches the given software version. [Arguments] ${software_version} # If no matchine record can be found, return ${EMPTY}. # Example of returned data: # software_inventory_record: # [image_type]: BMC update # [image_id]: 1e662ba8 # [functional]: True # [version]: 2.8.0-dev-150-g04508dc9f # Description of argument(s): # software_version A BMC or Host version (e.g "2.8.0-dev-150-g04508dc9f"). ${software_inventory}= Get Software Inventory State # Filter out entries that don't match the criterion.. ${software_inventory}= Filter Struct ${software_inventory} [('version', '${software_version}')] # Convert from dictionary to list. ${software_inventory}= Get Dictionary Values ${software_inventory} ${num_records}= Get Length ${software_inventory} Return From Keyword If ${num_records} == ${0} ${EMPTY} # Return the first list entry. [Return] ${software_inventory}[0] Get BMC Functional Firmware [Documentation] Get BMC functional firmware details. ${sw_inv}= Get Functional Firmware BMC update ${sw_inv}= Get Non Functional Firmware ${sw_inv} True [Return] ${sw_inv} Get Functional Firmware [Documentation] Get all the BMC firmware details. [Arguments] ${image_type} # Description of argument(s): # image_type Image value can be either BMC update or Host update. ${software_inventory}= Get Software Inventory State ${bmc_inv}= Get BMC Firmware ${image_type} ${software_inventory} [Return] ${bmc_inv} Get Non Functional Firmware [Documentation] Get BMC non functional firmware details. [Arguments] ${sw_inv} ${functional_state} # Description of argument(s): # sw_inv This dictionary contains all the BMC firmware details. # functional_state Functional state can be either True or False. ${resp}= Filter Struct ${sw_inv} [('functional', ${functional_state})] ${num_records}= Get Length ${resp} Set Global Variable ${num_records} Return From Keyword If ${num_records} == ${0} ${EMPTY} ${list_inv_dict}= Get Dictionary Values ${resp} [Return] ${list_inv_dict}[0] Get Non Functional Firmware List [Documentation] Get BMC non functional firmware details. [Arguments] ${sw_inv} ${functional_state} # Description of argument(s): # sw_inv This dictionary contains all the BMC firmware details. # functional_state Functional state can be either True or False. ${list_inv}= Create List FOR ${key} IN @{sw_inv.keys()} Run Keyword If '${sw_inv['${key}']['functional']}' == '${functional_state}' ... Append To List ${list_inv} ${sw_inv['${key}']} END [Return] ${list_inv} Redfish Upload Image And Check Progress State [Documentation] Code update with ApplyTime. Log To Console Start uploading image to BMC. Redfish Upload Image ${REDFISH_BASE_URI}UpdateService ${IMAGE_FILE_PATH} Log To Console Completed image upload to BMC. ${image_id}= Get Latest Image ID Rprint Vars image_id # We have noticed firmware inventory state Enabled quickly as soon the image # is uploaded via redfish. Wait Until Keyword Succeeds 2 min 05 sec ... Check Image Update Progress State match_state='Disabled', 'Updating', 'Enabled' image_id=${image_id} Wait Until Keyword Succeeds 8 min 10 sec ... Check Image Update Progress State ... match_state='Enabled' image_id=${image_id} Get Host Power State [Documentation] Get host power state. [Arguments] ${quiet}=0 # Description of arguments: # quiet Indicates whether results should be printed. ${state}= Redfish.Get Attribute ... ${REDFISH_BASE_URI}Systems/system PowerState Rqprint Vars state [Return] ${state} Check Host Power State [Documentation] Check that the machine's host state matches ... the caller's required host state. [Arguments] ${match_state} # Description of argument(s): # match_state The expected state. This may be one or more # comma-separated values (e.g. "On", "Off"). # If the actual state matches any of the # states named in this argument, # this keyword passes. ${state}= Get Host Power State Rvalid Value state valid_values=[${match_state}] Get System Firmware Details [Documentation] Return dictionary of system firmware details. # { # FirmwareVersion: 2.8.0-dev-1067-gdc66ce1c5, # BiosVersion: witherspoon-XXX-XX.X-X # } ${firmware_version}= Redfish Get BMC Version ${bios_version}= Redfish Get Host Version &{sys_firmware_dict}= Create Dictionary Set To Dictionary ... ${sys_firmware_dict} FirmwareVersion ${firmware_version} BiosVersion ${bios_version} Rprint Vars sys_firmware_dict [Return] &{sys_firmware_dict} Switch Backup Firmware Image To Functional [Documentation] Switch the backup firmware image to make functional. ${sw_inv}= Get Functional Firmware BMC image ${nonfunctional_sw_inv}= Get Non Functional Firmware ${sw_inv} False ${firmware_inv_path}= ... Set Variable /redfish/v1/UpdateService/FirmwareInventory/${nonfunctional_sw_inv['image_id']} # Below URI, change to backup image and reset the BMC. Redfish.Patch /redfish/v1/Managers/bmc ... body={'Links': {'ActiveSoftwareImage': {'@odata.id': '${firmware_inv_path}'}}}