1*** Settings ***
2Documentation       Test suite for OpenBMC IPMI user management.
3
4Resource            ../lib/ipmi_client.robot
5Resource            ../lib/openbmc_ffdc.robot
6Resource            ../lib/bmc_network_utils.robot
7Library             ../lib/ipmi_utils.py
8Test Setup          Printn
9
10Suite Setup         Suite Setup Execution
11Test Teardown       Test Teardown Execution
12
13Force Tags          IPMI_User
14
15*** Variables ***
16
17${invalid_username}     user%
18${invalid_password}     abc123
19${new_username}         newuser
20${root_userid}          1
21${operator_level_priv}  0x3
22${user_priv}            2
23${operator_priv}        3
24${admin_level_priv}     4
25${valid_password}       0penBmc1
26${max_password_length}  20
27${ipmi_setaccess_cmd}   channel setaccess
28&{password_values}      16=0penBmc10penBmc2  17=0penBmc10penBmc2B
29              ...       20=0penBmc10penBmc2Bmc3  21=0penBmc10penBmc2Bmc34
30              ...       7=0penBmc  8=0penBmc0
31${expected_max_ids}     15
32${root_pattern}         ^.*\\sroot\\s.*ADMINISTRATOR.*$
33${empty_name_pattern}   ^User Name\\s.*\\s:\\s$
34
35# User defined count.
36${USER_LOOP_COUNT}      20
37
38*** Test Cases ***
39
40Verify IPMI User Summary
41    [Documentation]  Verify IPMI maximum supported IPMI user ID and
42    ...  enabled user from user summary.
43    [Tags]  Verify_IPMI_User_Summary
44    [Teardown]  Run Keywords  FFDC On Test Case Fail  AND
45    ...  Delete Created User  ${random_userid}
46
47    ${initial_user_count}  ${maximum_ids}=  Get Enabled User Count
48
49    ${random_userid}  ${random_username}=  Create Random IPMI User
50    Wait And Confirm New User Entry  ${random_username}
51    Set Test Variable  ${random_userid}
52    Run IPMI Standard Command  user enable ${random_userid}
53
54    # Verify number of currently enabled users.
55    ${current_user_count}  ${maximum_ids}=  Get Enabled User Count
56    ${calculated_count}=  Evaluate  ${initial_user_count} + 1
57    Should Be Equal As Integers  ${current_user_count}   ${calculated_count}
58
59    # Verify maximum user count IPMI local user can have.
60    Should Be Equal As Integers  ${maximum_ids}  ${expected_max_ids}
61
62
63Verify IPMI User List
64    [Documentation]  Verify user list via IPMI.
65    [Tags]  Verify_IPMI_User_List
66    [Teardown]  Run Keywords  FFDC On Test Case Fail  AND
67    ...  Delete Created User  ${random_userid}
68
69    ${random_userid}  ${random_username}=  Create Random IPMI User
70    Set Test Variable  ${random_userid}
71
72    Run IPMI Standard Command
73    ...  user set password ${random_userid} ${valid_password}
74    Run IPMI Standard Command  user enable ${random_userid}
75    # Delay added for IPMI user to get enabled.
76    Sleep  5s
77    # Set admin privilege and enable IPMI messaging for newly created user.
78    Set Channel Access  ${random_userid}  ipmi=on privilege=${admin_level_priv}
79
80    ${users_access}=  Get User Access Ipmi  ${CHANNEL_NUMBER}
81    Rprint Vars  users_access
82
83    ${index}=  Evaluate  ${random_userid} - 1
84    # Verify the user access of created user.
85    Valid Value  users_access[${index}]['id']  ['${random_userid}']
86    Valid Value  users_access[${index}]['name']  ['${random_username}']
87    Valid Value  users_access[${index}]['callin']  ['true']
88    Valid Value  users_access[${index}]['link']  ['false']
89    Valid Value  users_access[${index}]['auth']  ['true']
90    Valid Value  users_access[${index}]['ipmi']  ['ADMINISTRATOR']
91
92
93Verify IPMI User Creation With Valid Name And ID
94    [Documentation]  Create user via IPMI and verify.
95    [Tags]  Verify_IPMI_User_Creation_With_Valid_Name_And_ID
96    [Teardown]  Run Keywords  FFDC On Test Case Fail  AND
97    ...  Delete Created User  ${random_userid}
98
99    ${random_userid}  ${random_username}=  Create Random IPMI User
100    Set Test Variable  ${random_userid}
101
102
103Verify IPMI User Creation With Invalid Name
104    [Documentation]  Verify error while creating IPMI user with invalid
105    ...  name (e.g. user name with special characters).
106    [Tags]  Verify_IPMI_User_Creation_With_Invalid_Name
107
108    ${random_userid}=  Find Free User Id
109    ${msg}=  Run Keyword And Expect Error  *  Run IPMI Standard Command
110    ...  user set name ${random_userid} ${invalid_username}
111    Should Contain  ${msg}  Invalid data
112
113
114Verify IPMI User Creation With Invalid ID
115    [Documentation]  Verify error while creating IPMI user with invalid
116    ...  ID(i.e. any number greater than 15 or 0).
117    [Tags]  Verify_IPMI_User_Creation_With_Invalid_ID
118
119    @{id_list}=  Create List
120    ${random_invalid_id}=  Evaluate  random.randint(16, 1000)  modules=random
121    Append To List  ${id_list}  ${random_invalid_id}
122    Append To List  ${id_list}  0
123
124    FOR  ${id}  IN  @{id_list}
125      ${msg}=  Run Keyword And Expect Error  *  Run IPMI Standard Command
126      ...  user set name ${id} newuser
127      Should Contain Any  ${msg}  User ID is limited to range  Parameter out of range
128    END
129
130
131Verify Setting IPMI User With Invalid Password
132    [Documentation]  Verify error while setting IPMI user with invalid
133    ...  password.
134    [Tags]  Verify_Setting_IPMI_User_With_Invalid_Password
135    [Teardown]  Run Keywords  FFDC On Test Case Fail  AND
136    ...  Delete Created User  ${random_userid}
137
138    ${random_userid}  ${random_username}=  Create Random IPMI User
139    Set Test Variable  ${random_userid}
140
141    # Set invalid password for newly created user.
142    ${msg}=  Run Keyword And Expect Error  *  Run IPMI Standard Command
143    ...  user set password ${random_userid} ${invalid_password}
144
145    # Delay added for user password to get set.
146    Sleep  5s
147
148    Should Contain  ${msg}  Set User Password command failed
149
150
151Verify Setting IPMI Root User With New Name
152    [Documentation]  Verify error while setting IPMI root user with new
153    ...  name.
154    [Tags]  Verify_Setting_IPMI_Root_User_With_New_Name
155
156    # Set invalid password for newly created user.
157    ${msg}=  Run Keyword And Expect Error  *  Run IPMI Standard Command
158    ...  user set name ${root_userid} abcd
159
160    Should Contain  ${msg}  Set User Name command failed
161
162
163Verify IPMI User Password Via Test Command
164    [Documentation]  Verify IPMI user password using test command.
165    [Tags]  Verify_IPMI_User_Password_Via_Test_Command
166    [Teardown]  Run Keywords  FFDC On Test Case Fail  AND
167    ...  Delete Created User  ${random_userid}
168
169    ${random_userid}  ${random_username}=  Create Random IPMI User
170    Set Test Variable  ${random_userid}
171
172    # Set valid password for newly created user.
173    Run IPMI Standard Command
174    ...  user set password ${random_userid} ${valid_password}
175
176    # Verify newly set password using test command.
177    ${msg}=  Run IPMI Standard Command
178    ...  user test ${random_userid} ${max_password_length} ${valid_password}
179
180    Should Contain  ${msg}  Success
181
182
183Verify Setting Valid Password For IPMI User
184    [Documentation]  Set valid password for IPMI user and verify.
185    [Tags]  Verify_Setting_Valid_Password_For_IPMI_User
186    [Teardown]  Run Keywords  FFDC On Test Case Fail  AND
187    ...  Delete Created User  ${random_userid}
188
189    ${random_userid}  ${random_username}=  Create Random IPMI User
190    Set Test Variable  ${random_userid}
191
192    # Set valid password for newly created user.
193    Run IPMI Standard Command
194    ...  user set password ${random_userid} ${valid_password}
195
196    Run IPMI Standard Command  user enable ${random_userid}
197
198    # Delay added for IPMI user to get enable
199    Sleep  5s
200
201    # Set admin privilege and enable IPMI messaging for newly created user
202    Set Channel Access  ${random_userid}  ipmi=on privilege=${admin_level_priv}
203
204    Verify IPMI Username And Password  ${random_username}  ${valid_password}
205
206
207Verify IPMI User Creation With Same Name
208    [Documentation]  Verify error while creating two IPMI user with same name.
209    [Tags]  Verify_IPMI_User_Creation_With_Same_Name
210    [Teardown]  Run Keywords  FFDC On Test Case Fail  AND
211    ...  Delete Created User  ${random_userid}
212
213    ${random_userid}  ${random_username}=  Create Random IPMI User
214
215    # Set same username for another IPMI user.
216    ${rand_userid_two}=  Find Free User Id
217    ${msg}=  Run Keyword And Expect Error  *  Run IPMI Standard Command
218    ...  user set name ${rand_userid_two} ${random_username}
219    Should Contain  ${msg}  Invalid data field in request
220
221
222Verify Setting IPMI User With Null Password
223    [Documentation]  Verify error while setting IPMI user with null
224    ...  password.
225    [Tags]  Verify_Setting_IPMI_User_With_Null_Password
226    [Teardown]  Run Keywords  FFDC On Test Case Fail  AND
227    ...  Delete Created User  ${random_userid}
228
229    ${random_userid}  ${random_username}=  Create Random IPMI User
230    Set Test Variable  ${random_userid}
231
232    # Set null password for newly created user.
233    ${msg}=  Run Keyword And Expect Error  *  Run IPMI Standard Command
234    ...  user set password ${random_userid} ""
235
236    Should Contain  ${msg}  Invalid data field in request
237
238
239Verify IPMI User Deletion
240    [Documentation]  Delete user via IPMI and verify.
241    [Tags]  Verify_IPMI_User_Deletion
242    [Teardown]  Run Keywords  FFDC On Test Case Fail  AND
243    ...  Delete Created User  ${random_userid}
244
245    ${random_userid}  ${random_username}=  Create Random IPMI User
246    Set Test Variable  ${random_userid}
247    # Delete IPMI User and verify
248    Run IPMI Standard Command  user set name ${random_userid} ""
249    ${user_info}=  Get User Info  ${random_userid}  ${CHANNEL_NUMBER}
250    Should Be Equal  ${user_info['user_name']}  ${EMPTY}
251
252
253Test IPMI User Privilege Level
254    [Documentation]  Verify IPMI user with user privilege can only run user level commands.
255    [Tags]  Test_IPMI_User_Privilege_Level
256    [Template]  Test IPMI User Privilege
257    [Teardown]  Run Keywords  FFDC On Test Case Fail  AND
258    ...  Delete Created User  ${random_userid}
259
260    #Privilege level     User Cmd Status  Operator Cmd Status  Admin Cmd Status
261    ${user_priv}         Passed           Failed               Failed
262
263
264Test IPMI Operator Privilege Level
265    [Documentation]  Verify IPMI user with operator privilege can only run user and operator levels commands.
266    ...  level is set to operator.
267    [Tags]  Test_IPMI_Operator_Privilege_Level
268    [Template]  Test IPMI User Privilege
269    [Teardown]  Run Keywords  FFDC On Test Case Fail  AND
270    ...  Delete Created User  ${random_userid}
271
272    #Privilege level     User Cmd Status  Operator Cmd Status  Admin Cmd Status
273    ${operator_priv}     Passed           Passed               Failed
274
275
276Test IPMI Administrator Privilege Level
277    [Documentation]  Verify IPMI user with admin privilege can run all levels command.
278    [Tags]  Test_IPMI_Administrator_Privilege_Level
279    [Template]  Test IPMI User Privilege
280    [Teardown]  Run Keywords  FFDC On Test Case Fail  AND
281    ...  Delete Created User  ${random_userid}
282
283    #Privilege level     User Cmd Status  Operator Cmd Status  Admin Cmd Status
284    ${admin_level_priv}  Passed           Passed               Passed
285
286
287Enable IPMI User And Verify
288    [Documentation]  Enable IPMI user and verify that the user is able
289    ...  to run IPMI command.
290    [Tags]  Enable_IPMI_User_And_Verify
291    [Teardown]  Run Keywords  FFDC On Test Case Fail  AND
292    ...  Delete Created User  ${random_userid}
293
294    ${random_userid}  ${random_username}=  Create Random IPMI User
295    Set Test Variable  ${random_userid}
296    Run IPMI Standard Command
297    ...  user set password ${random_userid} ${valid_password}
298
299    # Set admin privilege and enable IPMI messaging for newly created user.
300    Set Channel Access  ${random_userid}  ipmi=on privilege=${admin_level_priv}
301
302    # Delay added for user privilege to get set.
303    Sleep  5s
304
305    Enable IPMI User And Verify  ${random_userid}
306    Wait And Confirm New Username And Password  ${random_username}  ${valid_password}
307
308    # Verify that enabled IPMI  user is able to run IPMI command.
309    Verify IPMI Username And Password  ${random_username}  ${valid_password}
310
311
312Disable IPMI User And Verify
313    [Documentation]  Disable IPMI user and verify that that the user
314    ...  is unable to run IPMI command.
315    [Tags]  Disable_IPMI_User_And_Verify
316    [Teardown]  Run Keywords  FFDC On Test Case Fail  AND
317    ...  Delete Created User  ${random_userid}
318
319    ${random_userid}  ${random_username}=  Create Random IPMI User
320    Set Test Variable  ${random_userid}
321    Run IPMI Standard Command
322    ...  user set password ${random_userid} ${valid_password}
323
324    # Set admin privilege and enable IPMI messaging for newly created user.
325    Set Channel Access  ${random_userid}  ipmi=on privilege=${admin_level_priv}
326
327    # Disable IPMI user and verify.
328    Run IPMI Standard Command  user disable ${random_userid}
329    ${user_info}=  Get User Info  ${random_userid}  ${CHANNEL_NUMBER}
330    Should Be Equal  ${user_info['enable_status']}  disabled
331
332    # Verify that disabled IPMI  user is unable to run IPMI command.
333    ${msg}=  Run Keyword And Expect Error  *  Verify IPMI Username And Password
334    ...  ${random_username}  ${valid_password}
335    Should Contain  ${msg}  Unable to establish IPMI
336
337
338Verify IPMI Root User Password Change
339    [Documentation]  Change IPMI root user password and verify that
340    ...  root user is able to run IPMI command.
341    [Tags]  Verify_IPMI_Root_User_Password_Change
342    [Setup]  Skip if  len( '${OPENBMC_PASSWORD}' ) < 8
343    ...  msg= Do not run this test if len( OPENBMC_PASSWORD ) < 8
344    # Reason: if OPENBMC_PASSWORD is not at least 8 characters,
345    #         it cannot be restored in the Teardown step.
346    [Teardown]  Run Keywords  FFDC On Test Case Fail  AND
347    ...  Run Keyword If  "${TEST STATUS}" != "SKIP"
348    ...  Wait Until Keyword Succeeds  15 sec  5 sec
349    ...  Restore Default Password For IPMI Root User
350
351    # Set new password for root user.
352    Run IPMI Standard Command
353    ...  user set password ${root_userid} ${valid_password}
354
355    # Delay added for user password to get set.
356    Sleep  5s
357
358    # Verify that root user is able to run IPMI command using new password.
359    Wait Until Keyword Succeeds  15 sec  5 sec  Verify IPMI Username And Password
360    ...  root  ${valid_password}
361
362
363Verify Administrator And User Privilege For Different Channels
364    [Documentation]  Set administrator and user privilege for different channels and verify.
365    [Tags]  Verify_Administrator_And_User_Privilege_For_Different_Channels
366    [Setup]  Check Active Ethernet Channels
367    [Teardown]  Run Keywords  FFDC On Test Case Fail  AND
368    ...  Delete Created User  ${random_userid}
369
370    ${random_userid}  ${random_username}=  Create Random IPMI User
371    Set Test Variable  ${random_userid}
372    Run IPMI Standard Command
373    ...  user set password ${random_userid} ${valid_password}
374
375    # Set admin privilege for newly created user with channel 1.
376    Set Channel Access  ${random_userid}  ipmi=on privilege=${admin_level_priv}  ${CHANNEL_NUMBER}
377
378    # Set user privilege for newly created user with channel 2.
379    Set Channel Access  ${random_userid}  ipmi=on privilege=${user_priv}  ${secondary_channel_number}
380
381    Enable IPMI User And Verify  ${random_userid}
382
383    # Verify that user is able to run administrator level IPMI command with channel 1.
384    Verify IPMI Command  ${random_username}  ${valid_password}  Administrator  ${CHANNEL_NUMBER}
385
386    # Verify that user is unable to run IPMI command with channel 2.
387    Run IPMI Standard Command
388    ...  sel info ${secondary_channel_number}  expected_rc=${1}  U=${random_username}  P=${valid_password}
389
390
391Verify Operator And User Privilege For Different Channels
392    [Documentation]  Set operator and user privilege for different channels and verify.
393    [Tags]  Verify_Operator_And_User_Privilege_For_Different_Channels
394    [Setup]  Check Active Ethernet Channels
395    [Teardown]  Run Keywords  FFDC On Test Case Fail  AND
396    ...  Delete Created User  ${random_userid}
397
398    ${random_userid}  ${random_username}=  Create Random IPMI User
399    Set Test Variable  ${random_userid}
400    Run IPMI Standard Command
401    ...  user set password ${random_userid} ${valid_password}
402
403    # Set operator privilege for newly created user with channel 1.
404    Set Channel Access  ${random_userid}  ipmi=on privilege=${operator_priv}  ${CHANNEL_NUMBER}
405
406    # Set user privilege for newly created user with channel 2.
407    Set Channel Access  ${random_userid}  ipmi=on privilege=${user_priv}  ${secondary_channel_number}
408
409    Enable IPMI User And Verify  ${random_userid}
410
411    # Verify that user is able to run operator level IPMI command with channel 1.
412    Verify IPMI Command  ${random_username}  ${valid_password}  Operator  ${CHANNEL_NUMBER}
413
414    # Verify that user is able to run user level IPMI command with channel 2.
415    Verify IPMI Command  ${random_username}  ${valid_password}  User  ${secondary_channel_number}
416
417
418Verify Setting IPMI User With Max Password Length
419    [Documentation]  Verify IPMI user creation with password length of 20 characters.
420    [Tags]  Verify_Setting_IPMI_User_With_Max_Password_Length
421    [Template]  Set User Password And Verify
422
423    # password_length  password_option  expected_status
424    20                 20               ${True}
425
426
427Verify Setting IPMI User With Invalid Password Length
428    [Documentation]  Verify that IPMI user cannot be set with 21 character password using 16 char
429    ...  or 20 char password option.
430    [Tags]  Verify_Setting_IPMI_User_With_Invalid_Password_Length
431    [Template]  Set User Password And Verify
432
433    # password_length  password_option  expected_status
434    21                 16               ${False}
435    21                 20               ${False}
436
437
438Verify Setting IPMI User With 16 Character Password
439    [Documentation]  Verify that IPMI user can create a 16 character password using 16 char or 20
440    ...  char password option.
441    [Tags]  Verify_Setting_IPMI_User_With_16_Character_Password
442    [Template]  Set User Password And Verify
443
444    # password_length  password_option  expected_status
445    16                 16               ${True}
446    16                 20               ${True}
447
448
449Verify Default Selection Of 16 Character Password For IPMI User
450    [Documentation]  Verify that ipmitool by default opts for the 16 character option when given a
451    ...  password whose length is in between 17 and 20.
452    [Tags]  Verify_Default_Selection_Of_16_Character_Password_For_IPMI_User
453    [Template]  Set User Password And Verify
454
455    # password_length  password_option  expected_status
456    17                 16               ${True}
457    20                 16               ${True}
458
459
460Verify Minimum Password Length For IPMI User
461    [Documentation]  Verify minimum password length of 8 characters.
462    [Tags]  Verify_Minimum_Password_Length_For_IPMI_User
463    [Template]  Set User Password And Verify
464
465    # password_length  password_option  expected_status
466    7                  16               ${False}
467    8                  16               ${True}
468    7                  20               ${False}
469    8                  20               ${True}
470
471
472Verify Continuous IPMI Command Execution
473    [Documentation]  Verify that continuous IPMI command execution runs fine.
474    [Tags]  Verify_Continuous_IPMI_Command_Execution
475
476    FOR  ${i}  IN RANGE  ${USER_LOOP_COUNT}
477        Run IPMI Standard Command  lan print
478        Run IPMI Standard Command  power status
479        Run IPMI Standard Command  fru list
480        Run IPMI Standard Command  sel list
481    END
482
483
484Modify IPMI User
485    [Documentation]  Verify modified IPMI user is communicating via IPMI.
486    [Tags]  Modify_IPMI_User
487    [Teardown]  Run Keywords  FFDC On Test Case Fail  AND
488    ...  Delete Created User  ${random_userid}
489
490    ${random_userid}  ${random_username}=  Create Random IPMI User
491    Set Test Variable  ${random_userid}
492    Run IPMI Standard Command
493    ...  user set password ${random_userid} ${valid_password}
494
495    # Set admin privilege and enable IPMI messaging for newly created user.
496    Set Channel Access  ${random_userid}  ipmi=on privilege=${admin_level_priv}
497
498    # Delay added for user privilege to get set.
499    Sleep  5s
500
501    Enable IPMI User And Verify  ${random_userid}
502
503    # Verify that user is able to run administrator level IPMI command.
504    Verify IPMI Command  ${random_username}  ${valid_password}  Administrator  ${CHANNEL_NUMBER}
505
506    # Set different username for same IPMI user.
507    Run IPMI Standard Command
508    ...  user set name ${random_userid} ${new_username}
509    Wait And Confirm New Username And Password  ${new_username}  ${valid_password}
510
511    # Verify that user is able to run administrator level IPMI command.
512    Verify IPMI Command  ${new_username}  ${valid_password}  Administrator  ${CHANNEL_NUMBER}
513
514
515*** Keywords ***
516
517Restore Default Password For IPMI Root User
518    [Documentation]  Restore default password for IPMI root user
519
520    ${result}=  Run External IPMI Standard Command
521    ...  user set password ${root_userid} ${OPENBMC_PASSWORD}
522    ...  P=${valid_password}
523    Should Contain  ${result}  Set User Password command successful
524
525    # Verify that root user is able to run IPMI command using default password.
526    Verify IPMI Username And Password  root  ${OPENBMC_PASSWORD}
527
528
529Test IPMI User Privilege
530    [Documentation]  Test IPMI user privilege by executing IPMI command with different privileges.
531    [Arguments]  ${privilege_level}  ${user_cmd_status}  ${operator_cmd_status}  ${admin_cmd_status}
532
533    # Description of argument(s):
534    # privilege_level     Privilege level of IPMI user (e.g. 4, 3).
535    # user_cmd_status     Expected status of IPMI command run with the "User"
536    #                     privilege (i.e. "Passed" or "Failed").
537    # operator_cmd_status Expected status of IPMI command run with the "Operator"
538    #                     privilege (i.e. "Passed" or "Failed").
539    # admin_cmd_status    Expected status of IPMI command run with the "Administrator"
540    #                     privilege (i.e. "Passed" or "Failed").
541
542    # Create IPMI user and set valid password.
543    ${random_username}=  Generate Random String  8  [LETTERS]
544    ${random_userid}=  Evaluate  random.randint(2, 15)  modules=random
545    IPMI Create User  ${random_userid}  ${random_username}
546    Set Test Variable  ${random_userid}
547    Run IPMI Standard Command
548    ...  user set password ${random_userid} ${valid_password}
549
550    # Set privilege and enable IPMI messaging for newly created user.
551    Set Channel Access  ${random_userid}  ipmi=on privilege=${privilege_level}
552
553    # Delay added for user privilege to get set.
554    Sleep  5s
555
556    Enable IPMI User And Verify  ${random_userid}
557
558    Verify IPMI Command  ${random_username}  ${valid_password}  User
559    ...  expected_status=${user_cmd_status}
560    Verify IPMI Command  ${random_username}  ${valid_password}  Operator
561    ...  expected_status=${operator_cmd_status}
562    Verify IPMI Command  ${random_username}  ${valid_password}  Administrator
563    ...  expected_status=${admin_cmd_status}
564
565
566Verify IPMI Command
567    [Documentation]  Verify IPMI command execution with given username,
568    ...  password, privilege and expected status.
569    [Arguments]  ${username}  ${password}  ${privilege}  ${channel}=${1}  ${expected_status}=Passed
570    # Description of argument(s):
571    # username         The user name (e.g. "root", "robert", etc.).
572    # password         The user password (e.g. "0penBmc", "0penBmc1", etc.).
573    # privilege        The session privilege for IPMI command (e.g. "User", "Operator", etc.).
574    # channel          The user channel number (e.g. "1" or "2").
575    # expected_status  Expected status of IPMI command run with the user
576    #                  of above password and privilege (i.e. "Passed" or "Failed").
577
578    ${expected_rc}=  Set Variable If  '${expected_status}' == 'Passed'  ${0}  ${1}
579    Wait Until Keyword Succeeds  15 sec  5 sec  Run IPMI Standard Command
580    ...  sel info ${channel}  expected_rc=${expected_rc}  U=${username}  P=${password}
581    ...  L=${privilege}
582
583
584Set User Password And Verify
585    [Documentation]  Create a user and set its password with given length and option.
586    [Arguments]  ${password_length}  ${password_option}  ${expected_result}
587    [Teardown]  Run Keyword  Delete Created User  ${random_userid}
588    # Description of argument(s):
589    # password_length  Length of password to be generated and used (e.g. "16").
590    # password_option  Password length option to be given in IPMI command (e.g. "16", "20").
591    # expected_result  Expected result for setting the user's password (e.g. "True", "False").
592
593    Rprint Vars  password_length  password_option  expected_result
594    ${random_userid}  ${random_username}=  Create Random IPMI User
595    Set Test Variable  ${random_userid}
596    ${password}=  Get From Dictionary  ${password_values}  ${password_length}
597    Rprint Vars  random_userid  password
598
599    # Set password for newly created user.
600    ${status}=  Run Keyword And Return Status  Run IPMI Standard Command
601    ...  user set password ${random_userid} ${password} ${password_option}
602    Rprint Vars  status
603    Valid Value  status  [${expected_result}]
604    Return From Keyword If  '${expected_result}' == '${False}'
605
606    # Set admin privilege and enable IPMI messaging for newly created user.
607    Set Channel Access  ${random_userid}  ipmi=on privilege=${admin_level_priv}
608
609    # Delay added for user privilege to get set.
610    Sleep  5s
611
612    Enable IPMI User And Verify  ${random_userid}
613
614    # For password_option 16, passwords with length between 17 and 20 will be truncated.
615    # For all other cases, passwords will be retained as it is to verify.
616    ${truncated_password}=  Set Variable  ${password[:${password_option}]}
617    Rprint Vars  truncated_password
618    ${status}=  Run Keyword And Return Status  Verify IPMI Username And Password  ${random_username}
619    ...  ${truncated_password}
620    Rprint Vars  status
621    Valid Value  status  [${expected_result}]
622
623
624Test Teardown Execution
625    [Documentation]  Do the test teardown execution.
626
627    FFDC On Test Case Fail
628
629
630Check Active Ethernet Channels
631    [Documentation]  Check active ethernet channels and set suite variables.
632
633    ${channel_number_list}=  Get Active Ethernet Channel List
634    ${channel_length}=  Get Length  ${channel_number_list}
635    Skip If  '${channel_length}' == '1'
636    ...  msg= Skips this test case as only one channel was in active.
637
638    FOR  ${channel_num}  IN  @{channel_number_list}
639        ${secondary_channel_number}=  Set Variable If  ${channel_num} != ${CHANNEL_NUMBER}  ${channel_num}
640    END
641
642    Set Suite Variable  ${secondary_channel_number}
643
644
645Suite Setup Execution
646    [Documentation]  Make sure the enabled user count is below maximum,
647    ...  and prepares administrative user list suite variables.
648
649    Check Enabled User Count
650    # Skip root user checking if user decides not to use root user as default.
651    Run Keyword If  '${IPMI_USERNAME}' == 'root'  Determine Root User Id
652
653
654Check Enabled User Count
655    [Documentation]  Ensure that there are available user IDs.
656
657    # Check for the enabled user count
658    ${resp}=  Run IPMI Standard Command  user summary ${CHANNEL_NUMBER}
659    ${enabled_user_count}=
660    ...  Get Lines Containing String  ${resp}  Enabled User Count
661
662    Should not contain  ${enabled_user_count}  ${expected_max_ids}
663    ...  msg=IPMI have reached maximum user count
664
665
666Determine Root User Id
667    [Documentation]  Determines the user ID of the root user.
668
669    ${resp}=  Wait Until Keyword Succeeds  15 sec  1 sec  Run IPMI Standard Command
670    ...  user list
671    @{lines}=  Split To Lines  ${resp}
672
673    ${root_userid}=  Set Variable  ${-1}
674    ${line_count}=  Get Length  ${lines}
675    FOR  ${id_index}  IN RANGE  1  ${line_count}
676        ${line}=  Get From List  ${lines}  ${id_index}
677        ${root_found}=  Get Lines Matching Regexp  ${line}  ${root_pattern}
678        IF  '${root_found}' != '${EMPTY}'
679            ${root_userid}=  Set Variable  ${id_index}
680            Exit For Loop
681        END
682    END
683    Set Suite Variable  ${root_userid}
684
685    Log To Console  The root user ID is ${root_userid}.
686    Run Keyword If  ${root_userid} < ${1}  Fail  msg= Did not identify root user ID.
687
688
689Wait And Confirm New Username And Password
690    [Documentation]  Wait in loop trying to to confirm Username And Password.
691    [Arguments]  ${username}  ${password}
692
693    # Description of argument(s):
694    # username         The user name (e.g. "root", "robert", etc.).
695    # password         The user password (e.g. "0penBmc", "0penBmc1", etc.).
696
697    # Give time for previous command to complete.
698    Sleep  5s
699
700    # Looping verify that root user is able to run IPMI command using new password.
701    Wait Until Keyword Succeeds  15 sec  5 sec  Verify IPMI Username And Password
702    ...  ${username}  ${password}
703
704
705Get Enabled User Count
706    [Documentation]  Return as integers: current number of enabled users and
707    ...  Maximum number of Ids.
708
709    # Isolate 'Enabled User Count' value and convert to integer
710    ${resp}=  Wait Until Keyword Succeeds  15 sec  1 sec  Run IPMI Standard Command
711    ...  user summary ${CHANNEL_NUMBER}
712    ${user_count_line}=  Get Lines Containing String  ${resp}  Enabled User Count
713    ${count}=  Fetch From Right  ${user_count_line}  \:
714    ${user_count}=  Convert To Integer  ${count}
715
716    # Isolate 'Maximum IDs' value and convert to integer
717    ${maximum_ids}=  Get Lines Containing String  ${resp}  Maximum IDs
718    ${max_ids}=  Fetch From Right  ${maximum_ids}  \:
719    ${int_maximum_ids_count}=  Convert To Integer  ${max_ids}
720
721    [Return]  ${user_count}  ${int_maximum_ids_count}
722
723
724Wait And Confirm New User Entry
725    [Documentation]  Wait in loop until new user appears with given username.
726    [Arguments]  ${username}
727
728    # Description of argument(s):
729    # username         The user name (e.g. "root", "robert", etc.).
730
731    Wait Until Keyword Succeeds  45 sec  1 sec  Verify IPMI Username Visible
732    ...  ${username}
733
734
735Verify IPMI Username Visible
736    [Documentation]  Confirm that username is present in user list.
737    [Arguments]  ${username}
738
739    # Description of argument(s):
740    # username         The user name (e.g. "root", "robert", etc.).
741
742    ${resp}=  Run IPMI Standard Command  user list
743    Should Contain  ${resp}  ${username}
744
745
746Find Free User Id
747    [Documentation]  Find a user ID that is not being used.
748
749    Check Enabled User Count
750    FOR    ${num}    IN RANGE    300
751        ${random_userid}=  Evaluate  random.randint(1, ${expected_max_ids})  modules=random
752        ${access}=  Run IPMI Standard Command  channel getaccess ${CHANNEL_NUMBER} ${random_userid}
753
754        ${name_line}=  Get Lines Containing String  ${access}  User Name
755        Log To Console  For ID ${random_userid}: ${name_line}
756        ${is_empty}=  Run Keyword And Return Status
757        ...  Should Match Regexp  ${name_line}  ${empty_name_pattern}
758
759        Exit For Loop If  ${is_empty} == ${True}
760    END
761    [Return]  ${random_userid}
762