1*** Settings *** 2Documentation Redfish BMC and PNOR software utilities keywords. 3 4Library code_update_utils.py 5Library gen_robot_valid.py 6Library tftp_update_utils.py 7Resource bmc_redfish_utils.robot 8Resource boot_utils.robot 9 10*** Keywords *** 11 12Get Software Functional State 13 [Documentation] Return functional or active state of the software (i.e. True/False). 14 [Arguments] ${image_id} 15 16 # Description of argument(s): 17 # image_id The image ID (e.g. "acc9e073"). 18 19 ${image_info}= Redfish.Get Properties /redfish/v1/UpdateService/FirmwareInventory/${image_id} 20 21 ${sw_functional}= Run Keyword If 22 ... '${image_info["Description"]}' == 'BMC image' or '${image_info["Description"]}' == 'BMC update' 23 ... Redfish.Get Attribute /redfish/v1/Managers/bmc FirmwareVersion 24 ... ELSE 25 ... Redfish.Get Attribute /redfish/v1/Systems/system BiosVersion 26 27 ${functional}= Run Keyword And Return Status 28 ... Should Be Equal ${sw_functional} ${image_info["Version"]} 29 30 [Return] ${functional} 31 32 33Get Software Inventory State 34 [Documentation] Return dictionary of the image type, version and functional state 35 ... of the software objects active on the system. 36 37 # User defined state for software objects. 38 # Note: "Functional" term refers to firmware which system is currently booted with. 39 # sw_inv_dict: 40 # [ace821ef]: 41 # [image_type]: Host update 42 # [image_id]: ace821ef 43 # [functional]: True 44 # [version]: witherspoon-xx.xx.xx.xx 45 # [b9101858]: 46 # [image_type]: BMC update 47 # [image_id]: b9101858 48 # [functional]: True 49 # [version]: 2.8.0-dev-150-g04508dc9f 50 # [c45eafa5]: 51 # [image_type]: BMC update 52 # [image_id]: c45eafa5 53 # [functional]: False 54 # [version]: 2.8.0-dev-149-g1a8df5077 55 56 ${sw_member_list}= Redfish_Utils.Get Member List /redfish/v1/UpdateService/FirmwareInventory 57 &{sw_inv_dict}= Create Dictionary 58 59 # sw_member_list: 60 # [0]: /redfish/v1/UpdateService/FirmwareInventory/98744d76 61 # [1]: /redfish/v1/UpdateService/FirmwareInventory/9a8028ec 62 # [2]: /redfish/v1/UpdateService/FirmwareInventory/acc9e073 63 64 FOR ${uri_path} IN @{sw_member_list} 65 &{tmp_dict}= Create Dictionary 66 ${image_info}= Redfish.Get Properties ${uri_path} 67 Set To Dictionary ${tmp_dict} image_type ${image_info["Description"]} 68 Set To Dictionary ${tmp_dict} image_id ${uri_path.split("/")[-1]} 69 ${functional}= Get Software Functional State ${uri_path.split("/")[-1]} 70 Set To Dictionary ${tmp_dict} functional ${functional} 71 Set To Dictionary ${tmp_dict} version ${image_info["Version"]} 72 Set To Dictionary ${sw_inv_dict} ${uri_path.split("/")[-1]} ${tmp_dict} 73 END 74 75 [Return] &{sw_inv_dict} 76 77 78Get Software Inventory State By Version 79 [Documentation] Return the software inventory record that matches the given software version. 80 [Arguments] ${software_version} 81 82 # If no matchine record can be found, return ${EMPTY}. 83 84 # Example of returned data: 85 # software_inventory_record: 86 # [image_type]: BMC update 87 # [image_id]: 1e662ba8 88 # [functional]: True 89 # [version]: 2.8.0-dev-150-g04508dc9f 90 91 # Description of argument(s): 92 # software_version A BMC or Host version (e.g "2.8.0-dev-150-g04508dc9f"). 93 94 ${software_inventory}= Get Software Inventory State 95 # Filter out entries that don't match the criterion.. 96 ${software_inventory}= Filter Struct ${software_inventory} [('version', '${software_version}')] 97 # Convert from dictionary to list. 98 ${software_inventory}= Get Dictionary Values ${software_inventory} 99 ${num_records}= Get Length ${software_inventory} 100 101 Return From Keyword If ${num_records} == ${0} ${EMPTY} 102 103 # Return the first list entry. 104 [Return] ${software_inventory}[0] 105 106 107Get BMC Functional Firmware 108 [Documentation] Get BMC functional firmware details. 109 110 ${sw_inv}= Get Functional Firmware BMC update 111 ${sw_inv}= Get Non Functional Firmware ${sw_inv} True 112 113 [Return] ${sw_inv} 114 115 116Get Functional Firmware 117 [Documentation] Get all the BMC firmware details. 118 [Arguments] ${image_type} 119 120 # Description of argument(s): 121 # image_type Image value can be either BMC update or Host update. 122 123 ${software_inventory}= Get Software Inventory State 124 ${bmc_inv}= Get BMC Firmware ${image_type} ${software_inventory} 125 126 [Return] ${bmc_inv} 127 128 129Get Non Functional Firmware 130 [Documentation] Get BMC non functional firmware details. 131 [Arguments] ${sw_inv} ${functional_state} 132 133 # Description of argument(s): 134 # sw_inv This dictionary contains all the BMC firmware details. 135 # functional_state Functional state can be either True or False. 136 137 ${resp}= Filter Struct ${sw_inv} [('functional', ${functional_state})] 138 139 ${num_records}= Get Length ${resp} 140 Set Global Variable ${num_records} 141 Return From Keyword If ${num_records} == ${0} ${EMPTY} 142 143 ${list_inv_dict}= Get Dictionary Values ${resp} 144 145 [Return] ${list_inv_dict}[0] 146 147 148Get Non Functional Firmware List 149 [Documentation] Get BMC non functional firmware details. 150 [Arguments] ${sw_inv} ${functional_state} 151 152 # Description of argument(s): 153 # sw_inv This dictionary contains all the BMC firmware details. 154 # functional_state Functional state can be either True or False. 155 156 ${list_inv}= Create List 157 158 FOR ${key} IN @{sw_inv.keys()} 159 Run Keyword If '${sw_inv['${key}']['functional']}' == '${functional_state}' 160 ... Append To List ${list_inv} ${sw_inv['${key}']} 161 END 162 163 [Return] ${list_inv} 164 165 166Redfish Upload Image And Check Progress State 167 [Documentation] Code update with ApplyTime. 168 169 Log To Console Start uploading image to BMC. 170 Redfish Upload Image ${REDFISH_BASE_URI}UpdateService ${IMAGE_FILE_PATH} 171 Log To Console Completed image upload to BMC. 172 173 ${image_id}= Get Latest Image ID 174 Rprint Vars image_id 175 176 # We have noticed firmware inventory state Enabled quickly as soon the image 177 # is uploaded via redfish. 178 Wait Until Keyword Succeeds 2 min 05 sec 179 ... Check Image Update Progress State match_state='Disabled', 'Updating', 'Enabled' image_id=${image_id} 180 181 Wait Until Keyword Succeeds 8 min 10 sec 182 ... Check Image Update Progress State 183 ... match_state='Enabled' image_id=${image_id} 184 185 186Get Host Power State 187 [Documentation] Get host power state. 188 [Arguments] ${quiet}=0 189 190 # Description of arguments: 191 # quiet Indicates whether results should be printed. 192 193 ${state}= Redfish.Get Attribute 194 ... ${REDFISH_BASE_URI}Systems/system PowerState 195 Rqprint Vars state 196 197 [Return] ${state} 198 199 200Check Host Power State 201 [Documentation] Check that the machine's host state matches 202 ... the caller's required host state. 203 [Arguments] ${match_state} 204 205 # Description of argument(s): 206 # match_state The expected state. This may be one or more 207 # comma-separated values (e.g. "On", "Off"). 208 # If the actual state matches any of the 209 # states named in this argument, 210 # this keyword passes. 211 212 ${state}= Get Host Power State 213 Rvalid Value state valid_values=[${match_state}] 214 215 216Get System Firmware Details 217 [Documentation] Return dictionary of system firmware details. 218 219 # { 220 # FirmwareVersion: 2.8.0-dev-1067-gdc66ce1c5, 221 # BiosVersion: witherspoon-XXX-XX.X-X 222 # } 223 224 ${firmware_version}= Redfish Get BMC Version 225 ${bios_version}= Redfish Get Host Version 226 227 &{sys_firmware_dict}= Create Dictionary 228 Set To Dictionary 229 ... ${sys_firmware_dict} FirmwareVersion ${firmware_version} BiosVersion ${bios_version} 230 Rprint Vars sys_firmware_dict 231 232 [Return] &{sys_firmware_dict} 233 234 235Switch Backup Firmware Image To Functional 236 [Documentation] Switch the backup firmware image to make functional. 237 238 ${sw_inv}= Get Functional Firmware BMC image 239 ${nonfunctional_sw_inv}= Get Non Functional Firmware ${sw_inv} False 240 241 ${firmware_inv_path}= 242 ... Set Variable /redfish/v1/UpdateService/FirmwareInventory/${nonfunctional_sw_inv['image_id']} 243 244 # Below URI, change to backup image and reset the BMC. 245 Redfish.Patch /redfish/v1/Managers/bmc 246 ... body={'Links': {'ActiveSoftwareImage': {'@odata.id': '${firmware_inv_path}'}}} 247 248