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