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