xref: /openbmc/openbmc-test-automation/lib/openbmc_ffdc_methods.robot (revision aca557110becf3f4d45391b6f70d0f52f1046f4e)
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