xref: /openbmc/openbmc-test-automation/ipmi/test_ipmi_chassis.robot (revision a15a1839e76b5c36f07271811b13e975af519589)
1*** Settings ***
2
3Documentation    Module to test IPMI chassis functionality.
4Resource         ../lib/ipmi_client.robot
5Resource         ../lib/openbmc_ffdc.robot
6Resource         ../lib/boot_utils.robot
7Resource         ../lib/bmc_dbus.robot
8Library          ../lib/ipmi_utils.py
9Variables        ../data/ipmi_raw_cmd_table.py
10
11Suite Setup      Redfish.Login
12Suite Teardown   Redfish.Logout
13Test Teardown    Test Teardown Execution
14
15Test Tags       IPMI_Chassis
16
17*** Variables ***
18
19# Timeout value in minutes. Default 3 minutes.
20${IPMI_POWEROFF_WAIT_TIMEOUT}      3
21${busctl_settings}                 xyz.openbmc_project.Settings
22${chassis_capabilities_dbus_URL}   /xyz/openbmc_project/Control/ChassisCapabilities
23
24
25*** Test Cases ***
26
27IPMI Chassis Status On
28    [Documentation]  This test case verifies system power on status
29    ...              using IPMI Get Chassis status command.
30    [Tags]  IPMI_Chassis_Status_On
31
32    Redfish Power On  stack_mode=skip  quiet=1
33    ${resp}=  Run External IPMI Standard Command  chassis status
34    ${power_status}=  Get Lines Containing String  ${resp}  System Power
35    Should Contain  ${power_status}  on
36
37IPMI Chassis Status Off
38    [Documentation]  This test case verifies system power off status
39    ...              using IPMI Get Chassis status command.
40    [Tags]  IPMI_Chassis_Status_Off
41
42    Redfish Power Off  stack_mode=skip  quiet=1
43     ${resp}=  Run External IPMI Standard Command  chassis status
44    ${power_status}=  Get Lines Containing String  ${resp}  System Power
45    Should Contain  ${power_status}  off
46
47Verify Host PowerOff Via IPMI
48    [Documentation]   Verify host power off operation using external IPMI command.
49    [Tags]  Verify_Host_PowerOff_Via_IPMI
50
51    IPMI Power Off
52    ${ipmi_state}=  Get Host State Via External IPMI
53    Valid Value  ipmi_state  ['off']
54
55Verify Host PowerOn Via IPMI
56    [Documentation]   Verify host power on operation using external IPMI command.
57    [Tags]  Verify_Host_PowerOn_Via_IPMI
58
59    IPMI Power On
60    ${ipmi_state}=  Get Host State Via External IPMI
61    Valid Value  ipmi_state  ['on']
62
63
64Verify Soft Shutdown
65    [Documentation]  Verify host OS shutdown softly via IPMI command.
66    [Tags]  Verify_Soft_Shutdown
67
68    Redfish Power On  stack_mode=skip
69    Run External IPMI Standard Command  chassis power soft
70    Wait Until Keyword Succeeds  ${IPMI_POWEROFF_WAIT_TIMEOUT} min  10 sec  Is Host Off Via IPMI
71
72
73Verify Chassis Power Cycle And Check Chassis Status Via IPMI
74    [Documentation]   Verify chassis power Cycle operation and check the Chassis
75    ...               Power Status using external IPMI command.
76    [Tags]  Verify_Chassis_Power_Cycle_And_Check_Chassis_Status_Via_IPMI
77
78    # Chassis power cycle command via IPMI
79    IPMI Power Cycle
80    ${ipmi_state}=  Get Host State Via External IPMI
81    Valid Value  ipmi_state  ['on']
82
83
84Verify Chassis Power Reset And Check Chassis Status Via IPMI
85    [Documentation]   Verify chassis power Reset operation and check the Chassis
86    ...               Power Status using external IPMI command.
87    [Tags]  Verify_Chassis_Power_Reset_And_Check_Chassis_Status_Via_IPMI
88
89    # Chassis power reset command via IPMI
90    IPMI Power Reset
91    ${ipmi_state}=  Get Host State Via External IPMI
92    Valid Value  ipmi_state  ['on']
93
94
95Verify Chassis Power Policy
96    [Documentation]  Verify setting chassis power policy via IPMI command.
97    [Tags]  Verify_Chassis_Power_Policy
98    [Setup]  Test Setup Execution
99    [Teardown]  Run Keywords  FFDC On Test Case Fail  AND
100    ...  Run External IPMI Standard Command  chassis policy ${initial_power_policy}
101    [Template]  Set Chassis Power Policy Via IPMI And Verify
102
103    # power_policy
104    always-off
105    always-on
106    previous
107
108
109Verify Chassis Status Via IPMI
110    [Documentation]  Verify Chassis Status via IPMI command.
111    [Tags]  Verify_Chassis_Status_Via_IPMI
112    [Setup]  Test Setup Execution
113    [Teardown]  Run Keywords  FFDC On Test Case Fail  AND
114    ...  Run External IPMI Standard Command  chassis policy ${initial_power_policy}
115    [Template]  Check Chassis Status Via IPMI
116
117    # power_policy
118    always-off
119    always-on
120    previous
121
122
123Verify Get Chassis Capabilities
124    [Documentation]  Verify get chassis capabilities IPMI cmd with valid data length and verify
125    ...  its response comparing with busctl command.
126    [Tags]  Verify_Get_Chassis_Capabilities
127    [Teardown]  FFDC On Test Case Fail
128
129    ${ipmi_resp}=  Run External IPMI Raw Command
130    ...  ${IPMI_RAW_CMD['Chassis Capabilities']['Get'][0]}
131
132    ${ipmi_resp}=  Split String  ${ipmi_resp}
133    ${busctl_cmd}=  Catenate  ${BUSCTL_INTROSPECT_COMMAND} ${busctl_settings}
134    ...  ${chassis_capabilities_dbus_URL}
135
136    ${busctl_resp}=  BMC Execute Command  sh --login -c "${busctl_cmd}"
137
138    Verify Chassis Capabilities Response  ${ipmi_resp[0]}  ${busctl_resp[0]}  CapabilitiesFlags
139    Verify Chassis Capabilities Response  ${ipmi_resp[1]}  ${busctl_resp[0]}  FRUDeviceAddress
140    Verify Chassis Capabilities Response  ${ipmi_resp[2]}  ${busctl_resp[0]}  SDRDeviceAddress
141    Verify Chassis Capabilities Response  ${ipmi_resp[3]}  ${busctl_resp[0]}  SELDeviceAddress
142    Verify Chassis Capabilities Response  ${ipmi_resp[4]}  ${busctl_resp[0]}  SMDeviceAddress
143    Verify Chassis Capabilities Response  ${ipmi_resp[5]}  ${busctl_resp[0]}  BridgeDeviceAddress
144
145
146Verify Get Chassis Capabilities With Invalid Data Length
147    [Documentation]  Verify get chassis capabilities IPMI command with invalid data length
148    [Tags]  Verify_Get_Chassis_Capabilities_With_Invalid_Data_Length
149    [Teardown]  FFDC On Test Case Fail
150
151    Verify Invalid IPMI Command  ${IPMI_RAW_CMD['Chassis Capabilities']['Get'][1]}  0xc7
152
153Verify Get Chassis Status With Invalid Data Length
154    [Documentation]  Verify Get Chassis Status With Invalid Data Length
155    [Tags]  Verify_Get_Chassis_Status_With_Invalid_Data_Length
156    [Teardown]  FFDC On Test Case Fail
157
158    Verify Invalid IPMI Command  ${IPMI_RAW_CMD['Chassis_status']['get_invalid_length'][0]}  0xc7
159
160Verify Chassis Control With Invalid Data Length
161    [Documentation]  Verify Chassis Control With Invalid Data Length
162    [Tags]  Verify_Chassis_Control_With_Invalid_Data_Length
163    [Teardown]  FFDC On Test Case Fail
164    [Template]  Verify Invalid IPMI Command
165
166    # Invalid data length                                                Expected error code
167    ${IPMI_RAW_CMD['Chassis Control']['power_down'][1]}                  0xc7
168    ${IPMI_RAW_CMD['Chassis Control']['power_down'][2]}                  0xc7
169    ${IPMI_RAW_CMD['Chassis Control']['power_up'][1]}                    0xc7
170    ${IPMI_RAW_CMD['Chassis Control']['power_up'][2]}                    0xc7
171    ${IPMI_RAW_CMD['Chassis Control']['power_cycle'][1]}                 0xc7
172    ${IPMI_RAW_CMD['Chassis Control']['power_cycle'][2]}                 0xc7
173    ${IPMI_RAW_CMD['Chassis Control']['hard_reset'][1]}                  0xc7
174    ${IPMI_RAW_CMD['Chassis Control']['hard_reset'][2]}                  0xc7
175    ${IPMI_RAW_CMD['Chassis Control']['pulse_diagnostic_interrupt'][1]}  0xc7
176    ${IPMI_RAW_CMD['Chassis Control']['pulse_diagnostic_interrupt'][2]}  0xc7
177    ${IPMI_RAW_CMD['Chassis Control']['initiate_soft_shutdown'][1]}      0xc7
178    ${IPMI_RAW_CMD['Chassis Control']['initiate_soft_shutdown'][2]}      0xc7
179
180*** Keywords ***
181
182Set Chassis Power Policy Via IPMI And Verify
183    [Documentation]  Set chasiss power policy via IPMI and verify.
184    [Arguments]  ${power_policy}
185
186    # Description of argument(s):
187    # power_policy    Chassis power policy to be set(e.g. "always-off", "always-on").
188
189    Run External IPMI Standard Command  chassis policy ${power_policy}
190    ${resp}=  Get Chassis Status
191    Valid Value  resp['power_restore_policy']  ['${power_policy}']
192
193
194Check Chassis Status Via IPMI
195    [Documentation]  Set Chassis Status via IPMI and verify and verify chassis status.
196    [Arguments]  ${power_policy}
197
198    # Description of argument(s):
199    # power_policy    Chassis power policy to be set(e.g. "always-off", "always-on").
200
201    # Sets power policy according to requested policy
202    Set Chassis Power Policy Via IPMI And Verify  ${power_policy}
203
204    # Gets chassis status via IPMI raw command and validate byte 1
205    ${status}=  Run External IPMI Raw Command  ${IPMI_RAW_CMD['Chassis_status']['get'][0]}
206    ${status}=  Split String  ${status}
207    ${state}=  Convert To Binary  ${status[0]}  base=16
208    ${state}=  Zfill Data  ${state}  8
209
210    # Last bit corresponds whether Power is on
211    Should Be Equal As Strings  ${state[-1]}  1
212    # bit 1-2 corresponds to power restore policy
213    ${policy}=  Set Variable  ${state[1:3]}
214
215    # condition to verify each power policy
216    IF  '${power_policy}' == 'always-off'
217        Should Be Equal As Strings  ${policy}  00
218    ELSE IF  '${power_policy}' == 'always-on'
219        Should Be Equal As Strings  ${policy}  10
220    ELSE IF  '${power_policy}' == 'previous'
221        Should Be Equal As Strings  ${policy}  01
222    ELSE
223        Log  Power Restore Policy is Unknown
224        Should Be Equal As Strings  ${policy}  11
225    END
226
227    # Last Power Event - 4th bit should be 1b i.e, last ‘Power is on’ state
228    # was entered via IPMI command
229    ${last_power_event}=  Convert To Binary  ${status[1]}  base=16
230    ${last_power_event}=  Zfill Data  ${last_power_event}  8
231    Should Be Equal As Strings  ${last_power_event[3]}  1
232
233
234Verify Chassis Capabilities Response
235    [Documentation]  Compare the IPMI response with the busctl response for given property.
236    [Arguments]  ${ipmi_response}  ${busctl_response}  ${property}
237
238    # Description of argument(s):
239    # ipmi_response    IPMI response.
240    # busctl_response  busctl command response.
241    # property         property type (e.g. CapabilitiesFlags).
242
243    ${ipmi_response}=  Convert To Integer  ${ipmi_response}  16
244
245    ${busctl_value}=  Get Regexp Matches  ${busctl_response}
246    ...  \\.${property}\\s+property\\s+\\w\\s+(\\d+)\\s+  1
247
248    Should Be Equal As Integers   ${ipmi_response}  ${busctl_value[0]}
249
250
251Test Setup Execution
252    [Documentation]  Do test setup tasks.
253
254    ${chassis_status}=  Get Chassis Status
255    Set Test Variable  ${initial_power_policy}  ${chassis_status['power_restore_policy']}
256
257
258Test Teardown Execution
259    [Documentation]  Do Test Teardown tasks.
260
261    ${resp}=  Run External IPMI Standard Command  chassis status
262    ${power_status}=  Get Lines Containing String  ${resp}  System Power
263    @{powertolist}=  Split String  ${power_status}   :
264    ${status}=  Get From List  ${powertolist}  1
265    # Chassis Power ON if status is off
266    IF  '${status.strip()}' != 'on'  Redfish Power On
267    FFDC On Test Case Fail
268