1*** Settings *** 2Documentation Methods to execute commands on BMC and collect 3... data to a list of FFDC files 4 5Resource openbmc_ffdc_utils.robot 6Resource rest_client.robot 7Resource utils.robot 8 9*** Keywords *** 10 11################################################################ 12# Method : Call FFDC Methods # 13# Execute the user define keywords from the FFDC List # 14# Unlike any other keywords this will call into the # 15# list of keywords defined in the FFDC list at one go # 16################################################################ 17 18Call FFDC Methods 19 [Documentation] Calls into FFDC Keyword index list 20 21 @{entries}= Get ffdc method index 22 :FOR ${index} IN @{entries} 23 \ Method Call Keyword List ${index} 24 25 26Method Call Keyword List 27 [Documentation] Iterate the list through keyword index 28 [Arguments] ${index} 29 30 @{method_list}= Get ffdc method call ${index} 31 :FOR ${method} IN @{method_list} 32 \ Execute Keyword Method ${method[1]} 33 34 35Execute Keyword Method 36 [Documentation] Calls into BMC method keywords. Don't let one 37 ... failure skips the remaining. Get whatever data 38 ... it could gather at worse case scenario. 39 [Arguments] ${keyword_name} 40 41 Run Keyword And Continue On Failure ${keyword_name} 42 43 44################################################################ 45# Method : BMC FFDC Manifest # 46# Execute command on BMC and write to ffdc_report.txt # 47################################################################ 48 49BMC FFDC Manifest 50 [Documentation] Get the commands index for the FFDC_BMC_CMD, 51 ... login to BMC and execute commands. 52 Open Connection And Log In 53 54 @{entries}= Get ffdc cmd index 55 :FOR ${index} IN @{entries} 56 \ Iterate BMC Command List Pairs ${index} 57 58 59Iterate BMC Command List Pairs 60 [Documentation] Feed in key pair list from dictionary to execute 61 [Arguments] ${key_index} 62 63 @{cmd_list}= Get ffdc bmc cmd ${key_index} 64 Set Suite Variable ${ENTRY_INDEX} ${key_index} 65 :FOR ${cmd} IN @{cmd_list} 66 \ Execute Command and Write FFDC ${cmd[0]} ${cmd[1]} 67 68 69Execute Command and Write FFDC 70 [Documentation] Execute command on BMC or OS and write to ffdc 71 ... By default to ffdc_report.txt file else to 72 ... specified file path. 73 [Arguments] ${key_index} 74 ... ${cmd} 75 ... ${logpath}=${FFDC_FILE_PATH} 76 77 Run Keyword If '${logpath}' == '${FFDC_FILE_PATH}' 78 ... Write Cmd Output to FFDC File ${key_index} ${cmd} 79 80 ${stdout} ${stderr}= 81 ... Execute Command ${cmd} return_stderr=True 82 83 # Write stdout on success and stderr/stdout to the file on failure. 84 Run Keyword If $stderr == '${EMPTY}' 85 ... Write Data to File ${stdout}${\n} ${logpath} 86 ... ELSE Write Data to File 87 ... ERROR output:${\n}${stderr}${\n}Output:${\n}${stdout}${\n} 88 ... ${logpath} 89 90 91################################################################ 92# Method : BMC FFDC Files # 93# Execute command on BMC and write to individual file # 94# based on the file name pre-defined in the list # 95################################################################ 96 97BMC FFDC Files 98 [Documentation] Get the command list and iterate 99 Open Connection And Log In 100 @{entries}= Get ffdc file index 101 :FOR ${index} IN @{entries} 102 \ Create File and Write Data ${index} 103 104 105Create File and Write Data 106 [Documentation] Create files to current FFDC log directory, 107 ... executes command and write to corresponding 108 ... file name in the current FFDC directory. 109 [Arguments] ${key_index} 110 111 @{cmd_list}= Get ffdc bmc file ${key_index} 112 :FOR ${cmd} IN @{cmd_list} 113 \ ${logpath}= Catenate SEPARATOR= ${LOG_PREFIX} ${cmd[0]}.txt 114 \ Execute Command and Write FFDC ${cmd[0]} ${cmd[1]} ${logpath} 115 116 117################################################################ 118# Method : Log Test Case Status # 119# Creates test result history footprint for reference # 120################################################################ 121 122Log Test Case Status 123 [Documentation] Test case execution result history. 124 ... Create once and append to this file 125 ... logs/test_history.txt 126 ... Format Date:Test suite:Test case:Status 127 ... 20160909214053719992:Test Warmreset:Test WarmReset via REST:FAIL 128 Create Directory ${FFDC_LOG_PATH} 129 130 ${exist}= Run Keyword and Return Status 131 ... OperatingSystem.File Should Exist ${TEST_HISTORY} 132 133 Run Keyword If '${exist}' == '${False}' 134 ... Create File ${TEST_HISTORY} 135 136 ${cur_time}= Get Current Time Stamp 137 138 Append To File ${TEST_HISTORY} 139 ... ${cur_time}:${SUITE_NAME}:${TEST_NAME}:${TEST_STATUS}${\n} 140 141 142Log FFDC Get Requests 143 [Documentation] Create file in current FFDC log directory. 144 ... Do openbmc get request and write to 145 ... corresponding file name. 146 ... JSON pretty print for logging to file. 147 [Arguments] ${key_index} 148 149 @{cmd_list}= Get ffdc get request ${key_index} 150 :FOR ${cmd} IN @{cmd_list} 151 \ ${logpath}= Catenate SEPARATOR= ${LOG_PREFIX} ${cmd[0]}.txt 152 \ ${resp}= OpenBMC Get Request ${cmd[1]} quiet=${1} 153 \ ${status}= Run Keyword and Return Status 154 ... Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 155 \ Run Keyword If '${status}' == '${False}' Continue For Loop 156 \ ${jsondata}= to json ${resp.content} pretty_print=True 157 \ Write Data to File ${\n}${jsondata}${\n} ${logpath} 158 159 160BMC FFDC Get Requests 161 [Documentation] Get the command list and iterate 162 Open Connection And Log In 163 @{entries}= Get ffdc get request index 164 :FOR ${index} IN @{entries} 165 \ Log FFDC Get Requests ${index} 166 167 168Log OS ALL DISTROS FFDC 169 [Documentation] Create file in current FFDC log directory. 170 ... Executes OS command and write to 171 ... corresponding file name. 172 [Arguments] ${key_index} 173 174 @{cmd_list}= get ffdc os all distros call ${key_index} 175 :FOR ${cmd} IN @{cmd_list} 176 \ ${logpath}= Catenate SEPARATOR= ${LOG_PREFIX} ${cmd[0]}.txt 177 \ Execute Command and Write FFDC ${cmd[0]} ${cmd[1]} ${logpath} 178 179 180Log OS SPECIFIC DISTRO FFDC 181 [Documentation] Create file in current FFDC log directory. 182 ... Executes OS command and write to 183 ... corresponding file name. 184 [Arguments] ${key_index} ${linux_distro} 185 186 @{cmd_list}= get ffdc os distro call ${key_index} ${linux_distro} 187 :FOR ${cmd} IN @{cmd_list} 188 \ ${logpath}= Catenate SEPARATOR= ${LOG_PREFIX} ${cmd[0]}.txt 189 \ Execute Command and Write FFDC ${cmd[0]} ${cmd[1]} ${logpath} 190 191 192 193OS FFDC Files 194 [Documentation] Get the command list and iterate 195 [Arguments] ${OS_HOST}=${OS_HOST} ${OS_USERNAME}=${OS_USERNAME} 196 ... ${OS_PASSWORD}=${OS_PASSWORD} 197 198 Return From Keyword If '${OS_HOST}' == '${EMPTY}' 199 ... No OS Host Provided 200 201 # If can't ping, return 202 ${rc}= Run Keyword and Return Status Ping Host ${OS_HOST} 203 Return From Keyword If '${rc}' == '${False}' 204 ... Could not ping OS 205 206 Open Connection And Log In host=${OS_HOST} username=${OS_USERNAME} 207 ... password=${OS_PASSWORD} 208 209 ${output} ${stderr} ${rc}= Execute Command uptime return_stderr=True 210 ... return_rc=True 211 212 # If the return code returned by "Execute Command" is non-zero, return 213 Return From Keyword If '${rc}' != '${0}' 214 ... Could not connect to OS 215 216 @{entries}= Get ffdc os all distros index 217 :FOR ${index} IN @{entries} 218 \ Log OS ALL DISTROS FFDC ${index} 219 220 ${linux_distro}= Execute Command 221 ... . /etc/os-release; echo $ID 222 ... return_stdout=True return_stderr=False return_rc=False 223 224 Return From Keyword If 225 ... '${linux_distro}' == '${EMPTY}' or '${linux_distro}' == 'None' 226 ... Could not determine Linux Distribution 227 228 @{entries}= Get ffdc os distro index ${linux_distro} 229 :FOR ${index} IN @{entries} 230 \ Log OS SPECIFIC DISTRO FFDC ${index} ${linux_distro} 231