|  | *** Settings *** | 
|  | Documentation    Test Redfish user account. | 
|  |  | 
|  | Resource         ../../lib/resource.robot | 
|  | Resource         ../../lib/bmc_redfish_resource.robot | 
|  | Resource         ../../lib/openbmc_ffdc.robot | 
|  | Resource         ../../lib/bmc_redfish_utils.robot | 
|  |  | 
|  | Library          SSHLibrary | 
|  |  | 
|  | Test Setup       Redfish.Login | 
|  | Test Teardown    Test Teardown Execution | 
|  |  | 
|  | *** Variables *** | 
|  |  | 
|  | ${account_lockout_duration}   ${30} | 
|  | ${account_lockout_threshold}  ${3} | 
|  |  | 
|  | ${ssh_status}                 ${True} | 
|  |  | 
|  | ** Test Cases ** | 
|  |  | 
|  | Verify AccountService Available | 
|  | [Documentation]  Verify Redfish account service is available. | 
|  | [Tags]  Verify_AccountService_Available | 
|  |  | 
|  | ${resp} =  Redfish_utils.Get Attribute  /redfish/v1/AccountService  ServiceEnabled | 
|  | Should Be Equal As Strings  ${resp}  ${True} | 
|  |  | 
|  |  | 
|  | Verify Redfish Admin User Persistence After Reboot | 
|  | [Documentation]  Verify Redfish admin user persistence after reboot. | 
|  | [Tags]  Verify_Redfish_Admin_User_Persistence_After_Reboot | 
|  | [Setup]  Run Keywords  Redfish.Login  AND | 
|  | ...  Redfish Create User  admin_user  TestPwd123  Administrator  ${True} | 
|  | [Teardown]  Run Keywords  Redfish.Delete  /redfish/v1/AccountService/Accounts/admin_user | 
|  | ...  AND  Test Teardown Execution | 
|  |  | 
|  | # Reboot BMC. | 
|  | Redfish OBMC Reboot (off)  stack_mode=normal | 
|  |  | 
|  | # Verify users after reboot. | 
|  | Redfish Verify User  admin_user     TestPwd123  Administrator   ${True} | 
|  |  | 
|  |  | 
|  | Verify Redfish Operator User Persistence After Reboot | 
|  | [Documentation]  Verify Redfish operator user persistence after reboot. | 
|  | [Tags]  Verify_Redfish_Operator_User_Persistence_After_Reboot | 
|  | [Setup]  Run Keywords  Redfish.Login  AND | 
|  | ...  Redfish Create User  operator_user  TestPwd123  Operator  ${True} | 
|  | [Teardown]  Run Keywords  Redfish.Delete  /redfish/v1/AccountService/Accounts/operator_user | 
|  | ...  AND  Test Teardown Execution | 
|  |  | 
|  | # Reboot BMC. | 
|  | Redfish OBMC Reboot (off)  stack_mode=normal | 
|  |  | 
|  | # Verify users after reboot. | 
|  | Redfish Verify User  operator_user  TestPwd123  Operator        ${True} | 
|  |  | 
|  |  | 
|  | Verify Redfish Readonly User Persistence After Reboot | 
|  | [Documentation]  Verify Redfish readonly user persistence after reboot. | 
|  | [Tags]  Verify_Redfish_Readonly_User_Persistence_After_Reboot | 
|  | [Setup]  Run Keywords  Redfish.Login  AND | 
|  | ...  Redfish Create User  readonly_user  TestPwd123  ReadOnly  ${True} | 
|  | [Teardown]  Run Keywords  Redfish.Delete  /redfish/v1/AccountService/Accounts/readonly_user | 
|  | ...  AND  Test Teardown Execution | 
|  |  | 
|  | # Reboot BMC. | 
|  | Redfish OBMC Reboot (off)  stack_mode=normal | 
|  |  | 
|  | # Verify users after reboot. | 
|  | Redfish Verify User  readonly_user  TestPwd123  ReadOnly        ${True} | 
|  |  | 
|  |  | 
|  | Redfish Create and Verify Admin User | 
|  | [Documentation]  Create a Redfish user with administrator role and verify. | 
|  | [Tags]  Redfish_Create_and_Verify_Admin_User | 
|  | [Template]  Redfish Create And Verify User | 
|  |  | 
|  | #username      password    role_id         enabled | 
|  | admin_user     TestPwd123  Administrator   ${True} | 
|  |  | 
|  |  | 
|  | Redfish Create and Verify Operator User | 
|  | [Documentation]  Create a Redfish user with operator role and verify. | 
|  | [Tags]  Redfish_Create_and_Verify_Operator_User | 
|  | [Template]  Redfish Create And Verify User | 
|  |  | 
|  | #username      password    role_id         enabled | 
|  | operator_user  TestPwd123  Operator        ${True} | 
|  |  | 
|  |  | 
|  | Redfish Create and Verify Readonly User | 
|  | [Documentation]  Create a Redfish user with readonly role and verify. | 
|  | [Tags]  Redfish_Create_and_Verify_Readonly_User | 
|  | [Template]  Redfish Create And Verify User | 
|  |  | 
|  | #username      password    role_id         enabled | 
|  | readonly_user  TestPwd123  ReadOnly        ${True} | 
|  |  | 
|  |  | 
|  | Verify Redfish Admin User With Wrong Password | 
|  | [Documentation]  Verify Redfish admin user with wrong password. | 
|  | [Tags]  Verify_Redfish_Admin_User_With_Wrong_Password | 
|  | [Template]  Verify Redfish User with Wrong Password | 
|  |  | 
|  | #username      password    role_id         enabled  wrong_password | 
|  | admin_user     TestPwd123  Administrator   ${True}  alskjhfwurh | 
|  |  | 
|  |  | 
|  | Verify Redfish Operator User with Wrong Password | 
|  | [Documentation]  Verify Redfish operator user with wrong password. | 
|  | [Tags]  Verify_Redfish_Operator_User_with_Wrong_Password | 
|  | [Template]  Verify Redfish User with Wrong Password | 
|  |  | 
|  | #username      password    role_id         enabled  wrong_password | 
|  | operator_user  TestPwd123  Operator        ${True}  12j8a8uakjhdaosiruf024 | 
|  |  | 
|  |  | 
|  | Verify Redfish Readonly User With Wrong Password | 
|  | [Documentation]  Verify Redfish readonly user with wrong password. | 
|  | [Tags]  Verify_Redfish_Readonly_User_With_Wrong_Password | 
|  | [Template]  Verify Redfish User with Wrong Password | 
|  |  | 
|  | #username      password    role_id         enabled  wrong_password | 
|  | readonly_user  TestPwd123  ReadOnly        ${True}  12 | 
|  |  | 
|  |  | 
|  | Verify Login with Deleted Redfish Admin User | 
|  | [Documentation]  Verify login with deleted Redfish admin user. | 
|  | [Tags]  Verify_Login_with_Deleted_Redfish_Admin_User | 
|  | [Template]  Verify Login with Deleted Redfish User | 
|  |  | 
|  | #username     password    role_id         enabled | 
|  | admin_user     TestPwd123  Administrator   ${True} | 
|  |  | 
|  |  | 
|  | Verify Login with Deleted Redfish Operator User | 
|  | [Documentation]  Verify login with deleted Redfish operator user. | 
|  | [Tags]  Verify_Login_with_Deleted_Redfish_Operator_User | 
|  | [Template]  Verify Login with Deleted Redfish User | 
|  |  | 
|  | #username     password    role_id         enabled | 
|  | operator_user  TestPwd123  Operator        ${True} | 
|  |  | 
|  |  | 
|  | Verify Login with Deleted Redfish Readonly User | 
|  | [Documentation]  Verify login with deleted Redfish readonly user. | 
|  | [Tags]  Verify_Login_with_Deleted_Redfish_Readonly_User | 
|  | [Template]  Verify Login with Deleted Redfish User | 
|  |  | 
|  | #username     password    role_id         enabled | 
|  | readonly_user  TestPwd123  ReadOnly        ${True} | 
|  |  | 
|  |  | 
|  | Verify Admin User Creation Without Enabling It | 
|  | [Documentation]  Verify admin user creation without enabling it. | 
|  | [Tags]  Verify_Admin_User_Creation_Without_Enabling_It | 
|  | [Template]  Verify Create User Without Enabling | 
|  |  | 
|  | #username      password    role_id         enabled | 
|  | admin_user     TestPwd123  Administrator   ${False} | 
|  |  | 
|  |  | 
|  | Verify Operator User Creation Without Enabling It | 
|  | [Documentation]  Verify operator user creation without enabling it. | 
|  | [Tags]  Verify_Operator_User_Creation_Without_Enabling_It | 
|  | [Template]  Verify Create User Without Enabling | 
|  |  | 
|  | #username      password    role_id         enabled | 
|  | operator_user  TestPwd123  Operator        ${False} | 
|  |  | 
|  |  | 
|  | Verify Readonly User Creation Without Enabling It | 
|  | [Documentation]  Verify readonly user creation without enabling it. | 
|  | [Tags]  Verify_Readonly_User_Creation_Without_Enabling_It | 
|  | [Template]  Verify Create User Without Enabling | 
|  |  | 
|  | #username      password    role_id         enabled | 
|  | readonly_user  TestPwd123  ReadOnly        ${False} | 
|  |  | 
|  |  | 
|  | Verify User Creation With Invalid Role Id | 
|  | [Documentation]  Verify user creation with invalid role ID. | 
|  | [Tags]  Verify_User_Creation_With_Invalid_Role_Id | 
|  |  | 
|  | # Make sure the user account in question does not already exist. | 
|  | Redfish.Delete  /redfish/v1/AccountService/Accounts/test_user | 
|  | ...  valid_status_codes=[${HTTP_OK}, ${HTTP_NOT_FOUND}] | 
|  |  | 
|  | # Create specified user. | 
|  | ${payload}=  Create Dictionary | 
|  | ...  UserName=test_user  Password=TestPwd123  RoleId=wrongroleid  Enabled=${True} | 
|  | Redfish.Post  /redfish/v1/AccountService/Accounts/  body=&{payload} | 
|  | ...  valid_status_codes=[${HTTP_BAD_REQUEST}] | 
|  |  | 
|  | Verify Error Upon Creating Same Users With Different Privileges | 
|  | [Documentation]  Verify error upon creating same users with different privileges. | 
|  | [Tags]  Verify_Error_Upon_Creating_Same_Users_With_Different_Privileges | 
|  |  | 
|  | Redfish Create User  test_user  TestPwd123  Administrator  ${True} | 
|  |  | 
|  | # Create specified user. | 
|  | ${payload}=  Create Dictionary | 
|  | ...  UserName=test_user  Password=TestPwd123  RoleId=ReadOnly  Enabled=${True} | 
|  | Redfish.Post  /redfish/v1/AccountService/Accounts/  body=&{payload} | 
|  | ...  valid_status_codes=[${HTTP_BAD_REQUEST}] | 
|  |  | 
|  | Redfish.Delete  /redfish/v1/AccountService/Accounts/test_user | 
|  |  | 
|  |  | 
|  | Verify Modifying User Attributes | 
|  | [Documentation]  Verify modifying user attributes. | 
|  | [Tags]  Verify_Modifying_User_Attributes | 
|  |  | 
|  | # Create Redfish users. | 
|  | Redfish Create User  admin_user     TestPwd123  Administrator   ${True} | 
|  | Redfish Create User  readonly_user  TestPwd123  ReadOnly        ${True} | 
|  |  | 
|  | # Make sure the new user account does not already exist. | 
|  | Redfish.Delete  /redfish/v1/AccountService/Accounts/newadmin_user | 
|  | ...  valid_status_codes=[${HTTP_OK}, ${HTTP_NOT_FOUND}] | 
|  |  | 
|  | # Update admin_user username using Redfish. | 
|  | ${payload}=  Create Dictionary  UserName=newadmin_user | 
|  | Redfish.Patch  /redfish/v1/AccountService/Accounts/admin_user  body=&{payload} | 
|  |  | 
|  | # Update readonly_user role using Redfish. | 
|  | ${payload}=  Create Dictionary  RoleId=Administrator | 
|  | Redfish.Patch  /redfish/v1/AccountService/Accounts/readonly_user  body=&{payload} | 
|  |  | 
|  | # Verify users after updating | 
|  | Redfish Verify User  newadmin_user  TestPwd123     Administrator   ${True} | 
|  | Redfish Verify User  readonly_user  TestPwd123     Administrator   ${True} | 
|  |  | 
|  | # Delete created users. | 
|  | Redfish.Delete  /redfish/v1/AccountService/Accounts/newadmin_user | 
|  | Redfish.Delete  /redfish/v1/AccountService/Accounts/readonly_user | 
|  |  | 
|  |  | 
|  | Verify Modifying Operator User Attributes | 
|  | [Documentation]  Verify modifying operator user attributes. | 
|  | [Tags]  Verify_Modifying_Operator_User_Attributes | 
|  | [Setup]  Run Keywords  Redfish.Login  AND | 
|  | ...  Redfish Create User  operator_user  TestPwd123  Operator  ${True} | 
|  | [Teardown]  Run Keywords  Redfish.Delete  /redfish/v1/AccountService/Accounts/operator_user | 
|  | ...  AND  Test Teardown Execution | 
|  |  | 
|  | # Update operator_user password using Redfish. | 
|  | ${payload}=  Create Dictionary  Password=NewTestPwd123 | 
|  | Redfish.Patch  /redfish/v1/AccountService/Accounts/operator_user  body=&{payload} | 
|  |  | 
|  | # Verify users after updating | 
|  | Redfish Verify User  operator_user  NewTestPwd123  Operator        ${True} | 
|  |  | 
|  |  | 
|  | Verify User Account Locked | 
|  | [Documentation]  Verify user account locked upon trying with invalid password. | 
|  | [Tags]  Verify_User_Account_Locked | 
|  |  | 
|  | Redfish Create User  admin_user  TestPwd123  Administrator   ${True} | 
|  |  | 
|  | ${payload}=  Create Dictionary  AccountLockoutThreshold=${account_lockout_threshold} | 
|  | ...  AccountLockoutDuration=${account_lockout_duration} | 
|  | Redfish.Patch  ${REDFISH_ACCOUNTS_SERVICE_URI}  body=${payload} | 
|  |  | 
|  | Redfish.Logout | 
|  |  | 
|  | # Make ${account_lockout_threshold} failed login attempts. | 
|  | Repeat Keyword  ${account_lockout_threshold} times | 
|  | ...  Run Keyword And Expect Error  InvalidCredentialsError*  Redfish.Login  admin_user  abc123 | 
|  |  | 
|  | # Verify that legitimate login fails due to lockout. | 
|  | Run Keyword And Expect Error  InvalidCredentialsError* | 
|  | ...  Redfish.Login  admin_user  TestPwd123 | 
|  |  | 
|  | # Wait for lockout duration to expire and then verify that login works. | 
|  | Sleep  ${account_lockout_duration}s | 
|  | Redfish.Login  admin_user  TestPwd123 | 
|  |  | 
|  | Redfish.Logout | 
|  |  | 
|  | Redfish.Login | 
|  |  | 
|  | Redfish.Delete  /redfish/v1/AccountService/Accounts/admin_user | 
|  |  | 
|  |  | 
|  | Verify User Account Unlock | 
|  | [Documentation]  Verify manually unlocking the account before lockout time | 
|  | [Tags]  Verify_User_Account_Unlock | 
|  | [Teardown]  Run Keywords  Redfish.Logout | 
|  | ...  AND  Redfish.Login | 
|  | ...  AND  Redfish.Delete  /redfish/v1/AccountService/Accounts/test_user | 
|  | ...  AND  SSHLibrary.Close All Connections | 
|  |  | 
|  | Redfish Create User  test_user  TestPwd123  Administrator  ${True} | 
|  |  | 
|  | ${payload}=  Create Dictionary | 
|  | ...  AccountLockoutThreshold=${account_lockout_threshold} | 
|  | ...  AccountLockoutDuration=${account_lockout_duration} | 
|  | Redfish.Patch  ${REDFISH_ACCOUNTS_SERVICE_URI}  body=${payload} | 
|  |  | 
|  | Redfish.Logout | 
|  |  | 
|  | # Make ${account_lockout_threshold} failed login attempts. | 
|  | Repeat Keyword  ${account_lockout_threshold} times | 
|  | ...  Run Keyword And Expect Error  InvalidCredentialsError* | 
|  | ...  Redfish.Login  test_user  abc123 | 
|  |  | 
|  | # Ensure SSH Login with locked account gets failed | 
|  | SSHLibrary.Open Connection  ${OPENBMC_HOST} | 
|  | Run Keyword And Expect Error  Authentication failed* | 
|  | ...  SSHLibrary.Login  test_user  TestPwd123 | 
|  |  | 
|  | # Verify that legitimate login fails due to lockout. | 
|  | Run Keyword And Expect Error  InvalidCredentialsError* | 
|  | ...  Redfish.Login  test_user  TestPwd123 | 
|  |  | 
|  | ${payload}=  Create Dictionary  Locked=${FALSE} | 
|  |  | 
|  | # Manually unlock the account before lockout threshold expires | 
|  | Redfish.Login | 
|  | Redfish.Patch  ${REDFISH_ACCOUNTS_URI}test_user  body=${payload} | 
|  | Redfish.Logout | 
|  |  | 
|  | # Try redfish login with the recently unlocked account | 
|  | Redfish.Login  test_user  TestPwd123 | 
|  |  | 
|  | # Try SSH login with the unlocked account | 
|  | SSHLibrary.Open Connection  ${OPENBMC_HOST} | 
|  | SSHLibrary.Login  test_user  TestPwd123 | 
|  |  | 
|  |  | 
|  | Verify Admin User Privilege | 
|  | [Documentation]  Verify admin user privilege. | 
|  | [Tags]  Verify_Admin_User_Privilege | 
|  |  | 
|  | Redfish Create User  admin_user  TestPwd123  Administrator  ${True} | 
|  | Redfish Create User  readonly_user  TestPwd123  ReadOnly  ${True} | 
|  |  | 
|  | Redfish.Logout | 
|  |  | 
|  | Redfish.Login  admin_user  TestPwd123 | 
|  |  | 
|  | # Change password of 'readonly' user with admin user. | 
|  | Redfish.Patch  /redfish/v1/AccountService/Accounts/readonly_user  body={'Password': 'NewTestPwd123'} | 
|  |  | 
|  | # Verify modified user. | 
|  | Redfish Verify User  readonly_user  NewTestPwd123  ReadOnly  ${True} | 
|  |  | 
|  | # Note: Delete user would work here because a root login is | 
|  | # performed as part of "Redfish Verify User" keyword's teardown. | 
|  | Redfish.Delete  /redfish/v1/AccountService/Accounts/admin_user | 
|  | Redfish.Delete  /redfish/v1/AccountService/Accounts/readonly_user | 
|  |  | 
|  |  | 
|  | Verify Operator User Role Change Using Admin Privilege User | 
|  | [Documentation]  Verify operator user role change using admin privilege user | 
|  | [Tags]  Verify_Operator_User_Role_Change_Using_Admin_Privilege_User | 
|  |  | 
|  | Redfish Create User  admin_user  TestPwd123  Administrator  ${True} | 
|  | Redfish Create User  operator_user  TestPwd123  Operator  ${True} | 
|  |  | 
|  | Redfish.Logout | 
|  |  | 
|  | # Change role ID of operator user with admin user. | 
|  | # Login with admin user. | 
|  | Redfish.Login  admin_user  TestPwd123 | 
|  |  | 
|  | # Modify Role ID of Operator user. | 
|  | Redfish.Patch  /redfish/v1/AccountService/Accounts/operator_user  body={'RoleId': 'Administrator'} | 
|  |  | 
|  | # Verify modified user. | 
|  | Redfish Verify User  operator_user  TestPwd123  Administrator  ${True} | 
|  |  | 
|  | Redfish.Delete  /redfish/v1/AccountService/Accounts/admin_user | 
|  | Redfish.Delete  /redfish/v1/AccountService/Accounts/operator_user | 
|  |  | 
|  |  | 
|  | Verify Operator User Privilege | 
|  | [Documentation]  Verify operator user privilege. | 
|  | [Tags]  Verify_Operator_User_Privilege | 
|  |  | 
|  | Redfish Create User  admin_user  TestPwd123  Administrator  ${True} | 
|  | Redfish Create User  operator_user  TestPwd123  Operator  ${True} | 
|  |  | 
|  | Redfish.Logout | 
|  | # Login with operator user. | 
|  | Redfish.Login  operator_user  TestPwd123 | 
|  |  | 
|  | # Verify BMC reset. | 
|  | Run Keyword And Expect Error  ValueError*  Redfish BMC Reset Operation | 
|  |  | 
|  | # Attempt to change password of admin user with operator user. | 
|  | Redfish.Patch  /redfish/v1/AccountService/Accounts/admin_user  body={'Password': 'NewTestPwd123'} | 
|  | ...  valid_status_codes=[${HTTP_FORBIDDEN}] | 
|  |  | 
|  | Redfish.Logout | 
|  |  | 
|  | Redfish.Login | 
|  |  | 
|  | Redfish.Delete  /redfish/v1/AccountService/Accounts/admin_user | 
|  | Redfish.Delete  /redfish/v1/AccountService/Accounts/operator_user | 
|  |  | 
|  |  | 
|  | Verify ReadOnly User Privilege | 
|  | [Documentation]  Verify ReadOnly user privilege. | 
|  | [Tags]  Verify_ReadOnly_User_Privilege | 
|  |  | 
|  | Redfish Create User  readonly_user  TestPwd123  ReadOnly  ${True} | 
|  | Redfish.Logout | 
|  |  | 
|  | # Login with read_only user. | 
|  | Redfish.Login  readonly_user  TestPwd123 | 
|  |  | 
|  | # Read system level data. | 
|  | ${system_model}=  Redfish_Utils.Get Attribute | 
|  | ...  ${SYSTEM_BASE_URI}  Model | 
|  |  | 
|  | Redfish.Logout | 
|  | Redfish.Login | 
|  | Redfish.Delete  ${REDFISH_ACCOUNTS_URI}readonly_user | 
|  |  | 
|  |  | 
|  | Verify Minimum Password Length For Redfish User | 
|  | [Documentation]  Verify minimum password length for new and existing user. | 
|  | [Tags]  Verify_Minimum_Password_Length_For_Redfish_User | 
|  |  | 
|  | ${user_name}=  Set Variable  testUser | 
|  |  | 
|  | # Make sure the user account in question does not already exist. | 
|  | Redfish.Delete  /redfish/v1/AccountService/Accounts/${user_name} | 
|  | ...  valid_status_codes=[${HTTP_OK}, ${HTTP_NOT_FOUND}] | 
|  |  | 
|  | # Try to create a user with invalid length password. | 
|  | ${payload}=  Create Dictionary | 
|  | ...  UserName=${user_name}  Password=UserPwd  RoleId=Administrator  Enabled=${True} | 
|  | Redfish.Post  /redfish/v1/AccountService/Accounts/  body=&{payload} | 
|  | ...  valid_status_codes=[${HTTP_BAD_REQUEST}] | 
|  |  | 
|  | # Create specified user with valid length password. | 
|  | Set To Dictionary  ${payload}  Password  UserPwd1 | 
|  | Redfish.Post  /redfish/v1/AccountService/Accounts/  body=&{payload} | 
|  | ...  valid_status_codes=[${HTTP_CREATED}] | 
|  |  | 
|  | # Try to change to an invalid password. | 
|  | Redfish.Patch  /redfish/v1/AccountService/Accounts/${user_name}  body={'Password': 'UserPwd'} | 
|  | ...  valid_status_codes=[${HTTP_BAD_REQUEST}] | 
|  |  | 
|  | # Change to a valid password. | 
|  | Redfish.Patch  /redfish/v1/AccountService/Accounts/${user_name}  body={'Password': 'UserPwd1'} | 
|  |  | 
|  | # Verify login. | 
|  | Redfish.Logout | 
|  | Redfish.Login  ${user_name}  UserPwd1 | 
|  | Redfish.Logout | 
|  | Redfish.Login | 
|  | Redfish.Delete  /redfish/v1/AccountService/Accounts/${user_name} | 
|  |  | 
|  |  | 
|  | Verify Standard User Roles Defined By Redfish | 
|  | [Documentation]  Verify standard user roles defined by Redfish. | 
|  | [Tags]  Verify_Standard_User_Roles_Defined_By_Redfish | 
|  |  | 
|  | ${member_list}=  Redfish_Utils.Get Member List | 
|  | ...  /redfish/v1/AccountService/Roles | 
|  |  | 
|  | @{roles}=  Create List | 
|  | ...  /redfish/v1/AccountService/Roles/Administrator | 
|  | ...  /redfish/v1/AccountService/Roles/Operator | 
|  | ...  /redfish/v1/AccountService/Roles/ReadOnly | 
|  |  | 
|  | List Should Contain Sub List  ${member_list}  ${roles} | 
|  |  | 
|  | # The standard roles are: | 
|  |  | 
|  | # | Role name | Assigned privileges | | 
|  | # | Administrator | Login, ConfigureManager, ConfigureUsers, ConfigureComponents, ConfigureSelf | | 
|  | # | Operator | Login, ConfigureComponents, ConfigureSelf | | 
|  | # | ReadOnly | Login, ConfigureSelf | | 
|  |  | 
|  | @{admin}=  Create List  Login  ConfigureManager  ConfigureUsers  ConfigureComponents  ConfigureSelf | 
|  | @{operator}=  Create List  Login  ConfigureComponents  ConfigureSelf | 
|  | @{readOnly}=  Create List  Login  ConfigureSelf | 
|  |  | 
|  | ${roles_dict}=  create dictionary  admin_privileges=${admin}  operator_privileges=${operator} | 
|  | ...  readOnly_privileges=${readOnly} | 
|  |  | 
|  | ${resp}=  redfish.Get  /redfish/v1/AccountService/Roles/Administrator | 
|  | List Should Contain Sub List  ${resp.dict['AssignedPrivileges']}  ${roles_dict['admin_privileges']} | 
|  |  | 
|  | ${resp}=  redfish.Get  /redfish/v1/AccountService/Roles/Operator | 
|  | List Should Contain Sub List  ${resp.dict['AssignedPrivileges']}  ${roles_dict['operator_privileges']} | 
|  |  | 
|  | ${resp}=  redfish.Get  /redfish/v1/AccountService/Roles/ReadOnly | 
|  | List Should Contain Sub List  ${resp.dict['AssignedPrivileges']}  ${roles_dict['readOnly_privileges']} | 
|  |  | 
|  |  | 
|  | Verify Error While Deleting Root User | 
|  | [Documentation]  Verify error while deleting root user. | 
|  | [Tags]  Verify_Error_While_Deleting_Root_User | 
|  |  | 
|  | Redfish.Delete  /redfish/v1/AccountService/Accounts/root  valid_status_codes=[${HTTP_FORBIDDEN}] | 
|  |  | 
|  |  | 
|  | Verify SSH Login Access With Admin User | 
|  | [Documentation]  Verify that admin user have SSH login access. | 
|  | ...              By default, admin should have access but there could be | 
|  | ...              case where admin user shell access is restricted by design | 
|  | ...              in the community sphere.. | 
|  | [Tags]  Verify_SSH_Login_Access_With_Admin_User | 
|  |  | 
|  | # Create an admin User. | 
|  | Redfish Create User  new_admin  TestPwd1  Administrator  ${True} | 
|  |  | 
|  | # Attempt SSH login with admin user. | 
|  | SSHLibrary.Open Connection  ${OPENBMC_HOST} | 
|  | ${status}=  Run Keyword And Return Status  SSHLibrary.Login  new_admin  TestPwd1 | 
|  |  | 
|  | # By default ssh_status is True, user can change the status via CLI | 
|  | # -v ssh_status:False | 
|  | Should Be Equal As Strings  "${status}"  "${ssh_status}" | 
|  |  | 
|  | Redfish.Login | 
|  | Redfish.Delete  /redfish/v1/AccountService/Accounts/new_admin | 
|  |  | 
|  |  | 
|  | Verify Configure BasicAuth Enable And Disable | 
|  | [Documentation]  Verify configure basicauth enable and disable | 
|  | [Tags]  Verify_Configure_BasicAuth_Enable_And_Disable | 
|  | [Template]  Template For Configure Auth Methods | 
|  |  | 
|  | # auth_method | 
|  | BasicAuth | 
|  | XToken | 
|  |  | 
|  | *** Keywords *** | 
|  |  | 
|  | Test Teardown Execution | 
|  | [Documentation]  Do the post test teardown. | 
|  |  | 
|  | Run Keyword And Ignore Error  Redfish.Logout | 
|  | FFDC On Test Case Fail | 
|  |  | 
|  |  | 
|  | Redfish Create User | 
|  | [Documentation]  Redfish create user. | 
|  | [Arguments]   ${username}  ${password}  ${role_id}  ${enabled}  ${login_check}=${True} | 
|  |  | 
|  | # Description of argument(s): | 
|  | # username            The username to be created. | 
|  | # password            The password to be assigned. | 
|  | # role_id             The role ID of the user to be created | 
|  | #                     (e.g. "Administrator", "Operator", etc.). | 
|  | # enabled             Indicates whether the username being created | 
|  | #                     should be enabled (${True}, ${False}). | 
|  | # login_check         Checks user login for created user. | 
|  | #                     (e.g. ${True}, ${False}). | 
|  |  | 
|  | # Make sure the user account in question does not already exist. | 
|  | Redfish.Delete  /redfish/v1/AccountService/Accounts/${userName} | 
|  | ...  valid_status_codes=[${HTTP_OK}, ${HTTP_NOT_FOUND}] | 
|  |  | 
|  | # Create specified user. | 
|  | ${payload}=  Create Dictionary | 
|  | ...  UserName=${username}  Password=${password}  RoleId=${role_id}  Enabled=${enabled} | 
|  | Redfish.Post  /redfish/v1/AccountService/Accounts/  body=&{payload} | 
|  | ...  valid_status_codes=[${HTTP_CREATED}] | 
|  |  | 
|  | # Resetting faillock count as a workaround for issue | 
|  | # openbmc/phosphor-user-manager#4 | 
|  | ${cmd}=  Catenate  /usr/sbin/faillock --user ${username} --reset | 
|  |  | 
|  | Bmc Execute Command  ${cmd} | 
|  |  | 
|  | # Verify login with created user. | 
|  | ${status}=  Run Keyword If  '${login_check}' == '${True}' | 
|  | ...  Verify Redfish User Login  ${username}  ${password} | 
|  | Run Keyword If  '${login_check}' == '${True}'  Should Be Equal  ${status}  ${enabled} | 
|  |  | 
|  | # Validate Role ID of created user. | 
|  | ${role_config}=  Redfish_Utils.Get Attribute | 
|  | ...  /redfish/v1/AccountService/Accounts/${username}  RoleId | 
|  | Should Be Equal  ${role_id}  ${role_config} | 
|  |  | 
|  |  | 
|  | Redfish Verify User | 
|  | [Documentation]  Redfish user verification. | 
|  | [Arguments]   ${username}  ${password}  ${role_id}  ${enabled} | 
|  |  | 
|  | # Description of argument(s): | 
|  | # username            The username to be created. | 
|  | # password            The password to be assigned. | 
|  | # role_id             The role ID of the user to be created | 
|  | #                     (e.g. "Administrator", "Operator", etc.). | 
|  | # enabled             Indicates whether the username being created | 
|  | #                     should be enabled (${True}, ${False}). | 
|  |  | 
|  | ${status}=  Verify Redfish User Login  ${username}  ${password} | 
|  | # Doing a check of the returned status. | 
|  | Should Be Equal  ${status}  ${enabled} | 
|  |  | 
|  | # Validate Role Id of user. | 
|  | ${role_config}=  Redfish_Utils.Get Attribute | 
|  | ...  /redfish/v1/AccountService/Accounts/${username}  RoleId | 
|  | Should Be Equal  ${role_id}  ${role_config} | 
|  |  | 
|  |  | 
|  | Verify Redfish User Login | 
|  | [Documentation]  Verify Redfish login with given user id. | 
|  | [Teardown]  Run Keywords  Run Keyword And Ignore Error  Redfish.Logout  AND  Redfish.Login | 
|  | [Arguments]   ${username}  ${password} | 
|  |  | 
|  | # Description of argument(s): | 
|  | # username            Login username. | 
|  | # password            Login password. | 
|  |  | 
|  | # Logout from current Redfish session. | 
|  | # We don't really care if the current session is flushed out since we are going to login | 
|  | # with new credential in next. | 
|  | Run Keyword And Ignore Error  Redfish.Logout | 
|  |  | 
|  | ${status}=  Run Keyword And Return Status  Redfish.Login  ${username}  ${password} | 
|  | RETURN  ${status} | 
|  |  | 
|  |  | 
|  | Redfish Create And Verify User | 
|  | [Documentation]  Redfish create and verify user. | 
|  | [Arguments]   ${username}  ${password}  ${role_id}  ${enabled} | 
|  |  | 
|  | # Description of argument(s): | 
|  | # username            The username to be created. | 
|  | # password            The password to be assigned. | 
|  | # role_id             The role ID of the user to be created | 
|  | #                     (e.g. "Administrator", "Operator", etc.). | 
|  | # enabled             Indicates whether the username being created | 
|  | #                     should be enabled (${True}, ${False}). | 
|  |  | 
|  | # Example: | 
|  | #{ | 
|  | #"@odata.context": "/redfish/v1/$metadata#ManagerAccount.ManagerAccount", | 
|  | #"@odata.id": "/redfish/v1/AccountService/Accounts/test1", | 
|  | #"@odata.type": "#ManagerAccount.v1_0_3.ManagerAccount", | 
|  | #"Description": "User Account", | 
|  | #"Enabled": true, | 
|  | #"Id": "test1", | 
|  | #"Links": { | 
|  | #  "Role": { | 
|  | #    "@odata.id": "/redfish/v1/AccountService/Roles/Administrator" | 
|  | #  } | 
|  | #}, | 
|  |  | 
|  | Redfish Create User  ${username}  ${password}  ${role_id}  ${enabled} | 
|  |  | 
|  | Redfish Verify User  ${username}  ${password}  ${role_id}  ${enabled} | 
|  |  | 
|  | # Delete Specified User | 
|  | Redfish.Delete  /redfish/v1/AccountService/Accounts/${username} | 
|  |  | 
|  | Verify Redfish User with Wrong Password | 
|  | [Documentation]  Verify Redfish User with Wrong Password. | 
|  | [Arguments]   ${username}  ${password}  ${role_id}  ${enabled}  ${wrong_password} | 
|  |  | 
|  | # Description of argument(s): | 
|  | # username            The username to be created. | 
|  | # password            The password to be assigned. | 
|  | # role_id             The role ID of the user to be created | 
|  | #                     (e.g. "Administrator", "Operator", etc.). | 
|  | # enabled             Indicates whether the username being created | 
|  | #                     should be enabled (${True}, ${False}). | 
|  | # wrong_password      Any invalid password. | 
|  |  | 
|  | Redfish Create User  ${username}  ${password}  ${role_id}  ${enabled} | 
|  |  | 
|  | Redfish.Logout | 
|  |  | 
|  | # Attempt to login with created user with invalid password. | 
|  | Run Keyword And Expect Error  InvalidCredentialsError* | 
|  | ...  Redfish.Login  ${username}  ${wrong_password} | 
|  |  | 
|  | Redfish.Login | 
|  |  | 
|  | # Delete newly created user. | 
|  | Redfish.Delete  /redfish/v1/AccountService/Accounts/${username} | 
|  |  | 
|  |  | 
|  | Verify Login with Deleted Redfish User | 
|  | [Documentation]  Verify Login with Deleted Redfish User. | 
|  | [Arguments]   ${username}  ${password}  ${role_id}  ${enabled} | 
|  |  | 
|  | # Description of argument(s): | 
|  | # username            The username to be created. | 
|  | # password            The password to be assigned. | 
|  | # role_id             The role ID of the user to be created | 
|  | #                     (e.g. "Administrator", "Operator", etc.). | 
|  | # enabled             Indicates whether the username being created | 
|  | #                     should be enabled (${True}, ${False}). | 
|  |  | 
|  | Redfish Create User  ${username}  ${password}  ${role_id}  ${enabled} | 
|  |  | 
|  | # Delete newly created user. | 
|  | Redfish.Delete  /redfish/v1/AccountService/Accounts/${userName} | 
|  |  | 
|  | Redfish.Logout | 
|  |  | 
|  | # Attempt to login with deleted user account. | 
|  | Run Keyword And Expect Error  InvalidCredentialsError* | 
|  | ...  Redfish.Login  ${username}  ${password} | 
|  |  | 
|  | Redfish.Login | 
|  |  | 
|  |  | 
|  | Verify Create User Without Enabling | 
|  | [Documentation]  Verify Create User Without Enabling. | 
|  | [Arguments]   ${username}  ${password}  ${role_id}  ${enabled} | 
|  |  | 
|  | # Description of argument(s): | 
|  | # username            The username to be created. | 
|  | # password            The password to be assigned. | 
|  | # role_id             The role ID of the user to be created | 
|  | #                     (e.g. "Administrator", "Operator", etc.). | 
|  | # enabled             Indicates whether the username being created | 
|  | #                     should be enabled (${True}, ${False}). | 
|  |  | 
|  | Redfish Create User  ${username}  ${password}  ${role_id}  ${enabled}  ${False} | 
|  |  | 
|  | Redfish.Logout | 
|  |  | 
|  | # Login with created user. | 
|  | Run Keyword And Expect Error  InvalidCredentialsError* | 
|  | ...  Redfish.Login  ${username}  ${password} | 
|  |  | 
|  | Redfish.Login | 
|  |  | 
|  | # Delete newly created user. | 
|  | Redfish.Delete  /redfish/v1/AccountService/Accounts/${username} | 
|  |  | 
|  | Template For Configure Auth Methods | 
|  | [Documentation]  Template to configure auth methods. | 
|  | [Arguments]  ${auth_method} | 
|  | [Teardown]  Configure AuthMethods  ${auth_method}=${initial_value} | 
|  |  | 
|  | # Description of Argument(s): | 
|  | # authmethods   The authmethod setting which needs to be | 
|  | #               set in account service URI. | 
|  | # valid values  BasicAuth, XToken. | 
|  |  | 
|  | Get AuthMethods Default Values  ${auth_method} | 
|  |  | 
|  | # Patch basicauth to TRUE | 
|  | Configure AuthMethods  ${auth_method}=${TRUE} | 
|  |  | 
|  | Run Keyword IF  "${auth_method}" == "XToken" | 
|  | ...    Check XToken Works Fine  ${HTTP_OK} | 
|  | ...  ELSE | 
|  | ...    Check BasicAuth Works Fine  ${HTTP_OK} | 
|  |  | 
|  | # Patch basicauth to FALSE | 
|  | Configure AuthMethods  ${auth_method}=${FALSE} | 
|  |  | 
|  | Run Keyword IF  "${auth_method}" == "BasicAuth" | 
|  | ...    Check BasicAuth Works Fine  ${HTTP_UNAUTHORIZED} | 
|  | ...  ELSE | 
|  | ...    Check XToken Works Fine  ${HTTP_UNAUTHORIZED} | 
|  |  | 
|  | Configure AuthMethods | 
|  | [Documentation]  Enable/disable authmethod types. | 
|  | [Arguments]  &{authmethods} | 
|  |  | 
|  | # Description of argument(s): | 
|  | # authmethods            The authmethod setting which needs to be | 
|  | #                        set in account service URI. | 
|  | # Usage Example          Configure AuthMethods  XToken=${TRUE}  BasicAuth=${TRUE} | 
|  | #                        This will set the value of "XToken" and "BasicAuth" | 
|  | #                        property in accountservice uri to TRUE. | 
|  |  | 
|  | ${openbmc}=  Create Dictionary  AuthMethods=${authmethods} | 
|  | ${oem}=  Create Dictionary  OpenBMC=${openbmc} | 
|  | ${payload}=  Create Dictionary  Oem=${oem} | 
|  |  | 
|  | # Setting authmethod properties using Redfish session based auth | 
|  | ${status}=  Run Keyword And Return Status | 
|  | ...  Redfish.Patch  ${REDFISH_BASE_URI}AccountService | 
|  | ...  body=${payload}  valid_status_codes=[${HTTP_OK},${HTTP_NO_CONTENT}] | 
|  |  | 
|  | # Setting authmethod properties using basic auth in case the former fails | 
|  | IF  ${status}==${FALSE} | 
|  | # Payload dictionary pre-process to match json formatting | 
|  | ${payload}=  Convert To String  ${payload} | 
|  | ${payload}=  Replace String  ${payload}  '  " | 
|  | ${payload}=  Replace String  ${payload}  False  false | 
|  | ${payload}=  Replace String  ${payload}  True  true | 
|  |  | 
|  | # Curl Command Framing for PATCH authmethod | 
|  | ${cmd}=  Catenate  curl -k -i -u ${OPENBMC_USERNAME}:${OPENBMC_PASSWORD} | 
|  | ...  -X PATCH '${AUTH_URI}${REDFISH_ACCOUNTS_SERVICE_URI}' | 
|  | ...  -H 'content-type:application/json' -H 'If-Match:*' | 
|  | ...  -d '${payload}' | 
|  | ${rc}  ${out}=  Run And Return Rc And Output  ${cmd} | 
|  |  | 
|  | #  Check the response of curl command is 200 or 204 | 
|  | ${check_no_content}= | 
|  | ...  Run Keyword and Return Status  Should Contain  ${out}  204 | 
|  | ${check_ok}= | 
|  | ...  Run Keyword and Return Status  Should Contain  ${out}  200 | 
|  | Pass Execution If  ${check_no_content}==${TRUE} | 
|  | ...  OR  ${check_ok}==${TRUE} | 
|  | END | 
|  |  | 
|  |  | 
|  | Get AuthMethods Default Values | 
|  | [Documentation]  Get enabled/disabled status of all authmethods | 
|  | ...  from Redfish account service URI | 
|  | [Arguments]  ${authmethod} | 
|  |  | 
|  | # Description of argument(s): | 
|  | # authmethod            The authmethod property whose value needs to be | 
|  | #                       retrieved from account service URI. | 
|  | # Usage Example         Get AuthMethods Default Values  BasicAuth | 
|  | #                       returns >> ${TRUE} | 
|  | # Example: | 
|  | # { | 
|  | #     "@odata.id": "/redfish/v1/AccountService", | 
|  | #     (...) | 
|  | #     "Oem": { | 
|  | #         "OpenBMC": { | 
|  | #             "AuthMethods": { | 
|  | #                 "BasicAuth": true, | 
|  | #                 "Cookie": true, | 
|  | #                 "SessionToken": true, | 
|  | #                 "TLS": true, | 
|  | #                 "XToken": true | 
|  | #             } | 
|  | #         } | 
|  | #     } | 
|  | # } | 
|  |  | 
|  | ${resp}=  Redfish.Get Attribute  ${REDFISH_ACCOUNTS_SERVICE_URI}  Oem | 
|  | ${authmethods}=  Set Variable  ${resp['OpenBMC']['AuthMethods']} | 
|  | ${initial_value}=  Get From Dictionary  ${authmethods}  ${authmethod} | 
|  | Set Test Variable  ${initial_value} | 
|  |  | 
|  | Check XToken Works Fine | 
|  | [Documentation]  Verify Xtoken works fine. | 
|  | [Arguments]  ${status_code} | 
|  |  | 
|  | # Description of Argument(s): | 
|  | # status_code : 200, 401. | 
|  |  | 
|  | # Verify xtoken auth works for xtoken | 
|  | Redfish.Get  ${REDFISH_ACCOUNTS_SERVICE_URI} | 
|  | ...  valid_status_codes=[${status_code}] | 
|  |  | 
|  | Check BasicAuth Works Fine | 
|  | [Documentation]  Verify Basic Auth works fine. | 
|  | [Arguments]  ${status_code} | 
|  |  | 
|  | # Description of Argument(s): | 
|  | # status_code : 200, 401. | 
|  |  | 
|  | # Verify basic auth works based on basic auth. | 
|  | ${cmd}=  Catenate  curl -k -i -u ${OPENBMC_USERNAME}:${OPENBMC_PASSWORD} | 
|  | ...  ${AUTH_URI}/redfish/v1/AccountService | 
|  | ${rc}  ${out}=  Run And Return Rc And Output  ${cmd} | 
|  |  | 
|  | #  Check the response of curl command is 200/401 | 
|  | Should Contain  ${out}  ${status_code} |