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