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
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
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