1*** Settings ***
2
3Documentation  Utilities for Robot keywords.
4
5Resource                ../lib/resource.txt
6Resource                ../lib/rest_client.robot
7Resource                ../lib/connection_client.robot
8Library                 String
9Library                 DateTime
10Library                 Process
11Library                 OperatingSystem
12Library                 gen_print.py
13Library                 gen_robot_print.py
14Library                 gen_cmd.py
15Library                 gen_robot_keyword.py
16Library                 bmc_ssh_utils.py
17Library                 utils.py
18Library                 var_funcs.py
19Library                 SCPLibrary  WITH NAME  scp
20
21*** Variables ***
22
23${pflash_cmd}             /usr/sbin/pflash -r /dev/stdout -P VERSION
24${SYSTEM_SHUTDOWN_TIME}   ${5}
25
26${dbuscmdBase}
27...  dbus-send --system --print-reply --dest=${OPENBMC_BASE_DBUS}.settings.Host
28${dbuscmdGet}
29...  ${SETTINGS_URI}host0  org.freedesktop.DBus.Properties.Get
30${dbuscmdString}=  string:"xyz.openbmc_project.settings.Host" string:
31
32# Assign default value to QUIET for programs which may not define it.
33${QUIET}  ${0}
34
35${bmc_mem_free_cmd}=   free | tr -s ' ' | sed '/^Mem/!d' | cut -d" " -f4
36${bmc_mem_total_cmd}=   free | tr -s ' ' | sed '/^Mem/!d' | cut -d" " -f2
37${bmc_cpu_usage_cmd}=   top -n 1  | grep CPU: | cut -c 7-9
38${HOST_SETTING}    ${SETTINGS_URI}host0
39
40# /run/initramfs/ro associate filesystem  should be 100% full always
41${bmc_file_system_usage_cmd}=  df -h | cut -c 52-54 | grep 100 | wc -l
42${total_pnor_ro_file_system_cmd}=  df -h | grep /media/pnor-ro | wc -l
43${total_bmc_ro_file_system_cmd}=  df -h | grep /media/rofs | wc -l
44
45${BOOT_TIME}     ${0}
46${BOOT_COUNT}    ${0}
47${count}  ${0}
48${devicetree_base}  /sys/firmware/devicetree/base/model
49
50# Initialize default debug value to 0.
51${DEBUG}         ${0}
52
53${probe_cpu_tool_path}     ${EXECDIR}/tools/ras/probe_cpus.sh
54${scom_addrs_tool_path}    ${EXECDIR}/tools/ras/scom_addr_p9.sh
55${target_file_path}        /root/
56
57${default_tarball}  ${EXECDIR}/obmc-phosphor-debug-tarball-witherspoon.tar.xz
58
59# These variables are used to straddle between new and old methods of setting
60# values.
61${boot_prog_method}               ${EMPTY}
62${power_policy_setup}             ${0}
63${bmc_power_policy_method}        ${EMPTY}
64@{valid_power_policy_vars}        RESTORE_LAST_STATE  ALWAYS_POWER_ON
65...                               ALWAYS_POWER_OFF
66
67
68*** Keywords ***
69
70Check BMC Performance
71    [Documentation]  Check BMC basic CPU Mem File system performance.
72
73    Check BMC CPU Performance
74    Check BMC Mem Performance
75    Check BMC File System Performance
76
77
78Verify PNOR Update
79    [Documentation]  Verify that the PNOR is not corrupted.
80    # Example:
81    # FFS: Flash header not found. Code: 100
82    # Error 100 opening ffs !
83
84    Open Connection And Log In
85    ${pnor_info}=  Execute Command On BMC  ${pflash_cmd}
86    Should Not Contain Any  ${pnor_info}  Flash header not found  Error
87
88
89Get BMC System Model
90    [Documentation]  Get the BMC model from the device tree and return it.
91
92    ${bmc_model}  ${stderr}  ${rc}=  BMC Execute Command
93    ...  cat ${devicetree_base} | cut -d " " -f 1  return_stderr=True
94    ...  test_mode=0
95    Should Be Empty  ${stderr}
96    Should Not Be Empty  ${bmc_model}  msg=BMC model is empty.
97    [Return]  ${bmc_model}
98
99
100Verify BMC System Model
101    [Documentation]  Verify the BMC model with ${OPENBMC_MODEL}.
102    [Arguments]  ${bmc_model}
103
104    # Description of argument(s):
105    # bmc_model System model (e.g. "witherspoon").
106
107    ${tmp_bmc_model}=  Fetch From Right  ${OPENBMC_MODEL}  /
108    ${tmp_bmc_model}=  Fetch From Left  ${tmp_bmc_model}  .
109    ${ret}=  Run Keyword And Return Status  Should Contain  ${bmc_model}
110    ...  ${tmp_bmc_model}  ignore_case=True
111    [Return]  ${ret}
112
113
114Wait For Host To Ping
115    [Arguments]  ${host}  ${timeout}=${OPENBMC_REBOOT_TIMEOUT}min
116    ...          ${interval}=5 sec
117
118    # Description of argument(s):
119    # host      The host name or IP of the host to ping.
120    # timeout   The amount of time after which ping attempts cease.
121    #           This should be expressed in Robot Framework's time format
122    #           (e.g. "10 seconds").
123    # interval  The amount of time in between attempts to ping.
124    #           This should be expressed in Robot Framework's time format
125    #           (e.g. "5 seconds").
126
127    Wait Until Keyword Succeeds  ${timeout}  ${interval}  Ping Host  ${host}
128
129
130Ping Host
131    [Arguments]     ${host}
132
133    # Description of argument(s):
134    # host      The host name or IP of the host to ping.
135
136    Should Not Be Empty    ${host}   msg=No host provided
137    ${RC}   ${output}=     Run and return RC and Output    ping -c 4 ${host}
138    Log     RC: ${RC}\nOutput:\n${output}
139    Should be equal     ${RC}   ${0}
140
141
142Get Boot Progress
143    [Documentation]  Get the boot progress and return it.
144    [Arguments]  ${quiet}=${QUIET}
145
146    # Description of argument(s):
147    # quiet   Indicates whether this keyword should run without any output to
148    #         the console.
149
150    Set Boot Progress Method
151    ${state}=  Run Keyword If  '${boot_prog_method}' == 'New'
152    ...      New Get Boot Progress  quiet=${quiet}
153    ...  ELSE
154    ...      Old Get Boot Progress  quiet=${quiet}
155
156    [Return]  ${state}
157
158
159Set Boot Progress Method
160    [Documentation]  Set the boot_prog_method to either 'Old' or 'New'.
161
162    # The boot progress data has moved from an 'org' location to an 'xyz'
163    # location.  This keyword will determine whether the new method of getting
164    # the boot progress is valid and will set the global boot_prog_method
165    # variable accordingly.  If boot_prog_method is already set (either by a
166    # prior call to this function or via a -v parm), this keyword will simply
167    # return.
168
169    # Note:  There are interim builds that contain boot_progress in both the
170    # old and the new location values.  It is nearly impossible for this
171    # keyword to determine whether the old boot_progress or the new one is
172    # active.  When using such builds where the old boot_progress is active,
173    # the only recourse users will have is that they may specify
174    # -v boot_prog_method:Old to force old behavior on such builds.
175
176    Run Keyword If  '${boot_prog_method}' != '${EMPTY}'  Return From Keyword
177
178    ${new_status}  ${new_value}=  Run Keyword And Ignore Error
179    ...  New Get Boot Progress
180    # If the new style read fails, the method must necessarily be "Old".
181    Run Keyword If  '${new_status}' == 'PASS'
182    ...  Run Keywords
183    ...  Set Global Variable  ${boot_prog_method}  New  AND
184    ...  Rqpvars  boot_prog_method  AND
185    ...  Return From Keyword
186
187    # Default method is "Old".
188    Set Global Variable  ${boot_prog_method}  Old
189    Rqpvars  boot_prog_method
190
191
192Old Get Boot Progress
193    [Documentation]  Get the boot progress the old way (via org location).
194    [Arguments]  ${quiet}=${QUIET}
195
196    # Description of argument(s):
197    # quiet   Indicates whether this keyword should run without any output to
198    #         the console.
199
200    ${state}=  Read Attribute  ${OPENBMC_BASE_URI}sensors/host/BootProgress
201    ...  value  quiet=${quiet}
202
203    [Return]  ${state}
204
205
206New Get Boot Progress
207    [Documentation]  Get the boot progress the new way (via xyz location).
208    [Arguments]  ${quiet}=${QUIET}
209
210    # Description of argument(s):
211    # quiet   Indicates whether this keyword should run without any output to
212    #         the console.
213
214    ${state}=  Read Attribute  ${HOST_STATE_URI}  BootProgress  quiet=${quiet}
215
216    [Return]  ${state.rsplit('.', 1)[1]}
217
218
219Is Power On
220    ${state}=  Get Power State
221    Should be equal  ${state}  ${1}
222
223
224Is Power Off
225    ${state}=  Get Power State
226    Should be equal  ${state}  ${0}
227
228
229Initiate Power On
230    [Documentation]  Initiates the power on and waits until the Is Power On
231    ...  keyword returns that the power state has switched to on.
232    [Arguments]  ${wait}=${1}
233
234    # Description of argument(s):
235    # wait   Indicates whether to wait for a powered on state after issuing
236    #        the power on command.
237
238    @{arglist}=   Create List
239    ${args}=     Create Dictionary    data=@{arglist}
240    ${resp}=  Call Method  ${OPENBMC_BASE_URI}control/chassis0/  powerOn
241    ...  data=${args}
242    should be equal as strings      ${resp.status_code}     ${HTTP_OK}
243
244    # Does caller want to wait for power on status?
245    Run Keyword If  '${wait}' == '${0}'  Return From Keyword
246    Wait Until Keyword Succeeds  3 min  10 sec  Is Power On
247
248
249Initiate Power Off
250    [Documentation]  Initiates the power off and waits until the Is Power Off
251    ...  keyword returns that the power state has switched to off.
252
253    @{arglist}=   Create List
254    ${args}=     Create Dictionary    data=@{arglist}
255    ${resp}=  Call Method  ${OPENBMC_BASE_URI}control/chassis0/  powerOff
256    ...  data=${args}
257    should be equal as strings      ${resp.status_code}     ${HTTP_OK}
258    Wait Until Keyword Succeeds  1 min  10 sec  Is Power Off
259
260
261Initiate OS Host Power Off
262    [Documentation]  Initiate an OS reboot.
263    [Arguments]  ${os_host}=${OS_HOST}  ${os_username}=${OS_USERNAME}
264    ...          ${os_password}=${OS_PASSWORD}  ${hard}=${0}
265
266    # Description of argument(s):
267    # os_host      The DNS name or IP of the OS.
268    # os_username  The username to be used to sign in to the OS.
269    # os_password  The password to be used to sign in to the OS.
270    # hard         Indicates whether to do a hard vs. soft power off.
271
272    ${time_string}=  Run Keyword If  ${hard}  Set Variable  ${SPACE}now
273    ...  ELSE  Set Variable  ${EMPTY}
274
275    ${cmd_buf}=  Run Keyword If  '${os_username}' == 'root'
276    ...      Set Variable  shutdown${time_string}
277    ...  ELSE
278    ...      Set Variable  echo ${os_password} | sudo -S shutdown${time_string}
279
280    ${output}  ${stderr}  ${rc}=  OS Execute Command
281    ...  ${cmd_buf}  fork=${1}
282
283
284Initiate OS Host Reboot
285    [Documentation]  Initiate an OS reboot.
286    [Arguments]  ${os_host}=${OS_HOST}  ${os_username}=${OS_USERNAME}
287    ...          ${os_password}=${OS_PASSWORD}
288
289    # Description of argument(s):
290    # os_host      The host name or IP address of the OS.
291    # os_username  The username to be used to sign in to the OS.
292    # os_password  The password to be used to sign in to the OS.
293
294    ${cmd_buf}=  Run Keyword If  '${os_username}' == 'root'
295    ...      Set Variable  reboot
296    ...  ELSE
297    ...      Set Variable  echo ${os_password} | sudo -S reboot
298
299    ${output}  ${stderr}  ${rc}=  OS Execute Command
300    ...  ${cmd_buf}  fork=${1}
301
302
303Initiate Auto Reboot
304    [Documentation]  Initiate an auto reboot.
305
306    # Set the auto reboot policy.
307    Set Auto Reboot  ${1}
308    # Set the watchdog timer.  Note: 5000 = milliseconds which is 5 seconds.
309    Trigger Host Watchdog Error  5000
310
311
312Trigger Warm Reset
313    [Documentation]  Initiate a warm reset.
314
315    log to console    "Triggering warm reset"
316    ${data}=   create dictionary   data=@{EMPTY}
317    ${resp}=  openbmc post request
318    ...  ${OPENBMC_BASE_URI}control/bmc0/action/warmReset  data=${data}
319    Should Be Equal As Strings      ${resp.status_code}     ${HTTP_OK}
320    ${session_active}=   Check If warmReset is Initiated
321    Run Keyword If   '${session_active}' == '${True}'
322    ...    Fail   msg=warm reset didn't occur
323
324    Sleep   ${SYSTEM_SHUTDOWN_TIME}min
325    Check If BMC Is Up
326
327
328Check OS
329    [Documentation]  Attempts to ping the host OS and then checks that the host
330    ...              OS is up by running an SSH command.
331
332    [Arguments]  ${os_host}=${OS_HOST}  ${os_username}=${OS_USERNAME}
333    ...          ${os_password}=${OS_PASSWORD}  ${quiet}=${QUIET}
334    ...          ${print_string}=${EMPTY}
335    [Teardown]  SSHLibrary.Close Connection
336
337    # Description of argument(s):
338    # os_host           The DNS name/IP of the OS host associated with our BMC.
339    # os_username       The username to be used to sign on to the OS host.
340    # os_password       The password to be used to sign on to the OS host.
341    # quiet             Indicates whether this keyword should write to console.
342    # print_string      A string to be printed before checking the OS.
343
344    rprint  ${print_string}
345
346    # Attempt to ping the OS. Store the return code to check later.
347    ${ping_rc}=  Run Keyword and Return Status  Ping Host  ${os_host}
348
349    SSHLibrary.Open connection  ${os_host}
350
351    ${status}  ${msg}=  Run Keyword And Ignore Error  Login  ${os_username}
352    ...  ${os_password}
353    ${err_msg1}=  Sprint Error  ${msg}
354    ${err_msg}=  Catenate  SEPARATOR=  \n  ${err_msg1}
355    Run Keyword If  '${status}' == 'FAIL'  Fail  msg=${err_msg}
356    ${output}  ${stderr}  ${rc}=  Execute Command  uptime  return_stderr=True
357    ...        return_rc=True
358
359    ${temp_msg}=  Catenate  Could not execute a command on the operating
360    ...  system.\n
361    ${err_msg1}=  Sprint Error  ${temp_msg}
362    ${err_msg}=  Catenate  SEPARATOR=  \n  ${err_msg1}
363
364    # If the return code returned by "Execute Command" is non-zero, this
365    # keyword will fail.
366    Should Be Equal  ${rc}  ${0}  msg=${err_msg}
367    # We will likewise fail if there is any stderr data.
368    Should Be Empty  ${stderr}
369
370    ${temp_msg}=  Set Variable  Could not ping the operating system.\n
371    ${err_msg1}=  Sprint Error  ${temp_msg}
372    ${err_msg}=  Catenate  SEPARATOR=  \n  ${err_msg1}
373    # We will likewise fail if the OS did not ping, as we could SSH but not
374    # ping
375    Should Be Equal As Strings  ${ping_rc}  ${TRUE}  msg=${err_msg}
376
377
378Wait for OS
379    [Documentation]  Waits for the host OS to come up via calls to "Check OS".
380    [Arguments]  ${os_host}=${OS_HOST}  ${os_username}=${OS_USERNAME}
381    ...          ${os_password}=${OS_PASSWORD}  ${timeout}=${OS_WAIT_TIMEOUT}
382    ...          ${quiet}=${0}
383    [Teardown]  rprintn
384
385    # Description of argument(s):
386    # os_host           The DNS name or IP of the OS host associated with our
387    #                   BMC.
388    # os_username       The username to be used to sign on to the OS host.
389    # os_password       The password to be used to sign on to the OS host.
390    # timeout           The timeout in seconds indicating how long you're
391    #                   willing to wait for the OS to respond.
392    # quiet             Indicates whether this keyword should write to console.
393
394    # The interval to be used between calls to "Check OS".
395    ${interval}=  Set Variable  5
396
397    ${message}=  Catenate  Checking every ${interval} seconds for up to
398    ...  ${timeout} seconds for the operating system to communicate.
399    rqprint_timen  ${message}
400
401    Wait Until Keyword Succeeds  ${timeout} sec  ${interval}  Check OS
402    ...                          ${os_host}  ${os_username}  ${os_password}
403    ...                          print_string=\#
404
405    rqprintn
406
407    rqprint_timen  The operating system is now communicating.
408
409
410Get Power State
411    [Documentation]  Returns the power state as an integer. Either 0 or 1.
412    [Arguments]  ${quiet}=${QUIET}
413
414    # Description of argument(s):
415    # quiet   Indicates whether this keyword should run without any output to
416    #         the console.
417
418    @{arglist}=  Create List
419    ${args}=  Create Dictionary  data=@{arglist}
420
421    ${resp}=  Call Method  ${OPENBMC_BASE_URI}control/chassis0/  getPowerState
422    ...        data=${args}  quiet=${quiet}
423    Should be equal as strings  ${resp.status_code}  ${HTTP_OK}
424    ${content}=  to json  ${resp.content}
425
426    [Return]  ${content["data"]}
427
428
429Clear BMC Gard Record
430    [Documentation]  Clear gard records from the system.
431
432    @{arglist}=  Create List
433    ${args}=  Create Dictionary  data=@{arglist}
434    ${resp}=  Call Method
435    ...  ${OPENPOWER_CONTROL}gard  Reset  data=${args}
436    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
437
438
439Copy PNOR to BMC
440    Import Library      SCPLibrary      WITH NAME       scp
441    Open Connection for SCP
442    Log    Copying ${PNOR_IMAGE_PATH} to /tmp
443    scp.Put File    ${PNOR_IMAGE_PATH}   /tmp
444
445
446Flash PNOR
447    [Documentation]    Calls flash bios update method to flash PNOR image
448    [Arguments]    ${pnor_image}
449
450    # Description of argument(s):
451    # pnor_image  The filename and path of the PNOR image
452    #             (e.g. "/home/image/zaius.pnor").
453
454    @{arglist}=   Create List    ${pnor_image}
455    ${args}=     Create Dictionary    data=@{arglist}
456    ${resp}=  Call Method  /org/openbmc/control/flash/bios/  update
457    ...  data=${args}
458    should be equal as strings      ${resp.status_code}     ${HTTP_OK}
459    Wait Until Keyword Succeeds    2 min   10 sec    Is PNOR Flashing
460
461
462Get Flash BIOS Status
463    [Documentation]  Returns the status of the flash BIOS API as a string. For
464    ...              example 'Flashing', 'Flash Done', etc
465    ${data}=  Read Properties  /org/openbmc/control/flash/bios
466    [Return]    ${data['status']}
467
468
469Is PNOR Flashing
470    [Documentation]  Get BIOS 'Flashing' status. This indicates that PNOR
471    ...              flashing has started.
472    ${status}=    Get Flash BIOS Status
473    Should Contain  ${status}  Flashing
474
475
476Is PNOR Flash Done
477    [Documentation]  Get BIOS 'Flash Done' status.  This indicates that the
478    ...              PNOR flashing has completed.
479    ${status}=    Get Flash BIOS Status
480    should be equal as strings     ${status}     Flash Done
481
482
483Is OS Starting
484    [Documentation]  Check if boot progress is OS starting.
485    ${boot_progress}=  Get Boot Progress
486    Should Be Equal  ${boot_progress}  OSStart
487
488
489Is OS Off
490    [Documentation]  Check if boot progress is "Off".
491    ${boot_progress}=  Get Boot Progress
492    Should Be Equal  ${boot_progress}  Off
493
494
495Get Boot Progress To OS Starting State
496    [Documentation]  Get the system to a boot progress state of 'FW Progress,
497    ...  Starting OS'.
498
499    ${boot_progress}=  Get Boot Progress
500    Run Keyword If  '${boot_progress}' == 'OSStart'
501    ...  Log  Host is already in OS starting state
502    ...  ELSE
503    ...  Run Keywords  Initiate Host PowerOff  AND  Initiate Host Boot
504    ...  AND  Wait Until Keyword Succeeds  10 min  10 sec  Is OS Starting
505
506
507Verify Ping and REST Authentication
508    ${l_ping}=   Run Keyword And Return Status
509    ...    Ping Host  ${OPENBMC_HOST}
510    Run Keyword If  '${l_ping}' == '${False}'
511    ...    Fail   msg=Ping Failed
512
513    ${l_rest}=   Run Keyword And Return Status
514    ...    Initialize OpenBMC
515    Run Keyword If  '${l_rest}' == '${False}'
516    ...    Fail   msg=REST Authentication Failed
517
518    # Just to make sure the SSH is working for SCP
519    Open Connection And Log In
520    ${system}   ${stderr}=    Execute Command   hostname   return_stderr=True
521    Should Be Empty     ${stderr}
522
523
524Check If BMC is Up
525    [Documentation]  Wait for Host to be online. Checks every X seconds
526    ...              interval for Y minutes and fails if timed out.
527    ...              Default MAX timedout is 10 min, interval 10 seconds.
528    [Arguments]      ${max_timeout}=${OPENBMC_REBOOT_TIMEOUT} min
529    ...              ${interval}=10 sec
530
531    # Description of argument(s):
532    # max_timeout   Maximum time to wait.
533    #               This should be expressed in Robot Framework's time format
534    #               (e.g. "10 minutes").
535    # interfal      Interval to wait between status checks.
536    #               This should be expressed in Robot Framework's time format
537    #               (e.g. "5 seconds").
538
539    Wait Until Keyword Succeeds
540    ...   ${max_timeout}  ${interval}   Verify Ping and REST Authentication
541
542
543Check If warmReset is Initiated
544    [Documentation]  Ping would be still alive, so try SSH to connect
545    ...              if fails the ports are down indicating reboot
546    ...              is in progress
547
548    # Warm reset adds 3 seconds delay before forcing reboot
549    # To minimize race conditions, we wait for 7 seconds
550    Sleep  7s
551    ${alive}=   Run Keyword and Return Status
552    ...    Open Connection And Log In
553    Return From Keyword If   '${alive}' == '${False}'    ${False}
554    [Return]    ${True}
555
556
557Flush REST Sessions
558    [Documentation]   Removes all the active session objects
559    Delete All Sessions
560
561
562Initialize DBUS cmd
563    [Documentation]  Initialize dbus string with property string to extract
564    [Arguments]   ${boot_property}
565
566    # Description of argument(s):
567    # boot_property   Property string.
568
569    ${cmd}=     Catenate  ${dbuscmdBase} ${dbuscmdGet} ${dbuscmdString}
570    ${cmd}=     Catenate  ${cmd}${boot_property}
571    Set Global Variable   ${dbuscmd}     ${cmd}
572
573
574Create OS Console File Path
575    [Documentation]  Create OS console file path name and return it.
576    [Arguments]  ${log_file_path}=${EMPTY}
577
578    # Description of arguments:
579    # file_path  The caller's candidate value.  If this value is ${EMPTY}, this
580    #            keyword will compose a file path name.  Otherwise, this
581    #            keyword will use the caller's file_path value.  In either
582    #            case, the value will be returned.
583
584    ${default_file_path}=  Catenate  /tmp/${OPENBMC_HOST}_os_console.txt
585    ${log_file_path}=  Set Variable If  '${log_file_path}' == '${EMPTY}'
586    ...  ${default_file_path}  ${log_file_path}
587
588    [Return]  ${log_file_path}
589
590
591Create OS Console Command String
592    [Documentation]  Return a command string to start OS console logging.
593
594    # First make sure that the ssh_pw program is available.
595    ${cmd}=  Catenate  which ssh_pw 2>/dev/null || find
596    ...  ${EXECDIR} -name 'ssh_pw'
597
598    Rdpissuing  ${cmd}
599    ${rc}  ${output}=  Run And Return Rc And Output  ${cmd}
600    Rdpvars  rc  output
601
602    Should Be Equal As Integers  0  ${rc}  msg=Could not find ssh_pw.
603
604    ${ssh_pw_file_path}=  Set Variable  ${output}
605
606    ${cmd}=  Catenate  ${ssh_pw_file_path} ${OPENBMC_PASSWORD} -p 2200
607    ...  -o "StrictHostKeyChecking no" ${OPENBMC_USERNAME}@${OPENBMC_HOST}
608
609    [Return]  ${cmd}
610
611
612Get SOL Console Pid
613    [Documentation]  Get the pid of the active SOL console job.
614    [Arguments]  ${expect_running}=${0}
615
616    # Description of argument(s):
617    # expect_running  If set and if no SOL console job is found, print debug
618    #                 info and fail.
619
620    # Find the pid of the active system console logging session (if any).
621    ${search_string}=  Create OS Console Command String
622    # At least in some cases, ps output does not show double quotes so we must
623    # replace them in our search string with the regexes to indicate that they
624    # are optional.
625    ${search_string}=  Replace String  ${search_string}  "  ["]?
626    ${ps_cmd}=  Catenate  ps axwwo user,pid,cmd
627    ${cmd_buf}=  Catenate  echo $(${ps_cmd} | egrep '${search_string}' |
628    ...  egrep -v grep | cut -c10-14)
629    Rdpissuing  ${cmd_buf}
630    ${rc}  ${os_con_pid}=  Run And Return Rc And Output  ${cmd_buf}
631    Rdpvars  os_con_pid
632    # If rc is not zero it just means that there is no OS Console process
633    # running.
634
635    Return From Keyword If  '${os_con_pid}' != '${EMPTY}'  ${os_con_pid}
636    Return From Keyword If  '${expect_running}' == '${0}'  ${os_con_pid}
637
638    Cmd Fnc  cat ${log_file_path} ; echo ; ${ps_cmd}  quiet=${0}
639    ...  print_output=${1}  show_err=${1}
640
641    Should Not Be Empty  ${os_con_pid}
642
643
644Stop SOL Console Logging
645    [Documentation]  Stop system console logging and return log output.
646    [Arguments]  ${log_file_path}=${EMPTY}
647    ...          ${targ_file_path}=${EXECDIR}${/}logs${/}
648    ...          ${return_data}=${1}
649
650    # If there are muliple system console processes, they will all be stopped.
651    # If there is no existing log file this keyword will return an error
652    # message to that effect (and write that message to targ_file_path, if
653    # specified).
654    # NOTE: This keyword will not fail if there is no running system console
655    # process.
656
657    # Description of arguments:
658    # log_file_path   The file path that was used to call "Start SOL
659    #                 Console Logging".  See that keyword (above) for details.
660    # targ_file_path  If specified, the file path to which the source
661    #                 file path (i.e. "log_file_path") should be copied.
662    # return_data     If this is set to ${1}, this keyword will return the SOL
663    #                 data to the caller as a unicode string.
664
665    ${log_file_path}=  Create OS Console File Path  ${log_file_path}
666
667    ${os_con_pid}=  Get SOL Console Pid
668
669    ${cmd_buf}=  Catenate  kill -9 ${os_con_pid}
670    Run Keyword If  '${os_con_pid}' != '${EMPTY}'  Rdpissuing  ${cmd_buf}
671    ${rc}  ${output}=  Run Keyword If  '${os_con_pid}' != '${EMPTY}'
672    ...  Run And Return Rc And Output  ${cmd_buf}
673    Run Keyword If  '${os_con_pid}' != '${EMPTY}'  Rdpvars  rc  output
674
675    Run Keyword If  '${targ_file_path}' != '${EMPTY}'
676    ...  Run Keyword And Ignore Error
677    ...  Copy File  ${log_file_path}  ${targ_file_path}
678
679    ${output}=  Set Variable  ${EMPTY}
680    ${loc_quiet}=  Evaluate  ${debug}^1
681    ${rc}  ${output}=  Run Keyword If  '${return_data}' == '${1}'
682    ...  Cmd Fnc  cat ${log_file_path} 2>/dev/null  quiet=${loc_quiet}
683    ...  print_output=${0}  show_err=${0}
684
685    [Return]  ${output}
686
687
688Start SOL Console Logging
689    [Documentation]  Start system console log to file.
690    [Arguments]  ${log_file_path}=${EMPTY}  ${return_data}=${1}
691
692    # This keyword will first call "Stop SOL Console Logging".  Only then will
693    # it start SOL console logging.  The data returned by "Stop SOL Console
694    # Logging" will in turn be returned by this keyword.
695
696    # Description of arguments:
697    # log_file_path   The file path to which system console log data should be
698    #                 written.  Note that this path is taken to be a location
699    #                 on the machine where this program is running rather than
700    #                 on the Open BMC system.
701    # return_data     If this is set to ${1}, this keyword will return any SOL
702    #                 data to the caller as a unicode string.
703
704    ${log_file_path}=  Create OS Console File Path  ${log_file_path}
705
706    ${log_output}=  Stop SOL Console Logging  ${log_file_path}
707    ...  return_data=${return_data}
708
709    # Validate by making sure we can create the file.  Problems creating the
710    # file would not be noticed by the subsequent ssh command because we fork
711    # the command.
712    Create File  ${log_file_path}
713    ${sub_cmd_buf}=  Create OS Console Command String
714    # Routing stderr to stdout so that any startup error text will go to the
715    # output file.
716    # TODO: Doesn't work with tox so reverting temporarily.
717    # nohup detaches the process completely from our pty.
718    #${cmd_buf}=  Catenate  nohup ${sub_cmd_buf} &> ${log_file_path} &
719    ${cmd_buf}=  Catenate  ${sub_cmd_buf} > ${log_file_path} 2>&1 &
720    Rdpissuing  ${cmd_buf}
721    ${rc}  ${output}=  Run And Return Rc And Output  ${cmd_buf}
722    # Because we are forking this command, we essentially will never get a
723    # non-zero return code or any output.
724    Should Be Equal  ${rc}  ${0}
725
726    Wait Until Keyword Succeeds  10 seconds  0 seconds
727    ...   Get SOL Console Pid  ${1}
728
729    [Return]  ${log_output}
730
731
732Get Time Stamp
733    [Documentation]     Get the current time stamp data
734    ${cur_time}=    Get Current Date   result_format=%Y%m%d%H%M%S%f
735    [Return]   ${cur_time}
736
737
738Start Journal Log
739    [Documentation]   Start capturing journal log to a file in /tmp using
740    ...               journalctl command. By default journal log is collected
741    ...               at /tmp/journal_log else user input location.
742    ...               The File is appended with datetime.
743    [Arguments]       ${file_path}=/tmp/journal_log
744
745    # Description of arguments:
746    # file_path   The file path of the journal file.
747
748    ${cur_time}=    Get Time Stamp
749    Set Global Variable   ${LOG_TIME}   ${cur_time}
750    Start Command
751    ...  journalctl -f > ${file_path}-${LOG_TIME}
752    Log    Journal Log Started: ${file_path}-${LOG_TIME}
753
754
755Stop Journal Log
756    [Documentation]   Stop journalctl process if its running.
757    ...               By default return log from /tmp/journal_log else
758    ...               user input location.
759    [Arguments]       ${file_path}=/tmp/journal_log
760
761    # Description of arguments:
762    # file_path   The file path of the journal file.
763
764    Open Connection And Log In
765
766    ${rc}=
767    ...  Execute Command
768    ...  ps ax | grep journalctl | grep -v grep
769    ...  return_stdout=False  return_rc=True
770
771    Return From Keyword If   '${rc}' == '${1}'
772    ...   No journal log process running
773
774    ${output}  ${stderr}=
775    ...  Execute Command   killall journalctl
776    ...  return_stderr=True
777    Should Be Empty     ${stderr}
778
779    ${journal_log}  ${stderr}=
780    ...  Execute Command
781    ...  cat ${file_path}-${LOG_TIME}
782    ...  return_stderr=True
783    Should Be Empty     ${stderr}
784
785    Log    ${journal_log}
786
787    Execute Command    rm ${file_path}-${LOG_TIME}
788
789    [Return]    ${journal_log}
790
791
792Mac Address To Hex String
793    [Documentation]   Converts MAC address into hex format.
794    ...               Example
795    ...               Given the following MAC: 00:01:6C:80:02:78
796    ...               This keyword will return: 0x00 0x01 0x6C 0x80 0x02 0x78
797    ...               Description of arguments:
798    ...               i_macaddress  MAC address in the following format
799    ...               00:01:6C:80:02:78
800    [Arguments]    ${i_macaddress}
801
802    # Description of arguments:
803    # i_macaddress   The MAC address.
804
805    ${mac_hex}=  Catenate  0x${i_macaddress.replace(':', ' 0x')}
806    [Return]    ${mac_hex}
807
808
809IP Address To Hex String
810    [Documentation]   Converts IP address into hex format.
811    ...               Example:
812    ...               Given the following IP: 10.3.164.100
813    ...               This keyword will return: 0xa 0x3 0xa4 0xa0
814    [Arguments]    ${i_ipaddress}
815
816    # Description of arguments:
817    # i_macaddress   The IP address in the format 10.10.10.10.
818
819    @{ip}=  Split String  ${i_ipaddress}    .
820    ${index}=  Set Variable  ${0}
821
822    :FOR    ${item}     IN      @{ip}
823    \   ${hex}=  Convert To Hex    ${item}    prefix=0x    lowercase=yes
824    \   Set List Value    ${ip}    ${index}    ${hex}
825    \   ${index}=  Set Variable    ${index + 1}
826    ${ip_hex}=  Catenate    @{ip}
827
828    [Return]    ${ip_hex}
829
830
831BMC CPU Performance Check
832   [Documentation]   Minimal 10% of proc should be free in this instance
833
834    ${bmc_cpu_usage_output}  ${stderr}  ${rc}=  BMC Execute Command
835    ...  ${bmc_cpu_usage_cmd}
836    ${bmc_cpu_usage_output}  ${stderr}  ${rc}=  BMC Execute Command
837    ...  ${bmc_cpu_usage_cmd}
838    ${bmc_cpu_percentage}=  Fetch From Left  ${bmc_cpu_usage_output}  %
839    Should be true  ${bmc_cpu_percentage} < 90
840
841
842BMC Mem Performance Check
843    [Documentation]   Minimal 10% of memory should be free in this instance
844
845    ${bmc_mem_free_output}  ${stderr}  ${rc}=   BMC Execute Command
846    ...  ${bmc_mem_free_cmd}
847
848    ${bmc_mem_total_output}  ${stderr}  ${rc}=  BMC Execute Command
849    ...  ${bmc_mem_total_cmd}
850    ${bmc_mem_free_output}  ${stderr}  ${rc}=   BMC Execute Command
851    ...  ${bmc_mem_free_cmd}
852
853    ${bmc_mem_total_output}  ${stderr}  ${rc}=  BMC Execute Command
854    ...  ${bmc_mem_total_cmd}
855
856    ${bmc_mem_percentage}=  Evaluate  ${bmc_mem_free_output}*100
857    ${bmc_mem_percentage}=  Evaluate
858    ...   ${bmc_mem_percentage}/${bmc_mem_total_output}
859    Should be true  ${bmc_mem_percentage} > 10
860
861
862BMC File System Usage Check
863    [Documentation]   Check the file system space. 4 file system should be
864    ...  100% full which is expected
865    # Filesystem            Size    Used Available Use% Mounted on
866    # /dev/root            14.4M     14.4M       0 100% /
867    # /dev/ubiblock0_0     14.4M     14.4M       0 100% /media/rofs-c9249b0e
868    # /dev/ubiblock8_0     19.6M     19.6M       0 100% /media/pnor-ro-8764baa3
869    # /dev/ubiblock4_0     14.4M     14.4M       0 100% /media/rofs-407816c
870    # /dev/ubiblock8_4     21.1M     21.1M       0 100% /media/pnor-ro-cecc64c4
871    ${bmc_fs_usage_output}  ${stderr}  ${rc}=  BMC Execute Command
872    ...  ${bmc_file_system_usage_cmd}
873    ${bmc_pnor_fs_usage_output}  ${stderr}  ${rc}=  BMC Execute Command
874    ...  ${total_pnor_ro_file_system_cmd}
875    ${bmc_bmc_fs_usage_output}  ${stderr}  ${rc}=  BMC Execute Command
876    ...  ${total_bmc_ro_file_system_cmd}
877    ${total_bmc_pnor_image}=  Evaluate
878    ...  ${bmc_pnor_fs_usage_output}+${bmc_bmc_fs_usage_output}
879    # Considering /dev/root also in total 100% used file system
880    ${total_full_fs}=  Evaluate  ${total_bmc_pnor_image}+1
881    Should Be True  ${bmc_fs_usage_output}==${total_full_fs}
882
883
884Check BMC CPU Performance
885    [Documentation]   Minimal 10% of proc should be free in 3 sample
886    :FOR  ${var}  IN Range  1  4
887    \     BMC CPU Performance check
888
889
890Check BMC Mem Performance
891    [Documentation]   Minimal 10% of memory should be free
892
893    :FOR  ${var}  IN Range  1  4
894    \     BMC Mem Performance check
895
896
897Check BMC File System Performance
898    [Documentation]  Check for file system usage for 4 times
899
900    :FOR  ${var}  IN Range  1  4
901    \     BMC File System Usage check
902
903
904Get URL List
905    [Documentation]  Return list of URLs under given URL.
906    [Arguments]  ${openbmc_url}
907
908    # Description of argument(s):
909    # openbmc_url  URL for list operation (e.g.
910    #              /xyz/openbmc_project/inventory).
911
912    ${url_list}=  Read Properties  ${openbmc_url}/list  quiet=${1}
913    Sort List  ${url_list}
914
915    [Return]  ${url_list}
916
917
918Get Endpoint Paths
919    [Documentation]   Returns all url paths ending with given endpoint
920    ...               Example:
921    ...               Given the following endpoint: cpu
922    ...               This keyword will return: list of all urls ending with
923    ...               cpu -
924    ...               /org/openbmc/inventory/system/chassis/motherboard/cpu0,
925    ...               /org/openbmc/inventory/system/chassis/motherboard/cpu1
926    [Arguments]   ${path}   ${endpoint}
927
928    # Description of arguments:
929    # path       URL path for enumeration.
930    # endpoint   Endpoint string (url path ending).
931
932    ${resp}=  Read Properties  ${path}/enumerate  timeout=30
933    Log Dictionary  ${resp}
934
935    ${list}=  Get Dictionary Keys  ${resp}
936    # For a given string, look for prefix and suffix for matching expression.
937    # Start of string followed by zero or more of any character followed by
938    # any digit or lower case character.
939    ${resp}=  Get Matches  ${list}  regexp=^.*[0-9a-z_].${endpoint}[0-9a-z]*$
940
941    [Return]  ${resp}
942
943
944Check Zombie Process
945    [Documentation]    Check if any defunct process exist or not on BMC
946    ${count}  ${stderr}  ${rc}=  Execute Command  ps -o stat | grep Z | wc -l
947    ...    return_stderr=True  return_rc=True
948    Should Be True    ${count}==0
949    Should Be Empty    ${stderr}
950
951
952Prune Journal Log
953    [Documentation]   Prune archived journal logs.
954    [Arguments]   ${vacuum_size}=1M
955
956    # This keyword can be used to prevent the journal
957    # log from filling up the /run filesystem.
958    # This command will retain only the latest logs
959    # of the user specified size.
960
961    # Description of argument(s):
962    # vacuum_size    Size of journal.
963
964    Open Connection And Log In
965    ${output}  ${stderr}  ${rc}=
966    ...  Execute Command
967    ...  journalctl --vacuum-size=${vacuum_size}
968    ...  return_stderr=True  return_rc=True
969
970    Should Be Equal  ${rc}  ${0}  msg=${stderr}
971
972
973Set BMC Power Policy
974    [Documentation]   Set the given BMC power policy.
975    [Arguments]   ${policy}
976
977    # Note that this function will translate the old style "RESTORE_LAST_STATE"
978    # policy to the new style "xyz.openbmc_project.Control.Power.RestorePolicy.
979    # Policy.Restore" for you.
980
981    # Description of argument(s):
982    # policy    Power restore policy (e.g "RESTORE_LAST_STATE",
983    #           ${RESTORE_LAST_STATE}).
984
985    # Set the bmc_power_policy_method to either 'Old' or 'New'.
986    Set Power Policy Method
987    # This translation helps bridge between old and new method for calling.
988    ${policy}=  Translate Power Policy Value  ${policy}
989    # Run the appropriate keyword.
990    Run Key  ${bmc_power_policy_method} Set Power Policy \ ${policy}
991    ${currentPolicy}=  Get System Power Policy
992    Should Be Equal    ${currentPolicy}   ${policy}
993
994
995New Set Power Policy
996    [Documentation]   Set the given BMC power policy (new method).
997    [Arguments]   ${policy}
998
999    # Description of argument(s):
1000    # policy    Power restore policy (e.g. ${ALWAYS_POWER_OFF}).
1001
1002    ${valueDict}=  Create Dictionary  data=${policy}
1003    Write Attribute
1004    ...  ${POWER_RESTORE_URI}  PowerRestorePolicy  data=${valueDict}
1005
1006
1007Old Set Power Policy
1008    [Documentation]   Set the given BMC power policy (old method).
1009    [Arguments]   ${policy}
1010
1011    # Description of argument(s):
1012    # policy    Power restore policy (e.g. "ALWAYS_POWER_OFF").
1013
1014    ${valueDict}=     create dictionary  data=${policy}
1015    Write Attribute    ${HOST_SETTING}    power_policy   data=${valueDict}
1016
1017
1018Get System Power Policy
1019    [Documentation]  Returns the BMC power policy.
1020
1021    # Set the bmc_power_policy_method to either 'Old' or 'New'.
1022    Set Power Policy Method
1023    ${cmd_buf}=  Create List  ${bmc_power_policy_method} Get Power Policy
1024    # Run the appropriate keyword.
1025    ${currentPolicy}=  Run Keyword  @{cmd_buf}
1026
1027    [Return]  ${currentPolicy}
1028
1029
1030New Get Power Policy
1031    [Documentation]  Returns the BMC power policy (new method).
1032    ${currentPolicy}=  Read Attribute  ${POWER_RESTORE_URI}  PowerRestorePolicy
1033
1034    [Return]  ${currentPolicy}
1035
1036
1037Old Get Power Policy
1038    [Documentation]  Returns the BMC power policy (old method).
1039    ${currentPolicy}=  Read Attribute  ${HOST_SETTING}  power_policy
1040
1041    [Return]  ${currentPolicy}
1042
1043
1044Get Auto Reboot
1045    [Documentation]  Returns auto reboot setting.
1046    ${setting}=  Read Attribute  ${CONTROL_HOST_URI}/auto_reboot  AutoReboot
1047
1048    [Return]  ${setting}
1049
1050
1051Set Auto Reboot
1052    [Documentation]  Set the given auto reboot setting.
1053    [Arguments]  ${setting}
1054
1055    # Description of argument(s):
1056    # setting    The reboot setting, 1 for enabling and 0 for disabling.
1057
1058    ${valueDict}=  Set Variable  ${setting}
1059    ${data}=  Create Dictionary  data=${valueDict}
1060    Write Attribute  ${CONTROL_HOST_URI}/auto_reboot  AutoReboot   data=${data}
1061    ${current_setting}=  Get Auto Reboot
1062    Should Be Equal As Integers  ${current_setting}  ${setting}
1063
1064
1065Set BMC Reset Reference Time
1066    [Documentation]  Set current boot time as a reference and increment
1067    ...              boot count.
1068
1069    ${cur_btime}=  Get BMC Boot Time
1070    Run Keyword If  ${BOOT_TIME} == ${0} and ${BOOT_COUNT} == ${0}
1071    ...  Set Global Variable  ${BOOT_TIME}  ${cur_btime}
1072    ...  ELSE IF  ${cur_btime} > ${BOOT_TIME}
1073    ...  Run Keywords  Set Global Variable  ${BOOT_TIME}  ${cur_btime}
1074    ...  AND
1075    ...  Set Global Variable  ${BOOT_COUNT}  ${BOOT_COUNT + 1}
1076
1077
1078Get BMC Boot Time
1079    [Documentation]  Returns boot time from /proc/stat.
1080
1081    Open Connection And Log In
1082    ${output}  ${stderr}=
1083    ...  Execute Command  egrep '^btime ' /proc/stat | cut -f 2 -d ' '
1084    ...  return_stderr=True
1085    Should Be Empty  ${stderr}
1086    ${btime}=  Convert To Integer  ${output}
1087    [Return]  ${btime}
1088
1089
1090Execute Command On BMC
1091    [Documentation]  Execute given command on BMC and return output.
1092    [Arguments]  ${command}
1093
1094    # Description of argument(s):
1095    # command    The command to execute on the BMC.
1096
1097    ${stdout}  ${stderr}=  Execute Command  ${command}  return_stderr=True
1098    Should Be Empty  ${stderr}
1099    [Return]  ${stdout}
1100
1101
1102Enable Core Dump On BMC
1103    [Documentation]  Enable core dump collection.
1104    Open Connection And Log In
1105    ${core_pattern}=  Execute Command On BMC
1106    ...  echo '/tmp/core_%e.%p' | tee /proc/sys/kernel/core_pattern
1107    Should Be Equal As Strings  ${core_pattern}  /tmp/core_%e.%p
1108
1109
1110Get Number Of BMC Core Dump Files
1111    [Documentation]  Returns number of core dump files on BMC.
1112    Open Connection And Log In
1113    ${num_of_core_dump}=  Execute Command
1114    ...  ls /tmp/core* 2>/dev/null | wc -l
1115    [Return]  ${num_of_core_dump}
1116
1117
1118Set Core Dump File Size Unlimited
1119    [Documentation]  Set core dump file size to unlimited.
1120    Open Connection And Log In
1121    Execute Command On BMC
1122    ...  ulimit -c unlimited
1123
1124
1125Check For Core Dumps
1126    [Documentation]  Check for any core dumps exist.
1127    ${output}=  Get Number Of BMC Core Dump Files
1128    Run Keyword If  ${output} > 0
1129    ...  Log  **Warning** BMC core dump files exist  level=WARN
1130
1131
1132Trigger Host Watchdog Error
1133    [Documentation]  Inject host watchdog timeout error via REST.
1134    [Arguments]  ${milliseconds}=1000  ${sleep_time}=5s
1135
1136    # Description of argument(s):
1137    # milliseconds  The time watchdog timer value in milliseconds (e.g. 1000 =
1138    #               1 second).
1139    # sleep_time    Time delay for host watchdog error to get injected.
1140    #               Default is 5 seconds.
1141
1142    ${data}=  Create Dictionary  data=${True}
1143    Write Attribute  /xyz/openbmc_project/watchdog/host0  Enabled  data=${data}
1144
1145    ${data}=  Create Dictionary  data=${milliseconds}
1146    Write Attribute  /xyz/openbmc_project/watchdog/host0  TimeRemaining
1147    ...  data=${data}
1148
1149    Sleep  ${sleep_time}
1150
1151
1152Login To OS Host
1153    [Documentation]  Login to OS Host and return the Login response code.
1154    [Arguments]  ${os_host}=${OS_HOST}  ${os_username}=${OS_USERNAME}
1155    ...          ${os_password}=${OS_PASSWORD}
1156
1157    # Description of arguments:
1158    # ${os_host} IP address of the OS Host.
1159    # ${os_username}  OS Host Login user name.
1160    # ${os_password}  OS Host Login passwrd.
1161
1162    ${os_state}=  Run Keyword And Return Status  Ping Host  ${os_host}
1163    Run Keyword If  '${os_state}' == 'False'
1164    ...  Run Keywords  Initiate Host Reboot  AND
1165    ...  Is Host Running  AND
1166    ...  Wait for OS  ${os_host}  ${os_username}  ${os_password}
1167
1168    SSHLibrary.Open Connection  ${os_host}
1169    ${resp}=  Login  ${os_username}  ${os_password}
1170    [Return]  ${resp}
1171
1172
1173Configure Initial Settings
1174    [Documentation]  Restore old IP and route.
1175    ...  This keyword requires initial settings viz IP address,
1176    ...  Network Mask, default gatway and serial console IP and port
1177    ...  information which should be provided in command line.
1178
1179    [Arguments]  ${host}=${OPENBMC_HOST}  ${mask}=${NET_MASK}
1180    ...          ${gw_ip}=${GW_IP}
1181
1182    # Description of arguments:
1183    # host  IP address of the OS Host.
1184    # mask  Network mask.
1185    # gu_ip  Gateway IP address or hostname.
1186
1187    # Open telnet connection and ignore the error, in case telnet session is
1188    # already opened by the program calling this keyword.
1189    Run Keyword And Ignore Error  Open Telnet Connection to BMC Serial Console
1190    Telnet.write  ifconfig eth0 ${host} netmask ${mask}
1191    Telnet.write  route add default gw ${gw_ip}
1192
1193
1194Install Debug Tarball On BMC
1195    [Documentation]  Copy the debug tar file to BMC and install.
1196    [Arguments]  ${tarball_file_path}=${default_tarball}
1197    ...  ${targ_tarball_dir_path}=/tmp/tarball/
1198
1199    # Description of arguments:
1200    # tarball_file_path      Path of the debug tarball file.
1201    #                        The tar file is downloaded from the build page
1202    #                        https://openpower.xyz/job/openbmc-build/
1203    #                        obmc-phosphor-debug-tarball-witherspoon.tar.xz
1204    #
1205    # targ_tarball_dir_path  The directory path where the tarball is to be
1206    #                        installed.
1207
1208    OperatingSystem.File Should Exist  ${tarball_file_path}
1209    ...  msg=${tarball_file_path} doesn't exist.
1210
1211    # Upload the file to BMC.
1212    Import Library  SCPLibrary  WITH NAME  scp
1213    Open Connection for SCP
1214    scp.Put File  ${tarball_file_path}  /tmp/debug-tarball.tar.xz
1215
1216    # Create tarball directory and install.
1217    BMC Execute Command  mkdir -p ${targ_tarball_dir_path}
1218    BMC Execute Command
1219    ...  tar -xf /tmp/debug-tarball.tar.xz -C ${targ_tarball_dir_path}
1220
1221    # Remove the tarball file from BMC.
1222    BMC Execute Command  rm -f /tmp/debug-tarball.tar.xz
1223
1224
1225Get BMC Boot Count
1226    [Documentation]  Returns BMC boot count based on boot time.
1227    ${cur_btime}=  Get BMC Boot Time
1228
1229    # Set global variable BOOT_TIME to current boot time if current boot time
1230    # is changed. Also increase value of global variable BOOT_COUNT by 1.
1231    Run Keyword If  ${cur_btime} > ${BOOT_TIME}
1232    ...  Run Keywords  Set Global Variable  ${BOOT_TIME}  ${cur_btime}
1233    ...  AND
1234    ...  Set Global Variable  ${BOOT_COUNT}  ${BOOT_COUNT + 1}
1235
1236    [Return]  ${BOOT_COUNT}
1237
1238
1239Set BMC Boot Count
1240    [Documentation]  Set BMC boot count to given value.
1241    [Arguments]  ${count}
1242
1243    # Description of arguments:
1244    # count  boot count value.
1245    ${cur_btime}=  Get BMC Boot Time
1246
1247    # Set global variable BOOT_COUNT to given value.
1248    Set Global Variable  ${BOOT_COUNT}  ${count}
1249
1250    # Set BOOT_TIME variable to current boot time.
1251    Set Global Variable  ${BOOT_COUNT}  ${count}
1252
1253
1254Get System LED State
1255    [Documentation]  Return the state of given system LED.
1256    [Arguments]  ${led_name}
1257
1258    # Description of argument(s):
1259    # led_name     System LED name (e.g. heartbeat, identify, beep).
1260
1261    ${state}=  Read Attribute  ${LED_PHYSICAL_URI}${led_name}  State
1262    [Return]  ${state.rsplit('.', 1)[1]}
1263
1264
1265Set System LED State
1266    [Documentation]  Set given system LED via REST.
1267    [Arguments]  ${led_name}  ${led_state}
1268    # Description of argument(s):
1269    # led_name     System LED name (e.g. heartbeat, identify, beep).
1270    # led_state    LED state to be set (e.g. On, Off).
1271
1272    ${args}=  Create Dictionary
1273    ...  data=xyz.openbmc_project.Led.Physical.Action.${led_state}
1274    Write Attribute  ${LED_PHYSICAL_URI}${led_name}  State  data=${args}
1275
1276    Verify LED State  ${led_name}  ${led_state}
1277
1278
1279Verify LED State
1280    [Documentation]  Checks if LED is in given state.
1281    [Arguments]  ${led_name}  ${led_state}
1282    # Description of argument(s):
1283    # led_name     System LED name (e.g. heartbeat, identify, beep).
1284    # led_state    LED state to be verified (e.g. On, Off).
1285
1286    ${state}=  Get System LED State  ${led_name}
1287    Should Be Equal  ${state}  ${led_state}
1288
1289
1290Get LED State XYZ
1291    [Documentation]  Returns state of given LED.
1292    [Arguments]  ${led_name}
1293
1294    # Description of argument(s):
1295    # led_name  Name of LED.
1296
1297    ${state}=  Read Attribute  ${LED_GROUPS_URI}${led_name}  Asserted
1298    # Returns the state of the LED, either On or Off.
1299    [Return]  ${state}
1300
1301
1302Delete Error Logs
1303    [Documentation]  Delete error logs.
1304
1305    # Check if error logs entries exist, if not return.
1306    ${resp}=  OpenBMC Get Request  ${BMC_LOGGING_ENTRY}${/}list  quiet=${1}
1307    Return From Keyword If  ${resp.status_code} == ${HTTP_NOT_FOUND}
1308
1309    # Get the list of error logs entries and delete them all.
1310    ${elog_entries}=  Get URL List  ${BMC_LOGGING_ENTRY}
1311    :FOR  ${entry}  IN  @{elog_entries}
1312    \  Delete Error Log Entry  ${entry}
1313
1314
1315Delete Error Log Entry
1316    [Documentation]  Delete error log entry.
1317    [Arguments]  ${entry_path}
1318
1319    # Description of argument(s):
1320    # entry_path  Delete an error log entry.
1321    #             Ex. /xyz/openbmc_project/logging/entry/1
1322
1323    # Skip delete if entry URI is a callout.
1324    # Example: /xyz/openbmc_project/logging/entry/1/callout
1325    Return From Keyword If  '${entry_path.rsplit('/', 1)[1]}' == 'callout'
1326
1327    ${data}=  Create Dictionary  data=@{EMPTY}
1328    ${resp}=  Openbmc Delete Request  ${entry_path}  data=${data}
1329    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
1330
1331
1332Delete All Error Logs
1333    [Documentation]  Delete all error log entries using "DeleteAll" interface.
1334
1335    ${data}=  Create Dictionary  data=@{EMPTY}
1336    ${resp}=  Openbmc Post Request  ${BMC_LOGGING_URI}action/DeleteAll
1337    ...  data=${data}
1338    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
1339
1340
1341Get BMC Version
1342    [Documentation]  Returns BMC version from /etc/os-release.
1343    ...              e.g. "v1.99.6-141-ge662190"
1344
1345    Open Connection And Log In
1346    ${cmd}=  Set Variable  grep ^VERSION_ID= /etc/os-release | cut -f 2 -d '='
1347    ${output}=  Execute Command On BMC  ${cmd}
1348    [Return]  ${output}
1349
1350
1351Get PNOR Version
1352    [Documentation]  Returns the PNOR version from the BMC.
1353
1354    ${pnor_attrs}=  Get PNOR Attributes
1355    [Return]  ${pnor_attrs['version']}
1356
1357
1358Get PNOR Attributes
1359    [Documentation]  Return PNOR software attributes as a dictionary.
1360
1361    # This keyword parses /var/lib/phosphor-software-manager/pnor/ro/pnor.toc
1362    # into key/value pairs.
1363
1364    ${outbuf}  ${stderr}  ${rc}=  BMC Execute Command
1365    ...  cat /var/lib/phosphor-software-manager/pnor/ro/pnor.toc
1366    ${pnor_attrs}=  Key Value Outbuf To Dict  ${outbuf}  delim==
1367
1368    [Return]  ${pnor_attrs}
1369
1370
1371Get Elog URL List
1372    [Documentation]  Return error log entry list of URLs.
1373
1374    ${url_list}=  Read Properties  /xyz/openbmc_project/logging/entry/
1375    Sort List  ${url_list}
1376    [Return]  ${url_list}
1377
1378
1379Read Turbo Setting Via REST
1380    [Documentation]  Return turbo setting via REST.
1381
1382    ${resp}=  OpenBMC Get Request  ${SENSORS_URI}host/TurboAllowed
1383    ${jsondata}=  To JSON  ${resp.content}
1384    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
1385    [Return]  ${jsondata["data"]["value"]}
1386
1387
1388Set Turbo Setting Via REST
1389    [Documentation]  Set turbo setting via REST.
1390    [Arguments]  ${setting}
1391
1392    # Description of argument(s):
1393    # setting  Value which needs to be set.(i.e. False or True).
1394
1395    ${valueDict}=  Create Dictionary  data=${setting}
1396    Write Attribute  ${SENSORS_URI}host/TurboAllowed  value  data=${valueDict}
1397
1398
1399Set Control Boot Mode
1400    [Documentation]  Set given boot mode on the boot object path attribute.
1401    [Arguments]  ${boot_path}  ${boot_mode}
1402
1403    # Description of argument(s):
1404    # boot_path  Boot object path.
1405    #            Example:
1406    #            /xyz/openbmc_project/control/host0/boot
1407    #            /xyz/openbmc_project/control/host0/boot/one_time
1408    # boot_mode  Boot mode which need to be set.
1409    #            Example:
1410    #            "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular"
1411
1412    ${valueDict}=  Create Dictionary  data=${boot_mode}
1413    Write Attribute  ${boot_path}  BootMode  data=${valueDict}
1414
1415
1416Copy Address Translation Utils To HOST OS
1417    [Documentation]  Copy address translation utils to host OS.
1418
1419    OperatingSystem.File Should Exist  ${probe_cpu_tool_path}
1420    ...  msg=${probe_cpu_tool_path} doesn't exist.
1421    OperatingSystem.File Should Exist  ${probe_cpu_tool_path}
1422    ...  msg=${probe_cpu_tool_path} doesn't exist.
1423
1424    scp.Open connection  ${OS_HOST}  username=${OS_USERNAME}
1425    ...  password=${OS_PASSWORD}
1426    scp.Put File  ${probe_cpu_tool_path}  ${target_file_path}
1427    scp.Put File  ${scom_addrs_tool_path}  ${target_file_path}
1428
1429
1430Verify BMC RTC And UTC Time Drift
1431    [Documentation]  Verify that the RTC and UTC time difference is less than
1432    ...              the given time_drift_max.
1433    [Arguments]  ${time_diff_max}=${10}
1434
1435    # Description of argument(s):
1436    # time_diff_max   The max allowable RTC and UTC time difference in seconds.
1437
1438    # Example:
1439    # time_dict:
1440    #   [local_time]:               Fri 2017-11-03 152756 UTC
1441    #   [local_time_seconds]:       1509740876
1442    #   [universal_time]:           Fri 2017-11-03 152756 UTC
1443    #   [universal_time_seconds]:   1509740876
1444    #   [rtc_time]:                 Fri 2016-05-20 163403
1445    #   [rtc_time_seconds]:         1463780043
1446    #   [time_zone]:                n/a (UTC, +0000)
1447    #   [network_time_on]:          yes
1448    #   [ntp_synchronized]:         no
1449    #   [rtc_in_local_tz]:          no
1450
1451    ${time}=  Get BMC Date Time
1452    ${time_diff}=  Evaluate
1453    ...  ${time['universal_time_seconds']} - ${time['rtc_time_seconds']}
1454    Should Be True  ${time_diff} < ${time_diff_max}
1455
1456
1457Watchdog Object Should Exist
1458    [Documentation]  Check that watchdog object exists.
1459
1460    ${resp}=  OpenBMC Get Request  ${WATCHDOG_URI}host0
1461    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
1462    ...  msg=Expected watchdog object does not exist.
1463
1464
1465Validate IP On BMC
1466    [Documentation]  Validate IP address is present in set of IP addresses.
1467    [Arguments]  ${ip_address}  ${ip_data}
1468
1469    # Description of argument(s):
1470    # ip_address  IP address to check (e.g. xx.xx.xx.xx).
1471    # ip_data     Set of the IP addresses present.
1472
1473    Should Contain Match  ${ip_data}  ${ip_address}/*
1474    ...  msg=${ip_address} not found in the list provided.
1475
1476
1477Remove Journald Logs
1478    [Documentation]  Remove all journald logs and restart service.
1479
1480    ${cmd}=  Catenate  systemctl stop systemd-journald.service &&
1481    ...  rm -rf /var/log/journal && systemctl start systemd-journald.service
1482
1483    BMC Execute Command  ${cmd}
1484
1485