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