xref: /openbmc/openbmc-test-automation/ipmi/test_ipmi_user.robot (revision 7981f4323a16aa9fc676f8eb1ddcc48cf2854653)
1 *** Settings ***
2 Documentation       Test suite for OpenBMC IPMI user management.
3 
4 Resource            ../lib/ipmi_client.robot
5 Resource            ../lib/openbmc_ffdc.robot
6 Resource            ../lib/bmc_network_utils.robot
7 Library             ../lib/ipmi_utils.py
8 Test Setup          Printn
9 
10 Suite Setup         Suite Setup Execution
11 Test Teardown       Test Teardown Execution
12 
13 Force 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 
40 Verify 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 
63 Verify 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 
93 Verify 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 
103 Verify 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 
114 Verify 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 
131 Verify 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 
151 Verify 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 
163 Verify 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 
183 Verify 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 
207 Verify 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 
222 Verify 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 
239 Verify 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 
253 Test 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 
264 Test 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 
276 Test 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 
287 Enable 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 
312 Disable 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 
338 Verify 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     [Teardown]  Run Keywords  FFDC On Test Case Fail  AND
343     ...  Wait Until Keyword Succeeds  15 sec  5 sec
344     ...  Set Default Password For IPMI Root User
345 
346     # User input password should be minimum 8 characters long.
347     Valid Length  OPENBMC_PASSWORD  min_length=8
348     # Set new password for root user.
349     Run IPMI Standard Command
350     ...  user set password ${root_userid} ${valid_password}
351 
352     # Delay added for user password to get set.
353     Sleep  5s
354 
355     # Verify that root user is able to run IPMI command using new password.
356     Wait Until Keyword Succeeds  15 sec  5 sec  Verify IPMI Username And Password
357     ...  root  ${valid_password}
358 
359 
360 Verify Administrator And User Privilege For Different Channels
361     [Documentation]  Set administrator and user privilege for different channels and verify.
362     [Tags]  Verify_Administrator_And_User_Privilege_For_Different_Channels
363     [Setup]  Check Active Ethernet Channels
364     [Teardown]  Run Keywords  FFDC On Test Case Fail  AND
365     ...  Delete Created User  ${random_userid}
366 
367     ${random_userid}  ${random_username}=  Create Random IPMI User
368     Set Test Variable  ${random_userid}
369     Run IPMI Standard Command
370     ...  user set password ${random_userid} ${valid_password}
371 
372     # Set admin privilege for newly created user with channel 1.
373     Set Channel Access  ${random_userid}  ipmi=on privilege=${admin_level_priv}  ${CHANNEL_NUMBER}
374 
375     # Set user privilege for newly created user with channel 2.
376     Set Channel Access  ${random_userid}  ipmi=on privilege=${user_priv}  ${secondary_channel_number}
377 
378     Enable IPMI User And Verify  ${random_userid}
379 
380     # Verify that user is able to run administrator level IPMI command with channel 1.
381     Verify IPMI Command  ${random_username}  ${valid_password}  Administrator  ${CHANNEL_NUMBER}
382 
383     # Verify that user is unable to run IPMI command with channel 2.
384     Run IPMI Standard Command
385     ...  sel info ${secondary_channel_number}  expected_rc=${1}  U=${random_username}  P=${valid_password}
386 
387 
388 Verify Operator And User Privilege For Different Channels
389     [Documentation]  Set operator and user privilege for different channels and verify.
390     [Tags]  Verify_Operator_And_User_Privilege_For_Different_Channels
391     [Setup]  Check Active Ethernet Channels
392     [Teardown]  Run Keywords  FFDC On Test Case Fail  AND
393     ...  Delete Created User  ${random_userid}
394 
395     ${random_userid}  ${random_username}=  Create Random IPMI User
396     Set Test Variable  ${random_userid}
397     Run IPMI Standard Command
398     ...  user set password ${random_userid} ${valid_password}
399 
400     # Set operator privilege for newly created user with channel 1.
401     Set Channel Access  ${random_userid}  ipmi=on privilege=${operator_priv}  ${CHANNEL_NUMBER}
402 
403     # Set user privilege for newly created user with channel 2.
404     Set Channel Access  ${random_userid}  ipmi=on privilege=${user_priv}  ${secondary_channel_number}
405 
406     Enable IPMI User And Verify  ${random_userid}
407 
408     # Verify that user is able to run operator level IPMI command with channel 1.
409     Verify IPMI Command  ${random_username}  ${valid_password}  Operator  ${CHANNEL_NUMBER}
410 
411     # Verify that user is able to run user level IPMI command with channel 2.
412     Verify IPMI Command  ${random_username}  ${valid_password}  User  ${secondary_channel_number}
413 
414 
415 Verify Setting IPMI User With Max Password Length
416     [Documentation]  Verify IPMI user creation with password length of 20 characters.
417     [Tags]  Verify_Setting_IPMI_User_With_Max_Password_Length
418     [Template]  Set User Password And Verify
419 
420     # password_length  password_option  expected_status
421     20                 20               ${True}
422 
423 
424 Verify Setting IPMI User With Invalid Password Length
425     [Documentation]  Verify that IPMI user cannot be set with 21 character password using 16 char
426     ...  or 20 char password option.
427     [Tags]  Verify_Setting_IPMI_User_With_Invalid_Password_Length
428     [Template]  Set User Password And Verify
429 
430     # password_length  password_option  expected_status
431     21                 16               ${False}
432     21                 20               ${False}
433 
434 
435 Verify Setting IPMI User With 16 Character Password
436     [Documentation]  Verify that IPMI user can create a 16 character password using 16 char or 20
437     ...  char password option.
438     [Tags]  Verify_Setting_IPMI_User_With_16_Character_Password
439     [Template]  Set User Password And Verify
440 
441     # password_length  password_option  expected_status
442     16                 16               ${True}
443     16                 20               ${True}
444 
445 
446 Verify Default Selection Of 16 Character Password For IPMI User
447     [Documentation]  Verify that ipmitool by default opts for the 16 character option when given a
448     ...  password whose length is in between 17 and 20.
449     [Tags]  Verify_Default_Selection_Of_16_Character_Password_For_IPMI_User
450     [Template]  Set User Password And Verify
451 
452     # password_length  password_option  expected_status
453     17                 16               ${True}
454     20                 16               ${True}
455 
456 
457 Verify Minimum Password Length For IPMI User
458     [Documentation]  Verify minimum password length of 8 characters.
459     [Tags]  Verify_Minimum_Password_Length_For_IPMI_User
460     [Template]  Set User Password And Verify
461 
462     # password_length  password_option  expected_status
463     7                  16               ${False}
464     8                  16               ${True}
465     7                  20               ${False}
466     8                  20               ${True}
467 
468 
469 Verify Continuous IPMI Command Execution
470     [Documentation]  Verify that continuous IPMI command execution runs fine.
471     [Tags]  Verify_Continuous_IPMI_Command_Execution
472 
473     FOR  ${i}  IN RANGE  ${USER_LOOP_COUNT}
474         Run IPMI Standard Command  lan print
475         Run IPMI Standard Command  power status
476         Run IPMI Standard Command  fru list
477         Run IPMI Standard Command  sel list
478     END
479 
480 
481 Modify IPMI User
482     [Documentation]  Verify modified IPMI user is communicating via IPMI.
483     [Tags]  Modify_IPMI_User
484     [Teardown]  Run Keywords  FFDC On Test Case Fail  AND
485     ...  Delete Created User  ${random_userid}
486 
487     ${random_userid}  ${random_username}=  Create Random IPMI User
488     Set Test Variable  ${random_userid}
489     Run IPMI Standard Command
490     ...  user set password ${random_userid} ${valid_password}
491 
492     # Set admin privilege and enable IPMI messaging for newly created user.
493     Set Channel Access  ${random_userid}  ipmi=on privilege=${admin_level_priv}
494 
495     # Delay added for user privilege to get set.
496     Sleep  5s
497 
498     Enable IPMI User And Verify  ${random_userid}
499 
500     # Verify that user is able to run administrator level IPMI command.
501     Verify IPMI Command  ${random_username}  ${valid_password}  Administrator  ${CHANNEL_NUMBER}
502 
503     # Set different username for same IPMI user.
504     Run IPMI Standard Command
505     ...  user set name ${random_userid} ${new_username}
506     Wait And Confirm New Username And Password  ${new_username}  ${valid_password}
507 
508     # Verify that user is able to run administrator level IPMI command.
509     Verify IPMI Command  ${new_username}  ${valid_password}  Administrator  ${CHANNEL_NUMBER}
510 
511 
512 *** Keywords ***
513 
514 Set Default Password For IPMI Root User
515     [Documentation]  Set default password for IPMI root user (i.e. 0penBmc).
516     # Set default password for root user.
517     ${result}=  Run External IPMI Standard Command
518     ...  user set password ${root_userid} ${OPENBMC_PASSWORD}
519     ...  P=${valid_password}
520     Should Contain  ${result}  Set User Password command successful
521 
522     # Verify that root user is able to run IPMI command using default password.
523     Verify IPMI Username And Password  root  ${OPENBMC_PASSWORD}
524 
525 
526 Test IPMI User Privilege
527     [Documentation]  Test IPMI user privilege by executing IPMI command with different privileges.
528     [Arguments]  ${privilege_level}  ${user_cmd_status}  ${operator_cmd_status}  ${admin_cmd_status}
529 
530     # Description of argument(s):
531     # privilege_level     Privilege level of IPMI user (e.g. 4, 3).
532     # user_cmd_status     Expected status of IPMI command run with the "User"
533     #                     privilege (i.e. "Passed" or "Failed").
534     # operator_cmd_status Expected status of IPMI command run with the "Operator"
535     #                     privilege (i.e. "Passed" or "Failed").
536     # admin_cmd_status    Expected status of IPMI command run with the "Administrator"
537     #                     privilege (i.e. "Passed" or "Failed").
538 
539     # Create IPMI user and set valid password.
540     ${random_username}=  Generate Random String  8  [LETTERS]
541     ${random_userid}=  Evaluate  random.randint(2, 15)  modules=random
542     IPMI Create User  ${random_userid}  ${random_username}
543     Set Test Variable  ${random_userid}
544     Run IPMI Standard Command
545     ...  user set password ${random_userid} ${valid_password}
546 
547     # Set privilege and enable IPMI messaging for newly created user.
548     Set Channel Access  ${random_userid}  ipmi=on privilege=${privilege_level}
549 
550     # Delay added for user privilege to get set.
551     Sleep  5s
552 
553     Enable IPMI User And Verify  ${random_userid}
554 
555     Verify IPMI Command  ${random_username}  ${valid_password}  User
556     ...  expected_status=${user_cmd_status}
557     Verify IPMI Command  ${random_username}  ${valid_password}  Operator
558     ...  expected_status=${operator_cmd_status}
559     Verify IPMI Command  ${random_username}  ${valid_password}  Administrator
560     ...  expected_status=${admin_cmd_status}
561 
562 
563 Verify IPMI Command
564     [Documentation]  Verify IPMI command execution with given username,
565     ...  password, privilege and expected status.
566     [Arguments]  ${username}  ${password}  ${privilege}  ${channel}=${1}  ${expected_status}=Passed
567     # Description of argument(s):
568     # username         The user name (e.g. "root", "robert", etc.).
569     # password         The user password (e.g. "0penBmc", "0penBmc1", etc.).
570     # privilege        The session privilege for IPMI command (e.g. "User", "Operator", etc.).
571     # channel          The user channel number (e.g. "1" or "2").
572     # expected_status  Expected status of IPMI command run with the user
573     #                  of above password and privilege (i.e. "Passed" or "Failed").
574 
575     ${expected_rc}=  Set Variable If  '${expected_status}' == 'Passed'  ${0}  ${1}
576     Wait Until Keyword Succeeds  15 sec  5 sec  Run IPMI Standard Command
577     ...  sel info ${channel}  expected_rc=${expected_rc}  U=${username}  P=${password}
578     ...  L=${privilege}
579 
580 
581 Set User Password And Verify
582     [Documentation]  Create a user and set its password with given length and option.
583     [Arguments]  ${password_length}  ${password_option}  ${expected_result}
584     [Teardown]  Run Keyword  Delete Created User  ${random_userid}
585     # Description of argument(s):
586     # password_length  Length of password to be generated and used (e.g. "16").
587     # password_option  Password length option to be given in IPMI command (e.g. "16", "20").
588     # expected_result  Expected result for setting the user's password (e.g. "True", "False").
589 
590     Rprint Vars  password_length  password_option  expected_result
591     ${random_userid}  ${random_username}=  Create Random IPMI User
592     Set Test Variable  ${random_userid}
593     ${password}=  Get From Dictionary  ${password_values}  ${password_length}
594     Rprint Vars  random_userid  password
595 
596     # Set password for newly created user.
597     ${status}=  Run Keyword And Return Status  Run IPMI Standard Command
598     ...  user set password ${random_userid} ${password} ${password_option}
599     Rprint Vars  status
600     Valid Value  status  [${expected_result}]
601     Return From Keyword If  '${expected_result}' == '${False}'
602 
603     # Set admin privilege and enable IPMI messaging for newly created user.
604     Set Channel Access  ${random_userid}  ipmi=on privilege=${admin_level_priv}
605 
606     # Delay added for user privilege to get set.
607     Sleep  5s
608 
609     Enable IPMI User And Verify  ${random_userid}
610 
611     # For password_option 16, passwords with length between 17 and 20 will be truncated.
612     # For all other cases, passwords will be retained as it is to verify.
613     ${truncated_password}=  Set Variable  ${password[:${password_option}]}
614     Rprint Vars  truncated_password
615     ${status}=  Run Keyword And Return Status  Verify IPMI Username And Password  ${random_username}
616     ...  ${truncated_password}
617     Rprint Vars  status
618     Valid Value  status  [${expected_result}]
619 
620 
621 Test Teardown Execution
622     [Documentation]  Do the test teardown execution.
623 
624     FFDC On Test Case Fail
625 
626 
627 Check Active Ethernet Channels
628     [Documentation]  Check active ethernet channels and set suite variables.
629 
630     ${channel_number_list}=  Get Active Ethernet Channel List
631     ${channel_length}=  Get Length  ${channel_number_list}
632     Skip If  '${channel_length}' == '1'
633     ...  msg= Skips this test case as only one channel was in active.
634 
635     FOR  ${channel_num}  IN  @{channel_number_list}
636         ${secondary_channel_number}=  Set Variable If  ${channel_num} != ${CHANNEL_NUMBER}  ${channel_num}
637     END
638 
639     Set Suite Variable  ${secondary_channel_number}
640 
641 
642 Suite Setup Execution
643     [Documentation]  Make sure the enabled user count is below maximum,
644     ...  and prepares administrative user list suite variables.
645 
646     Check Enabled User Count
647     # Skip root user checking if user decides not to use root user as default.
648     Run Keyword If  '${IPMI_USERNAME}' == 'root'  Determine Root User Id
649 
650 
651 Check Enabled User Count
652     [Documentation]  Ensure that there are available user IDs.
653 
654     # Check for the enabled user count
655     ${resp}=  Run IPMI Standard Command  user summary ${CHANNEL_NUMBER}
656     ${enabled_user_count}=
657     ...  Get Lines Containing String  ${resp}  Enabled User Count
658 
659     Should not contain  ${enabled_user_count}  ${expected_max_ids}
660     ...  msg=IPMI have reached maximum user count
661 
662 
663 Determine Root User Id
664     [Documentation]  Determines the user ID of the root user.
665 
666     ${resp}=  Wait Until Keyword Succeeds  15 sec  1 sec  Run IPMI Standard Command
667     ...  user list
668     @{lines}=  Split To Lines  ${resp}
669 
670     ${root_userid}=  Set Variable  ${-1}
671     ${line_count}=  Get Length  ${lines}
672     FOR  ${id_index}  IN RANGE  1  ${line_count}
673         ${line}=  Get From List  ${lines}  ${id_index}
674         ${root_found}=  Get Lines Matching Regexp  ${line}  ${root_pattern}
675         IF  '${root_found}' != '${EMPTY}'
676             ${root_userid}=  Set Variable  ${id_index}
677             Exit For Loop
678         END
679     END
680     Set Suite Variable  ${root_userid}
681 
682     Log To Console  The root user ID is ${root_userid}.
683     Run Keyword If  ${root_userid} < ${1}  Fail  msg= Did not identify root user ID.
684 
685 
686 Wait And Confirm New Username And Password
687     [Documentation]  Wait in loop trying to to confirm Username And Password.
688     [Arguments]  ${username}  ${password}
689 
690     # Description of argument(s):
691     # username         The user name (e.g. "root", "robert", etc.).
692     # password         The user password (e.g. "0penBmc", "0penBmc1", etc.).
693 
694     # Give time for previous command to complete.
695     Sleep  5s
696 
697     # Looping verify that root user is able to run IPMI command using new password.
698     Wait Until Keyword Succeeds  15 sec  5 sec  Verify IPMI Username And Password
699     ...  ${username}  ${password}
700 
701 
702 Get Enabled User Count
703     [Documentation]  Return as integers: current number of enabled users and
704     ...  Maximum number of Ids.
705 
706     # Isolate 'Enabled User Count' value and convert to integer
707     ${resp}=  Wait Until Keyword Succeeds  15 sec  1 sec  Run IPMI Standard Command
708     ...  user summary ${CHANNEL_NUMBER}
709     ${user_count_line}=  Get Lines Containing String  ${resp}  Enabled User Count
710     ${count}=  Fetch From Right  ${user_count_line}  \:
711     ${user_count}=  Convert To Integer  ${count}
712 
713     # Isolate 'Maximum IDs' value and convert to integer
714     ${maximum_ids}=  Get Lines Containing String  ${resp}  Maximum IDs
715     ${max_ids}=  Fetch From Right  ${maximum_ids}  \:
716     ${int_maximum_ids_count}=  Convert To Integer  ${max_ids}
717 
718     [Return]  ${user_count}  ${int_maximum_ids_count}
719 
720 
721 Wait And Confirm New User Entry
722     [Documentation]  Wait in loop until new user appears with given username.
723     [Arguments]  ${username}
724 
725     # Description of argument(s):
726     # username         The user name (e.g. "root", "robert", etc.).
727 
728     Wait Until Keyword Succeeds  45 sec  1 sec  Verify IPMI Username Visible
729     ...  ${username}
730 
731 
732 Verify IPMI Username Visible
733     [Documentation]  Confirm that username is present in user list.
734     [Arguments]  ${username}
735 
736     # Description of argument(s):
737     # username         The user name (e.g. "root", "robert", etc.).
738 
739     ${resp}=  Run IPMI Standard Command  user list
740     Should Contain  ${resp}  ${username}
741 
742 
743 Find Free User Id
744     [Documentation]  Find a user ID that is not being used.
745 
746     Check Enabled User Count
747     FOR    ${num}    IN RANGE    300
748         ${random_userid}=  Evaluate  random.randint(1, ${expected_max_ids})  modules=random
749         ${access}=  Run IPMI Standard Command  channel getaccess ${CHANNEL_NUMBER} ${random_userid}
750 
751         ${name_line}=  Get Lines Containing String  ${access}  User Name
752         Log To Console  For ID ${random_userid}: ${name_line}
753         ${is_empty}=  Run Keyword And Return Status
754         ...  Should Match Regexp  ${name_line}  ${empty_name_pattern}
755 
756         Exit For Loop If  ${is_empty} == ${True}
757     END
758     [Return]  ${random_userid}
759