1*** Settings ***
2Documentation   This suite tests Timed Power On(TPO) feature via busctl command
3...             and verify the power status of the system.
4...
5...             System can be scheduled to Power ON at a specified time by using this feature.
6
7
8Resource        ../lib/boot_utils.robot
9Resource        ../lib/openbmc_ffdc.robot
10Resource        ../lib/bmc_redfish_resource.robot
11
12
13Suite Setup     Redfish.Login
14Suite Teardown  Redfish.Logout
15Test Setup      Test Setup Execution
16Test Teardown   Test Teardown Execution
17
18
19*** Variables ****
20
21${CMD_ENABLE_TPO}      busctl set-property xyz.openbmc_project.State.ScheduledHostTransition
22...   /xyz/openbmc_project/scheduled/host0 xyz.openbmc_project.State.ScheduledHostTransition
23...   ScheduledTransition s "xyz.openbmc_project.State.Host.Transition.On"
24
25${CMD_SET_TPO_TIME}    busctl set-property xyz.openbmc_project.State.ScheduledHostTransition
26...  /xyz/openbmc_project/scheduled/host0 xyz.openbmc_project.State.ScheduledHostTransition ScheduledTime t
27
28${CMD_GET_TPO_TIME}    busctl get-property xyz.openbmc_project.State.ScheduledHostTransition
29...  /xyz/openbmc_project/scheduled/host0 xyz.openbmc_project.State.ScheduledHostTransition ScheduledTime
30
31# Time in seconds.
32${TIMER_POWER_ON}      100
33
34# All current versions of the following distributions:
35#  - Red Hat Enterprise Linux
36#  - SUSE Linux Enterprise Server
37# Tested on RHEL 8.4.
38
39# Shut down the system and schedule it to restart in 1 hour.
40# User can input -v HOST_TIMER_POWER_ON:h24  ( e.g. 24 hours )
41${HOST_TIMER_POWER_ON}            h1
42${HOST_TIMED_POWER_ON_REQUEST}    set_poweron_time -d ${HOST_TIMER_POWER_ON} -s
43
44*** Test Cases ***
45
46Test Timed Powered On Via BMC
47    [Documentation]  Set time to power on host attribute ScheduledTime and expect
48    ...              the system to boot on scheduled time.
49    [Tags]  Test_Timed_Powered_On_Via_BMC
50
51    # Make sure the host is powered off.
52    Redfish Power Off  stack_mode=skip
53
54    # Set Host transition to ON to enable TPO.
55    BMC Execute Command  ${CMD_ENABLE_TPO}
56
57    ${tpo_set_value}=  Set Timer For Power ON
58    ${new_tpo_value}=  Get Time Power ON Value
59
60    Should Be Equal  ${new_tpo_value}  ${tpo_set_value}
61    ...  msg=TPO time set mismatched.
62
63    # Check if the system BootProgress state changed. If changed, it implies the
64    # system is powering on. Though we have set system to power on in 100 seconds
65    # since, the system boot sometime to change.
66    Wait Until Keyword Succeeds  10 min  20 sec  Is Boot Progress Changed
67
68    Log To Console   BMC Scheduled Time Power on success.
69
70
71Test Timed Powered On Via Host OS
72    [Documentation]  Set time to power on host via service aids tool set_poweron_time
73    ...              and expect the system to boot on scheduled time.
74    [Tags]  Test_Timed_Powered_On_Via_Host_OS
75
76    # Make sure the host is powered on and booted to host OS partition.
77    Redfish Power On
78
79    ${stdout}  ${stderr}  ${rc}=  OS Execute Command  which set_poweron_time  ignore_err=${0}
80    # Skip the test if the tool does not exist or error getting the tool.
81    Skip If  ${rc} != ${0}  INFO: ${stdout} Skip the test since the tool does not. Install and re-run.
82
83    # Set Host transition to ON to enable TPO.
84    ${stdout}  ${stderr}  ${rc}=  OS Execute Command  ${HOST_TIMED_POWER_ON_REQUEST}  ignore_err=${0}
85
86    # Wait for host to Power off.
87    Wait Until Keyword Succeeds  45 min  30 sec  Is BMC Standby
88
89    Log To Console  Power Off completed.
90
91    # Note: The verification could more precise by checking date and set time.
92
93    # Check if the system BootProgress state changed. If changed, it implies the
94    # system is powering on after user timer set and delta time to update BootProgress
95    # state by the state manager.
96    # ${HOST_TIMER_POWER_ON} is in <m/h/d/><time> format
97    # Example:  h1 , logic to convert  x[1:] -> 1 and x[:1] ->h  to robot format 1 h.
98
99    Log To Console  Waiting for system to power on.
100    Wait Until Keyword Succeeds  ${HOST_TIMER_POWER_ON[1:]} ${HOST_TIMER_POWER_ON[:1]}  30 sec
101    ...  Is Boot Progress Changed
102
103    Log To Console   Host Scheduled Time Power on success.
104
105
106*** Keywords ***
107
108Test Setup Execution
109    [Documentation]  Do test case setup tasks.
110
111    Redfish.Login
112    Set Power Policy For TPO  Automatic
113
114
115Set Power Policy For TPO
116    [Documentation]   Change 'server power policy' option to automatic.
117    [Arguments]  ${power_policy_mode}
118
119    # Description of argument(s):
120    # power_policy_mode           BIOS attribute value. E.g. "Stay On", "Automatic".
121
122    Redfish.Patch  /redfish/v1/Systems/${SYSTEM_ID}/Bios/Settings
123    ...  body={"Attributes":{"pvm_system_power_off_policy": "${power_policy_mode}"}}
124    ...  valid_status_codes=[${HTTP_OK}]
125
126
127Test Teardown Execution
128    [Documentation]  Do the test teardown
129
130    FFDC On Test Case Fail
131
132
133Set Timer For Power ON
134    [Documentation]  Set the time for power ON with given value.
135
136    ${current_bmc_time}=  BMC Execute Command  date +%s
137    ${time_set}=  Evaluate  ${current_bmc_time[0]} + ${TIMER_POWER_ON}
138    BMC Execute Command  ${CMD_SET_TPO_TIME} ${time_set}
139
140    [Return]  ${time_set}
141
142
143Get Time Power ON Value
144    [Documentation]  Returns time power ON value.
145
146    ${timer_value}=  BMC Execute Command  ${CMD_GET_TPO_TIME}
147    @{return_value}=  Split String  ${timer_value[0]}
148    ${return_value}=  Evaluate  ${return_value}[1]
149
150    # BMC command returns integer value.
151    [Return]  ${return_value}
152