1*** Settings ***
2Documentation     This module will take whatever action is necessary
3...               to bring the BMC to a stable, standby state.  For our
4...               purposes, a stable state is defined as:
5...                  - BMC is communicating
6...                   (pinging, sshing and REST commands working)
7...                  - Power state is 0 (off)
8...                  - BMC state is "Ready"
9...                  - HOST state is "Off"
10...                  - Boot policy is "ALWAYS_POWER_OFF"
11...               Power cycle system via PDU if specified
12...               Prune archived journal logs
13
14Resource          ../lib/utils.robot
15Resource          ../lib/pdu/pdu.robot
16Resource          ../lib/state_manager.robot
17Resource          ../lib/bmc_network_utils.robot
18Resource          ../lib/bmc_cleanup.robot
19Resource          ../lib/dump_utils.robot
20Library           ../lib/gen_misc.py
21
22*** Variables ***
23${HOST_SETTING}      /org/openbmc/settings/host0
24
25${ERROR_REGEX}  xyz.openbmc_project.Software.BMC.Updater.service: Failed with result 'core-dump'
26
27*** Test Cases ***
28
29Get To Stable State
30    [Documentation]  BMC cleanup drive to stable state
31    ...              1. PDU powercycle if specified
32    ...              1. Ping Test
33    ...              2. SSH Connection session Test
34    ...              3. REST Connection session Test
35    ...              4. Reboot BMC if REST Test failed
36    ...              5. Get BMC in Ready state if its not in this state
37    ...              6. Get Host in Off state if its not in this state
38    ...              7. Update restore policy
39    ...              8. Verify and Update MAC address.
40    [Tags]  Get_To_Stable_State
41
42    Run Keyword And Ignore Error  Powercycle System Via PDU
43
44    ${ping_status}=  Run Keyword And Return Status
45    ...  Wait For Host To Ping  ${OPENBMC_HOST}  2 mins
46
47    # Check if the ping works using 1400 MTU.
48    Run Keyword if  ${ping_status} == ${True}  MTU Ping Test
49
50    Run Keyword if  ${ping_status} == ${False}
51    ...  Fail  ${OPENBMC_HOST} ping test failed.
52
53    Open Connection And Log In  host=${OPENBMC_HOST}
54
55    Wait Until Keyword Succeeds
56    ...  1 min  30 sec  Initialize OpenBMC
57
58    ${ready_status}=  Run Keyword And Return Status  Is BMC Ready
59    Run Keyword If  '${ready_status}' == '${False}'  Put BMC State  Ready
60
61    ${host_off_status}=  Run Keyword And Return Status  Is Host Off
62    Run Keyword If  '${host_off_status}' == '${False}'  Initiate Host PowerOff
63
64    Prune Journal Log
65
66    Run Keyword And Ignore Error  Set BMC Power Policy  ${ALWAYS_POWER_OFF}
67
68    # TODO: Enable MAC AES check latter.
69    # Reference : openbmc/openbmc-test-automation#998
70    #Run Keyword If  '${MAC_ADDRESS}' != '${EMPTY}'
71    #...  Check And Reset MAC
72
73    # TODO: Add new UBI File system cleanup.
74    # Reference : openbmc/openbmc-test-automation#998
75    #${rc}=  Execute Command  find ${CLEANUP_DIR_PATH}
76    #...  return_stdout=False  return_rc=True
77    #Run Keyword If  '${CLEANUP_DIR_PATH}' != '${EMPTY}' and ${rc} == 0
78    #...  Cleanup Dir
79
80    Run Keyword And Ignore Error  Delete All Error Logs
81    Run Keyword And Ignore Error  Delete All Dumps
82    Check For Current Boot Application Failures
83
84*** Keywords ***
85
86BMC Online Test
87    [Documentation]   BMC ping, SSH, REST connection Test
88
89    ${l_status}=   Run Keyword and Return Status
90    ...   Verify Ping and REST Authentication
91    Run Keyword If  '${l_status}' == '${False}'
92    ...   Fail  msg=System not in ideal state to continue [ERROR]
93
94
95Update Policy Setting
96    [Documentation]   Update the given restore policy
97    [Arguments]   ${policy}
98
99    ${valueDict}=     create dictionary  data=${policy}
100    Write Attribute    ${HOST_SETTING}    power_policy   data=${valueDict}
101    ${currentPolicy}=  Read Attribute     ${HOST_SETTING}   power_policy
102    Should Be Equal    ${currentPolicy}   ${policy}
103
104
105Trigger Warm Reset via Reboot
106    [Documentation]    Execute reboot command on the remote BMC and
107    ...                returns immediately. This keyword "Start Command"
108    ...                returns nothing and does not wait for the command
109    ...                execution to be finished.
110    Open Connection And Log In
111
112    Start Command   /sbin/reboot
113
114
115Powercycle System Via PDU
116    [Documentation]   AC cycle the system via PDU.
117
118    Validate Parameters
119    PDU Power Cycle
120    Check If BMC is Up   5 min    10 sec
121
122
123Check For Current Boot Application Failures
124    [Documentation]  Parse the journal log and check for failures.
125    [Arguments]  ${error_regex}=${ERROR_REGEX}
126
127    ${error_regex}=  Escape Bash Quotes  ${error_regex}
128    ${journal_log}  ${stderr}  ${rc}=  BMC Execute Command
129    ...  journalctl -b --no-pager | egrep '${error_regex}'  ignore_err=1
130
131    Should Be Empty  ${journal_log}
132
133
134Validate Parameters
135    [Documentation]  Validate PDU parameters.
136    Should Not Be Empty   ${PDU_IP}
137    Should Not Be Empty   ${PDU_TYPE}
138    Should Not Be Empty   ${PDU_SLOT_NO}
139    Should Not Be Empty   ${PDU_USERNAME}
140    Should Not Be Empty   ${PDU_PASSWORD}
141
142
143MTU Ping Test
144    [Documentation]  Ping test using MTU.
145    [Arguments]  ${mtu}=${1400}
146
147    # Description of argument(s):
148    # mtu   The maximum transmission unit (MTU) of a network interface.
149
150    ${rc}  ${output}=  Run And Return RC And Output
151    ...  ping -M do -s ${mtu} -c 10 ${OPENBMC_HOST}
152    Should Be Equal As Integers  ${rc}  0
153    Should Not Contain  ${output}  100% packet loss
154