1*** Settings ***
2
3Documentation  Utilities for Robot keywords that use REST.
4
5Resource                ../lib/resource.robot
6Resource                ../lib/rest_client.robot
7Resource                ../lib/connection_client.robot
8Resource                ../lib/boot_utils.robot
9Resource                ../lib/common_utils.robot
10Resource                ../lib/bmc_redfish_utils.robot
11Library                 String
12Library                 DateTime
13Library                 Process
14Library                 OperatingSystem
15Library                 gen_print.py
16Library                 gen_misc.py
17Library                 gen_robot_print.py
18Library                 gen_cmd.py
19Library                 gen_robot_keyword.py
20Library                 bmc_ssh_utils.py
21Library                 utils.py
22Library                 var_funcs.py
23Library                 SCPLibrary  WITH NAME  scp
24Library                 gen_robot_valid.py
25Library                 pldm_utils.py
26
27
28*** Variables ***
29
30${SYSTEM_SHUTDOWN_TIME}   ${5}
31
32# Assign default value to QUIET for programs which may not define it.
33${QUIET}  ${0}
34
35${HOST_SETTING}    ${SETTINGS_URI}host0
36
37${boot_prog_method}               ${EMPTY}
38${power_policy_setup}             ${0}
39${bmc_power_policy_method}        ${EMPTY}
40@{BOOT_PROGRESS_STATES}           SystemHardwareInitializationComplete  OSBootStarted  OSRunning
41
42${REDFISH_SYS_STATE_WAIT_TIMEOUT}    120 Seconds
43
44*** Keywords ***
45
46
47Verify Ping and REST Authentication
48    [Documentation]  Verify ping and rest authentication.
49    ${l_ping}=   Run Keyword And Return Status
50    ...    Ping Host  ${OPENBMC_HOST}
51    Run Keyword If  '${l_ping}' == '${False}'
52    ...    Fail   msg=Ping Failed
53
54    ${l_rest}=   Run Keyword And Return Status
55    ...    Initialize OpenBMC
56    Run Keyword If  '${l_rest}' == '${False}'
57    ...    Fail   msg=REST Authentication Failed
58
59    # Just to make sure the SSH is working for SCP
60    Open Connection And Log In
61    ${system}   ${stderr}=    Execute Command   hostname   return_stderr=True
62    Should Be Empty     ${stderr}
63
64
65Verify Ping SSH And Redfish Authentication
66    [Documentation]  Verify ping, SSH and redfish authentication.
67
68    ${l_ping}=   Run Keyword And Return Status  Ping Host  ${OPENBMC_HOST}
69    Run Keyword If  '${l_ping}' == '${False}'  Fail   msg=Ping Failed
70
71    ${l_rest}=   Run Keyword And Return Status   Redfish.Login
72    Run Keyword If  '${l_rest}' == '${False}'  Fail   msg=REST Authentication Failed
73
74    # Just to make sure the SSH is working.
75    Open Connection And Log In
76    ${system}   ${stderr}=    Execute Command   hostname   return_stderr=True
77    Should Be Empty     ${stderr}
78
79
80Check If BMC is Up
81    [Documentation]  Wait for Host to be online. Checks every X seconds
82    ...              interval for Y minutes and fails if timed out.
83    ...              Default MAX timedout is 10 min, interval 10 seconds.
84    [Arguments]      ${max_timeout}=${OPENBMC_REBOOT_TIMEOUT} min
85    ...              ${interval}=10 sec
86
87    # Description of argument(s):
88    # max_timeout   Maximum time to wait.
89    #               This should be expressed in Robot Framework's time format
90    #               (e.g. "10 minutes").
91    # interval      Interval to wait between status checks.
92    #               This should be expressed in Robot Framework's time format
93    #               (e.g. "5 seconds").
94
95    Wait Until Keyword Succeeds
96    ...   ${max_timeout}  ${interval}   Verify Ping and REST Authentication
97
98
99Flush REST Sessions
100    [Documentation]   Removes all the active session objects
101    Delete All Sessions
102
103
104Trigger Host Watchdog Error
105    [Documentation]  Inject host watchdog timeout error via REST.
106    [Arguments]  ${milliseconds}=1000  ${sleep_time}=5s
107
108    # Description of argument(s):
109    # milliseconds  The time watchdog timer value in milliseconds (e.g. 1000 =
110    #               1 second).
111    # sleep_time    Time delay for host watchdog error to get injected.
112    #               Default is 5 seconds.
113
114    ${data}=  Create Dictionary
115    ...  data=xyz.openbmc_project.State.Watchdog.Action.PowerCycle
116    ${status}  ${result}=  Run Keyword And Ignore Error
117    ...  Read Attribute  ${HOST_WATCHDOG_URI}  ExpireAction
118    Run Keyword If  '${status}' == 'PASS'
119    ...  Write Attribute  ${HOST_WATCHDOG_URI}  ExpireAction  data=${data}
120
121    ${int_milliseconds}=  Convert To Integer  ${milliseconds}
122    ${data}=  Create Dictionary  data=${int_milliseconds}
123    Write Attribute  ${HOST_WATCHDOG_URI}  Interval  data=${data}
124
125    ${data}=  Create Dictionary  data=${True}
126    Write Attribute  ${HOST_WATCHDOG_URI}  Enabled  data=${data}
127
128    Sleep  ${sleep_time}
129
130
131Login To OS Host
132    [Documentation]  Login to OS Host and return the Login response code.
133    [Arguments]  ${os_host}=${OS_HOST}  ${os_username}=${OS_USERNAME}
134    ...          ${os_password}=${OS_PASSWORD}
135
136    # Description of arguments:
137    # ${os_host} IP address of the OS Host.
138    # ${os_username}  OS Host Login user name.
139    # ${os_password}  OS Host Login passwrd.
140
141    Redfish Power On  stack_mode=skip  quiet=1
142
143    SSHLibrary.Open Connection  ${os_host}
144    ${resp}=  SSHLibrary.Login  ${os_username}  ${os_password}
145    RETURN  ${resp}
146
147
148Initiate Auto Reboot
149    [Documentation]  Initiate an auto reboot.
150    [Arguments]  ${milliseconds}=5000
151
152    # Description of argument(s):
153    # milliseconds  The number of milliseconds for the watchdog timer.
154
155    # Set the auto reboot policy.
156    Set Auto Reboot  ${1}
157    # Set the watchdog timer.
158    Trigger Host Watchdog Error  ${milliseconds}
159
160
161Initiate OS Host Reboot
162    [Documentation]  Initiate an OS reboot.
163    [Arguments]  ${os_host}=${OS_HOST}  ${os_username}=${OS_USERNAME}
164    ...          ${os_password}=${OS_PASSWORD}
165
166    # Description of argument(s):
167    # os_host      The host name or IP address of the OS.
168    # os_username  The username to be used to sign in to the OS.
169    # os_password  The password to be used to sign in to the OS.
170
171    ${cmd_buf}=  Run Keyword If  '${os_username}' == 'root'
172    ...      Set Variable  reboot
173    ...  ELSE
174    ...      Set Variable  echo ${os_password} | sudo -S reboot
175
176    ${output}  ${stderr}  ${rc}=  OS Execute Command
177    ...  ${cmd_buf}  fork=${1}
178
179
180Initiate OS Host Power Off
181    [Documentation]  Initiate an OS reboot.
182    [Arguments]  ${os_host}=${OS_HOST}  ${os_username}=${OS_USERNAME}
183    ...          ${os_password}=${OS_PASSWORD}  ${hard}=${0}
184
185    # Description of argument(s):
186    # os_host      The DNS name or IP of the OS.
187    # os_username  The username to be used to sign in to the OS.
188    # os_password  The password to be used to sign in to the OS.
189    # hard         Indicates whether to do a hard vs. soft power off.
190
191    ${time_string}=  Run Keyword If  ${hard}  Set Variable  ${SPACE}now
192    ...  ELSE  Set Variable  ${EMPTY}
193
194    ${cmd_buf}=  Run Keyword If  '${os_username}' == 'root'
195    ...      Set Variable  shutdown${time_string}
196    ...  ELSE
197    ...      Set Variable  echo ${os_password} | sudo -S shutdown${time_string}
198
199    ${output}  ${stderr}  ${rc}=  OS Execute Command
200    ...  ${cmd_buf}  fork=${1}
201
202
203Set System LED State
204    [Documentation]  Set given system LED via REST.
205    [Arguments]  ${led_name}  ${led_state}
206    # Description of argument(s):
207    # led_name     System LED name (e.g. heartbeat, identify, beep).
208    # led_state    LED state to be set (e.g. On, Off).
209
210    ${args}=  Create Dictionary
211    ...  data=xyz.openbmc_project.Led.Physical.Action.${led_state}
212    Write Attribute  ${LED_PHYSICAL_URI}${led_name}  State  data=${args}
213
214    Verify LED State  ${led_name}  ${led_state}
215
216
217Read Turbo Setting Via REST
218    [Documentation]  Return turbo setting via REST.
219    # Returns 1 if TurboAllowed, 0 if not.
220
221    ${turbo_setting}=  Read Attribute
222    ...  ${CONTROL_HOST_URI}turbo_allowed  TurboAllowed
223    RETURN  ${turbo_setting}
224
225
226Set Turbo Setting Via REST
227    [Documentation]  Set turbo setting via REST.
228    [Arguments]  ${setting}  ${verify}=${False}
229
230    # Description of argument(s):
231    # setting  State to set TurboAllowed, 1=allowed, 0=not allowed.
232    # verify   If True, read the TurboAllowed setting to confirm.
233
234    ${data}=  Create Dictionary  data=${${setting}}
235    Write Attribute  ${CONTROL_HOST_URI}turbo_allowed  TurboAllowed
236    ...  verify=${verify}  data=${data}
237
238
239Set REST Logging Policy
240    [Documentation]  Enable or disable REST logging setting.
241    [Arguments]  ${policy_setting}=${True}
242
243    # Description of argument(s):
244    # policy_setting    The policy setting value which can be either
245    #                   True or False.
246
247    ${log_dict}=  Create Dictionary  data=${policy_setting}
248    Write Attribute  ${BMC_LOGGING_URI}rest_api_logs  Enabled
249    ...  data=${log_dict}  verify=${1}  expected_value=${policy_setting}
250
251
252Old Get Boot Progress
253    [Documentation]  Get the boot progress the old way (via org location).
254    [Arguments]  ${quiet}=${QUIET}
255
256    # Description of argument(s):
257    # quiet   Indicates whether this keyword should run without any output to
258    #         the console.
259
260    ${state}=  Read Attribute  ${OPENBMC_BASE_URI}sensors/host/BootProgress
261    ...  value  quiet=${quiet}
262
263    RETURN  ${state}
264
265
266Set Boot Progress Method
267    [Documentation]  Set the boot_prog_method to either 'Old' or 'New'.
268
269    # The boot progress data has moved from an 'org' location to an 'xyz'
270    # location.  This keyword will determine whether the new method of getting
271    # the boot progress is valid and will set the global boot_prog_method
272    # variable accordingly.  If boot_prog_method is already set (either by a
273    # prior call to this function or via a -v parm), this keyword will simply
274    # return.
275
276    # Note:  There are interim builds that contain boot_progress in both the
277    # old and the new location values.  It is nearly impossible for this
278    # keyword to determine whether the old boot_progress or the new one is
279    # active.  When using such builds where the old boot_progress is active,
280    # the only recourse users will have is that they may specify
281    # -v boot_prog_method:Old to force old behavior on such builds.
282
283    Run Keyword If  '${boot_prog_method}' != '${EMPTY}'  Return From Keyword
284
285    ${new_status}  ${new_value}=  Run Keyword And Ignore Error
286    ...  New Get Boot Progress
287    # If the new style read fails, the method must necessarily be "Old".
288    Run Keyword If  '${new_status}' == 'PASS'
289    ...  Run Keywords
290    ...  Set Global Variable  ${boot_prog_method}  New  AND
291    ...  Rqpvars  boot_prog_method  AND
292    ...  Return From Keyword
293
294    # Default method is "Old".
295    Set Global Variable  ${boot_prog_method}  Old
296    Rqpvars  boot_prog_method
297
298
299Initiate Power On
300    [Documentation]  Initiates the power on and waits until the Is Power On
301    ...  keyword returns that the power state has switched to on.
302    [Arguments]  ${wait}=${1}
303
304    # Description of argument(s):
305    # wait   Indicates whether to wait for a powered on state after issuing
306    #        the power on command.
307
308    @{arglist}=   Create List
309    ${args}=     Create Dictionary    data=@{arglist}
310    ${resp}=  Call Method  ${OPENBMC_BASE_URI}control/chassis0/  powerOn
311    ...  data=${args}
312    should be equal as strings      ${resp.status_code}     ${HTTP_OK}
313
314    # Does caller want to wait for power on status?
315    Run Keyword If  '${wait}' == '${0}'  Return From Keyword
316    Wait Until Keyword Succeeds  3 min  10 sec  Is Power On
317
318
319Initiate Power Off
320    [Documentation]  Initiates the power off and waits until the Is Power Off
321    ...  keyword returns that the power state has switched to off.
322
323    @{arglist}=   Create List
324    ${args}=     Create Dictionary    data=@{arglist}
325    ${resp}=  Call Method  ${OPENBMC_BASE_URI}control/chassis0/  powerOff
326    ...  data=${args}
327    should be equal as strings      ${resp.status_code}     ${HTTP_OK}
328    Wait Until Keyword Succeeds  1 min  10 sec  Is Power Off
329
330
331Get Boot Progress
332    [Documentation]  Get the boot progress and return it.
333    [Arguments]  ${quiet}=${QUIET}
334
335    # Description of argument(s):
336    # quiet   Indicates whether this keyword should run without any output to
337    #         the console.
338
339    Set Boot Progress Method
340    ${state}=  Run Keyword If  '${boot_prog_method}' == 'New'
341    ...      New Get Boot Progress  quiet=${quiet}
342    ...  ELSE
343    ...      Old Get Boot Progress  quiet=${quiet}
344
345    RETURN  ${state}
346
347
348New Get Boot Progress
349    [Documentation]  Get the boot progress the new way (via xyz location).
350    [Arguments]  ${quiet}=${QUIET}
351
352    # Description of argument(s):
353    # quiet   Indicates whether this keyword should run without any output to
354    #         the console.
355
356    ${state}=  Read Attribute  ${HOST_STATE_URI}  BootProgress  quiet=${quiet}
357
358    RETURN  ${state.rsplit('.', 1)[1]}
359
360
361New Get Power Policy
362    [Documentation]  Returns the BMC power policy (new method).
363    ${currentPolicy}=  Read Attribute  ${POWER_RESTORE_URI}  PowerRestorePolicy
364
365    RETURN  ${currentPolicy}
366
367
368Old Get Power Policy
369    [Documentation]  Returns the BMC power policy (old method).
370    ${currentPolicy}=  Read Attribute  ${HOST_SETTING}  power_policy
371
372    RETURN  ${currentPolicy}
373
374
375Redfish Get Power Restore Policy
376    [Documentation]  Returns the BMC power restore policy.
377
378    ${power_restore_policy}=  Redfish.Get Attribute  /redfish/v1/Systems/${SYSTEM_ID}  PowerRestorePolicy
379    RETURN  ${power_restore_policy}
380
381
382Get Auto Reboot
383    [Documentation]  Returns auto reboot setting.
384    ${setting}=  Read Attribute  ${CONTROL_HOST_URI}/auto_reboot  AutoReboot
385
386    RETURN  ${setting}
387
388
389Redfish Get Auto Reboot
390    [Documentation]  Returns auto reboot setting.
391
392    ${resp}=  Wait Until Keyword Succeeds  1 min  20 sec
393    ...  Redfish.Get Attribute  /redfish/v1/Systems/${SYSTEM_ID}  Boot
394    RETURN  ${resp["AutomaticRetryConfig"]}
395
396
397Trigger Warm Reset
398    [Documentation]  Initiate a warm reset.
399
400    log to console    "Triggering warm reset"
401    ${data}=   create dictionary   data=@{EMPTY}
402    ${resp}=  Openbmc Post Request
403    ...  ${OPENBMC_BASE_URI}control/bmc0/action/warmReset  data=${data}
404    Should Be Equal As Strings      ${resp.status_code}     ${HTTP_OK}
405    ${session_active}=   Check If warmReset is Initiated
406    Run Keyword If   '${session_active}' == '${True}'
407    ...    Fail   msg=warm reset didn't occur
408
409    Sleep   ${SYSTEM_SHUTDOWN_TIME}min
410    Check If BMC Is Up
411
412
413Get Power State
414    [Documentation]  Returns the power state as an integer. Either 0 or 1.
415    [Arguments]  ${quiet}=${QUIET}
416
417    # Description of argument(s):
418    # quiet   Indicates whether this keyword should run without any output to
419    #         the console.
420
421    @{arglist}=  Create List
422    ${args}=  Create Dictionary  data=@{arglist}
423
424    ${resp}=  Call Method  ${OPENBMC_BASE_URI}control/chassis0/  getPowerState
425    ...        data=${args}  quiet=${quiet}
426    Should be equal as strings  ${resp.status_code}  ${HTTP_OK}
427
428    RETURN  ${resp.json()["data"]}
429
430
431Clear BMC Gard Record
432    [Documentation]  Clear gard records from the system.
433
434    @{arglist}=  Create List
435    ${args}=  Create Dictionary  data=@{arglist}
436    ${resp}=  Call Method
437    ...  ${OPENPOWER_CONTROL}gard  Reset  data=${args}
438    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
439
440
441Flash PNOR
442    [Documentation]    Calls flash bios update method to flash PNOR image
443    [Arguments]    ${pnor_image}
444
445    # Description of argument(s):
446    # pnor_image  The filename and path of the PNOR image
447    #             (e.g. "/home/image/zaius.pnor").
448
449    @{arglist}=   Create List    ${pnor_image}
450    ${args}=     Create Dictionary    data=@{arglist}
451    ${resp}=  Call Method  /org/openbmc/control/flash/bios/  update
452    ...  data=${args}
453    should be equal as strings      ${resp.status_code}     ${HTTP_OK}
454    Wait Until Keyword Succeeds    2 min   10 sec    Is PNOR Flashing
455
456
457Get Flash BIOS Status
458    [Documentation]  Returns the status of the flash BIOS API as a string. For
459    ...              example 'Flashing', 'Flash Done', etc
460    ${data}=  Read Properties  /org/openbmc/control/flash/bios
461    RETURN    ${data['status']}
462
463
464Is PNOR Flashing
465    [Documentation]  Get BIOS 'Flashing' status. This indicates that PNOR
466    ...              flashing has started.
467    ${status}=    Get Flash BIOS Status
468    Should Contain  ${status}  Flashing
469
470
471Is PNOR Flash Done
472    [Documentation]  Get BIOS 'Flash Done' status.  This indicates that the
473    ...              PNOR flashing has completed.
474    ${status}=    Get Flash BIOS Status
475    should be equal as strings     ${status}     Flash Done
476
477
478Create OS Console File Path
479    [Documentation]  Create OS console file path name and return it.
480    [Arguments]  ${log_file_path}=${EMPTY}
481
482    # Description of arguments:
483    # file_path  The caller's candidate value.  If this value is ${EMPTY}, this
484    #            keyword will compose a file path name.  Otherwise, this
485    #            keyword will use the caller's file_path value.  In either
486    #            case, the value will be returned.
487
488    ${status}=  Run Keyword And Return Status  Variable Should Exist
489    ...  ${TEST_NAME}
490
491    ${default_file_path}=  Set Variable If  ${status} == ${TRUE}
492    ...  ${EXECDIR}${/}tmp${/}${OPENBMC_HOST}_${TEST_NAME.replace(' ', '')}_os_console.txt
493    ...  ${EXECDIR}${/}tmp${/}${OPENBMC_HOST}_os_console.txt
494
495    ${log_file_path}=  Set Variable If  '${log_file_path}' == '${EMPTY}'
496    ...  ${default_file_path}  ${log_file_path}
497
498    RETURN  ${log_file_path}
499
500
501Get Endpoint Paths
502    [Documentation]   Returns all url paths ending with given endpoint
503    ...               Example:
504    ...               Given the following endpoint: cpu
505    ...               This keyword will return: list of all urls ending with
506    ...               cpu -
507    ...               /org/openbmc/inventory/system/chassis/motherboard/cpu0,
508    ...               /org/openbmc/inventory/system/chassis/motherboard/cpu1
509    [Arguments]   ${path}   ${endpoint}
510
511    # Description of arguments:
512    # path       URL path for enumeration.
513    # endpoint   Endpoint string (url path ending).
514
515    # Make sure path ends with slash.
516    ${path}=  Add Trailing Slash  ${path}
517
518    ${resp}=  Read Properties  ${path}enumerate  timeout=30
519    Log Dictionary  ${resp}
520
521    ${list}=  Get Dictionary Keys  ${resp}
522    # For a given string, look for prefix and suffix for matching expression.
523    # Start of string followed by zero or more of any character followed by
524    # any digit or lower case character.
525    ${resp}=  Get Matches  ${list}  regexp=^.*[0-9a-z_].${endpoint}\[_0-9a-z]*$  case_insensitive=${True}
526
527    RETURN  ${resp}
528
529
530Set BMC Power Policy
531    [Documentation]   Set the given BMC power policy.
532    [Arguments]   ${policy}
533
534    # Note that this function will translate the old style "RESTORE_LAST_STATE"
535    # policy to the new style "xyz.openbmc_project.Control.Power.RestorePolicy.
536    # Policy.Restore" for you.
537
538    # Description of argument(s):
539    # policy    Power restore policy (e.g "RESTORE_LAST_STATE",
540    #           ${RESTORE_LAST_STATE}).
541
542    # Set the bmc_power_policy_method to either 'Old' or 'New'.
543    Set Power Policy Method
544    # This translation helps bridge between old and new method for calling.
545    ${policy}=  Translate Power Policy Value  ${policy}
546    # Run the appropriate keyword.
547    Run Key  ${bmc_power_policy_method} Set Power Policy \ ${policy}
548    ${currentPolicy}=  Get System Power Policy
549    Should Be Equal    ${currentPolicy}   ${policy}
550
551
552Delete Error Logs
553    [Documentation]  Delete error logs.
554    [Arguments]  ${quiet}=${0}
555    # Description of argument(s):
556    # quiet    If enabled, turns off logging to console.
557
558    # Check if error logs entries exist, if not return.
559    ${resp}=  OpenBMC Get Request  ${BMC_LOGGING_ENTRY}list  quiet=${1}
560    Return From Keyword If  ${resp.status_code} == ${HTTP_NOT_FOUND}
561
562    # Get the list of error logs entries and delete them all.
563    ${elog_entries}=  Get URL List  ${BMC_LOGGING_ENTRY}
564    FOR  ${entry}  IN  @{elog_entries}
565        Delete Error Log Entry  ${entry}  quiet=${quiet}
566    END
567
568
569Delete All Error Logs
570    [Documentation]  Delete all error log entries using "DeleteAll" interface.
571
572    ${args}=  Set Variable   {"data": []}
573    ${resp}=  Openbmc Post Request  ${BMC_LOGGING_URI}action/DeleteAll
574    ...  data=${args}
575    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
576
577
578Get Elog URL List
579    [Documentation]  Return error log entry list of URLs.
580
581    ${url_list}=  Read Properties  /xyz/openbmc_project/logging/entry/
582    Sort List  ${url_list}
583    RETURN  ${url_list}
584
585
586Get BMC Flash Chip Boot Side
587    [Documentation]  Return the BMC flash chip boot side.
588
589    # Example:
590    # 0  - indicates chip select is current side.
591    # 32 - indicates chip select is alternate side.
592
593    ${boot_side}  ${stderr}  ${rc}=  BMC Execute Command
594    ...  cat /sys/class/watchdog/watchdog1/bootstatus
595
596    RETURN  ${boot_side}
597
598
599Watchdog Object Should Exist
600    [Documentation]  Check that watchdog object exists.
601
602    ${resp}=  OpenBMC Get Request  ${WATCHDOG_URI}host0
603    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
604    ...  msg=Expected watchdog object does not exist.
605
606
607Get System LED State
608    [Documentation]  Return the state of given system LED.
609    [Arguments]  ${led_name}
610
611    # Description of argument(s):
612    # led_name     System LED name (e.g. heartbeat, identify, beep).
613
614    ${state}=  Read Attribute  ${LED_PHYSICAL_URI}${led_name}  State
615    RETURN  ${state.rsplit('.', 1)[1]}
616
617
618Verify LED State
619    [Documentation]  Checks if LED is in given state.
620    [Arguments]  ${led_name}  ${led_state}
621    # Description of argument(s):
622    # led_name     System LED name (e.g. heartbeat, identify, beep).
623    # led_state    LED state to be verified (e.g. On, Off).
624
625    ${state}=  Get System LED State  ${led_name}
626    Should Be Equal  ${state}  ${led_state}
627
628
629Get LED State XYZ
630    [Documentation]  Returns state of given LED.
631    [Arguments]  ${led_name}
632
633    # Description of argument(s):
634    # led_name  Name of LED.
635
636    ${state}=  Read Attribute  ${LED_GROUPS_URI}${led_name}  Asserted
637    # Returns the state of the LED, either On or Off.
638    RETURN  ${state}
639
640
641Verify Identify LED State
642    [Documentation]  Verify that the identify state of the LED group matches caller's expectations.
643    [Arguments]  ${expected_state}
644
645    # Description of argument(s):
646    # expected_state  The expected LED asserted state (1 = asserted, 0 = not asserted).
647
648    ${led_state}=  Get LED State XYZ  enclosure_identify
649    Should Be Equal  ${led_state}  ${expected_state}  msg=Unexpected LED state.
650
651Verify The Attribute
652    [Documentation]  Verify the given attribute.
653    [Arguments]  ${uri}  ${attribute_name}  ${attribute_value}
654
655    # Description of argument(s):
656    # uri              URI path
657    #                  (e.g. "/xyz/openbmc_project/control/host0/TPMEnable").
658    # attribute_name   Name of attribute to be verified (e.g. "TPMEnable").
659    # attribute_value  The expected value of attribute (e.g. "1", "0", etc.)
660
661    ${output}=  Read Attribute  ${uri}  ${attribute_name}
662    Should Be Equal  ${attribute_value}  ${output}
663    ...  msg=Attribute "${attribute_name} does not have the expected value.
664
665
666New Set Power Policy
667    [Documentation]   Set the given BMC power policy (new method).
668    [Arguments]   ${policy}
669
670    # Description of argument(s):
671    # policy    Power restore policy (e.g. ${ALWAYS_POWER_OFF}).
672
673    ${valueDict}=  Create Dictionary  data=${policy}
674    Write Attribute
675    ...  ${POWER_RESTORE_URI}  PowerRestorePolicy  data=${valueDict}
676
677
678Old Set Power Policy
679    [Documentation]   Set the given BMC power policy (old method).
680    [Arguments]   ${policy}
681
682    # Description of argument(s):
683    # policy    Power restore policy (e.g. "ALWAYS_POWER_OFF").
684
685    ${valueDict}=     create dictionary  data=${policy}
686    Write Attribute    ${HOST_SETTING}    power_policy   data=${valueDict}
687
688
689Redfish Set Power Restore Policy
690    [Documentation]   Set the BMC power restore policy.
691    [Arguments]   ${power_restore_policy}
692
693    # Description of argument(s):
694    # power_restore_policy    Power restore policy (e.g. "AlwaysOff", "AlwaysOn", "LastState").
695
696    Redfish.Patch  /redfish/v1/Systems/${SYSTEM_ID}  body={"PowerRestorePolicy": "${power_restore_policy}"}
697    ...  valid_status_codes=[${HTTP_OK}, ${HTTP_NO_CONTENT}]
698
699
700IPMI Set Power Restore Policy
701    [Documentation]   Set the BMC power restore policy using IPMI.
702    [Arguments]   ${power_restore_policy}=always-off
703
704    # Description of argument(s):
705    # power_restore_policy    Power restore policies
706    #                         always-on   : turn on when power is restored
707    #                         previous    : return to previous state when power is restored
708    #                         always-off  : stay off after power is restored
709
710    ${resp}=  Run IPMI Standard Command  chassis policy ${power_restore_policy}
711    # Example:  Set chassis power restore policy to always-off
712    Should Contain  ${resp}  ${power_restore_policy}
713
714
715Set Auto Reboot Setting
716    [Documentation]  Set the given auto reboot setting (REST or Redfish).
717    [Arguments]  ${value}
718
719    # Description of argument(s):
720    # value    The reboot setting, 1 for enabling and 0 for disabling.
721
722    # This is to cater to boot call points and plugin script which will always
723    # send using value 0 or 1. This dictionary maps to redfish string values.
724    ${rest_redfish_dict}=  Create Dictionary
725    ...                    1=RetryAttempts
726    ...                    0=Disabled
727
728    Run Keyword If  ${REDFISH_SUPPORT_TRANS_STATE} == ${1}
729    ...    Redfish Set Auto Reboot  ${rest_redfish_dict["${value}"]}
730    ...  ELSE
731    ...    Set Auto Reboot  ${value}
732
733Set Auto Reboot
734    [Documentation]  Set the given auto reboot setting.
735    [Arguments]  ${setting}
736
737    # Description of argument(s):
738    # setting    The reboot setting, 1 for enabling and 0 for disabling.
739
740    ${valueDict}=  Convert To Integer  ${setting}
741    ${data}=  Create Dictionary  data=${valueDict}
742    Write Attribute  ${CONTROL_HOST_URI}/auto_reboot  AutoReboot   data=${data}
743    ${current_setting}=  Get Auto Reboot
744    Should Be Equal As Integers  ${current_setting}  ${setting}
745
746
747Redfish Set Auto Reboot
748    [Documentation]  Set the given auto reboot setting.
749    [Arguments]  ${setting}
750
751    # Description of argument(s):
752    # setting    The reboot setting, "RetryAttempts" and "Disabled".
753
754    Redfish.Patch  /redfish/v1/Systems/${SYSTEM_ID}  body={"Boot": {"AutomaticRetryConfig": "${setting}"}}
755    ...  valid_status_codes=[${HTTP_OK}, ${HTTP_NO_CONTENT}]
756
757    ${current_setting}=  Redfish Get Auto Reboot
758    Should Be Equal As Strings  ${current_setting}  ${setting}
759
760
761Set Control Boot Mode
762    [Documentation]  Set given boot mode on the boot object path attribute.
763    [Arguments]  ${boot_path}  ${boot_mode}
764
765    # Description of argument(s):
766    # boot_path  Boot object path.
767    #            Example:
768    #            /xyz/openbmc_project/control/host0/boot
769    #            /xyz/openbmc_project/control/host0/boot/one_time
770    # boot_mode  Boot mode which need to be set.
771    #            Example:
772    #            "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular"
773
774    ${valueDict}=  Create Dictionary  data=${boot_mode}
775    Write Attribute  ${boot_path}  BootMode  data=${valueDict}
776
777
778Is Power On
779    [Documentation]  Verify that the BMC chassis state is on.
780    ${state}=  Get Power State
781    Should be equal  ${state}  ${1}
782
783
784Is Power Off
785    [Documentation]  Verify that the BMC chassis state is off.
786    ${state}=  Get Power State
787    Should be equal  ${state}  ${0}
788
789
790CLI Get BMC DateTime
791    [Documentation]  Returns BMC date time from date command.
792
793    ${bmc_time_via_date}  ${stderr}  ${rc}=  BMC Execute Command  date +"%Y-%m-%d %H:%M:%S"  print_err=1
794    RETURN  ${bmc_time_via_date}
795
796
797Update Root Password
798    [Documentation]  Update system "root" user password.
799    [Arguments]  ${openbmc_password}=${OPENBMC_PASSWORD}
800
801    # Description of argument(s):
802    # openbmc_password   The root password for the open BMC system.
803
804    @{password}=  Create List  ${openbmc_password}
805    ${data}=  Create Dictionary  data=@{password}
806
807    ${headers}=  Create Dictionary  Content-Type=application/json  X-Auth-Token=${XAUTH_TOKEN}
808    ${resp}=  POST On Session  openbmc  ${BMC_USER_URI}root/action/SetPassword
809    ...  data=${data}  headers=${headers}
810    Valid Value  resp.status_code  [${HTTP_OK}]
811
812
813Get Post Boot Action
814    [Documentation]  Get post boot action.
815
816    # Post code update action dictionary.
817    #
818    # {
819    #    BMC image: {
820    #        OnReset: Redfish OBMC Reboot (off),
821    #        Immediate: Wait For Reboot  start_boot_seconds=${state['epoch_seconds']}
822    #    },
823    #    Host image: {
824    #        OnReset: RF SYS GracefulRestart,
825    #        Immediate: Wait State  os_running_match_state  10 mins
826    #    }
827    # }
828
829    ${code_base_dir_path}=  Get Code Base Dir Path
830    ${post_code_update_actions}=  Evaluate
831    ...  json.load(open('${code_base_dir_path}data/applytime_table.json'))  modules=json
832    Rprint Vars  post_code_update_actions
833
834    RETURN  ${post_code_update_actions}
835
836
837Get Task State From File
838    [Documentation]  Get task states from pre-define data/task_state.json file.
839
840    # Example:  Task state JSON format.
841    #
842    # {
843    #   "TaskRunning": {
844    #           "TaskState": "Running",
845    #           "TaskStatus": "OK"
846    #   },
847    #   "TaskCompleted": {
848    #           "TaskState": "Completed",
849    #           "TaskStatus": "OK"
850    #   },
851    #   "TaskException": {
852    #           "TaskState": "Exception",
853    #           "TaskStatus": "Warning"
854    #   }
855    # }
856
857    # Python module: get_code_base_dir_path()
858    ${code_base_dir_path}=  Get Code Base Dir Path
859    ${task_state}=  Evaluate
860    ...  json.load(open('${code_base_dir_path}data/task_state.json'))  modules=json
861    Rprint Vars  task_state
862
863    RETURN  ${task_state}
864
865
866Redfish Set Boot Default
867    [Documentation]  Set and Verify Boot source override
868    [Arguments]      ${override_enabled}  ${override_target}  ${override_mode}=UEFI
869
870    # Description of argument(s):
871    # override_enabled    Boot source override enable type.
872    #                     ('Once', 'Continuous', 'Disabled').
873    # override_target     Boot source override target.
874    #                     ('Pxe', 'Cd', 'Hdd', 'Diags', 'BiosSetup', 'None').
875    # override_mode       Boot source override mode (relevant only for x86 arch).
876    #                     ('Legacy', 'UEFI').
877
878    ${data}=  Create Dictionary  BootSourceOverrideEnabled=${override_enabled}
879    ...  BootSourceOverrideTarget=${override_target}
880
881    Run Keyword If  '${PLATFORM_ARCH_TYPE}' == 'x86'
882    ...  Set To Dictionary  ${data}  BootSourceOverrideMode  ${override_mode}
883
884    ${payload}=  Create Dictionary  Boot=${data}
885
886    Redfish.Patch  /redfish/v1/Systems/${SYSTEM_ID}  body=&{payload}
887    ...  valid_status_codes=[${HTTP_OK},${HTTP_NO_CONTENT}]
888
889    ${resp}=  Redfish.Get Attribute  /redfish/v1/Systems/${SYSTEM_ID}  Boot
890    Should Be Equal As Strings  ${resp["BootSourceOverrideEnabled"]}  ${override_enabled}
891    Should Be Equal As Strings  ${resp["BootSourceOverrideTarget"]}  ${override_target}
892    Run Keyword If  '${PLATFORM_ARCH_TYPE}' == 'x86'
893    ...  Should Be Equal As Strings  ${resp["BootSourceOverrideMode"]}  ${override_mode}
894
895
896# Redfish state keywords.
897
898Redfish Get BMC State
899    [Documentation]  Return BMC health state.
900
901    # "Enabled" ->  BMC Ready, "Starting" -> BMC NotReady
902
903    # Example:
904    # "Status": {
905    #    "Health": "OK",
906    #    "HealthRollup": "OK",
907    #    "State": "Enabled"
908    # },
909
910    ${status}=  Wait Until Keyword Succeeds  1 min  20 sec
911    ...  Redfish.Get Attribute  /redfish/v1/Managers/${MANAGER_ID}  Status
912    RETURN  ${status["State"]}
913
914
915Redfish Verify BMC State
916    [Documentation]  Verify BMC state is enabled.
917    [Arguments]  ${match_state}=Enabled
918
919    # Description of argument(s):
920    # match_state    Expected match state (e.g. Enabled, Starting, Error)
921
922    ${Status}=  Wait Until Keyword Succeeds  1 min  20 sec
923    ...  Redfish.Get Attribute  /redfish/v1/Managers/${MANAGER_ID}  Status
924
925    Should Be Equal As Strings  ${match_state}  ${Status['State']}
926
927
928Redfish Get Host State
929    [Documentation]  Return host power and health state.
930
931    # Refer: http://redfish.dmtf.org/schemas/v1/Resource.json#/definitions/Status
932
933    # Example:
934    # "PowerState": "Off",
935    # "Status": {
936    #    "Health": "OK",
937    #    "HealthRollup": "OK",
938    #    "State": "StandbyOffline"
939    # },
940
941    ${chassis}=  Wait Until Keyword Succeeds  1 min  20 sec
942    ...  Redfish.Get Properties  /redfish/v1/Chassis/${CHASSIS_ID}
943    RETURN  ${chassis["PowerState"]}  ${chassis["Status"]["State"]}
944
945
946Redfish Get Boot Progress
947    [Documentation]  Return boot progress state.
948
949    # Example: /redfish/v1/Systems/system/
950    # "BootProgress": {
951    #    "LastState": "OSRunning"
952    # },
953
954    ${boot_progress}=  Wait Until Keyword Succeeds  1 min  20 sec
955    ...  Redfish.Get Properties  /redfish/v1/Systems/${SYSTEM_ID}/
956
957    Return From Keyword If  "${PLATFORM_ARCH_TYPE}" == "x86"
958    ...  NA  ${boot_progress["Status"]["State"]}
959
960    RETURN  ${boot_progress["BootProgress"]["LastState"]}  ${boot_progress["Status"]["State"]}
961
962
963Redfish Get States
964    [Documentation]  Return all the BMC and host states in dictionary.
965    [Timeout]  ${REDFISH_SYS_STATE_WAIT_TIMEOUT}
966
967    # Refer: openbmc/docs/designs/boot-progress.md
968
969    Redfish.Login
970
971    ${bmc_state}=  Redfish Get BMC State
972    ${chassis_state}  ${chassis_status}=  Redfish Get Host State
973    ${boot_progress}  ${host_state}=  Redfish Get Boot Progress
974
975    ${states}=  Create Dictionary
976    ...  bmc=${bmc_state}
977    ...  chassis=${chassis_state}
978    ...  host=${host_state}
979    ...  boot_progress=${boot_progress}
980
981    # Disable loggoing state to prevent huge log.html record when boot
982    # test is run in loops.
983    #Log  ${states}
984
985    RETURN  ${states}
986
987
988Is BMC Not Quiesced
989    [Documentation]  Verify BMC state is not quiesced.
990
991    ${bmc_state}=   Redfish Get States
992
993    Log To Console  BMC State : ${bmc_state}
994
995    Should Not Be Equal As Strings  Quiesced  ${bmc_state['bmc']}
996
997
998Is BMC Standby
999    [Documentation]  Check if BMC is ready and host at standby.
1000
1001    ${standby_states}=  Create Dictionary
1002    ...  bmc=Enabled
1003    ...  chassis=Off
1004    ...  host=Disabled
1005    ...  boot_progress=None
1006
1007    Run Keyword If  '${PLATFORM_ARCH_TYPE}' == 'x86'
1008    ...  Set To Dictionary  ${standby_states}  boot_progress=NA
1009
1010    Wait Until Keyword Succeeds  3 min  10 sec  Redfish Get States
1011
1012    Wait Until Keyword Succeeds  5 min  10 sec  Match State  ${standby_states}
1013
1014
1015Match State
1016    [Documentation]  Check if the expected and current states are matched.
1017    [Arguments]  ${match_state}
1018
1019    # Description of argument(s):
1020    # match_state      Expected states in dictionary.
1021
1022    ${current_state}=  Redfish Get States
1023    Dictionaries Should Be Equal  ${match_state}  ${current_state}
1024
1025
1026Wait For Host Boot Progress To Reach Required State
1027    [Documentation]  Wait till host boot progress reaches required state.
1028    [Arguments]      ${expected_boot_state}=OSRunning
1029
1030    # Description of argument(s):
1031    # expected_boot_state    Expected boot state. E.g. OSRunning, SystemInitComplete etc.
1032
1033    Wait Until Keyword Succeeds  ${power_on_timeout}  20 sec
1034    ...  Is Boot Progress At Required State  ${expected_boot_state}
1035
1036
1037Redfish Initiate Auto Reboot
1038    [Documentation]  Initiate an auto reboot.
1039    [Arguments]  ${interval}=2000
1040
1041    # Description of argument(s):
1042    # interval  Value in milliseconds to set Watchdog interval
1043
1044    # Set auto reboot policy
1045    Redfish Set Auto Reboot  RetryAttempts
1046
1047    Redfish Power Operation  On
1048
1049    Wait Until Keyword Succeeds  2 min  5 sec  Is Boot Progress Changed
1050
1051    # Set watchdog timer
1052    Set Watchdog Interval Using Busctl  ${interval}
1053
1054
1055Is Boot Progress Changed
1056    [Documentation]  Get BootProgress state and expect boot state mismatch.
1057    [Arguments]  ${boot_state}=None
1058
1059    # Description of argument(s):
1060    # boot_state   Value of the BootProgress state to match against.
1061
1062    ${boot_progress}  ${host_state}=  Redfish Get Boot Progress
1063
1064    Should Not Be Equal  ${boot_progress}   ${boot_state}
1065
1066
1067Is Boot Progress At Required State
1068    [Documentation]  Get BootProgress state and expect boot state to match.
1069    [Arguments]  ${boot_state}=None
1070
1071    # Description of argument(s):
1072    # boot_state   Value of the BootProgress state to match.
1073
1074    ${boot_progress}  ${host_state}=  Redfish Get Boot Progress
1075
1076    Should Be Equal  ${boot_progress}   ${boot_state}
1077
1078
1079Is Boot Progress At Any State
1080    [Documentation]  Get BootProgress state and expect boot state to match
1081    ...              with any of the states mentioned in the list.
1082    [Arguments]  ${boot_states}=@{BOOT_PROGRESS_STATES}
1083
1084    # Description of argument(s):
1085    # boot_states   List of the BootProgress states to match.
1086
1087    ${boot_progress}  ${host_state}=  Redfish Get Boot Progress
1088    Should Contain Any  ${boot_progress}  @{boot_states}
1089
1090
1091Is Host At State
1092    [Documentation]  Get Host state and check if it matches
1093    ...   user input expected state.
1094    [Arguments]  ${expected_host_state}
1095
1096    # Description of argument(s):
1097    # expected_host_state  Expected Host State to check.(e.g. Quiesced).
1098
1099    ${boot_progress}  ${host_state}=  Redfish Get Boot Progress
1100
1101    Should Be Equal  ${host_state}  ${expected_host_state}
1102
1103
1104Set Watchdog Interval Using Busctl
1105    [Documentation]  Set Watchdog time interval.
1106    [Arguments]  ${milliseconds}=1000
1107
1108    # Description of argument(s):
1109    # milliseconds     Time interval for watchdog timer
1110
1111    ${cmd}=  Catenate  busctl set-property xyz.openbmc_project.Watchdog
1112    ...                /xyz/openbmc_project/watchdog/host0
1113    ...                xyz.openbmc_project.State.Watchdog Interval t ${milliseconds}
1114    BMC Execute Command  ${cmd}
1115
1116
1117Stop PLDM Service And Wait
1118    [Documentation]  Stop PLDM service and wait for Host to initiate reset.
1119
1120    BMC Execute Command  systemctl stop pldmd.service
1121
1122
1123Get BIOS Attribute
1124    [Documentation]  Get the BIOS attribute for /redfish/v1/Systems/system/Bios.
1125
1126    # Python module:  get_member_list(resource_path)
1127    ${systems}=  Redfish_Utils.Get Member List  /redfish/v1/Systems
1128    ${bios_attr_dict}=  Redfish.Get Attribute  ${systems[0]}/Bios  Attributes
1129
1130    RETURN  ${bios_attr_dict}
1131
1132
1133Set BIOS Attribute
1134    [Documentation]  PATCH the BIOS attribute for /redfish/v1/Systems/system/Bios.
1135    [Arguments]  ${attribute_name}  ${attribute_value}
1136
1137    # Description of argument(s):
1138    # attribute_name     Any valid BIOS attribute.
1139    # attribute_value    Valid allowed attribute values.
1140
1141    # Python module:  get_member_list(resource_path)
1142    ${systems}=  Redfish_Utils.Get Member List  /redfish/v1/Systems
1143    Redfish.Patch  ${systems[0]}/Bios/Settings  body={"Attributes":{"${attribute_name}":"${attribute_value}"}}
1144
1145
1146Is BMC Operational
1147    [Documentation]  Check if BMC is enabled.
1148    [Teardown]  Redfish.Logout
1149
1150    Wait Until Keyword Succeeds  5 min  5 sec  Ping Host  ${OPENBMC_HOST}
1151    # In some of bmc stack, network services will gets loaded before redfish/ipmi services gets loaded.
1152    # Hence, 3mins sleep time is added to allow other service gets loaded.
1153    Sleep  180s
1154    Redfish.login
1155    ${bmc_status}=  Redfish Get BMC State
1156    Should Be Equal  ${bmc_status}  Enabled
1157
1158
1159PLDM Set BIOS Attribute
1160    [Documentation]  Set the BIOS attribute via pldmtool and verify the attribute is set.
1161    ...              Defaulted for fw_boot_side for boot test usage caller.
1162    [Arguments]  ${attribute_name}=fw_boot_side  ${attribute_value}=Temp
1163
1164    # Description of argument(s):
1165    # attribute_name      Valid BIOS attribute name e.g ("fw_boot_side")
1166    # attribute_value     Valid BIOS attribute value for fw_boot_side.
1167
1168    # PLDM response output example:
1169    # {
1170    #    "Response": "SUCCESS"
1171    # }
1172
1173    ${resp}=  pldmtool  bios SetBIOSAttributeCurrentValue -a ${attribute_name} -d ${attribute_value}
1174    Should Be Equal As Strings  ${resp["Response"]}  SUCCESS
1175
1176    # PLDM GET output example:
1177    # {
1178    #    "CurrentValue": "Temp"
1179    # }
1180
1181    ${pldm_output}=  PLDM Get BIOS Attribute  ${attribute_name}
1182    Should Be Equal As Strings  ${pldm_output["CurrentValue"]}  ${attribute_value}
1183    ...  msg=Expecting ${attribute_value} but got ${pldm_output["CurrentValue"]}
1184
1185
1186PLDM Get BIOS Attribute
1187    [Documentation]  Get the BIOS attribute via pldmtool for a given attribute and return value.
1188    [Arguments]  ${attribute_name}
1189
1190    # Description of argument(s):
1191    # attribute_name     Valid BIOS attribute name e.g ("fw_boot_side")
1192
1193    ${pldm_output}=  pldmtool  bios GetBIOSAttributeCurrentValueByHandle -a ${attribute_name}
1194    RETURN  ${pldm_output}
1195
1196
1197Verify Host Power State
1198    [Documentation]  Get the Host Power state and compare it with the expected state.
1199    [Arguments]  ${expected_power_state}
1200
1201    # Description of argument(s):
1202    # expected_power_state   State of Host e.g. Off or On.
1203
1204    ${power_state}  ${health_status}=  Redfish Get Host State
1205    Should Be Equal  ${power_state}  ${expected_power_state}
1206
1207
1208Verify Host Is Up
1209    [Documentation]  Verify Host is Up.
1210
1211    Wait Until Keyword Succeeds  3 min  30 sec  Verify Host Power State  On
1212    # Python module:  os_execute(cmd)
1213    Wait Until Keyword Succeeds  10 min  30 sec  OS Execute Command  uptime
1214