Tony Lee | 6c998f7 | 2020-03-09 18:28:35 +0800 | [diff] [blame] | 1 | *** Settings *** |
| 2 | Documentation This suite tests IPMI Payload in OpenBMC. |
| 3 | |
| 4 | Resource ../lib/ipmi_client.robot |
| 5 | Resource ../lib/openbmc_ffdc.robot |
nagarjunb22 | a2255de | 2022-05-25 19:15:10 +0530 | [diff] [blame] | 6 | Resource ../lib/bmc_network_utils.robot |
Tony Lee | 6c998f7 | 2020-03-09 18:28:35 +0800 | [diff] [blame] | 7 | Variables ../data/ipmi_raw_cmd_table.py |
nagarjunb22 | a2255de | 2022-05-25 19:15:10 +0530 | [diff] [blame] | 8 | Library ../lib/ipmi_utils.py |
| 9 | |
| 10 | |
nagarjunb | 765535a | 2022-06-01 12:59:00 +0530 | [diff] [blame] | 11 | Suite Setup IPMI Payload Setup Execution |
nagarjunb22 | a2255de | 2022-05-25 19:15:10 +0530 | [diff] [blame] | 12 | Test Teardown FFDC On Test Case Fail |
| 13 | |
| 14 | |
| 15 | *** Variables *** |
| 16 | ${user_priv} 2 |
| 17 | ${operator_priv} 3 |
| 18 | ${admin_level_priv} 4 |
| 19 | ${no_access_priv} 15 |
| 20 | ${new_user_passwd} 0penBmc1 |
Tony Lee | 6c998f7 | 2020-03-09 18:28:35 +0800 | [diff] [blame] | 21 | |
| 22 | |
| 23 | *** Test Cases *** |
| 24 | |
| 25 | Test Get Payload Activation Status |
| 26 | [Documentation] Test get payload activation status. |
| 27 | [Tags] Test_Get_Payload_Activation_Status |
| 28 | |
| 29 | # SOL is the payload currently supported for payload status. |
| 30 | # Currently supports only one SOL session. |
| 31 | # Response Data |
| 32 | # 01 instance 1 is activated. |
| 33 | # 00 instance 1 is deactivated. |
| 34 | ${payload_status}= Get Payload Activation Status |
| 35 | Should Contain Any ${payload_status} 01 00 |
| 36 | |
| 37 | |
| 38 | Test Activate Payload |
| 39 | [Documentation] Test activate payload via IPMI raw command. |
| 40 | [Tags] Test_Activate_Payload |
| 41 | |
| 42 | ${payload_status}= Get Payload Activation Status |
| 43 | Run Keyword If '${payload_status}' == '01' Deactivate Payload |
| 44 | |
| 45 | Activate Payload |
| 46 | |
| 47 | ${payload_status}= Get Payload Activation Status |
| 48 | Should Contain ${payload_status} 01 |
| 49 | |
| 50 | |
| 51 | Test Deactivate Payload |
| 52 | [Documentation] Test deactivate payload via IPMI raw command. |
| 53 | [Tags] Test_Deactivate_Payload |
| 54 | |
| 55 | ${payload_status}= Get Payload Activation Status |
| 56 | Run Keyword If '${payload_status}' == '00' Activate Payload |
| 57 | |
| 58 | Deactivate Payload |
| 59 | |
| 60 | ${payload_status}= Get Payload Activation Status |
| 61 | Should Contain ${payload_status} 00 |
| 62 | |
| 63 | |
| 64 | Test Get Payload Instance Info |
| 65 | [Documentation] Test Get Payload Instance via IPMI raw command. |
| 66 | [Tags] Test_Get_Payload_Instance_Info |
| 67 | |
| 68 | ${payload_status}= Get Payload Activation Status |
| 69 | Run keyword If '${payload_status}' == '01' |
| 70 | ... Deactivate Payload |
| 71 | |
| 72 | # First four bytes should be 00 if given instance is not activated. |
| 73 | ${resp}= Run IPMI Command |
| 74 | ... ${IPMI_RAW_CMD['Payload']['Get_Payload_Instance_Info'][0]} |
| 75 | Should Contain ${resp} ${IPMI_RAW_CMD['Payload']['Get_Payload_Instance_Info'][1]} |
| 76 | Activate Payload |
| 77 | |
| 78 | # First four bytes should be session ID when payload is activated. |
| 79 | ${resp}= Run IPMI Command |
| 80 | ... ${IPMI_RAW_CMD['Payload']['Get_Payload_Instance_Info'][0]} |
| 81 | Should Not Contain ${resp} ${IPMI_RAW_CMD['Payload']['Get_Payload_Instance_Info'][1]} |
| 82 | |
| 83 | |
nagarjunb22 | a2255de | 2022-05-25 19:15:10 +0530 | [diff] [blame] | 84 | Verify Set User Access Payload For Standard Payload SOL |
| 85 | [Documentation] Disable standard payload for SOL and verify IPMI sol activate command does not work. |
| 86 | [Tags] Verify_Set_User_Access_Payload_For_Standard_Payload_SOL |
| 87 | [Teardown] Run Keywords Set User Access Payload For Given User ${user_id_in_hex} |
| 88 | ... AND Delete Created User ${userid} |
| 89 | ... AND FFDC On Test Case Fail |
| 90 | |
| 91 | ${userid} ${username}= Create And Verify IPMI User |
| 92 | ${user_id_in_hex}= Convert To Hex ${userid} |
| 93 | ${userid_in_hex_format}= Convert To Hex ${userid} prefix=0x length=2 |
| 94 | |
| 95 | # Get default user access payload values. |
| 96 | ${default_user_access_payload}= Get User Access Payload For Given Channel ${userid_in_hex_format} |
| 97 | |
| 98 | # Disable Standard payload 1 via set user access payload command. |
| 99 | Set User Access Payload For Given User ${user_id_in_hex} Disable |
| 100 | |
| 101 | Verify Standard Payload ${userid_in_hex_format} ${username} Disabled |
| 102 | |
| 103 | |
| 104 | Verify Set User Access Payload For Operator Privileged User |
| 105 | [Documentation] Try to set user access payload using operator privileged user and expect error. |
| 106 | [Tags] Verify_Set_User_Access_Payload_For_Operator_Privileged_User |
| 107 | [Teardown] Run Keywords Delete Created User ${userid} AND FFDC On Test Case Fail |
| 108 | |
| 109 | ${userid} ${username}= Create And Verify IPMI User ${operator_priv} Operator |
| 110 | |
| 111 | ${payload_raw_cmd}= Catenate ${IPMI_RAW_CMD['Payload']['Set_User_Access_Payload'][0]} |
| 112 | ... ${CHANNEL_NUMBER} 0x${user_id} 0x02 0x00 0x00 0x00 |
| 113 | |
| 114 | Run Keyword and Expect Error *Unable to establish IPMI* |
| 115 | ... Run External IPMI Raw Command ${payload_raw_cmd} U=${userid} P=${new_user_passwd} L=Operator |
| 116 | |
| 117 | |
nagarjunb | 765535a | 2022-06-01 12:59:00 +0530 | [diff] [blame] | 118 | Verify Set User Access Payload For Invalid User |
| 119 | [Documentation] Verify set user access payload IPMI command for invalid user. |
| 120 | [Tags] Verify_Set_User_Access_Payload_For_Invalid_User |
| 121 | |
| 122 | # Get Random invalid user ID. |
| 123 | ${invalid_userid}= Get Invalid User ID |
| 124 | |
| 125 | ${raw_cmd}= Catenate ${IPMI_RAW_CMD['Payload']['Set_User_Access_Payload'][0]} |
| 126 | ... ${CHANNEL_NUMBER} ${invalid_userid} 0x02 0x00 0x00 0x00 |
| 127 | |
| 128 | Verify Invalid IPMI Command ${raw_cmd} 0xcc |
| 129 | |
| 130 | |
| 131 | Verify Set User Access Payload For Invalid Channel Number |
| 132 | [Documentation] Verify set user access payload IPMI command for invalid channel number. |
| 133 | [Tags] Verify_Set_User_Access_Payload_for_Invalid_Channel_Number |
| 134 | [Teardown] Delete Created User ${userid} |
| 135 | |
| 136 | ${userid} ${username}= Create And Verify IPMI User |
| 137 | |
| 138 | FOR ${channel} IN @{inactive_channel_list} |
| 139 | |
| 140 | Verify Set User Access Payload For Invalid Channel ${userid} ${channel} |
| 141 | END |
| 142 | |
| 143 | |
| 144 | Verify Get User Access Payload For User Access privilege |
| 145 | [Documentation] Verify get user access payload for user access(Read-only) privileged user. |
| 146 | [Tags] Verify_Get_User_Access_Payload_For_User_Access_privilege |
| 147 | [Teardown] Delete Created User ${userid} |
| 148 | |
| 149 | ${userid} ${username}= Create And Verify IPMI User ${user_priv} User |
| 150 | |
| 151 | ${raw_command}= Catenate ${IPMI_RAW_CMD['Payload']['Get_User_Access_Payload'][0]} |
| 152 | ... ${CHANNEL_NUMBER} ${user_id} |
| 153 | |
| 154 | Run Keyword and Expect Error *Unable to establish IPMI* |
| 155 | ... Run External IPMI Raw Command ${raw_command} U=${userid} P=${new_user_passwd} L=User |
| 156 | |
| 157 | |
| 158 | Verify Get User Access Payload For Invalid User |
| 159 | [Documentation] Verify get user access payload IPMI command for invalid user. |
| 160 | [Tags] Verify_Get_User_Access_Payload_For_Invalid_User |
| 161 | |
| 162 | ${invalid_userid}= Get Invalid User ID |
| 163 | |
| 164 | Verify Get User Access Payload For Invalid User Or Channel ${invalid_userid} ${CHANNEL_NUMBER} |
| 165 | |
| 166 | |
| 167 | Verify Get User Access Payload For Invalid Channel Number |
| 168 | [Documentation] Verify get user access payload IPMI command for invalid channel number. |
| 169 | [Tags] Verify_Get_User_Access_Payload_For_Invalid_Channel_Number |
| 170 | [Teardown] Delete Created User ${userid} |
| 171 | |
| 172 | ${userid} ${username}= Create And Verify IPMI User |
| 173 | #${invalid_channels}= Get Invalid Channel Number |
| 174 | |
| 175 | FOR ${channel} IN @{inactive_channel_list} |
| 176 | Verify Get User Access Payload For Invalid User Or Channel ${userid} ${channel} |
| 177 | END |
| 178 | |
| 179 | |
Tony Lee | 6c998f7 | 2020-03-09 18:28:35 +0800 | [diff] [blame] | 180 | *** Keywords *** |
| 181 | |
nagarjunb | 765535a | 2022-06-01 12:59:00 +0530 | [diff] [blame] | 182 | IPMI Payload Setup Execution |
| 183 | [Documentation] Get active and inactive/invalid channels from channel_config.json file |
| 184 | ... in list type and set it as suite variable. |
| 185 | |
| 186 | # Get active channel list and set as a suite variable. |
| 187 | @{active_channel_list}= Get Active Ethernet Channel List current_channel=1 |
| 188 | Set Suite Variable @{active_channel_list} |
| 189 | |
| 190 | # Get Inactive/Invalid channel list and set as a suite variable. |
| 191 | @{inactive_channel_list}= Get Invalid Channel Number List |
| 192 | Set Suite Variable @{inactive_channel_list} |
| 193 | |
| 194 | |
Tony Lee | 6c998f7 | 2020-03-09 18:28:35 +0800 | [diff] [blame] | 195 | Get Payload Activation Status |
| 196 | [Documentation] Get payload activation status. |
| 197 | |
| 198 | ${resp}= Run IPMI Command |
| 199 | ... ${IPMI_RAW_CMD['Payload']['Get_Payload_Activation_Status'][0]} |
| 200 | |
| 201 | @{resp}= Split String ${resp} |
| 202 | |
| 203 | ${payload_status}= Set Variable ${resp[1]} |
| 204 | |
| 205 | [return] ${payload_status} |
| 206 | |
| 207 | |
| 208 | Activate Payload |
| 209 | [Documentation] Activate Payload. |
| 210 | |
| 211 | ${resp}= Run IPMI Command |
| 212 | ... ${IPMI_RAW_CMD['Payload']['Activate_Payload'][0]} |
| 213 | Should Contain ${resp} ${IPMI_RAW_CMD['Payload']['Activate_Payload'][1]} |
| 214 | |
| 215 | |
| 216 | Deactivate Payload |
| 217 | [Documentation] Deactivate Payload. |
| 218 | |
| 219 | ${resp}= Run IPMI Command |
| 220 | ... ${IPMI_RAW_CMD['Payload']['Deactivate_Payload'][0]} |
| 221 | Should Be Empty ${resp} |
nagarjunb22 | a2255de | 2022-05-25 19:15:10 +0530 | [diff] [blame] | 222 | |
| 223 | |
| 224 | Get User Access Payload For Given Channel |
| 225 | [Documentation] Execute get user access payload IPMI command for given channel |
| 226 | ... and return response. |
| 227 | [Arguments] ${user_id} ${channel_number}=${CHANNEL_NUMBER} |
| 228 | |
| 229 | # Description of argument(s): |
| 230 | # user_id The user ID (e.g. "1", "2", etc.). |
| 231 | # channel_number Input channel number(e.g. "1", "2"). |
| 232 | |
| 233 | ${raw_command}= Catenate ${IPMI_RAW_CMD['Payload']['Get_User_Access_Payload'][0]} |
| 234 | ... ${channel_number} ${user_id} |
| 235 | ${resp}= Run External IPMI Raw Command ${raw_command} |
| 236 | [Return] ${resp} |
| 237 | |
| 238 | |
| 239 | Create And Verify IPMI User |
| 240 | [Documentation] Create IPMI User, set password, set privilege and enable the user. |
| 241 | [Arguments] ${user_privilege_level}=${admin_level_priv} ${privilege}=Administrator |
| 242 | |
| 243 | # Description of argument(s): |
| 244 | # user_privilege_level User Privilege level in integer. |
| 245 | # (e.g. 4-Administrator, 3-Operator, 2-Readonly). |
| 246 | # privilege User Privilege in Wordings. |
| 247 | # (e.g. "Administrator", "Operator", "ReadOnly"). |
| 248 | |
| 249 | ${random_user_id} ${random_user_name}= Create Random IPMI User |
| 250 | Set User Password ${random_user_id} ${new_user_passwd} 16 |
| 251 | Set And Verify User Access Privilege ${random_user_id} ${user_privilege_level} |
| 252 | Verify Username And Password ${random_user_name} ${new_user_passwd} L=${privilege} |
| 253 | |
| 254 | [Return] ${random_user_id} ${random_user_name} |
| 255 | |
| 256 | |
| 257 | Set User Password |
| 258 | [Documentation] Set user password for given user ID. |
| 259 | [Arguments] ${user_id} ${password} ${password_option} |
| 260 | |
| 261 | # Description of argument(s): |
| 262 | # user_id The user ID (e.g. "1", "2", etc.). |
| 263 | # password The user password (e.g. "0penBmc", "0penBmc1", etc.). |
| 264 | # password_option Password length option to be given in IPMI command (e.g. "16", "20"). |
| 265 | |
| 266 | Run IPMI Standard Command user set password ${user_id} ${password} ${password_option} |
| 267 | |
| 268 | Set And Verify User Access Privilege |
| 269 | [Documentation] Set User Access Privilege, enable and verify user for given user ID. |
| 270 | [Arguments] ${user_id} ${privilege_level} |
| 271 | |
| 272 | # Description of argument(s): |
| 273 | # user_id The user ID (e.g. "1", "2", etc.). |
| 274 | # privilege_level User Privilege level in hex value. |
| 275 | # (e.g. 0x04-Administrator, 0x03-Operator, 0x02-Readonly). |
| 276 | |
| 277 | Set Channel Access ${_user_id} ipmi=on privilege=${privilege_level} |
| 278 | |
| 279 | # Delay added for user privilege to get set. |
| 280 | Sleep 5s |
| 281 | |
| 282 | Enable IPMI User And Verify ${user_id} |
| 283 | |
| 284 | |
| 285 | Verify Username And Password |
| 286 | [Documentation] Verify that newly created user is able to run IPMI command |
| 287 | ... with given username and password. |
| 288 | [Arguments] ${username} ${password} &{options} |
| 289 | |
| 290 | # Description of argument(s): |
| 291 | # username The user name (e.g. "root", "robert", etc.). |
| 292 | # password The user password (e.g. "0penBmc", "0penBmc1", etc.). |
| 293 | # options Additional ipmitool command options (e.g "-L=Operator","-C=3"). |
| 294 | |
| 295 | Wait Until Keyword Succeeds 15 sec 5 sec Run External IPMI Raw Command |
| 296 | ... ${IPMI_RAW_CMD['Device GUID']['Get'][0]} U=${username} P=${password} &{options} |
| 297 | |
| 298 | |
| 299 | Verify Standard Payload |
| 300 | [Documentation] Verify standard payload is disabled or enabled. |
| 301 | [Arguments] ${user_id} ${user_name} ${standard_payload}=Enabled |
| 302 | |
| 303 | # Description of argument(s): |
| 304 | # user_id The user ID (e.g. "1", "2", etc.). |
| 305 | # username The user name (e.g. "root", "robert", etc.). |
| 306 | # standard_payload Enabled or Disabled. |
| 307 | |
| 308 | # Verify the standard payload 1 (sol) is disabled. |
| 309 | ${get_user_access_payload}= Get User Access Payload For Given Channel ${user_id} |
| 310 | @{get_user_access_cmd_resp_list}= Split String ${get_user_access_payload} |
| 311 | |
| 312 | Run Keyword If '${standard_payload}' == 'Disabled' |
| 313 | ... Should Be Equal ${get_user_access_cmd_resp_list}[0] 00 |
| 314 | ... ELSE |
| 315 | ... Should Be Equal ${get_user_access_cmd_resp_list}[0] 02 |
| 316 | |
| 317 | Run Keyword If '${standard_payload}' == 'Disabled' |
| 318 | ... Verify Sol Activate Disabled ${user_name} |
| 319 | |
| 320 | |
| 321 | Verify Sol Activate Disabled |
| 322 | [Documentation] Verify SOL activate IPMI command is not working. |
| 323 | [Arguments] ${user_name} |
| 324 | |
| 325 | # Description of argument(s): |
| 326 | # username The user name (e.g. "root", "robert", etc.). |
| 327 | |
| 328 | ${resp}= Run External IPMI Standard Command |
| 329 | ... sol activate expected_rc=${1} U=${username} P=${new_user_passwd} |
| 330 | |
| 331 | Should Contain ${resp} SOL payload disabled |
| 332 | |
| 333 | |
| 334 | Set User Access Payload For Given User |
| 335 | [Documentation] Set the user access payload on given user, channel and return response. |
| 336 | [Arguments] ${user_id} ${operation_mode}=Enable ${oempayload_value}=0x00 ${standard_payload_value}=0x02 |
| 337 | |
| 338 | # Description of argument(s): |
| 339 | # user_id The user ID (e.g. "1", "2", etc.). |
| 340 | # operation_mode Enable or Disable payload type. |
| 341 | # oempayload_value Oempayload in hex (e.g. "0x00", "0x01", "0x02", "0x04" etc). |
| 342 | # standard_payload_value Standard payload type IPMI or SOL. |
| 343 | # (e.g. 0x01 - IPMI, 0x02- SOL). |
| 344 | |
| 345 | # If operation mode is disable 2nd byte of raw command is 4${user_id}. |
| 346 | # (e.g) 2n byte will be 0x4a (if user_id is a). |
| 347 | # If operation mode is enable 2nd byte of raw command is 0${user_id}. |
| 348 | # (e.g.) 3rd byte will be 0x0a (if user_id is a). |
| 349 | # 0x02- standard payload for SOL, 0x01 standard payload for IPMI. |
| 350 | # 3rd byte represent standard payload enables 1 (SOL). |
| 351 | # 4th to 6th byte represent standard payload enables 2 and OEM payload 1 & 2 respectively. |
| 352 | |
| 353 | ${operation_mode_value}= Set Variable If '${operation_mode}' == 'Enable' |
| 354 | ... 0 4 |
| 355 | ${set_cmd}= Catenate ${IPMI_RAW_CMD['Payload']['Set_User_Access_Payload'][0]} |
| 356 | ... ${CHANNEL_NUMBER} 0x${operation_mode_value}${user_id} ${standard_payload_value} 0x00 ${oempayload_value} 0x00 |
| 357 | |
| 358 | ${resp}= Run IPMI Command ${set_cmd} |
| 359 | |
nagarjunb | 765535a | 2022-06-01 12:59:00 +0530 | [diff] [blame] | 360 | [Return] ${resp} |
| 361 | |
| 362 | |
| 363 | Get Invalid User ID |
| 364 | [Documentation] Get random invalid user ID using "channel getaccess" IPMI standard command. |
| 365 | |
| 366 | # Python module: get_user_info(userid, channel_number=1) |
| 367 | ${user_info}= Get User Info ${EMPTY} |
| 368 | ${user_info}= Filter Struct ${user_info} [('user_name', None)] invert=1 |
| 369 | ${empty_user_info}= Filter Struct ${user_info} [('user_name', '')] |
| 370 | @{invalid_userid_list}= Create List |
| 371 | FOR ${user_record} IN @{empty_user_info} |
| 372 | Append To List ${invalid_userid_list} ${user_record['user_id']} |
| 373 | END |
| 374 | ${invalid_user_id}= Evaluate random.choice(${invalid_userid_list}) random |
| 375 | |
| 376 | [Return] ${invalid_user_id} |
| 377 | |
| 378 | |
| 379 | Verify Set User Access Payload For Invalid Channel |
| 380 | [Documentation] Verify set user payload command for invalid channels. |
| 381 | [Arguments] ${user_id} ${channel_number} |
| 382 | |
| 383 | # Description of argument(s): |
| 384 | # user_id The user ID (e.g. "1", "2", etc.). |
| 385 | # channel_number Input channel number. |
| 386 | |
| 387 | ${channel_number}= Convert To Hex ${channel_number} prefix=0x |
| 388 | ${user_id}= Convert To Hex ${user_id} prefix=0x |
| 389 | ${raw_cmd}= Catenate ${IPMI_RAW_CMD['Payload']['Set_User_Access_Payload'][0]} |
| 390 | ... ${channel_number} ${user_id} 0x02 0x00 0x00 0x00 |
| 391 | |
| 392 | Verify Invalid IPMI Command ${raw_cmd} 0xcc |
| 393 | |
| 394 | |
| 395 | Verify Get User Access Payload For Invalid User Or Channel |
| 396 | [Documentation] Verify get user payload command for invalid userid or invalid channels. |
| 397 | [Arguments] ${user_id} ${channel_number} |
| 398 | |
| 399 | # Description of argument(s): |
| 400 | # user_id The user ID (e.g. "1", "2", etc.). |
| 401 | # channel_number Input channel number. |
| 402 | |
| 403 | ${channel_number}= Convert To Hex ${channel_number} prefix=0x |
| 404 | ${user_id}= Convert To Hex ${user_id} prefix=0x |
| 405 | ${raw_cmd}= Catenate ${IPMI_RAW_CMD['Payload']['Get_User_Access_Payload'][0]} |
| 406 | ... ${channel_number} ${user_id} |
| 407 | |
| 408 | Verify Invalid IPMI Command ${raw_cmd} 0xcc |