*** Settings ***

Documentation    Module to test IPMI asset tag functionality.
Resource         ../lib/ipmi_client.robot
Resource         ../lib/openbmc_ffdc.robot
Resource         ../lib/bmc_network_utils.robot
Variables        ../data/ipmi_raw_cmd_table.py
Variables        ../data/ipmi_variable.py
Library          ../lib/bmc_network_utils.py
Library          ../lib/ipmi_utils.py

Suite Setup      IPMI General Test Suite Setup
Test Teardown    FFDC On Test Case Fail

*** Test Cases ***

Verify Get DCMI Capabilities
    [Documentation]  Verify get DCMI capabilities command output.
    [Tags]  Verify_Get_DCMI_Capabilities
    ${cmd_output}=  Run IPMI Standard Command  dcmi discover

    @{supported_capabilities}=  Create List
    # Supported DCMI capabilities:
    ...  Mandatory platform capabilties
    ...  Optional platform capabilties
    ...  Power management available
    ...  Managebility access capabilties
    ...  In-band KCS channel available
    # Mandatory platform attributes:
    ...  200 SEL entries
    ...  SEL automatic rollover is enabled
    # Optional Platform Attributes:
    ...  Slave address of device: 0h (8bits)(Satellite/External controller)
    ...  Channel number is 0h (Primary BMC)
    ...  Device revision is 0
    # Manageability Access Attributes:
    ...  Primary LAN channel number: 1 is available
    ...  Secondary LAN channel is not available for OOB
    ...  No serial channel is available

    FOR  ${capability}  IN  @{supported_capabilities}
      Should Contain  ${cmd_output}  ${capability}  ignore_case=True
      ...  msg=Supported DCMI capabilities not present.
    END


Test Get Self Test Results via IPMI Raw Command
    [Documentation]  Get self test results via IPMI raw command and verify the output.
    [Tags]  Test_Get_Self_Test_Results_via_IPMI_Raw_Command

    ${resp}=  Run IPMI Standard Command  raw ${IPMI_RAW_CMD['Self_Test_Results']['Get'][0]}

    # 55h = No error. All Self Tests Passed.
    # 56h = Self Test function not implemented in this controller.
    Should Contain Any  ${resp}  55 00  56 00


Test Get Device GUID Via IPMI Raw Command
    [Documentation]  Get device GUID via IPMI raw command and verify it using Redfish.
    [Tags]  Test_Get_Device_GUID_Via_IPMI_Raw_Command
    [Teardown]  Run Keywords  Redfish.Logout  AND  FFDC On Test Case Fail
    # Get GUIDS via IPMI.
    # This should match the /redfish/v1/Managers/bmc's UUID data.
    ${guids}=  Run IPMI Standard Command  raw ${IPMI_RAW_CMD['Device GUID']['Get'][0]}
    # Reverse the order and remove space delims.
    ${guids}=  Split String  ${guids}
    Reverse List  ${guids}
    ${guids}=  Evaluate  "".join(${guids})

    Redfish.Login
    ${uuid}=  Redfish.Get Attribute  /redfish/v1/Managers/bmc  UUID
    ${uuid}=  Remove String  ${uuid}  -

    Rprint Vars  guids  uuid
    Valid Value  uuid  ['${guids}']


