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
7
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 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 data on success and error msg to the file on failure
84    Run Keyword If   '${stderr}' == '${EMPTY}'
85    ...   Write Data to File   ${stdout}${\n}   ${logpath}
86    ...   ELSE   Run Keyword   Write Data to File   ${stderr}${\n}   ${logpath}
87
88
89################################################################
90# Method : BMC FFDC Files                                      #
91#          Execute command on BMC and write to individual file #
92#          based on the file name pre-defined in the list      #
93################################################################
94
95BMC FFDC Files
96    [Documentation]    Get the command list and iterate
97    Open Connection And Log In
98    @{entries}=     Get ffdc file index
99    :FOR  ${index}  IN   @{entries}
100    \     Create File and Write Data   ${index}
101
102
103Create File and Write Data
104    [Documentation]    Create files to current FFDC log directory,
105    ...                executes command and write to corresponding
106    ...                file name in the current FFDC directory.
107    [Arguments]        ${key_index}
108
109    @{cmd_list}=      Get ffdc bmc file   ${key_index}
110    :FOR  ${cmd}  IN  @{cmd_list}
111    \   ${logpath}=  Catenate  SEPARATOR=   ${LOG_PREFIX}   ${cmd[0]}
112    \   Execute Command and Write FFDC  ${cmd[0]}  ${cmd[1]}   ${logpath}
113
114
115################################################################
116# Method : Log Test Case Status                                #
117#          Creates test result history footprint for reference #
118################################################################
119
120Log Test Case Status
121    [Documentation]    Test case execution result history.
122    ...                Create once and append to this file
123    ...                logs/test_history.txt
124    ...                Format   Date:Test suite:Test case:Status
125    ...                20160909214053719992:Test Warmreset:Test WarmReset via REST:FAIL
126    Create Directory   ${FFDC_LOG_PATH}
127
128    ${exist}=   Run Keyword and Return Status
129    ...   OperatingSystem.File Should Exist   ${TEST_HISTORY}
130
131    Run Keyword If  '${exist}' == '${False}'
132    ...   Create File  ${TEST_HISTORY}
133
134    ${cur_time}=      Get Current Time Stamp
135
136    Append To File    ${TEST_HISTORY}
137    ...   ${cur_time}:${SUITE_NAME}:${TEST_NAME}:${TEST_STATUS}${\n}
138
139
140Log FFDC Get Requests
141    [Documentation]    Create file in current FFDC log directory.
142    ...                Do openbmc get request and write to
143    ...                corresponding file name.
144    ...                JSON pretty print for logging to file.
145    [Arguments]        ${key_index}
146
147    @{cmd_list}=  Get ffdc get request  ${key_index}
148    :FOR  ${cmd}  IN  @{cmd_list}
149    \   ${logpath}=  Catenate  SEPARATOR=  ${LOG_PREFIX}  ${cmd[0]}
150    \   ${resp}=  OpenBMC Get Request  ${cmd[1]}
151    \   ${status}=    Run Keyword and Return Status
152    ...   Should Be Equal As Strings    ${resp.status_code}    ${HTTP_OK}
153    \   Run Keyword If   '${status}' == '${False}'  Continue For Loop
154    \   ${jsondata}=  to json  ${resp.content}    pretty_print=True
155    \   Write Data to File  ${\n}${jsondata}${\n}  ${logpath}
156
157
158BMC FFDC Get Requests
159    [Documentation]    Get the command list and iterate
160    Open Connection And Log In
161    @{entries}=  Get ffdc get request index
162    :FOR  ${index}  IN  @{entries}
163    \   Log FFDC Get Requests   ${index}
164
165
166Log OS FFDC
167    [Documentation]    Create file in current FFDC log directory.
168    ...                Executes OS command and write to
169    ...                corresponding file name.
170    [Arguments]        ${key_index}
171
172    Open Connection And Log In  host=${OS_HOST}  username=${OS_USERNAME}
173    ...   password=${OS_PASSWORD}
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]}
177    \   Execute Command and Write FFDC  ${cmd[0]}  ${cmd[1]}   ${logpath}
178
179
180OS FFDC Files
181    [Documentation]    Get the command list and iterate
182
183    Return From Keyword If  '${OS_HOST}' == '${EMPTY}'
184    ...   No OS Host Provided
185    @{entries}=  Get ffdc os all distros index
186    :FOR  ${index}  IN  @{entries}
187    \   Log OS FFDC  ${index}
188