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 arguments:
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 arguments:
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
84    ${args}=  Create Dictionary  data=${HOST_REBOOT_TRANS}
85    Write Attribute
86    ...  ${HOST_STATE_URI}  RequestedHostTransition  data=${args}
87    Is Host Rebooted
88
89
90Is Host Running
91    [Documentation]  Check if host state is "Running".
92    # Chassis state should be "On" before we check the host state.
93    Is Chassis On
94    ${host_state}=  Get Host State
95    Should Be Equal  Running  ${host_state}
96    # Check to verify that the host is really booted.
97    Is OS Booted
98
99
100Get Host State Attribute
101    [Documentation]  Return the state of the host as a string.
102    [Arguments]  ${host_attribute}  ${quiet}=${QUIET}
103
104    # Description of argument(s):
105    # host_attribute   Host attribute name.
106    # quiet            Suppress REST output logging to console.
107
108    ${state}=
109    ...  Read Attribute  ${HOST_STATE_URI}  ${host_attribute}  quiet=${quiet}
110    [Return]  ${state}
111
112
113Is OS Booted
114    [Documentation]  Check OS status.
115
116    # Example:
117    # "/xyz/openbmc_project/state/host0": {
118    #    "AttemptsLeft": 0,
119    #    "BootProgress": "xyz.openbmc_project.State.Boot.Progress.ProgressStages.OSStart",
120    #    "CurrentHostState": "xyz.openbmc_project.State.Host.HostState.Running",
121    #    "OperatingSystemState": "xyz.openbmc_project.State.OperatingSystem.Status.OSStatus.BootComplete",
122    #    "RequestedHostTransition": "xyz.openbmc_project.State.Host.Transition.On"
123    # }
124
125    ${boot_stage}=  Get Host State Attribute  BootProgress
126    Should Be Equal  ${OS_BOOT_START}  ${boot_stage}
127
128    ${os_state}=  Get Host State Attribute  OperatingSystemState
129    Should Be Equal  ${OS_BOOT_COMPLETE}  ${os_state}
130
131
132Is Host Off
133    [Documentation]  Check if host state is "Off".
134    # Chassis state should be "Off" before we check the host state.
135    Is Chassis Off
136    ${host_state}=  Get Host State
137    Should Be Equal  Off  ${host_state}
138    # Check to verify that the host shutdown completely.
139    # TODO openbmc/openbmc#2049 - boot sensor not cleared on power off
140    #Is OS Off
141
142
143Is Host Rebooted
144    [Documentation]  Checks if host rebooted.
145
146    ${host_trans_state}=  Get Host Trans State
147    Should Be Equal  ${host_trans_state}  Reboot
148    Is Host Running
149
150
151Is Chassis On
152    [Documentation]  Check if chassis state is "On".
153    ${power_state}=  Get Chassis Power State
154    Should Be Equal  On  ${power_state}
155
156
157Is Chassis Off
158    [Documentation]  Check if chassis state is "Off".
159    ${power_state}=  Get Chassis Power State
160    Should Be Equal  Off  ${power_state}
161
162Is Host Quiesced
163    [Documentation]  Check if host state is quiesced.
164    ${host_state}=  Get Host State
165    ${status}=  Run Keyword And Return Status  Should Be Equal
166    ...  ${host_state}  Quiesced
167    [Return]  ${status}
168
169
170Recover Quiesced Host
171    [Documentation]  Recover host from quisced state.
172
173    ${resp}=  Run Keyword And Return Status  Is Host Quiesced
174    Run Keyword If  '${resp}' == 'True'
175    ...  Run Keywords  Initiate Host PowerOff  AND
176    ...  Log  HOST is recovered from quiesced state
177
178
179Get Host State
180    [Documentation]  Return the state of the host as a string.
181    [Arguments]  ${quiet}=${QUIET}
182    # quiet - Suppress REST output logging to console.
183    ${state}=
184    ...  Read Attribute  ${HOST_STATE_URI}  CurrentHostState
185    ...  quiet=${quiet}
186    [Return]  ${state.rsplit('.', 1)[1]}
187
188Get Host Trans State
189    [Documentation]  Return the transition state of host as a string.
190    ...              e.g. On, Off, Reboot
191    [Arguments]  ${quiet}=${QUIET}
192    # Description of arguments:
193    # quiet  Suppress REST output logging to console.
194
195    ${state}=
196    ...  Read Attribute  ${HOST_STATE_URI}  RequestedHostTransition
197    ...  quiet=${quiet}
198    [Return]  ${state.rsplit('.', 1)[1]}
199
200Get Chassis Power State
201    [Documentation]  Return the power state of the Chassis
202    ...              as a string.
203    [Arguments]  ${quiet}=${QUIET}
204    # quiet - Suppress REST output logging to console.
205    ${state}=
206    ...  Read Attribute  ${CHASSIS_STATE_URI}  CurrentPowerState
207    ...  quiet=${quiet}
208    [Return]  ${state.rsplit('.', 1)[1]}
209
210
211Get BMC State
212    [Documentation]  Return the state of the BMC.
213    [Arguments]  ${quiet}=${QUIET}
214    # quiet - Suppress REST output logging to console.
215    ${state}=
216    ...  Read Attribute  ${BMC_STATE_URI}  CurrentBMCState  quiet=${quiet}
217    [Return]  ${state.rsplit('.', 1)[1]}
218
219
220Put BMC State
221    [Documentation]  Put BMC in given state.
222    [Arguments]  ${expected_state}
223    # expected_state - expected BMC state
224
225    ${bmc_state}=  Get BMC State
226    Run Keyword If  '${bmc_state}' == '${expected_state}'
227    ...  Log  BMC is already in ${expected_state} state
228    ...  ELSE  Run Keywords  Initiate BMC Reboot  AND
229    ...  Wait for BMC state  ${expected_state}
230
231Initiate BMC Reboot
232    [Documentation]  Initiate BMC reboot.
233    [Arguments]  ${wait}=${1}
234
235    # Description of argument(s):
236    # wait  Indicates that this keyword should wait for ending state..
237
238    ${args}=  Create Dictionary  data=${BMC_REBOOT_TRANS}
239
240    Run Keyword And Ignore Error  Write Attribute
241    ...  ${BMC_STATE_URI}  RequestedBMCTransition  data=${args}
242
243    # Does caller want to wait for status?
244    Run Keyword If  '${wait}' == '${0}'  Return From Keyword
245
246    ${session_active}=  Check If BMC Reboot Is Initiated
247    Run Keyword If  '${session_active}' == '${True}'
248    ...  Fail  msg=BMC Reboot didn't occur.
249
250    Check If BMC is Up
251
252Check If BMC Reboot Is Initiated
253    [Documentation]  Checks whether BMC Reboot is initiated by checking
254    ...              BMC connection loss.
255    # Reboot adds 3 seconds delay before forcing reboot
256    # To minimize race conditions, we wait for 7 seconds
257    Sleep  7s
258    ${alive}=   Run Keyword and Return Status
259    ...    Open Connection And Log In
260    Return From Keyword If   '${alive}' == '${False}'    ${False}
261    [Return]    ${True}
262
263Is BMC Ready
264    [Documentation]  Check if BMC state is Ready.
265    ${bmc_state}=  Get BMC State
266    Should Be Equal  ${BMC_READY_STATE}  ${bmc_state}
267
268Is BMC Not Ready
269    [Documentation]  Check if BMC state is Not Ready.
270    ${bmc_state}=  Get BMC State
271    Should Be Equal  ${BMC_NOT_READY_STATE}  ${bmc_state}
272
273Wait for BMC state
274    [Documentation]  Wait until given BMC state is reached.
275    [Arguments]  ${state}
276    # state - BMC state to wait for
277    Run Keyword If  '${state}' == '${BMC_READY_STATE}'
278    ...    Wait Until Keyword Succeeds
279    ...    10 min  10 sec  Is BMC Ready
280    ...  ELSE IF  '${state}' == '${BMC_NOT_READY_STATE}'
281    ...    Wait Until Keyword Succeeds
282    ...    10 min  10 sec  Is BMC Not Ready
283    ...  ELSE  Fail  msg=Invalid BMC state
284
285
286Set State Interface Version
287    [Documentation]  Set version to indicate which interface to use.
288    ${resp}=  Openbmc Get Request  ${CHASSIS_STATE_URI}
289    ${status}=  Run Keyword And Return Status
290    ...  Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
291    Run Keyword If  '${status}' == '${True}'
292    ...  Set Global Variable  ${OBMC_STATES_VERSION}  ${1}
293    ...  ELSE
294    ...  Set Global Variable  ${OBMC_STATES_VERSION}  ${0}
295
296
297Power Off Request
298    [Documentation]  Select appropriate poweroff keyword.
299    Run Keyword If  '${OBMC_STATES_VERSION}' == '${0}'
300    ...  Initiate Power Off
301    ...  ELSE
302    ...  Initiate Host PowerOff
303
304
305Wait For BMC Ready
306    [Documentation]  Check BMC state and wait for BMC Ready.
307    Wait Until Keyword Succeeds  10 min  10 sec  Is BMC Ready
308
309
310