1*** Settings *** 2Documentation Test IPMI and Redfish combinations for user management. 3 4Resource ../../lib/resource.robot 5Resource ../../lib/bmc_redfish_resource.robot 6Resource ../../lib/openbmc_ffdc.robot 7Resource ../../lib/ipmi_client.robot 8Library ../lib/ipmi_utils.py 9 10Test Setup Test Setup Execution 11Test Teardown Test Teardown Execution 12 13Test Teardown IPMI_Redfish_User 14 15*** Variables *** 16 17${valid_password} 0penBmc1 18${valid_password2} 0penBmc2 19${admin_level_priv} 4 20${operator_level_priv} 3 21${readonly_level_priv} 2 22${user_count} 0 23${ipmi_max_num_users} ${15} 24${max_num_users} ${15} 25${empty_name_pattern} ^User Name\\s.*\\s:\\s$ 26 27*** Test Cases *** 28 29Create Admin Redfish User And Verify Login Via IPMI 30 [Documentation] Create user using redfish and verify via IPMI. 31 [Tags] Create_Admin_Redfish_User_And_Verify_Login_Via_IPMI 32 33 ${random_username}= Generate Random String 8 [LETTERS] 34 Set Test Variable ${random_username} 35 36 ${payload}= Create Dictionary 37 ... UserName=${random_username} Password=${valid_password} 38 ... RoleId=Administrator Enabled=${True} 39 Redfish.Post /redfish/v1/AccountService/Accounts body=&{payload} 40 ... valid_status_codes=[${HTTP_CREATED}] 41 42 # Delay added for created new user password to get set. 43 Sleep 5s 44 45 Verify IPMI Username And Password ${random_username} ${valid_password} 46 47 48Update User Password Via Redfish And Verify Using IPMI 49 [Documentation] Update user password via Redfish and verify using IPMI. 50 [Tags] Update_User_Password_Via_Redfish_And_Verify_Using_IPMI 51 52 # Create user using Redfish. 53 ${random_username}= Generate Random String 8 [LETTERS] 54 Set Test Variable ${random_username} 55 56 ${payload}= Create Dictionary 57 ... UserName=${random_username} Password=${valid_password} 58 ... RoleId=Administrator Enabled=${True} 59 Redfish.Post /redfish/v1/AccountService/Accounts body=&{payload} 60 ... valid_status_codes=[${HTTP_CREATED}] 61 62 # Update user password using Redfish. 63 ${payload}= Create Dictionary Password=${valid_password2} 64 Redfish.Patch /redfish/v1/AccountService/Accounts/${random_username} body=&{payload} 65 66 # Verify that IPMI command works with new password and fails with older password. 67 Verify IPMI Username And Password ${random_username} ${valid_password2} 68 69 Run Keyword And Expect Error *Error: Unable to establish IPMI* 70 ... Verify IPMI Username And Password ${random_username} ${valid_password} 71 72 73Update User Privilege Via Redfish And Verify Using IPMI 74 [Documentation] Update user privilege via Redfish and verify using IPMI. 75 [Tags] Update_User_Privilege_Via_Redfish_And_Verify_Using_IPMI 76 77 # Create user using Redfish with admin privilege. 78 ${random_username}= Generate Random String 8 [LETTERS] 79 Set Test Variable ${random_username} 80 81 ${payload}= Create Dictionary 82 ... UserName=${random_username} Password=${valid_password} 83 ... RoleId=Administrator Enabled=${True} 84 Redfish.Post /redfish/v1/AccountService/Accounts body=&{payload} 85 ... valid_status_codes=[${HTTP_CREATED}] 86 87 # Update user privilege to operator using Redfish. 88 ${payload}= Create Dictionary RoleId=Operator 89 Redfish.Patch /redfish/v1/AccountService/Accounts/${random_username} body=&{payload} 90 91 # Verify new user privilege level via IPMI. 92 ${resp}= Run IPMI Standard Command user list ${CHANNEL_NUMBER} 93 94 # Example of response data: 95 # ID Name Callin Link Auth IPMI Msg Channel Priv Limit 96 # 1 root false true true ADMINISTRATOR 97 # 2 OAvCxjMv false true true OPERATOR 98 # 3 true false false NO ACCESS 99 # .. 100 # .. 101 # 15 true false false NO ACCESS 102 103 ${user_info}= 104 ... Get Lines Containing String ${resp} ${random_username} 105 Should Contain ${user_info} OPERATOR 106 107 108Delete User Via Redfish And Verify Using IPMI 109 [Documentation] Delete user via redfish and verify using IPMI. 110 [Tags] Delete_User_Via_Redfish_And_Verify_Using_IPMI 111 112 # Create user using Redfish. 113 ${random_username}= Generate Random String 8 [LETTERS] 114 Set Test Variable ${random_username} 115 116 ${payload}= Create Dictionary 117 ... UserName=${random_username} Password=${valid_password} 118 ... RoleId=Administrator Enabled=${True} 119 Redfish.Post /redfish/v1/AccountService/Accounts body=&{payload} 120 ... valid_status_codes=[${HTTP_CREATED}] 121 122 # Delete user using Redfish. 123 Redfish.Delete /redfish/v1/AccountService/Accounts/${random_username} 124 125 # Verify that IPMI command fails with deleted user. 126 Run Keyword And Expect Error *Error: Unable to establish IPMI* 127 ... Verify IPMI Username And Password ${random_username} ${valid_password} 128 129 130Create IPMI User And Verify Login Via Redfish 131 [Documentation] Create user using IPMI and verify user login via Redfish. 132 [Tags] Create_IPMI_User_And_Verify_Login_Via_Redfish 133 134 ${username} ${userid}= IPMI Create Random User Plus Password And Privilege 135 ... ${valid_password} ${admin_level_priv} 136 137 Redfish.Logout 138 139 # Verify user login using Redfish. 140 Redfish.Login ${username} ${valid_password} 141 Redfish.Logout 142 143 Redfish.Login 144 145 146Update User Password Via IPMI And Verify Using Redfish 147 [Documentation] Update user password using IPMI and verify user 148 ... login via Redfish. 149 [Tags] Update_User_Password_Via_IPMI_And_Verify_Using_Redfish 150 151 ${username} ${userid}= IPMI Create Random User Plus Password And Privilege 152 ... ${valid_password} ${admin_level_priv} 153 154 # Update user password using IPMI. 155 Run IPMI Standard Command 156 ... user set password ${userid} ${valid_password2} 157 158 Redfish.Logout 159 160 # Verify that user login works with new password using Redfish. 161 Redfish.Login ${username} ${valid_password2} 162 Redfish.Logout 163 164 Redfish.Login 165 166 167Update User Privilege To Operator Via IPMI And Verify Using Redfish 168 [Documentation] Update user privilege to operator via IPMI and verify using Redfish. 169 [Tags] Update_User_Privilege_To_Operator_Via_IPMI_And_Verify_Using_Redfish 170 # Create user using IPMI with admin privilege. 171 ${username} ${userid}= IPMI Create Random User Plus Password And Privilege 172 ... ${valid_password} ${admin_level_priv} 173 174 # Change user privilege to opetrator using IPMI. 175 Run IPMI Standard Command 176 ... user priv ${userid} ${operator_level_priv} ${CHANNEL_NUMBER} 177 178 # Verify new user privilege level via Redfish. 179 ${privilege}= Redfish_Utils.Get Attribute 180 ... /redfish/v1/AccountService/Accounts/${username} RoleId 181 Should Be Equal ${privilege} Operator 182 183 184Update User Privilege To Readonly Via IPMI And Verify Using Redfish 185 [Documentation] Update user privilege to readonly via IPMI and verify using Redfish. 186 [Tags] Update_User_Privilege_To_Readonly_Via_IPMI_And_Verify_Using_Redfish 187 188 # Create user using IPMI with admin privilege. 189 ${username} ${userid}= IPMI Create Random User Plus Password And Privilege 190 ... ${valid_password} ${admin_level_priv} 191 192 # Change user privilege to readonly using IPMI. 193 Run IPMI Standard Command 194 ... user priv ${userid} ${readonly_level_priv} ${CHANNEL_NUMBER} 195 196 # Verify new user privilege level via Redfish. 197 ${privilege}= Redfish_Utils.Get Attribute 198 ... /redfish/v1/AccountService/Accounts/${username} RoleId 199 Should Be Equal ${privilege} ReadOnly 200 201 202Delete User Via IPMI And Verify Using Redfish 203 [Documentation] Delete user using IPMI and verify error while doing 204 ... user login with deleted user via Redfish. 205 [Tags] Delete_User_Via_IPMI_And_Verify_Using_Redfish 206 207 ${username} ${userid}= IPMI Create Random User Plus Password And Privilege 208 ... ${valid_password} ${admin_level_priv} 209 210 # Delete IPMI User. 211 Run IPMI Standard Command user set name ${userid} "" 212 213 # Verify that Redfish login fails with deleted user. 214 Run Keyword And Expect Error *InvalidCredentialsError* 215 ... Redfish.Login ${username} ${valid_password} 216 217 218Verify Failure To Exceed Max Number Of Users 219 [Documentation] Verify failure attempting to exceed the max number of 220 ... user accounts. 221 [Tags] Verify_Failure_To_Exceed_Max_Number_Of_Users 222 [Teardown] Run Keywords Test Teardown Execution 223 ... AND Delete Users Via Redfish ${username_list} 224 225 # Get existing user count. 226 ${existing_user_count}= Get User Count Of Not IPMI Account Type 227 228 ${payload}= Create Dictionary Password=${valid_password} 229 ... RoleId=Administrator Enabled=${True} 230 231 @{username_list}= Create List 232 233 # Create users to reach maximum users count (i.e. 15 users). 234 FOR ${INDEX} IN RANGE ${existing_user_count} ${max_num_users} 235 ${random_username}= Generate Random String 8 [LETTERS] 236 Set To Dictionary ${payload} UserName ${random_username} 237 Redfish.Post ${REDFISH_ACCOUNTS_URI} body=&{payload} 238 ... valid_status_codes=[${HTTP_CREATED}] 239 Append To List ${username_list} /redfish/v1/AccountService/Accounts/${random_username} 240 END 241 242 # Verify error while creating 16th user. 243 ${random_username}= Generate Random String 8 [LETTERS] 244 Set To Dictionary ${payload} UserName ${random_username} 245 Redfish.Post ${REDFISH_ACCOUNTS_URI} body=&{payload} 246 ... valid_status_codes=[${HTTP_BAD_REQUEST}] 247 248 249Create IPMI User Without Any Privilege And Verify Via Redfish 250 [Documentation] Create user using IPMI without privilege and verify via redfish. 251 [Tags] Create_IPMI_User_Without_Any_Privilege_And_Verify_Via_Redfish 252 253 ${username} ${userid}= IPMI Create Random User Plus Password And Privilege 254 ... ${valid_password} 255 256 # Verify new user privilege level via Redfish. 257 ${privilege}= Redfish_Utils.Get Attribute 258 ... /redfish/v1/AccountService/Accounts/${username} RoleId 259 Valid Value privilege ['ReadOnly'] 260 261*** Keywords *** 262 263IPMI Create Random User Plus Password And Privilege 264 [Documentation] Create random IPMI user with given password and privilege 265 ... level. 266 [Arguments] ${password} ${privilege}=0 267 268 # Description of argument(s): 269 # password Password to be assigned for the user. 270 # privilege Privilege level for the user (e.g. "1", "2", "3", etc.). 271 272 # Create IPMI user. 273 ${random_username}= Generate Random String 8 [LETTERS] 274 Set Suite Variable ${random_username} 275 276 ${random_userid}= Find Free User Id 277 IPMI Create User ${random_userid} ${random_username} 278 279 # Set given password for newly created user. 280 Run IPMI Standard Command 281 ... user set password ${random_userid} ${password} 282 283 # Enable IPMI user. 284 Run IPMI Standard Command user enable ${random_userid} 285 286 # Set given privilege and enable IPMI messaging for newly created user. 287 IF '${privilege}' != '0' 288 Set Channel Access ${random_userid} ipmi=on privilege=${privilege} 289 END 290 291 RETURN ${random_username} ${random_userid} 292 293 294Delete Users Via Redfish 295 [Documentation] Delete all the users via redfish from given list. 296 [Arguments] ${user_list} 297 298 # Description of argument(s): 299 # user_list List of user which are to be deleted. 300 301 Redfish.Login 302 303 FOR ${user} IN @{user_list} 304 Redfish.Delete ${user} 305 END 306 307 Redfish.Logout 308 309 310Test Setup Execution 311 [Documentation] Do test case setup tasks. 312 313 Redfish.Login 314 315 316Test Teardown Execution 317 [Documentation] Do the post test teardown. 318 319 FFDC On Test Case Fail 320 # Delete the test user. 321 Run Keyword And Ignore Error 322 ... Redfish.Delete /redfish/v1/AccountService/Accounts/${random_username} 323 324 Redfish.Logout 325 326 327Find Free User Id 328 [Documentation] Find a userid that is not being used. 329 330 FOR ${jj} IN RANGE 300 331 # IPMI maximum users count (i.e. 15 users). 332 ${random_userid}= Evaluate random.randint(1, ${ipmi_max_num_users}) modules=random 333 ${access}= Run IPMI Standard Command channel getaccess ${CHANNEL_NUMBER} ${random_userid} 334 335 ${name_line}= Get Lines Containing String ${access} User Name 336 ${is_empty}= Run Keyword And Return Status 337 ... Should Match Regexp ${name_line} ${empty_name_pattern} 338 339 IF ${is_empty} == ${True} BREAK 340 END 341 IF '${jj}' == '299' Fail msg=A free user ID could not be found. 342 RETURN ${random_userid} 343 344 345Get All User Account Names 346 [Documentation] Get all user account names in list format. 347 348 @{username_list}= Create List 349 ${resp}= Redfish.Get /redfish/v1/AccountService/Accounts/ 350 ${current_users}= Get From Dictionary ${resp.dict} Members 351 FOR ${user} IN @{current_users} 352 ${output}= Split String ${user["@odata.id"]} /redfish/v1/AccountService/Accounts/ 353 Append To List ${username_list} ${output[1]} 354 END 355 RETURN ${username_list} 356 357 358Get User Count Of Not IPMI Account Type 359 [Documentation] Get user count of not IPMI account type. 360 361 ${username_list}= Get All User Account Names 362 FOR ${user} IN @{username_list} 363 ${resp}= Redfish.Get /redfish/v1/AccountService/Accounts/${user} 364 @{account_type}= Get From Dictionary ${resp.dict} AccountTypes 365 IF "IPMI" not in ${account_type} 366 ${user_count}= Evaluate ${user_count} + 1 367 END 368 END 369 RETURN ${user_count} 370