1*** Settings ***
2Resource          ../lib/utils.robot
3Variables         ../data/variables.py
4
5*** Variables ***
6
7${BMC_READY_STATE}           Ready
8${BMC_NOT_READY_STATE}       NotReady
9${QUIET}  ${0}
10
11# "1" indicates that the new "xyz" interface should be used.
12${OBMC_STATES_VERSION}    ${1}
13
14*** Keywords ***
15
16Initiate Host Boot
17    [Documentation]  Initiate host power on.
18    [Arguments]  ${wait}=${1}
19
20    # Description of argument(s):
21    # wait  Indicates that this keyword should wait for host running state.
22
23    ${args}=  Create Dictionary   data=${HOST_POWERON_TRANS}
24    Write Attribute
25    ...  ${HOST_STATE_URI}  RequestedHostTransition   data=${args}
26
27    # Does caller want to wait for status?
28    Run Keyword If  '${wait}' == '${0}'  Return From Keyword
29
30    Wait Until Keyword Succeeds
31    ...  10 min  10 sec  Is Host Running
32
33
34Initiate Host PowerOff
35    [Documentation]  Initiate host power off.
36    # 1. Request soft power off
37    # 2. Hard power off, if failed.
38    [Arguments]  ${wait}=${1}
39
40    # Description of argument(s):
41    # wait  Indicates that this keyword should wait for host off state.
42
43    ${args}=  Create Dictionary   data=${HOST_POWEROFF_TRANS}
44    Write Attribute
45    ...  ${HOST_STATE_URI}  RequestedHostTransition   data=${args}
46
47    # Does caller want to wait for status?
48    Run Keyword If  '${wait}' == '${0}'  Return From Keyword
49
50    ${status}=  Run Keyword And Return Status  Wait For PowerOff
51
52    Run Keyword if  '${status}' == '${False}'  Hard Power Off
53
54
55Wait For PowerOff
56    [Documentation]  Wait for power off state.
57
58    # TODO: Reference to open-power/skiboot#81.
59    # Revert to 3 minutes once fixed.
60    Wait Until Keyword Succeeds  6 min  10 sec  Is Host Off
61
62
63Hard Power Off
64    [Documentation]  Do a hard power off.
65    [Arguments]  ${wait}=${1}
66
67    # Description of argument(s):
68    # wait  Indicates that this keyword should wait for host off state.
69
70    ${args}=  Create Dictionary  data=${CHASSIS_POWEROFF_TRANS}
71    Write Attribute
72    ...  ${CHASSIS_STATE_URI}  RequestedPowerTransition  data=${args}
73
74    # Does caller want to wait for status?
75    Run Keyword If  '${wait}' == '${0}'  Return From Keyword
76
77    Wait Until Keyword Succeeds
78    ...  1 min  10 sec  Run Keywords  Is Chassis Off  AND  Is Host Off
79
80
81Initiate Host Reboot
82    [Documentation]  Initiate host reboot via REST.
83    [Arguments]  ${wait}=${1}
84
85    # Description of argument(s):
86    # wait  Indicates that this keyword should wait for host reboot state.
87
88    ${args}=  Create Dictionary  data=${HOST_REBOOT_TRANS}
89    Write Attribute
90    ...  ${HOST_STATE_URI}  RequestedHostTransition  data=${args}
91
92    # Does caller want to wait for host booted status?
93    Run Keyword If  '${wait}' == '${0}'  Return From Keyword
94
95    Is Host Rebooted
96
97
98Is Host Running
99    [Documentation]  Check if host state is "Running".
100    # Chassis state should be "On" before we check the host state.
101    Is Chassis On
102    ${host_state}=  Get Host State
103    Should Be Equal  Running  ${host_state}
104    # Check to verify that the host is really booted.
105    Is OS Booted
106
107
108Get Host State Attribute
109    [Documentation]  Return the state of the host as a string.
110    [Arguments]  ${host_attribute}  ${quiet}=${QUIET}
111
112    # Description of argument(s):
113    # host_attribute   Host attribute name.
114    # quiet            Suppress REST output logging to console.
115
116    ${HOST_STATE_URI}=  Set Variable If  '${PLATFORM_ARCH_TYPE}' == 'x86' and '${host_attribute}' == 'OperatingSystemState'
117    ...  ${OS_STATE_URI}  ${HOST_STATE_URI}
118
119    ${state}=
120    ...  Read Attribute  ${HOST_STATE_URI}  ${host_attribute}  quiet=${quiet}
121    [Return]  ${state}
122
123
124Is OS Booted
125    [Documentation]  Check OS status.
126
127    # Example:
128    # "/xyz/openbmc_project/state/host0": {
129    #    "AttemptsLeft": 0,
130    #    "BootProgress": "xyz.openbmc_project.State.Boot.Progress.ProgressStages.OSStart",
131    #    "CurrentHostState": "xyz.openbmc_project.State.Host.HostState.Running",
132    #    "OperatingSystemState": "xyz.openbmc_project.State.OperatingSystem.Status.OSStatus.BootComplete",
133    #    "RequestedHostTransition": "xyz.openbmc_project.State.Host.Transition.On"
134    # }
135
136    ${boot_stage}=  Get Host State Attribute  BootProgress
137    Should Be Equal  ${OS_BOOT_START}  ${boot_stage}
138
139    ${os_state}=  Get Host State Attribute  OperatingSystemState
140    Should Be Equal  ${OS_BOOT_COMPLETE}  ${os_state}
141
142
143Is Host Off
144    [Documentation]  Check if host state is "Off".
145    # Chassis state should be "Off" before we check the host state.
146    Is Chassis Off
147    ${host_state}=  Get Host State
148    Should Be Equal  Off  ${host_state}
149    # Check to verify that the host shutdown completely.
150    # TODO openbmc/openbmc#2049 - boot sensor not cleared on power off
151    #Is OS Off
152
153
154Is Host Rebooted
155    [Documentation]  Checks if host rebooted.
156
157    ${host_trans_state}=  Get Host Trans State
158    Should Be Equal  ${host_trans_state}  Reboot
159    Is Host Running
160
161
162Is Chassis On
163    [Documentation]  Check if chassis state is "On".
164    ${power_state}=  Get Chassis Power State
165    Should Be Equal  On  ${power_state}
166
167
168Is Chassis Off
169    [Documentation]  Check if chassis state is "Off".
170    ${power_state}=  Get Chassis Power State
171    Should Be Equal  Off  ${power_state}
172
173Is Host Quiesced
174    [Documentation]  Check if host state is quiesced.
175    ${host_state}=  Get Host State
176    ${status}=  Run Keyword And Return Status  Should Be Equal
177    ...  ${host_state}  Quiesced
178    [Return]  ${status}
179
180
181Recover Quiesced Host
182    [Documentation]  Recover host from quisced state.
183
184    ${resp}=  Run Keyword And Return Status  Is Host Quiesced
185    Run Keyword If  '${resp}' == 'True'
186    ...  Run Keywords  Initiate Host PowerOff  AND
187    ...  Log  HOST is recovered from quiesced state
188
189
190Get Host State
191    [Documentation]  Return the state of the host as a string.
192    [Arguments]  ${quiet}=${QUIET}
193    # quiet - Suppress REST output logging to console.
194    ${state}=
195    ...  Read Attribute  ${HOST_STATE_URI}  CurrentHostState
196    ...  quiet=${quiet}
197    [Return]  ${state.rsplit('.', 1)[1]}
198
199Get Host Trans State
200    [Documentation]  Return the transition state of host as a string.
201    ...              e.g. On, Off, Reboot
202    [Arguments]  ${quiet}=${QUIET}
203    # Description of arguments:
204    # quiet  Suppress REST output logging to console.
205
206    ${state}=
207    ...  Read Attribute  ${HOST_STATE_URI}  RequestedHostTransition
208    ...  quiet=${quiet}
209    [Return]  ${state.rsplit('.', 1)[1]}
210
211Get Chassis Power State
212    [Documentation]  Return the power state of the Chassis
213    ...              as a string.
214    [Arguments]  ${quiet}=${QUIET}
215    # quiet - Suppress REST output logging to console.
216    ${state}=
217    ...  Read Attribute  ${CHASSIS_STATE_URI}  CurrentPowerState
218    ...  quiet=${quiet}
219    [Return]  ${state.rsplit('.', 1)[1]}
220
221
222Get BMC State
223    [Documentation]  Return the state of the BMC.
224    [Arguments]  ${quiet}=${QUIET}
225    # quiet - Suppress REST output logging to console.
226    ${state}=
227    ...  Read Attribute  ${BMC_STATE_URI}  CurrentBMCState  quiet=${quiet}
228    [Return]  ${state.rsplit('.', 1)[1]}
229
230
231Put BMC State
232    [Documentation]  Put BMC in given state.
233    [Arguments]  ${expected_state}
234    # expected_state - expected BMC state
235
236    ${bmc_state}=  Get BMC State
237    Run Keyword If  '${bmc_state}' == '${expected_state}'
238    ...    Log  BMC is already in ${expected_state} state
239    ...  ELSE
240    ...    OBMC Reboot (off)
241
242Initiate BMC Reboot
243    [Documentation]  Initiate BMC reboot.
244    [Arguments]  ${wait}=${1}
245
246    # Description of argument(s):
247    # wait  Indicates that this keyword should wait for ending state..
248
249    ${args}=  Create Dictionary  data=${BMC_REBOOT_TRANS}
250
251    Run Keyword And Ignore Error  Write Attribute
252    ...  ${BMC_STATE_URI}  RequestedBMCTransition  data=${args}
253
254    # Does caller want to wait for status?
255    Run Keyword If  '${wait}' == '${0}'  Return From Keyword
256
257    ${session_active}=  Check If BMC Reboot Is Initiated
258    Run Keyword If  '${session_active}' == '${True}'
259    ...  Fail  msg=BMC Reboot didn't occur.
260
261    Check If BMC is Up
262
263Check If BMC Reboot Is Initiated
264    [Documentation]  Checks whether BMC Reboot is initiated by checking
265    ...              BMC connection loss.
266    # Reboot adds 3 seconds delay before forcing reboot
267    # To minimize race conditions, we wait for 7 seconds
268    Sleep  7s
269    ${alive}=   Run Keyword and Return Status
270    ...    Open Connection And Log In
271    Return From Keyword If   '${alive}' == '${False}'    ${False}
272    [Return]    ${True}
273
274Is BMC Ready
275    [Documentation]  Check if BMC state is Ready.
276    ${bmc_state}=  Get BMC State
277    Should Be Equal  ${BMC_READY_STATE}  ${bmc_state}
278
279Is BMC Not Ready
280    [Documentation]  Check if BMC state is Not Ready.
281    ${bmc_state}=  Get BMC State
282    Should Be Equal  ${BMC_NOT_READY_STATE}  ${bmc_state}
283
284Wait for BMC state
285    [Documentation]  Wait until given BMC state is reached.
286    [Arguments]  ${state}
287    # state - BMC state to wait for
288    Run Keyword If  '${state}' == '${BMC_READY_STATE}'
289    ...    Wait Until Keyword Succeeds
290    ...    10 min  10 sec  Is BMC Ready
291    ...  ELSE IF  '${state}' == '${BMC_NOT_READY_STATE}'
292    ...    Wait Until Keyword Succeeds
293    ...    10 min  10 sec  Is BMC Not Ready
294    ...  ELSE  Fail  msg=Invalid BMC state
295
296
297Set State Interface Version
298    [Documentation]  Set version to indicate which interface to use.
299    ${resp}=  Openbmc Get Request  ${CHASSIS_STATE_URI}
300    ${status}=  Run Keyword And Return Status
301    ...  Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
302    Run Keyword If  '${status}' == '${True}'
303    ...  Set Global Variable  ${OBMC_STATES_VERSION}  ${1}
304    ...  ELSE
305    ...  Set Global Variable  ${OBMC_STATES_VERSION}  ${0}
306
307
308Power Off Request
309    [Documentation]  Select appropriate poweroff keyword.
310    Run Keyword If  '${OBMC_STATES_VERSION}' == '${0}'
311    ...  Initiate Power Off
312    ...  ELSE
313    ...  Initiate Host PowerOff
314
315
316Wait For BMC Ready
317    [Documentation]  Check BMC state and wait for BMC Ready.
318    Wait Until Keyword Succeeds  10 min  10 sec  Is BMC Ready
319
320
321Get Host State Via Redfish
322    [Documentation]  Return the state of the host Via Redfish as a string.
323
324    ${powerstate}=
325    ...  Redfish.Get Attribute  ${REDFISH_CHASSIS_URI}/${CHASSIS_ID}  PowerState
326
327    [Return]  ${powerstate}
328