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