*** Settings ***
Documentation   OpenBMC user management keywords.

Resource         ../lib/rest_client.robot
Resource         ../lib/utils.robot
Library          SSHLibrary

*** Keywords ***

Create Group And Privilege
    [Documentation]  Create group and privilege for users.
    [Arguments]  ${user_group}  ${user_privilege}

    # Description of argument(s):
    # user_group      User group.
    # user_privilege  User privilege like priv-admin, priv-user.

    @{ldap_parm_list}=  Create List  ${user_group}  ${user_privilege}

    ${data}=  Create Dictionary  data=@{ldap_parm_list}

    ${resp}=  OpenBMC Post Request
    ...  ${BMC_USER_URI}ldap/action/Create  data=${data}
    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
    ...  msg=Updating the new root password failed. RC=${resp.status_code}.


Create Privilege
    [Documentation]  Create privilege as priv-admin.
    [Arguments]  ${user_privilege}

    Create Group And Privilege  ${group_name}=${GROUP_NAME}  ${user_privilege}
    ${bmc_user_uris}=  Read Properties  ${BMC_USER_URI}ldap/enumerate
    # Sample output:
    # "data": {
    #  "/xyz/openbmc_project/user/ldap/13": {
    #  "GroupName": "redfish",
    #  "Privilege": "priv-admin"
    # },
    # "/xyz/openbmc_project/user/ldap/15": {
    #  "GroupName": "openldapgroup",
    #  "Privilege": "priv-admin"
    # },
    # "/xyz/openbmc_project/user/ldap/config": {
    #  "LDAPBaseDN": "dc=ldap,dc=com",
    #  "LDAPBindDN": "cn=Administrator,dc=ldap,dc=com",
    #  "LDAPSearchScope": "xyz.openbmc_project.User.Ldap.Config.SearchScope.sub",
    #  "LDAPServerURI": "ldaps://fspldaptest.in.ibm.com/",
    #  "LDAPType": "xyz.openbmc_project.User.Ldap.Config.Type.OpenLdap"
    # }
    #}

    ${bmc_user_uris}=  Convert To String  ${bmc_user_uris}
    Should Contain  ${bmc_user_uris}  ${user_privilege}
    ...  msg=Could not create ${user_privilege} privilege.


Suite Setup Execution
    [Documentation]  Do the initial suite setup.

    # Validating external user parameters.
    Should Not Be Empty  ${LDAP_SERVER_URI}
    Should Not Be Empty  ${LDAP_BIND_DN}
    Should Not Be Empty  ${LDAP_BASE_DN}
    Should Not Be Empty  ${LDAP_BIND_DN_PASSWORD}
    Should Not Be Empty  ${LDAP_SEARCH_SCOPE}
    Should Not Be Empty  ${LDAP_SERVER_TYPE}

Check LDAP Service Running
    [Documentation]  Check LDAP service running in BMC.

    BMC Execute Command  systemctl | grep -in ldap


Configure LDAP Server On BMC
    [Documentation]  Configure LDAP Server On BMC.

    @{ldap_parm_list}=  Create List
    ...  ${LDAP_SERVER_URI}  ${LDAP_BIND_DN}
    ...  ${LDAP_BASE_DN}  ${LDAP_BIND_DN_PASSWORD}  ${LDAP_SEARCH_SCOPE}
    ...  ${LDAP_SERVER_TYPE}

    ${data}=  Create Dictionary  data=@{ldap_parm_list}

    ${resp}=  OpenBMC Post Request
    ...  ${BMC_LDAP_URI}/action/CreateConfig  data=${data}
    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}


Check LDAP Config File Generated
    [Documentation]  Check LDAP file nslcd.conf generated.
    [Arguments]  ${ldap_server_uri}=${LDAP_SERVER_URI}

    # Description of argument(s):
    # ldap_server_uri  The LDAP server uri (e.g. "ldap://x.x.x.x/" for non-secured or
    # ""ldaps://x.x.x.x/"" for secured).

    ${ldap_server_config}=  Read Properties  ${BMC_USER_URI}ldap/enumerate
    ${ldap_server_config}=  Convert To String  ${ldap_server_config}
    Should Contain  ${ldap_server_config}  ${ldap_server_uri}
    ...  msg=${ldap_server_uri} is not configured.


