*** Settings ***

Documentation    Module to test IPMI Get BIOS POST Code Command.
Resource         ../lib/ipmi_client.robot
Resource         ../lib/boot_utils.robot
Library          ../lib/ipmi_utils.py
Variables        ../data/ipmi_raw_cmd_table.py

Suite Setup      IPMI Power On
Suite Teardown   IPMI Power On  stack_mode=skip  quiet=1

Force Tags       Get_BIOS_Post_Code

*** Test Cases ***

Test Get BIOS POST Code via IPMI Raw Command
    [Documentation]  Get BIOS POST Code via IPMI raw command.
    [Tags]  Test_Get_BIOS_POST_Code_via_IPMI_Raw_Command

    Wait Until Keyword Succeeds  10 min  1 sec  Check Host Is Pinging  ${OS_HOST}
    Wait Until Keyword Succeeds  1 min  1 sec  Check Chassis Power Status  on
    ${resp}=  Run IPMI Standard Command  raw ${IPMI_RAW_CMD['BIOS_POST_Code']['Get'][0]}
    Verify POST Code Response Length  ${resp}

Test Get BIOS POST Code via IPMI Raw Command After Power Cycle
    [Documentation]  Get BIOS POST Code via IPMI raw command after power cycle.
    [Tags]  Test_Get_BIOS_POST_Code_via_IPMI_Raw_Command_After_Power_Cycle

    ${resp}=  Run IPMI Standard Command  chassis power cycle
    Wait Until Keyword Succeeds  1 min  1 sec  Check Host Is Not Pinging  ${OS_HOST}
    Wait Until Keyword Succeeds  10 min  1 sec  Check Host Is Pinging  ${OS_HOST}

    ${resp}=  Run IPMI Standard Command  raw ${IPMI_RAW_CMD['BIOS_POST_Code']['Get'][0]}
    Verify POST Code Response Length  ${resp}

Test Get BIOS POST Code via IPMI Raw Command With Host Powered Off
    [Documentation]  Get BIOS POST Code via IPMI raw command after power off.
    [Tags]  Test_Get_BIOS_POST_Code_via_IPMI_Raw_Command_With_Host_Powered_Off

    ${resp}=  Run IPMI Standard Command  chassis power off
    Wait Until Keyword Succeeds  1 min  1 sec  Check Host Is Not Pinging  ${OS_HOST}
    Wait Until Keyword Succeeds  1 min  1 sec  Check Chassis Power Status  off

    ${resp}=  Run IPMI Standard Command  raw ${IPMI_RAW_CMD['BIOS_POST_Code']['Get'][0]}  fail_on_err=0
    Should Contain  ${resp}  ${IPMI_RAW_CMD['BIOS_POST_Code']['Get'][3]}

*** Keywords ***
Verify POST Code Response Length
    [Documentation]  Verify the BIOS POST Code response byte length.
    [Tags]  Verify_POST_Code_Response_Length
    [Arguments]  ${resp}

    # Description of argument(s):
    # resp                          The complete response bytes from
    #                               Get BIOS POST Code command returned
    #                               in one string.

    @{resp_bytes}=  Split String  ${resp}
    ${string_length}=  Get Length  ${resp_bytes}

    # Convert response byte length to integer.
    ${value}=  Get Slice From List  ${resp_bytes}   2   4
    Reverse List   ${value}
    ${byte_length_string}=  Evaluate   "".join(${value})
    ${byte_length_integer}=  Convert To Integer  ${byte_length_string}  16
    ${true_length}=  Evaluate  (${string_length} - 4)

    Should Be Equal  ${true_length}  ${byte_length_integer}

Check Chassis Power Status
    [Documentation]  Validate chassis power status.
    [Arguments]  ${expected_state}

    # Description of argument(s):
    # expected_state    on, off

    ${resp}=  Run IPMI Standard Command  chassis power status
    Should Contain  ${resp}  ${expected_state}

Check Host Is Pinging
    [Documentation]  Check given ip/hostname is pinging.
    [Arguments]  ${host_ip}

    # Description of argument(s):
    # host_ip      The host name or IP of the host to ping.

    ${ping_rsp}=  Host Ping  ${host_ip}
    # Should Not Contain  ${ping_rsp}  Destination Host Unreachable
    # ...  msg=${host_ip} is not pinging.
    Should Not Contain  ${ping_rsp}  100% packet loss
    ...  msg=${host_ip} is not pinging.

Check Host Is Not Pinging
    [Documentation]  Check given ip/hostname is not pinging.
    [Arguments]  ${host_ip}

    # Description of argument(s):
    # host_ip      The host name or IP of the host to ping.

    ${ping_rsp}=  Host Ping  ${host_ip}
    Should Contain  ${ping_rsp}  100% packet loss
    ...  msg=${host_ip} is pinging.

Host Ping
    [Documentation]  Ping the given host.
    [Arguments]  ${host_ip}

    # Description of argument(s):
    # host_ip      The host name or IP of the host to ping.

    ${cmd}=  Catenate  ping -c 4 ${host_ip}
    ${output}=  Run  ${cmd}

    [Return]  ${output}
