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