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    [Arguments]  ${wait}=${1}
37
38    # Description of arguments:
39    # wait  Indicates that this keyword should wait for host off state.
40
41    ${args}=  Create Dictionary   data=${HOST_POWEROFF_TRANS}
42    Write Attribute
43    ...  ${HOST_STATE_URI}  RequestedHostTransition   data=${args}
44
45    # Does caller want to wait for status?
46    Run Keyword If  '${wait}' == '${0}'  Return From Keyword
47
48    Wait Until Keyword Succeeds
49    ...  3 min  10 sec  Is Host Off
50
51
52Initiate Host Reboot
53    [Documentation]  Initiate host reboot via REST.
54
55    ${args}=  Create Dictionary  data=${HOST_REBOOT_TRANS}
56    Write Attribute
57    ...  ${HOST_STATE_URI}  RequestedHostTransition  data=${args}
58    Is Host Rebooted
59
60
61Is Host Running
62    [Documentation]  Check if host state is "Running".
63    ${host_state}=  Get Host State
64    Should Be Equal  Running  ${host_state}
65
66
67Is Host Off
68    [Documentation]  Check if host state is "Off".
69    ${host_state}=  Get Host State
70    Should Be Equal  Off  ${host_state}
71
72
73Is Host Rebooted
74    [Documentation]  Checks if host rebooted.
75
76    ${host_trans_state}=  Get Host Trans State
77    Should Be Equal  ${host_trans_state}  Reboot
78    Is Host Running
79
80
81Is Chassis On
82    [Documentation]  Check if chassis state is "On".
83    ${power_state}=  Get Chassis Power State
84    Should Be Equal  On  ${power_state}
85
86
87Is Chassis Off
88    [Documentation]  Check if chassis state is "Off".
89    ${power_state}=  Get Chassis Power State
90    Should Be Equal  Off  ${power_state}
91
92Is Host Quiesced
93    [Documentation]  Check if host state is quiesced.
94    ${host_state}=  Get Host State
95    ${status}=  Run Keyword And Return Status  Should Be Equal
96    ...  ${host_state}  Quiesced
97    [Return]  ${status}
98
99
100Recover Quiesced Host
101    [Documentation]  Recover host from quisced state.
102
103    ${resp}=  Run Keyword And Return Status  Is Host Quiesced
104    Run Keyword If  '${resp}' == 'True'
105    ...  Run Keywords  Initiate Host PowerOff  AND
106    ...  Log  HOST is recovered from quiesced state
107
108
109Get Host State
110    [Documentation]  Return the state of the host as a string.
111    [Arguments]  ${quiet}=${QUIET}
112    # quiet - Suppress REST output logging to console.
113    ${state}=
114    ...  Read Attribute  ${HOST_STATE_URI}  CurrentHostState
115    ...  quiet=${quiet}
116    [Return]  ${state.rsplit('.', 1)[1]}
117
118Get Host Trans State
119    [Documentation]  Return the transition state of host as a string.
120    ...              e.g. On, Off, Reboot
121    [Arguments]  ${quiet}=${QUIET}
122    # Description of arguments:
123    # quiet  Suppress REST output logging to console.
124
125    ${state}=
126    ...  Read Attribute  ${HOST_STATE_URI}  RequestedHostTransition
127    ...  quiet=${quiet}
128    [Return]  ${state.rsplit('.', 1)[1]}
129
130Get Chassis Power State
131    [Documentation]  Return the power state of the Chassis
132    ...              as a string.
133    [Arguments]  ${quiet}=${QUIET}
134    # quiet - Suppress REST output logging to console.
135    ${state}=
136    ...  Read Attribute  ${CHASSIS_STATE_URI}  CurrentPowerState
137    ...  quiet=${quiet}
138    [Return]  ${state.rsplit('.', 1)[1]}
139
140
141Get BMC State
142    [Documentation]  Return the state of the BMC.
143    [Arguments]  ${quiet}=${QUIET}
144    # quiet - Suppress REST output logging to console.
145    ${state}=
146    ...  Read Attribute  ${BMC_STATE_URI}  CurrentBMCState  quiet=${quiet}
147    [Return]  ${state.rsplit('.', 1)[1]}
148
149
150Put BMC State
151    [Documentation]  Put BMC in given state.
152    [Arguments]  ${expected_state}
153    # expected_state - expected BMC state
154
155    ${bmc_state}=  Get BMC State
156    Run Keyword If  '${bmc_state}' == '${expected_state}'
157    ...  Log  BMC is already in ${expected_state} state
158    ...  ELSE  Run Keywords  Initiate BMC Reboot  AND
159    ...  Wait for BMC state  ${expected_state}
160
161
162Initiate BMC Reboot
163    [Documentation]  Initiate BMC reboot.
164    ${args}=  Create Dictionary   data=${BMC_REBOOT_TRANS}
165
166    Run Keyword And Ignore Error  Write Attribute
167    ...  ${BMC_STATE_URI}  RequestedBMCTransition   data=${args}
168
169    ${session_active}=   Check If BMC Reboot Is Initiated
170    Run Keyword If   '${session_active}' == '${True}'
171    ...    Fail   msg=BMC Reboot didn't occur
172
173    Check If BMC is Up
174
175Check If BMC Reboot Is Initiated
176    [Documentation]  Checks whether BMC Reboot is initiated by checking
177    ...              BMC connection loss.
178    # Reboot adds 3 seconds delay before forcing reboot
179    # To minimize race conditions, we wait for 7 seconds
180    Sleep  7s
181    ${alive}=   Run Keyword and Return Status
182    ...    Open Connection And Log In
183    Return From Keyword If   '${alive}' == '${False}'    ${False}
184    [Return]    ${True}
185
186Is BMC Ready
187    [Documentation]  Check if BMC state is Ready.
188    ${bmc_state}=  Get BMC State
189    Should Be Equal  ${BMC_READY_STATE}  ${bmc_state}
190
191Is BMC Not Ready
192    [Documentation]  Check if BMC state is Not Ready.
193    ${bmc_state}=  Get BMC State
194    Should Be Equal  ${BMC_NOT_READY_STATE}  ${bmc_state}
195
196Wait for BMC state
197    [Documentation]  Wait until given BMC state is reached.
198    [Arguments]  ${state}
199    # state - BMC state to wait for
200    Run Keyword If  '${state}' == '${BMC_READY_STATE}'
201    ...    Wait Until Keyword Succeeds
202    ...    10 min  10 sec  Is BMC Ready
203    ...  ELSE IF  '${state}' == '${BMC_NOT_READY_STATE}'
204    ...    Wait Until Keyword Succeeds
205    ...    10 min  10 sec  Is BMC Not Ready
206    ...  ELSE  Fail  msg=Invalid BMC state
207
208
209Set State Interface Version
210    [Documentation]  Set version to indicate which interface to use.
211    ${resp}=  Openbmc Get Request  ${CHASSIS_STATE_URI}
212    ${status}=  Run Keyword And Return Status
213    ...  Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
214    Run Keyword If  '${status}' == '${True}'
215    ...  Set Global Variable  ${OBMC_STATES_VERSION}  ${1}
216    ...  ELSE
217    ...  Set Global Variable  ${OBMC_STATES_VERSION}  ${0}
218
219
220Power Off Request
221    [Documentation]  Select appropriate poweroff keyword.
222    Run Keyword If  '${OBMC_STATES_VERSION}' == '${0}'
223    ...  Initiate Power Off
224    ...  ELSE
225    ...  Initiate Host PowerOff
226
227
228Wait For BMC Ready
229    [Documentation]  Check BMC state and wait for BMC Ready.
230    @{states}=  Create List  BMC_READY  HOST_POWERED_OFF
231    Run Keyword If  '${OBMC_STATES_VERSION}' == '${0}'
232    ...  Wait Until Keyword Succeeds  10 min  10 sec
233    ...  Verify BMC State  ${states}
234    ...  ELSE
235    ...  Wait Until Keyword Succeeds  10 min  10 sec
236    ...  Is BMC Ready
237
238
239