xref: /openbmc/openbmc-test-automation/lib/utils.robot (revision 01262bd50b1f107ccf7f26680d9b5a1d15aa48b3)
1*** Settings ***
2Resource                ../lib/resource.txt
3Resource                ../lib/rest_client.robot
4Resource                ../lib/connection_client.robot
5Library                 DateTime
6Library                 Process
7Library                 OperatingSystem
8Library                 gen_print.py
9Library                 gen_robot_print.py
10
11*** Variables ***
12${SYSTEM_SHUTDOWN_TIME}       ${5}
13${dbuscmdBase}
14...  dbus-send --system --print-reply --dest=${OPENBMC_BASE_DBUS}.settings.Host
15${dbuscmdGet}
16...  ${SETTINGS_URI}host0  org.freedesktop.DBus.Properties.Get
17# Enable when ready with openbmc/openbmc-test-automation#203
18#${dbuscmdString}=  string:"xyz.openbmc_project.settings.Host" string:
19${dbuscmdString}=   string:"org.openbmc.settings.Host" string:
20
21# Assign default value to QUIET for programs which may not define it.
22${QUIET}  ${0}
23${bmc_mem_free_cmd}=   free | tr -s ' ' | sed '/^Mem/!d' | cut -d" " -f4
24${bmc_mem_total_cmd}=   free | tr -s ' ' | sed '/^Mem/!d' | cut -d" " -f2
25${bmc_cpu_usage_cmd}=   top -n 1  | grep CPU: | cut -c 7-9
26${HOST_SETTING}    ${SETTINGS_URI}host0
27# /run/initramfs/ro associate filesystem  should be 100% full always
28${bmc_file_system_usage_cmd}=
29...  df -h | grep -v /run/initramfs/ro | cut -c 52-54 | grep 100 | wc -l
30
31${BOOT_TIME}     ${0}
32${BOOT_COUNT}    ${0}
33${devicetree_base}  /sys/firmware/devicetree/base/model
34
35*** Keywords ***
36
37Get BMC System Model
38    [Documentation]  Get the BMC model from the device tree.
39
40    ${bmc_model}  ${stderr}=  Execute Command
41    ...  cat ${devicetree_base} | cut -d " " -f 1  return_stderr=True
42    Should Be Empty  ${stderr}
43    Should Not Be Empty  ${bmc_model}
44    [Return]  ${bmc_model}
45
46Verify BMC System Model
47    [Documentation]  Verify the BMC model with ${OPENBMC_MODEL}.
48    [Arguments]  ${bmc_model}
49
50    ${tmp_bmc_model}=  Fetch From Right  ${OPENBMC_MODEL}  /
51    ${tmp_bmc_model}=  Fetch From Left  ${tmp_bmc_model}  .
52    ${ret}=  Run Keyword And Return Status  Should Contain  ${bmc_model}
53    ...  ${tmp_bmc_model}  ignore_case=True
54    [Return]  ${ret}
55
56Wait For Host To Ping
57    [Arguments]  ${host}  ${timeout}=${OPENBMC_REBOOT_TIMEOUT}min
58    ...          ${interval}=5 sec
59
60    # host      The DNS name or IP of the host to ping.
61    # timeout   The amount of time after which attempts to ping cease.
62    # interval  The amount of time in between attempts to ping.
63
64    Wait Until Keyword Succeeds  ${timeout}  ${interval}  Ping Host  ${host}
65
66Ping Host
67    [Arguments]     ${host}
68    Should Not Be Empty    ${host}   msg=No host provided
69    ${RC}   ${output}=     Run and return RC and Output    ping -c 4 ${host}
70    Log     RC: ${RC}\nOutput:\n${output}
71    Should be equal     ${RC}   ${0}
72
73Get Boot Progress
74    [Arguments]  ${quiet}=${QUIET}
75
76    ${state}=  Read Attribute  ${OPENBMC_BASE_URI}sensors/host/BootProgress
77    ...  value  quiet=${quiet}
78    [Return]  ${state}
79
80Is Power On
81    ${state}=  Get Power State
82    Should be equal  ${state}  ${1}
83
84Is Power Off
85    ${state}=  Get Power State
86    Should be equal  ${state}  ${0}
87
88Initiate Power On
89    [Documentation]  Initiates the power on and waits until the Is Power On
90    ...  keyword returns that the power state has switched to on.
91    [Arguments]  ${wait}=${1}
92
93    @{arglist}=   Create List
94    ${args}=     Create Dictionary    data=@{arglist}
95    ${resp}=  Call Method  ${OPENBMC_BASE_URI}control/chassis0/  powerOn
96    ...  data=${args}
97    should be equal as strings      ${resp.status_code}     ${HTTP_OK}
98
99    # Does caller want to wait for power on status?
100    Run Keyword If  '${wait}' == '${0}'  Return From Keyword
101    Wait Until Keyword Succeeds  3 min  10 sec  Is Power On
102
103Initiate Power Off
104    [Documentation]  Initiates the power off and waits until the Is Power Off
105    ...  keyword returns that the power state has switched to off.
106    @{arglist}=   Create List
107    ${args}=     Create Dictionary    data=@{arglist}
108    ${resp}=  Call Method  ${OPENBMC_BASE_URI}control/chassis0/  powerOff
109    ...  data=${args}
110    should be equal as strings      ${resp.status_code}     ${HTTP_OK}
111    Wait Until Keyword Succeeds  1 min  10 sec  Is Power Off
112
113Initiate OS Host Power Off
114    [Documentation]  Initiate an OS reboot.
115    [Arguments]  ${os_host}=${OS_HOST}  ${os_username}=${OS_USERNAME}
116    ...          ${os_password}=${OS_PASSWORD}
117
118    # Description of arguments:
119    # os_host      The DNS name or IP of the OS.
120    # os_username  The username to be used to sign in to the OS.
121    # os_password  The password to be used to sign in to the OS.
122
123    SSHLibrary.Open connection  ${os_host}
124    Login  ${os_username}  ${os_password}
125    ${cmd_buf}  Catenate  shutdown
126    Start Command  ${cmd_buf}
127    SSHLibrary.Close Connection
128
129Initiate OS Host Reboot
130    [Documentation]  Initiate an OS reboot.
131    [Arguments]  ${os_host}=${OS_HOST}  ${os_username}=${OS_USERNAME}
132    ...          ${os_password}=${OS_PASSWORD}
133
134    # Description of arguments:
135    # os_host      The DNS name or IP of the OS.
136    # os_username  The username to be used to sign in to the OS.
137    # os_password  The password to be used to sign in to the OS.
138
139    SSHLibrary.Open connection  ${os_host}
140    Login  ${os_username}  ${os_password}
141    ${cmd_buf}  Catenate  reboot
142    Start Command  ${cmd_buf}
143    SSHLibrary.Close Connection
144
145Initiate Auto Reboot
146    [Documentation]  Initiate an auto reboot.
147
148    # Set the auto reboot policy.
149    Set Auto Reboot  yes
150
151    SSHLibrary.Open connection  ${openbmc_host}
152    Login  ${openbmc_username}  ${openbmc_password}
153
154    # Set the watchdog timer.  Note: 5000 = milliseconds which is 5 seconds.
155    ${cmd_buf}=  Catenate  /usr/sbin/mapper call /org/openbmc/watchdog/host0
156    ...  org.openbmc.Watchdog set i 5000
157    ${output}  ${stderr}  ${rc}=  Execute Command  ${cmd_buf}
158    ...  return_stderr=True  return_rc=True
159    Should Be Empty  ${stderr}
160    Should be equal  ${rc}  ${0}
161
162    # Start the watchdog.
163    ${cmd_buf}=  Catenate  /usr/sbin/mapper call /org/openbmc/watchdog/host0
164    ...  org.openbmc.Watchdog start
165    ${output}  ${stderr}  ${rc}=  Execute Command  ${cmd_buf}
166    ...  return_stderr=True  return_rc=True
167    Should Be Empty  ${stderr}
168    Should be equal  ${rc}  ${0}
169
170Trigger Warm Reset
171    log to console    "Triggering warm reset"
172    ${data}=   create dictionary   data=@{EMPTY}
173    ${resp}=  openbmc post request
174    ...  ${OPENBMC_BASE_URI}control/bmc0/action/warmReset  data=${data}
175    Should Be Equal As Strings      ${resp.status_code}     ${HTTP_OK}
176    ${session_active}=   Check If warmReset is Initiated
177    Run Keyword If   '${session_active}' == '${True}'
178    ...    Fail   msg=warm reset didn't occur
179
180    Sleep   ${SYSTEM_SHUTDOWN_TIME}min
181    Check If BMC Is Up
182
183Check OS
184    [Documentation]  Attempts to ping the host OS and then checks that the host
185    ...              OS is up by running an SSH command.
186
187    [Arguments]  ${os_host}=${OS_HOST}  ${os_username}=${OS_USERNAME}
188    ...          ${os_password}=${OS_PASSWORD}  ${quiet}=${QUIET}
189    ...          ${print_string}=${EMPTY}
190    [Teardown]  SSHLibrary.Close Connection
191
192    # os_host           The DNS name/IP of the OS host associated with our BMC.
193    # os_username       The username to be used to sign on to the OS host.
194    # os_password       The password to be used to sign on to the OS host.
195    # quiet             Indicates whether this keyword should write to console.
196    # print_string      A string to be printed before checking the OS.
197
198    rprint  ${print_string}
199
200    # Attempt to ping the OS. Store the return code to check later.
201    ${ping_rc}=  Run Keyword and Return Status  Ping Host  ${os_host}
202
203    SSHLibrary.Open connection  ${os_host}
204
205    ${status}  ${msg}=  Run Keyword And Ignore Error  Login  ${os_username}
206    ...  ${os_password}
207    ${err_msg1}=  Sprint Error  ${msg}
208    ${err_msg}=  Catenate  SEPARATOR=  \n  ${err_msg1}
209    Run Keyword If  '${status}' == 'FAIL'  Fail  msg=${err_msg}
210    ${output}  ${stderr}  ${rc}=  Execute Command  uptime  return_stderr=True
211    ...        return_rc=True
212
213    ${temp_msg}=  Catenate  Could not execute a command on the operating
214    ...  system.\n
215    ${err_msg1}=  Sprint Error  ${temp_msg}
216    ${err_msg}=  Catenate  SEPARATOR=  \n  ${err_msg1}
217
218    # If the return code returned by "Execute Command" is non-zero, this
219    # keyword will fail.
220    Should Be Equal  ${rc}  ${0}  msg=${err_msg}
221    # We will likewise fail if there is any stderr data.
222    Should Be Empty  ${stderr}
223
224    ${temp_msg}=  Set Variable  Could not ping the operating system.\n
225    ${err_msg1}=  Sprint Error  ${temp_msg}
226    ${err_msg}=  Catenate  SEPARATOR=  \n  ${err_msg1}
227    # We will likewise fail if the OS did not ping, as we could SSH but not
228    # ping
229    Should Be Equal As Strings  ${ping_rc}  ${TRUE}  msg=${err_msg}
230
231Wait for OS
232    [Documentation]  Waits for the host OS to come up via calls to "Check OS".
233    [Arguments]  ${os_host}=${OS_HOST}  ${os_username}=${OS_USERNAME}
234    ...          ${os_password}=${OS_PASSWORD}  ${timeout}=${OS_WAIT_TIMEOUT}
235    ...          ${quiet}=${0}
236    [Teardown]  rprintn
237
238    # os_host           The DNS name or IP of the OS host associated with our
239    #                   BMC.
240    # os_username       The username to be used to sign on to the OS host.
241    # os_password       The password to be used to sign on to the OS host.
242    # timeout           The timeout in seconds indicating how long you're
243    #                   willing to wait for the OS to respond.
244    # quiet             Indicates whether this keyword should write to console.
245
246    # The interval to be used between calls to "Check OS".
247    ${interval}=  Set Variable  5
248
249    ${message}=  Catenate  Checking every ${interval} seconds for up to
250    ...  ${timeout} seconds for the operating system to communicate.
251    rqprint_timen  ${message}
252
253    Wait Until Keyword Succeeds  ${timeout} sec  ${interval}  Check OS
254    ...                          ${os_host}  ${os_username}  ${os_password}
255    ...                          print_string=\#
256
257    rqprintn
258
259    rqprint_timen  The operating system is now communicating.
260
261Get BMC State Deprecated
262    [Documentation]  Returns the state of the BMC as a string. (i.e: BMC_READY)
263    [Arguments]  ${quiet}=${QUIET}
264
265    @{arglist}=  Create List
266    ${args}=  Create Dictionary  data=@{arglist}
267    ${resp}=  Call Method  ${OPENBMC_BASE_URI}managers/System/  getSystemState
268    ...        data=${args}  quiet=${quiet}
269    Should be equal as strings  ${resp.status_code}  ${HTTP_OK}
270    ${content}=  to json  ${resp.content}
271    [Return]  ${content["data"]}
272
273Get Power State
274    [Documentation]  Returns the power state as an integer. Either 0 or 1.
275    [Arguments]  ${quiet}=${QUIET}
276
277    @{arglist}=  Create List
278    ${args}=  Create Dictionary  data=@{arglist}
279
280    ${resp}=  Call Method  ${OPENBMC_BASE_URI}control/chassis0/  getPowerState
281    ...        data=${args}  quiet=${quiet}
282    Should be equal as strings  ${resp.status_code}  ${HTTP_OK}
283    ${content}=  to json  ${resp.content}
284    [Return]  ${content["data"]}
285
286Clear BMC Record Log
287    [Documentation]  Clears all the event logs on the BMC. This would be
288    ...              equivalent to ipmitool sel clear.
289    @{arglist}=   Create List
290    ${args}=     Create Dictionary    data=@{arglist}
291    ${resp}=  Call Method
292    ...  ${OPENBMC_BASE_URI}records/events/  clear  data=${args}
293    should be equal as strings      ${resp.status_code}     ${HTTP_OK}
294
295Copy PNOR to BMC
296    Import Library      SCPLibrary      WITH NAME       scp
297    Open Connection for SCP
298    Log    Copying ${PNOR_IMAGE_PATH} to /tmp
299    scp.Put File    ${PNOR_IMAGE_PATH}   /tmp
300
301Flash PNOR
302    [Documentation]    Calls flash bios update method to flash PNOR image
303    [Arguments]    ${pnor_image}
304    @{arglist}=   Create List    ${pnor_image}
305    ${args}=     Create Dictionary    data=@{arglist}
306    ${resp}=  Call Method  ${OPENBMC_BASE_URI}control/flash/bios/  update
307    ...  data=${args}
308    should be equal as strings      ${resp.status_code}     ${HTTP_OK}
309    Wait Until Keyword Succeeds    2 min   10 sec    Is PNOR Flashing
310
311Get Flash BIOS Status
312    [Documentation]  Returns the status of the flash BIOS API as a string. For
313    ...              example 'Flashing', 'Flash Done', etc
314    ${data}=      Read Properties     ${OPENBMC_BASE_URI}control/flash/bios
315    [Return]    ${data['status']}
316
317Is PNOR Flashing
318    [Documentation]  Get BIOS 'Flashing' status. This indicates that PNOR
319    ...              flashing has started.
320    ${status}=    Get Flash BIOS Status
321    should be equal as strings     ${status}     Flashing
322
323Is PNOR Flash Done
324    [Documentation]  Get BIOS 'Flash Done' status.  This indicates that the
325    ...              PNOR flashing has completed.
326    ${status}=    Get Flash BIOS Status
327    should be equal as strings     ${status}     Flash Done
328
329Is System State Host Booted
330    [Documentation]  Checks whether system state is HOST_BOOTED.
331    ${state}=    Get BMC State Deprecated
332    should be equal as strings     ${state}     HOST_BOOTED
333
334Is OS Starting
335    [Documentation]  Check if boot progress is OS starting.
336    ${boot_progress}=  Get Boot Progress
337    Should Be Equal  ${boot_progress}  FW Progress, Starting OS
338
339Is OS Off
340    [Documentation]  Check if boot progress is "Off".
341    ${boot_progress}=  Get Boot Progress
342    Should Be Equal  ${boot_progress}  Off
343
344Verify Ping and REST Authentication
345    ${l_ping}=   Run Keyword And Return Status
346    ...    Ping Host  ${OPENBMC_HOST}
347    Run Keyword If  '${l_ping}' == '${False}'
348    ...    Fail   msg=Ping Failed
349
350    ${l_rest}=   Run Keyword And Return Status
351    ...    Initialize OpenBMC
352    Run Keyword If  '${l_rest}' == '${False}'
353    ...    Fail   msg=REST Authentication Failed
354
355    # Just to make sure the SSH is working for SCP
356    Open Connection And Log In
357    ${system}   ${stderr}=    Execute Command   hostname   return_stderr=True
358    Should Be Empty     ${stderr}
359
360Check If BMC is Up
361    [Documentation]  Wait for Host to be online. Checks every X seconds
362    ...              interval for Y minutes and fails if timed out.
363    ...              Default MAX timedout is 10 min, interval 10 seconds.
364    [Arguments]      ${max_timeout}=${OPENBMC_REBOOT_TIMEOUT} min
365    ...              ${interval}=10 sec
366
367    Wait Until Keyword Succeeds
368    ...   ${max_timeout}  ${interval}   Verify Ping and REST Authentication
369
370
371Check If warmReset is Initiated
372    [Documentation]  Ping would be still alive, so try SSH to connect
373    ...              if fails the ports are down indicating reboot
374    ...              is in progress
375
376    # Warm reset adds 3 seconds delay before forcing reboot
377    # To minimize race conditions, we wait for 7 seconds
378    Sleep  7s
379    ${alive}=   Run Keyword and Return Status
380    ...    Open Connection And Log In
381    Return From Keyword If   '${alive}' == '${False}'    ${False}
382    [Return]    ${True}
383
384Flush REST Sessions
385    [Documentation]   Removes all the active session objects
386    Delete All Sessions
387
388Initialize DBUS cmd
389    [Documentation]  Initialize dbus string with property string to extract
390    [Arguments]   ${boot_property}
391    ${cmd}=     Catenate  ${dbuscmdBase} ${dbuscmdGet} ${dbuscmdString}
392    ${cmd}=     Catenate  ${cmd}${boot_property}
393    Set Global Variable   ${dbuscmd}     ${cmd}
394
395Create OS Console File Path
396    [Documentation]  Create OS console file path name and return it.
397    [Arguments]  ${log_file_path}=${EMPTY}
398
399    # Description of arguements:
400    # file_path  The caller's candidate value.  If this value is ${EMPTY}, this
401    #            keyword will compose a file path name.  Otherwise, this
402    #            keyword will use the caller's file_path value.  In either
403    #            case, the value will be returned.
404
405    ${default_file_path}=  Catenate  /tmp/${OPENBMC_HOST}_os_console
406    ${log_file_path}=  Set Variable If  '${log_file_path}' == '${EMPTY}'
407    ...  ${default_file_path}  ${log_file_path}
408
409    [Return]  ${log_file_path}
410
411Create OS Console Command String
412    [Documentation]  Return a command string to start OS console logging.
413
414    # First make sure that the ssh_pw program is available.
415    ${cmd_buf}=  Catenate  which ssh_pw 2>&1
416    Rdpissuing  ${cmd_buf}
417    ${rc}  ${output}=  Run And Return Rc And Output  ${cmd_buf}
418    Rdpvars  rc  output
419    Should Be Equal  ${rc}  ${0}  msg=${output}\n
420
421    ${cmd_buf}=  Catenate  ssh_pw ${OPENBMC_PASSWORD} -p 2200
422    ...  ${OPENBMC_USERNAME}@${OPENBMC_HOST}
423
424    [Return]  ${cmd_buf}
425
426Stop SOL Console Logging
427    [Documentation]  Stop system console logging and return log output.
428    [Arguments]  ${log_file_path}=${EMPTY}  ${targ_file_path}=${EMPTY}
429
430    # If there are muliple system console processes, they will all be stopped.
431    # If there is no existing log file this keyword will return an error
432    # message to that effect (and write that message to targ_file_path, if
433    # specified).
434    # NOTE: This keyword will not fail if there is no running system console
435    # process.
436
437    # Description of arguments:
438    # log_file_path   The file path that was used to call "Start SOL
439    #                 Console Logging".  See that keyword (above) for details.
440    # targ_file_path  If specified, the file path to which the source
441    #                 file path (i.e. "log_file_path") should be copied.
442
443    ${log_file_path}=  Create OS Console File Path  ${log_file_path}
444    # Find the pid of the active system console logging session (if any).
445    ${search_string}=  Create OS Console Command String
446    ${cmd_buf}=  Catenate  echo $(ps -ef | egrep '${search_string}'
447    ...  | egrep -v grep | cut -c10-14)
448    Rdpissuing  ${cmd_buf}
449    ${rc}  ${os_con_pid}=  Run And Return Rc And Output  ${cmd_buf}
450    Rdpvars  os_con_pid
451    # If rc is not zero it just means that there is no OS Console process
452    # running.
453
454    ${cmd_buf}=  Catenate  kill -9 ${os_con_pid}
455    Run Keyword If  '${os_con_pid}' != '${EMPTY}'  Rdpissuing  ${cmd_buf}
456    ${rc}  ${output}=  Run Keyword If  '${os_con_pid}' != '${EMPTY}'
457    ...  Run And Return Rc And Output  ${cmd_buf}
458    Run Keyword If  '${os_con_pid}' != '${EMPTY}'  Rdpvars  rc  output
459
460    ${cmd_buf}=  Set Variable  cat ${log_file_path} 2>&1
461    Rdpissuing  ${cmd_buf}
462    ${rc}  ${output}=  Run And Return Rc And Output  ${cmd_buf}
463    Rdpvars  rc
464
465    Run Keyword If  '${targ_file_path}' != '${EMPTY}'
466    ...  Run Keyword And Ignore Error
467    ...  Copy File  ${log_file_path}  ${targ_file_path}
468
469    [Return]  ${output}
470
471Start SOL Console Logging
472    [Documentation]  Start system console log to file.
473    [Arguments]  ${log_file_path}=${EMPTY}
474
475    # This keyword will first call "Stop SOL Console Logging".  Only then will
476    # it start SOL console logging.  The data returned by "Stop SOL Console
477    # Logging" will in turn be returned by this keyword.
478
479    # Description of arguments:
480    # log_file_path  The file path to which system console log data should be
481    #                written.  Note that this path is taken to be a location on
482    #                the machine where this program is running rather than on
483    #                the Open BMC system.
484
485    ${log_file_path}=  Create OS Console File Path  ${log_file_path}
486
487    ${log_output}=  Stop SOL Console Logging  ${log_file_path}
488
489    # Validate by making sure we can create the file.  Problems creating the
490    # file would not be noticed by the subsequent ssh command because we fork
491    # the command.
492    Create File  ${log_file_path}
493    ${sub_cmd_buf}=  Create OS Console Command String
494    # Routing stderr to stdout so that any startup error text will go to the
495    # output file.
496    ${cmd_buf}=  Catenate  ${sub_cmd_buf} > ${log_file_path} 2>&1 &
497    Rdpissuing  ${cmd_buf}
498    ${rc}  ${output}=  Run And Return Rc And Output  ${cmd_buf}
499    # Because we are forking this command, we essentially will never get a
500    # non-zero return code or any output.
501    Should Be Equal  ${rc}  ${0}
502
503    [Return]  ${log_output}
504
505Get Time Stamp
506    [Documentation]     Get the current time stamp data
507    ${cur_time}=    Get Current Date   result_format=%Y%m%d%H%M%S%f
508    [Return]   ${cur_time}
509
510
511Verify BMC State
512    [Documentation]   Get the BMC state and verify if the current
513    ...               BMC state is as expected.
514    [Arguments]       ${expected}
515
516    ${current}=  Get BMC State Deprecated
517    Should Contain  ${expected}   ${current}
518
519Start Journal Log
520    [Documentation]   Start capturing journal log to a file in /tmp using
521    ...               journalctl command. By default journal log is collected
522    ...               at /tmp/journal_log else user input location.
523    ...               The File is appended with datetime.
524    [Arguments]       ${file_path}=/tmp/journal_log
525
526    Open Connection And Log In
527
528    ${cur_time}=    Get Time Stamp
529    Set Global Variable   ${LOG_TIME}   ${cur_time}
530    Start Command
531    ...  journalctl -f > ${file_path}-${LOG_TIME}
532    Log    Journal Log Started: ${file_path}-${LOG_TIME}
533
534
535Stop Journal Log
536    [Documentation]   Stop journalctl process if its running.
537    ...               By default return log from /tmp/journal_log else
538    ...               user input location.
539    [Arguments]       ${file_path}=/tmp/journal_log
540
541    Open Connection And Log In
542
543    ${rc}=
544    ...  Execute Command
545    ...  ps ax | grep journalctl | grep -v grep
546    ...  return_stdout=False  return_rc=True
547
548    Return From Keyword If   '${rc}' == '${1}'
549    ...   No journal log process running
550
551    ${output}  ${stderr}=
552    ...  Execute Command   killall journalctl
553    ...  return_stderr=True
554    Should Be Empty     ${stderr}
555
556    ${journal_log}  ${stderr}=
557    ...  Execute Command
558    ...  cat ${file_path}-${LOG_TIME}
559    ...  return_stderr=True
560    Should Be Empty     ${stderr}
561
562    Log    ${journal_log}
563
564    Execute Command    rm ${file_path}-${LOG_TIME}
565
566    [Return]    ${journal_log}
567
568Mac Address To Hex String
569    [Documentation]   Converts MAC address into hex format.
570    ...               Example
571    ...               Given the following MAC: 00:01:6C:80:02:78
572    ...               This keyword will return: 0x00 0x01 0x6C 0x80 0x02 0x78
573    ...               Description of arguments:
574    ...               i_macaddress  MAC address in the following format
575    ...               00:01:6C:80:02:78
576    [Arguments]    ${i_macaddress}
577
578    ${mac_hex}=  Catenate  0x${i_macaddress.replace(':', ' 0x')}
579    [Return]    ${mac_hex}
580
581IP Address To Hex String
582    [Documentation]   Converts IP address into hex format.
583    ...               Example:
584    ...               Given the following IP: 10.3.164.100
585    ...               This keyword will return: 0xa 0x3 0xa4 0xa0
586    ...               Description of arguments:
587    ...               i_ipaddress  IP address in the following format
588    ...               10.10.10.10
589    [Arguments]    ${i_ipaddress}
590
591    @{ip}=  Split String  ${i_ipaddress}    .
592    ${index}=  Set Variable  ${0}
593
594    :FOR    ${item}     IN      @{ip}
595    \   ${hex}=  Convert To Hex    ${item}    prefix=0x    lowercase=yes
596    \   Set List Value    ${ip}    ${index}    ${hex}
597    \   ${index}=  Set Variable    ${index + 1}
598    ${ip_hex}=  Catenate    @{ip}
599    [Return]    ${ip_hex}
600
601BMC CPU Performance Check
602   [Documentation]   Minimal 10% of proc should be free in this instance
603
604    ${bmc_cpu_usage_output}  ${stderr}=  Execute Command  ${bmc_cpu_usage_cmd}
605    ...                   return_stderr=True
606    Should be empty  ${stderr}
607    ${bmc_cpu_percentage}=  Fetch From Left  ${bmc_cpu_usage_output}  %
608    Should be true  ${bmc_cpu_percentage} < 90
609
610BMC Mem Performance Check
611    [Documentation]   Minimal 10% of memory should be free in this instance
612
613    ${bmc_mem_free_output}  ${stderr}=   Execute Command  ${bmc_mem_free_cmd}
614    ...                   return_stderr=True
615    Should be empty  ${stderr}
616
617    ${bmc_mem_total_output}  ${stderr}=   Execute Command  ${bmc_mem_total_cmd}
618    ...                   return_stderr=True
619    Should be empty  ${stderr}
620
621    ${bmc_mem_percentage}=   Evaluate  ${bmc_mem_free_output}*100
622    ${bmc_mem_percentage}=  Evaluate
623    ...   ${bmc_mem_percentage}/${bmc_mem_total_output}
624    Should be true  ${bmc_mem_percentage} > 10
625
626BMC File System Usage Check
627    [Documentation]   Check the file system space. None should be 100% full
628    ...   except /run/initramfs/ro
629    ${bmc_fs_usage_output}  ${stderr}=   Execute Command
630    ...   ${bmc_file_system_usage_cmd}  return_stderr=True
631    Should Be Empty  ${stderr}
632    Should Be True  ${bmc_fs_usage_output}==0
633
634Check BMC CPU Performance
635    [Documentation]   Minimal 10% of proc should be free in 3 sample
636    :FOR  ${var}  IN Range  1  4
637    \     BMC CPU Performance check
638
639Check BMC Mem Performance
640    [Documentation]   Minimal 10% of memory should be free
641
642    :FOR  ${var}  IN Range  1  4
643    \     BMC Mem Performance check
644
645Check BMC File System Performance
646    [Documentation]  Check for file system usage for 4 times
647
648    :FOR  ${var}  IN Range  1  4
649    \     BMC File System Usage check
650
651Get Endpoint Paths
652    [Documentation]   Returns all url paths ending with given endpoint
653    ...               Example:
654    ...               Given the following endpoint: cpu
655    ...               This keyword will return: list of all urls ending with
656    ...               cpu -
657    ...               /org/openbmc/inventory/system/chassis/motherboard/cpu0,
658    ...               /org/openbmc/inventory/system/chassis/motherboard/cpu1
659    ...               Description of arguments:
660    ...               path       URL path for enumeration
661    ...               endpoint   string for which url path ending
662    [Arguments]   ${path}   ${endpoint}
663
664    ${resp}=   Read Properties   ${path}/enumerate   timeout=30
665    log Dictionary   ${resp}
666
667    ${list}=   Get Dictionary Keys   ${resp}
668    ${resp}=   Get Matches   ${list}   regexp=^.*[0-9a-z_].${endpoint}[0-9]*$
669    [Return]   ${resp}
670
671Check Zombie Process
672    [Documentation]    Check if any defunct process exist or not on BMC
673    ${count}  ${stderr}  ${rc}=  Execute Command  ps -o stat | grep Z | wc -l
674    ...    return_stderr=True  return_rc=True
675    Should Be True    ${count}==0
676    Should Be Empty    ${stderr}
677
678Prune Journal Log
679    [Documentation]   Prune archived journal logs.
680    [Arguments]   ${vacuum_size}=1M
681
682    # This keyword can be used to prevent the journal
683    # log from filling up the /run filesystem.
684    # This command will retain only the latest logs
685    # of the user specified size.
686
687    Open Connection And Log In
688    ${output}  ${stderr}  ${rc}=
689    ...  Execute Command
690    ...  journalctl --vacuum-size=${vacuum_size}
691    ...  return_stderr=True  return_rc=True
692
693    Should Be Equal  ${rc}  ${0}  msg=${stderr}
694
695Set BMC Power Policy
696    [Documentation]   Set the given BMC power policy.
697    [arguments]   ${policy}
698
699    ${valueDict}=     create dictionary  data=${policy}
700    Write Attribute    ${HOST_SETTING}    power_policy   data=${valueDict}
701    ${currentPolicy}=  Read Attribute     ${HOST_SETTING}   power_policy
702    Should Be Equal    ${currentPolicy}   ${policy}
703
704Get System Power Policy
705    [Documentation]  Get the BMC power policy.
706    ${currentPolicy}=  Read Attribute  ${HOST_SETTING}  power_policy
707    [Return]  ${currentPolicy}
708
709Get Auto Reboot
710    [Documentation]  Returns auto reboot setting.
711    ${setting}=  Read Attribute  ${HOST_SETTING}  auto_reboot
712    [Return]  ${setting}
713
714
715Set Auto Reboot
716    [Documentation]  Set the given auto reboot setting.
717    [Arguments]  ${setting}
718    # setting  auto reboot's setting, i.e. yes or no
719
720    ${valueDict}=  Set Variable  ${setting}
721    ${data}=  Create Dictionary  data=${valueDict}
722    Write Attribute  ${HOST_SETTING}  auto_reboot  data=${data}
723    ${current_setting}=  Get Auto Reboot
724    Should Be Equal  ${current_setting}  ${setting}
725
726
727Set BMC Reset Reference Time
728    [Documentation]  Set current boot time as a reference and increment
729    ...              boot count.
730
731    ${cur_btime}=  Get BMC Boot Time
732    Run Keyword If  ${BOOT_TIME} == ${0} and ${BOOT_COUNT} == ${0}
733    ...  Set Global Variable  ${BOOT_TIME}  ${cur_btime}
734    ...  ELSE IF  ${cur_btime} > ${BOOT_TIME}
735    ...  Run Keywords  Set Global Variable  ${BOOT_TIME}  ${cur_btime}
736    ...  AND
737    ...  Set Global Variable  ${BOOT_COUNT}  ${BOOT_COUNT + 1}
738
739Get BMC Boot Time
740    [Documentation]  Get boot time from /proc/stat.
741
742    Open Connection And Log In
743    ${output}  ${stderr}=
744    ...  Execute Command  egrep '^btime ' /proc/stat | cut -f 2 -d ' '
745    ...  return_stderr=True
746    Should Be Empty  ${stderr}
747    ${btime}=  Convert To Integer  ${output}
748    [Return]  ${btime}
749
750Execute Command On BMC
751    [Documentation]  Execute given command on BMC and return output.
752    [Arguments]  ${command}
753    ${stdout}  ${stderr}=  Execute Command  ${command}  return_stderr=True
754    Should Be Empty  ${stderr}
755    [Return]  ${stdout}
756
757Enable Core Dump On BMC
758    [Documentation]  Enable core dump collection.
759    Open Connection And Log In
760    ${core_pattern}=  Execute Command On BMC
761    ...  echo '/tmp/core_%e.%p' | tee /proc/sys/kernel/core_pattern
762    Should Be Equal As Strings  ${core_pattern}  /tmp/core_%e.%p
763
764Get Number Of BMC Core Dump Files
765    [Documentation]  Get number of core dump files on BMC.
766    Open Connection And Log In
767    ${num_of_core_dump}=  Execute Command
768    ...  ls /tmp/core* 2>/dev/null | wc -l
769    [Return]  ${num_of_core_dump}
770
771Set Core Dump File Size Unlimited
772    [Documentation]  Set core dump file size to unlimited.
773    Open Connection And Log In
774    Execute Command On BMC
775    ...  ulimit -c unlimited
776
777Check For Core Dumps
778    [Documentation]  Check for any core dumps exist.
779    ${output}=  Get Number Of BMC Core Dump Files
780    Run Keyword If  ${output} > 0
781    ...  Log  **Warning** BMC core dump files exist  level=WARN
782
783Trigger Host Watchdog Error
784    [Documentation]  Inject host watchdog error using BMC.
785    [Arguments]  ${milliseconds}=1000  ${sleep_time}=5s
786    # Description of arguments:
787    # milliseconds  The time watchdog timer value in milliseconds (e.g. 1000 = 1 second).
788    # sleep_time    Time delay for host watchdog error to get injected.
789    #               Default is 5 seconds.
790
791    Execute Command On BMC
792    ...  /usr/sbin/mapper call /org/openbmc/watchdog/host0 org.openbmc.Watchdog set i ${milliseconds}
793    Execute Command On BMC
794    ...  /usr/sbin/mapper call /org/openbmc/watchdog/host0 org.openbmc.Watchdog start
795    Sleep  ${sleep_time}
796
797Login To OS Host
798    [Documentation]  Login to OS Host.
799    [Arguments]  ${os_host}=${OS_HOST}  ${os_username}=${OS_USERNAME}
800    ...          ${os_password}=${OS_PASSWORD}
801    # Desription of arguments:
802    # ${os_host} IP address of the OS Host.
803    # ${os_username}  OS Host Login user name.
804    # ${os_password}  OS Host Login passwrd.
805
806    ${os_state}=  Run Keyword And Return Status  Ping Host  ${os_host}
807    Run Keyword If  '${os_state}' == 'False'
808    ...  Run Keywords  Initiate Host Reboot  AND
809    ...  Is Host Running  AND
810    ...  Wait for OS  ${os_host}  ${os_username}  ${os_password}
811
812    Open Connection  ${os_host}
813    Login  ${os_username}  ${os_password}
814
815Configure Initial Settings
816    [Documentation]  Restore old IP and route.
817    ...  This keyword requires initial settings viz IP address,
818    ...  Network Mask, default gatway and serial console IP and port
819    ...  information which should be provided in command line.
820
821    [Arguments]  ${host}=${OPENBMC_HOST}  ${mask}=${NET_MASK}  ${gw_ip}=${GW_IP}
822
823    # Open telnet connection and ignore the error, in case telnet session is already
824    # opened by the program calling this keyword.
825
826    Run Keyword And Ignore Error  Open Telnet Connection to BMC Serial Console
827    Telnet.write  ifconfig eth0 ${host} netmask ${mask}
828    Telnet.write  route add default gw ${gw_ip}
829