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