Verify Get Channel Info via IPMI
    [Documentation]  Verify get channel info via IPMI.
    [Tags]  Verify_Get_Channel_Info_via_IPMI

    # Get channel info via ipmi command "ipmitool channel info [channel number]".
    # Verify channel info with files "channel_access_volatile.json", "channel_access_nv.json"
    # and "channel_config.json" in BMC.

    # Example output from 'Get Channel Info':
    # channel_info:
    #   [channel_0x2_info]:
    #     [channel_medium_type]:                        802.3 LAN
    #     [channel_protocol_type]:                      IPMB-1.0
    #     [session_support]:                            multi-session
    #     [active_session_count]:                       0
    #     [protocol_vendor_id]:                         7154
    #   [volatile(active)_settings]:
    #       [alerting]:                                 enabled
    #       [per-message_auth]:                         enabled
    #       [user_level_auth]:                          enabled
    #       [access_mode]:                              always available
    #   [Non-Volatile Settings]:
    #       [alerting]:                                 enabled
    #       [per-message_auth]:                         enabled
    #       [user_level_auth]:                          enabled
    #       [access_mode]:                              always available

    ${channel_info_ipmi}=  Get Channel Info  ${CHANNEL_NUMBER}
    ${active_channel_config}=  Get Active Channel Config
    ${channel_volatile_data_config}=  Get Channel Access Config  /run/ipmi/channel_access_volatile.json
    ${channel_nv_data_config}=  Get Channel Access Config  /var/lib/ipmi/channel_access_nv.json

    Rprint Vars  channel_info_ipmi
    Rprint Vars  active_channel_config
    Rprint Vars  channel_volatile_data_config
    Rprint Vars  channel_nv_data_config

    Valid Value  medium_type_ipmi_conf_map['${channel_info_ipmi['channel_0x${CHANNEL_NUMBER}_info']['channel_medium_type']}']
    ...  ['${active_channel_config['${CHANNEL_NUMBER}']['channel_info']['medium_type']}']

    Valid Value  protocol_type_ipmi_conf_map['${channel_info_ipmi['channel_0x${CHANNEL_NUMBER}_info']['channel_protocol_type']}']
    ...  ['${active_channel_config['${CHANNEL_NUMBER}']['channel_info']['protocol_type']}']

    Valid Value  channel_info_ipmi['channel_0x${CHANNEL_NUMBER}_info']['session_support']
    ...  ['${active_channel_config['${CHANNEL_NUMBER}']['channel_info']['session_supported']}']

    Valid Value  channel_info_ipmi['channel_0x${CHANNEL_NUMBER}_info']['active_session_count']
    ...  ['${active_channel_config['${CHANNEL_NUMBER}']['active_sessions']}']
    # IPMI Spec: The IPMI Enterprise Number is: 7154 (decimal)
    Valid Value  channel_info_ipmi['channel_0x${CHANNEL_NUMBER}_info']['protocol_vendor_id']  ['7154']

    # Verify volatile(active)_settings
    Valid Value  disabled_ipmi_conf_map['${channel_info_ipmi['volatile(active)_settings']['alerting']}']
    ...  ['${channel_volatile_data_config['${CHANNEL_NUMBER}']['alerting_disabled']}']

    Valid Value  disabled_ipmi_conf_map['${channel_info_ipmi['volatile(active)_settings']['per-message_auth']}']
    ...  ['${channel_volatile_data_config['${CHANNEL_NUMBER}']['per_msg_auth_disabled']}']

    Valid Value  disabled_ipmi_conf_map['${channel_info_ipmi['volatile(active)_settings']['user_level_auth']}']
    ...  ['${channel_volatile_data_config['${CHANNEL_NUMBER}']['user_auth_disabled']}']

    Valid Value  access_mode_ipmi_conf_map['${channel_info_ipmi['volatile(active)_settings']['access_mode']}']
    ...  ['${channel_volatile_data_config['${CHANNEL_NUMBER}']['access_mode']}']

    # Verify Non-Volatile Settings
    Valid Value  disabled_ipmi_conf_map['${channel_info_ipmi['non-volatile_settings']['alerting']}']
    ...  ['${channel_nv_data_config['${CHANNEL_NUMBER}']['alerting_disabled']}']

    Valid Value  disabled_ipmi_conf_map['${channel_info_ipmi['non-volatile_settings']['per-message_auth']}']
    ...  ['${channel_nv_data_config['${CHANNEL_NUMBER}']['per_msg_auth_disabled']}']

    Valid Value  disabled_ipmi_conf_map['${channel_info_ipmi['non-volatile_settings']['user_level_auth']}']
    ...  ['${channel_nv_data_config['${CHANNEL_NUMBER}']['user_auth_disabled']}']

    Valid Value  access_mode_ipmi_conf_map['${channel_info_ipmi['non-volatile_settings']['access_mode']}']
    ...  ['${channel_nv_data_config['${CHANNEL_NUMBER}']['access_mode']}']


Test Get Channel Authentication Capabilities via IPMI
    [Documentation]  Verify channel authentication capabilities via IPMI.
    [Tags]  Test_Get_Channel_Authentication_Capabilities_via_IPMI
    [Template]  Verify Channel Auth Capabilities

    FOR  ${channel}  IN   @{active_channel_list}
        FOR  ${privilege}  IN   4  3  2
            # Input Channel     Privilege Level
            ${channel}          ${privilege}
        END
    END


