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