Delete LDAP Config
    [Documentation]  Delete LDAP Config via REST.

    ${data}=  Create Dictionary  data=@{EMPTY}
    ${resp}=  OpenBMC Post Request
    ...  ${BMC_LDAP_URI}/config/action/delete  data=${data}

    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}


Check LDAP Config File Deleted
    [Documentation]  Check LDAP file nslcd.conf deleted.

    ${ldap_server_config}=  Read Properties  ${BMC_USER_URI}ldap/enumerate
    ${ldap_server_config}=  Convert To String  ${ldap_server_config}

    Should Not Contain  ${ldap_server_config}  ${LDAP_SERVER_URI}
    ...  msg=${ldap_server_config} is not configured.


Modify LDAP Search Scope
    [Documentation]  Modify LDAP search scope parameter in LDAP config.
    [Arguments]  ${search_scope}=${LDAP_SEARCH_SCOPE}

    # Description of argument(s):
    # search_scope  Contains ldap search scope (e.g. "xyz.openbmc_project.User.Ldap.Config.SearchScope.one").

    ${search_scope_dict}=  Create Dictionary  data=${search_scope}
    Write Attribute  ${BMC_LDAP_URI}/config   LDAPSearchScope  data=${search_scope_dict}
    ...  verify=${True}  expected_value=${search_scope}


Modify LDAP Server Type
    [Documentation]  Modify LDAP server type parameter in LDAP config.
    [Arguments]  ${ldap_type}=${LDAP_SERVER_TYPE}

    # Description of argument(s):
    # ldap_type Contains ldap server type (e.g. "xyz.openbmc_project.User.Ldap.Config.Type.ActiveDirectory").

    ${ldap_type_dict}=  Create Dictionary  data=${ldap_type}
    Write Attribute  ${BMC_LDAP_URI}/config   LDAPType  data=${ldap_type_dict}
    ...  verify=${True}  expected_value=${ldap_type}


Get LDAP Entries
    [Documentation]  Get LDAP entries and return the object list.

    ${ldap_entry_list}=  Create List
    ${resp}=  OpenBMC Get Request  ${BMC_USER_URI}ldap/enumerate  quiet=${1}
    Return From Keyword If  ${resp.status_code} == ${HTTP_NOT_FOUND}
    ${jsondata}=  To JSON  ${resp.content}

    :FOR  ${entry}  IN  @{jsondata["data"]}
    \  Continue For Loop If  '${entry.rsplit('/', 1)[1]}' == 'callout'
    \  Append To List  ${ldap_entry_list}  ${entry}

    # LDAP entries list.
    # ['/xyz/openbmc_project/user/ldap/1',
    #  '/xyz/openbmc_project/user/ldap/2']
    [Return]  ${ldap_entry_list}


Defined LDAP Group Entry Should Exist
    [Documentation]  Find the matching group and return the entry id.
    [Arguments]  ${user_group}

    # Description of argument(s):
    # user_group  A space-delimited list of user group (e.g. "Domain Admins").

    @{ldap_entries}=  Get LDAP Entries

    :FOR  ${ldap_entry}  IN  @{ldap_entries}
    \  ${resp}=  Read Properties  ${ldap_entry}
    \  ${status}=  Run Keyword And Return Status
    ...  Should Be Equal As Strings  ${user_group}  ${resp["GroupName"]}
    \  Return From Keyword If  ${status} == ${TRUE}  ${ldap_entry}

    Fail  No ${user_group} LDAP user group entry found.


Delete Defined LDAP Group And Privilege
    [Documentation]  Delete LDAP group and its privilege.
    [Arguments]  ${user_group}
    # user_group(s)   contain LDAP user group string. Example: "Domain Admins"

    # Description of argument(s):

    ${ldap_entry_id}=   Defined LDAP Group Entry Should Exist  ${user_group}
    ${data}=  Create Dictionary  data=@{EMPTY}
    ${resp}=  OpenBMC Post Request  ${ldap_entry_id}/action/delete  data=${data}
    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
