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