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