Test Get Channel Authentication Capabilities IPMI Command For Invalid Channel
    [Documentation]  Verify get channel authentication capabilities for invalid channel.
    [Tags]  Test_Get_Channel_Authentication_Capabilities_IPMI_Command_For_Invalid_Channel
    [Template]  Verify Channel Auth Capabilites For Invalid Channel

    FOR  ${channel}  IN  @{inactive_channel_list}
        # Input Channel
        ${channel}
    END


Verify Get Channel Authentication Capablities IPMI Raw Command With Invalid Data Length
    [Documentation]  Verify get channel authentication capablities IPMI raw command with invalid data length.
    [Tags]  Verify_Get_Channel_Authentication_Capablities_IPMI_Raw_Command_With_Invalid_Data_Length
    [Template]  Verify Channel Auth Command For Invalid Data Length

    # Bytes
    low
    high


Verify Set Session Privilege Level via IPMI Raw Command
    [Documentation]  Set session privilege with given privilege level and verify the response with
    ...              expected level.
    [Tags]  Verify_Set_Session_Privilege_Level_via_IPMI_Raw_Command
    [Template]  Set Session Privilege Level And Verify

    # privilege_level   expected_level
    0x00                04
    0x02                02
    0x03                03
    0x04                04


Verify Set Invalid Session Privilege Level Via IPMI Raw Command
    [Documentation]  Verify set invalid session privilege level via IPMI raw command.
    [Tags]  Verify_Set_Invalid_Session_Privilege_Level_Via_IPMI_Raw_Command
    [Template]  Set Invalid Session Privilege Level And Verify

    # invalid_privilege_level
    0x05
    0x06
    0x07
    0x0F


Verify Close Session Via IPMI
    [Documentation]  Verify close session via IPMI.
    [Tags]  Verify_Close_Session_Via_IPMI

    # The "close session command" can be tested with any out-of-band IPMI command.
    # When the session is about to close, it will execute the close session command at the end.

    ${cmd}=  Catenate  mc info -vvv 2>&1 | grep "Closed Session"
    ${cmd_output}=  Run External IPMI Standard Command  ${cmd}

    Should Contain  ${cmd_output}  Closed Session


Verify Chassis Identify via IPMI
    [Documentation]  Set chassis identify using IPMI and verify.
    [Tags]  Verify_Chassis_Identify_via_IPMI
    [Setup]  Redfish.Login
    [Teardown]  Redfish.logout

    # Set to default "chassis identify" and verify that LED blinks for 15s.
    Run IPMI Standard Command  chassis identify
    Verify Identify LED State Via Redfish  Lit

    Sleep  18s
    Verify Identify LED State Via Redfish  Off

    # Set "chassis identify" to 10s and verify that the LED blinks for 10s.
    Run IPMI Standard Command  chassis identify 10
    Verify Identify LED State Via Redfish  Lit

    Sleep  12s
    Verify Identify LED State Via Redfish  Off


Verify Chassis Identify Off And Force Identify On via IPMI
    [Documentation]  Set chassis identify to "off" and "force" using IPMI and verify.
    [Tags]  Verify_Chassis_Identify_Off_And_Force_Identify_On_via_IPMI
    [Setup]  Redfish.Login
    [Teardown]  Redfish.logout

    # Set the LED to "Force Identify On".
    Run IPMI Standard Command  chassis identify force
    Verify Identify LED State Via Redfish  Lit

    # Set "chassis identify" to 0 and verify that the LED turns off.
    Run IPMI Standard Command  chassis identify 0
    Verify Identify LED State Via Redfish  Off


*** Keywords ***

IPMI General Test Suite Setup
    [Documentation]  Get active and inactive/invalid channels from channel_config.json file
    ...              in list type and set it as suite variable.

    # Get active channel list and set as suite variable.
    @{active_channel_list}=  Get Active Ethernet Channel List
    Set Suite Variable  @{active_channel_list}

    # Get Inactive/Invalid channel list and set as suite variable.
    @{inactive_channel_list}=  Get Invalid Channel Number List
    Set Suite Variable  @{inactive_channel_list}


