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
20Resource          ../lib/bmc_redfish_resource.robot
21Resource          ../lib/bmc_redfish_utils.robot
22Library           ../lib/gen_misc.py
23
24# Force the test to timedout to prevent test hanging.
25Test Timeout      10 minutes
26
27
28*** Variables ***
29${HOST_SETTING}      /org/openbmc/settings/host0
30
31${ERROR_REGEX}  xyz.openbmc_project.Software.BMC.Updater.service: Failed with result 'core-dump'
32
33*** Test Cases ***
34
35Get To Stable State
36    [Documentation]  BMC cleanup drive to stable state
37    ...              1. PDU powercycle if specified
38    ...              1. Ping Test
39    ...              2. SSH Connection session Test
40    ...              3. REST Connection session Test
41    ...              4. Reboot BMC if REST Test failed
42    ...              5. Get BMC in Ready state if its not in this state
43    ...              6. Get Host in Off state if its not in this state
44    ...              7. Update restore policy
45    ...              8. Verify and Update MAC address.
46    [Tags]  Get_To_Stable_State
47
48    Run Keyword And Ignore Error  Powercycle System Via PDU
49
50    ${ping_status}=  Run Keyword And Return Status
51    ...  Wait For Host To Ping  ${OPENBMC_HOST}  2 mins
52
53    # Check if the ping works using 1400 MTU.
54    #Run Keyword if  ${ping_status} == ${True}  MTU Ping Test
55
56    Run Keyword if  ${ping_status} == ${False}
57    ...  Fail  ${OPENBMC_HOST} ping test failed.
58
59    Open Connection And Log In  host=${OPENBMC_HOST}
60
61    Run Keyword If  ${REDFISH_SUPPORTED}
62    ...    Redfish Clean Up
63    ...  ELSE
64    ...    REST Clean Up
65
66
67    Prune Journal Log
68    Check For Current Boot Application Failures
69
70*** Keywords ***
71
72
73REST Clean Up
74    [Documentation]  Check states, reboot if needed and poweroff.
75
76    Wait Until Keyword Succeeds  1 min  30 sec  Initialize OpenBMC
77
78    ${ready_status}=  Run Keyword And Return Status  Is BMC Ready
79    Run Keyword If  '${ready_status}' == '${False}'
80    ...    Put BMC State  Ready
81    ...  ELSE
82    ...    REST Power Off  stack_mode=skip
83
84    Run Keyword And Ignore Error  Set BMC Power Policy  ${ALWAYS_POWER_OFF}
85    Run Keyword And Ignore Error  Delete All Error Logs
86    Run Keyword And Ignore Error  Delete All Dumps
87
88
89Redfish Clean Up
90    [Documentation]  Check states, reboot if needed and poweroff.
91
92    Wait Until Keyword Succeeds  1 min  30 sec  Redfish.Login
93
94    Redfish Power Off  stack_mode=skip
95
96    Run Keyword And Ignore Error  Redfish Set Power Restore Policy  AlwaysOff
97    Run Keyword And Ignore Error  Redfish Purge Event Log
98    Run Keyword And Ignore Error  Redfish Delete All BMC Dumps
99    Run Keyword And Ignore Error  Redfish Delete All System Dumps
100    Run Keyword And Ignore Error  Clear All Subscriptions
101    Run Keyword And Ignore Error  Delete All Redfish Sessions
102
103
104BMC Online Test
105    [Documentation]   BMC ping, SSH, REST connection Test
106
107    ${l_status}=   Run Keyword and Return Status
108    ...   Verify Ping and REST Authentication
109    Run Keyword If  '${l_status}' == '${False}'
110    ...   Fail  msg=System not in ideal state to continue [ERROR]
111
112
113Update Policy Setting
114    [Documentation]   Update the given restore policy
115    [Arguments]   ${policy}
116
117    ${valueDict}=     create dictionary  data=${policy}
118    Write Attribute    ${HOST_SETTING}    power_policy   data=${valueDict}
119    ${currentPolicy}=  Read Attribute     ${HOST_SETTING}   power_policy
120    Should Be Equal    ${currentPolicy}   ${policy}
121
122
123Trigger Warm Reset via Reboot
124    [Documentation]    Execute reboot command on the remote BMC and
125    ...                returns immediately. This keyword "Start Command"
126    ...                returns nothing and does not wait for the command
127    ...                execution to be finished.
128    Open Connection And Log In
129
130    Start Command   /sbin/reboot
131
132
133Powercycle System Via PDU
134    [Documentation]   AC cycle the system via PDU.
135
136    Validate Parameters
137    PDU Power Cycle
138    Check If BMC is Up   5 min    10 sec
139
140
141Check For Current Boot Application Failures
142    [Documentation]  Parse the journal log and check for failures.
143    [Arguments]  ${error_regex}=${ERROR_REGEX}
144
145    ${error_regex}=  Escape Bash Quotes  ${error_regex}
146    ${journal_log}  ${stderr}  ${rc}=  BMC Execute Command
147    ...  journalctl -b --no-pager | egrep '${error_regex}'  ignore_err=1
148
149    Should Be Empty  ${journal_log}
150
151
152Validate Parameters
153    [Documentation]  Validate PDU parameters.
154    Should Not Be Empty   ${PDU_IP}
155    Should Not Be Empty   ${PDU_TYPE}
156    Should Not Be Empty   ${PDU_SLOT_NO}
157    Should Not Be Empty   ${PDU_USERNAME}
158    Should Not Be Empty   ${PDU_PASSWORD}
159
160
161MTU Ping Test
162    [Documentation]  Ping test using MTU.
163    [Arguments]  ${mtu}=${1400}
164
165    # Description of argument(s):
166    # mtu   The maximum transmission unit (MTU) of a network interface.
167
168    ${rc}  ${output}=  Run And Return RC And Output
169    ...  ping -M do -s ${mtu} -c 10 ${OPENBMC_HOST}
170    Should Be Equal As Integers  ${rc}  0
171    Should Not Contain  ${output}  100% packet loss
172
173
174Clear All Subscriptions
175    [Documentation]  Delete all subscriptions.
176
177    ${subscriptions}=  Redfish.Get Attribute  /redfish/v1/EventService/Subscriptions  Members
178    FOR  ${subscription}  IN  @{subscriptions}
179        Redfish.Delete  ${subscription['@odata.id']}
180    END
181