1*** Settings ***
2
3Documentation    Module to test IPMI Get BIOS POST Code Command.
4Resource         ../lib/ipmi_client.robot
5Resource         ../lib/boot_utils.robot
6Library          ../lib/ipmi_utils.py
7Variables        ../data/ipmi_raw_cmd_table.py
8
9Suite Setup      IPMI Power On
10Suite Teardown   IPMI Power On  stack_mode=skip  quiet=1
11
12Test Tags       Get_BIOS_Post_Code
13
14*** Test Cases ***
15
16Test Get BIOS POST Code via IPMI Raw Command
17    [Documentation]  Get BIOS POST Code via IPMI raw command.
18    [Tags]  Test_Get_BIOS_POST_Code_via_IPMI_Raw_Command
19
20    Wait Until Keyword Succeeds  10 min  1 sec  Check Host Is Pinging  ${OS_HOST}
21    Wait Until Keyword Succeeds  1 min  1 sec  Check Chassis Power Status  on
22    ${resp}=  Run IPMI Standard Command  raw ${IPMI_RAW_CMD['BIOS_POST_Code']['Get'][0]}
23    Verify POST Code Response Length  ${resp}
24
25Test Get BIOS POST Code via IPMI Raw Command After Power Cycle
26    [Documentation]  Get BIOS POST Code via IPMI raw command after power cycle.
27    [Tags]  Test_Get_BIOS_POST_Code_via_IPMI_Raw_Command_After_Power_Cycle
28
29    ${resp}=  Run IPMI Standard Command  chassis power cycle
30    Wait Until Keyword Succeeds  1 min  1 sec  Check Host Is Not Pinging  ${OS_HOST}
31    Wait Until Keyword Succeeds  10 min  1 sec  Check Host Is Pinging  ${OS_HOST}
32
33    ${resp}=  Run IPMI Standard Command  raw ${IPMI_RAW_CMD['BIOS_POST_Code']['Get'][0]}
34    Verify POST Code Response Length  ${resp}
35
36Test Get BIOS POST Code via IPMI Raw Command With Host Powered Off
37    [Documentation]  Get BIOS POST Code via IPMI raw command after power off.
38    [Tags]  Test_Get_BIOS_POST_Code_via_IPMI_Raw_Command_With_Host_Powered_Off
39
40    ${resp}=  Run IPMI Standard Command  chassis power off
41    Wait Until Keyword Succeeds  1 min  1 sec  Check Host Is Not Pinging  ${OS_HOST}
42    Wait Until Keyword Succeeds  1 min  1 sec  Check Chassis Power Status  off
43
44    ${resp}=  Run IPMI Standard Command  raw ${IPMI_RAW_CMD['BIOS_POST_Code']['Get'][0]}  fail_on_err=0
45    Should Contain  ${resp}  ${IPMI_RAW_CMD['BIOS_POST_Code']['Get'][3]}
46
47*** Keywords ***
48Verify POST Code Response Length
49    [Documentation]  Verify the BIOS POST Code response byte length.
50    [Tags]  Verify_POST_Code_Response_Length
51    [Arguments]  ${resp}
52
53    # Description of argument(s):
54    # resp                          The complete response bytes from
55    #                               Get BIOS POST Code command returned
56    #                               in one string.
57
58    @{resp_bytes}=  Split String  ${resp}
59    ${string_length}=  Get Length  ${resp_bytes}
60
61    # Convert response byte length to integer.
62    ${value}=  Get Slice From List  ${resp_bytes}   2   4
63    Reverse List   ${value}
64    ${byte_length_string}=  Evaluate   "".join(${value})
65    ${byte_length_integer}=  Convert To Integer  ${byte_length_string}  16
66    ${true_length}=  Evaluate  (${string_length} - 4)
67
68    Should Be Equal  ${true_length}  ${byte_length_integer}
69
70Check Chassis Power Status
71    [Documentation]  Validate chassis power status.
72    [Arguments]  ${expected_state}
73
74    # Description of argument(s):
75    # expected_state    on, off
76
77    ${resp}=  Run IPMI Standard Command  chassis power status
78    Should Contain  ${resp}  ${expected_state}
79
80Check Host Is Pinging
81    [Documentation]  Check given ip/hostname is pinging.
82    [Arguments]  ${host_ip}
83
84    # Description of argument(s):
85    # host_ip      The host name or IP of the host to ping.
86
87    ${ping_rsp}=  Host Ping  ${host_ip}
88    # Should Not Contain  ${ping_rsp}  Destination Host Unreachable
89    # ...  msg=${host_ip} is not pinging.
90    Should Not Contain  ${ping_rsp}  100% packet loss
91    ...  msg=${host_ip} is not pinging.
92
93Check Host Is Not Pinging
94    [Documentation]  Check given ip/hostname is not pinging.
95    [Arguments]  ${host_ip}
96
97    # Description of argument(s):
98    # host_ip      The host name or IP of the host to ping.
99
100    ${ping_rsp}=  Host Ping  ${host_ip}
101    Should Contain  ${ping_rsp}  100% packet loss
102    ...  msg=${host_ip} is pinging.
103
104Host Ping
105    [Documentation]  Ping the given host.
106    [Arguments]  ${host_ip}
107
108    # Description of argument(s):
109    # host_ip      The host name or IP of the host to ping.
110
111    ${cmd}=  Catenate  ping -c 4 ${host_ip}
112    ${output}=  Run  ${cmd}
113
114    RETURN  ${output}
115