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