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    Wait For Host To Ping  ${OPENBMC_HOST}  2 mins
45    Run Keyword And Ignore Error
46    ...  Open Connection And Log In  host=${OPENBMC_HOST}
47
48    Wait Until Keyword Succeeds
49    ...  1 min  30 sec  Initialize OpenBMC
50
51    ${ready_status}=  Run Keyword And Return Status  Is BMC Ready
52    Run Keyword If  '${ready_status}' == '${False}'  Put BMC State  Ready
53
54    ${host_off_status}=  Run Keyword And Return Status  Is Host Off
55    Run Keyword If  '${host_off_status}' == '${False}'  Initiate Host PowerOff
56
57    Prune Journal Log
58
59    Run Keyword And Ignore Error  Set BMC Power Policy  ${ALWAYS_POWER_OFF}
60
61    # TODO: Enable MAC AES check latter.
62    # Reference : openbmc/openbmc-test-automation#998
63    #Run Keyword If  '${MAC_ADDRESS}' != '${EMPTY}'
64    #...  Check And Reset MAC
65
66    # TODO: Add new UBI File system cleanup.
67    # Reference : openbmc/openbmc-test-automation#998
68    #${rc}=  Execute Command  find ${CLEANUP_DIR_PATH}
69    #...  return_stdout=False  return_rc=True
70    #Run Keyword If  '${CLEANUP_DIR_PATH}' != '${EMPTY}' and ${rc} == 0
71    #...  Cleanup Dir
72
73    Run Keyword And Ignore Error  Delete All Error Logs
74    Run Keyword And Ignore Error  Delete All Dumps
75    Check For Application Failures
76    Run Keyword And Ignore Error  Remove Journald Logs
77
78*** Keywords ***
79
80BMC Online Test
81    [Documentation]   BMC ping, SSH, REST connection Test
82
83    ${l_status}=   Run Keyword and Return Status
84    ...   Verify Ping and REST Authentication
85    Run Keyword If  '${l_status}' == '${False}'
86    ...   Fail  msg=System not in ideal state to continue [ERROR]
87
88
89Update Policy Setting
90    [Documentation]   Update the given restore policy
91    [Arguments]   ${policy}
92
93    ${valueDict}=     create dictionary  data=${policy}
94    Write Attribute    ${HOST_SETTING}    power_policy   data=${valueDict}
95    ${currentPolicy}=  Read Attribute     ${HOST_SETTING}   power_policy
96    Should Be Equal    ${currentPolicy}   ${policy}
97
98
99Trigger Warm Reset via Reboot
100    [Documentation]    Execute reboot command on the remote BMC and
101    ...                returns immediately. This keyword "Start Command"
102    ...                returns nothing and does not wait for the command
103    ...                execution to be finished.
104    Open Connection And Log In
105
106    Start Command   /sbin/reboot
107
108
109Powercycle System Via PDU
110    [Documentation]   AC cycle the system via PDU.
111
112    Validate Parameters
113    PDU Power Cycle
114    Check If BMC is Up   5 min    10 sec
115
116
117Check For Application Failures
118    [Documentation]  Parse the journal log and check for failures.
119    [Arguments]  ${error_regex}=${ERROR_REGEX}
120
121    ${error_regex}=  Escape Bash Quotes  ${error_regex}
122    ${journal_log}  ${stderr}  ${rc}=  BMC Execute Command
123    ...  journalctl --no-pager | egrep '${error_regex}'  ignore_err=1
124
125    Should Be Empty  ${journal_log}
126
127
128Validate Parameters
129    [Documentation]  Validate PDU parameters.
130    Should Not Be Empty   ${PDU_IP}
131    Should Not Be Empty   ${PDU_TYPE}
132    Should Not Be Empty   ${PDU_SLOT_NO}
133    Should Not Be Empty   ${PDU_USERNAME}
134    Should Not Be Empty   ${PDU_PASSWORD}
135