Set Session Privilege Level And Verify
    [Documentation]   Set session privilege with given privilege level and verify the response with
    ...               expected level.
    [Arguments]  ${privilege_level}  ${expected_level}
    # Description of argument(s):
    # privilege_level    Requested Privilege Level.
    # expected_level     New Privilege Level (or present level if ‘return present privilege level’
    #                    was selected).

    ${resp}=  Run External IPMI Raw Command
    ...  0x06 0x3b ${privilege_level}
    Should Contain  ${resp}  ${expected_level}


Set Invalid Session Privilege Level And Verify
    [Documentation]   Set invalid session privilege level and verify the response.
    [Arguments]  ${privilege_level}
    # Description of argument(s):
    # privilege_level    Requested Privilege Level.

    # Verify requested level exceeds Channel and/or User Privilege Limit.
    ${msg}=  Run Keyword And Expect Error  *  Run External IPMI Raw Command
    ...  0x06 0x3b ${privilege_level}
    Should Contain  ${msg}  Unknown  rsp=0x81


Verify Identify LED State Via Redfish
    [Documentation]  Verify that Redfish identify LED system with given state.
    [Arguments]  ${expected_state}
    # Description of argument(s):
    # expected_led_status  Expected value of Identify LED.

    # Python module:  get_member_list(resource_path)
    ${systems}=  Redfish_Utils.Get Member List  /redfish/v1/Systems
    FOR  ${system}  IN  @{systems}
        ${led_value}=  Redfish.Get Attribute  ${system}  IndicatorLED
        Should Be True  '${led_value}' == '${expected_state}'
    END


Verify Channel Auth Capabilities
    [Documentation]  Verify authentication capabilities for given channel and privilege.
    [Arguments]  ${channel}  ${privilege_level}

    # Description of argument(s):
    # channel           Interface channel number.
    # privilege_level   User Privelege level (e.g. 4-Administator, 3-Operator, 2-Readonly).

    # Python module:  get_channel_auth_capabilities(channel_number, privilege_level)
    ${channel_auth_cap}=  Get Channel Auth Capabilities  ${channel}  ${privilege_level}
    Rprint Vars  channel_auth_cap

    Valid Value  channel_auth_cap['channel_number']  ['${channel}']
    Valid Value  channel_auth_cap['kg_status']  ['default (all zeroes)']
    Valid Value  channel_auth_cap['per_message_authentication']  ['enabled']
    Valid Value  channel_auth_cap['user_level_authentication']  ['enabled']
    Valid Value  channel_auth_cap['non-null_user_names_exist']  ['yes']
    Valid Value  channel_auth_cap['null_user_names_exist']  ['no']
    Valid Value  channel_auth_cap['anonymous_login_enabled']  ['no']
    Valid Value  channel_auth_cap['channel_supports_ipmi_v1.5']  ['no']
    Valid Value  channel_auth_cap['channel_supports_ipmi_v2.0']  ['yes']


Verify Channel Auth Capabilites For Invalid Channel
    [Documentation]  Verify authentication capabilities of invalid channels.
    [Arguments]  ${channel}

    # Description of argument(s):
    # channel   Interface channel number.

    ${channel_in_hex}=  Convert To Hex  ${channel}  prefix=0x
    ${cmd}=  Catenate  ${IPMI_RAW_CMD['Get Channel Auth Cap']['get'][0]} ${channel_in_hex} 0x04

    Verify Invalid IPMI Command  ${cmd}  0xcc


Verify Channel Auth Command For Invalid Data Length
   [Documentation]  Verify channel authentication command for invalid data length.
   [Arguments]  ${byte_length}

   # Description of argument(s):
   # byte_length   high or low.
   #               e.g. high - add extra byte to request data like "0x06 0x38 0x01 0x04 0x01".
   #               low - reduce bytes in actual request data like "0x06 0x38".

   ${req_cmd}=  Run Keyword If  '${byte_length}' == 'low'
   ...  Catenate  ${IPMI_RAW_CMD['Get Channel Auth Cap']['get'][0]}  ${CHANNEL_NUMBER}
   ...  ELSE
   ...  Catenate  ${IPMI_RAW_CMD['Get Channel Auth Cap']['get'][0]}  ${CHANNEL_NUMBER} 0x04 0x01

   Verify Invalid IPMI Command  ${req_cmd}  0xc7
