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