1*** Settings ***
2Documentation    Code update utility
3
4Resource         ../../lib/rest_client.robot
5Resource         ../../lib/connection_client.robot
6Resource         ../../lib/utils.robot
7Library          OperatingSystem
8
9*** Variables ***
10
11# Fix old org path locally for non-witherspoon system.
12${ORG_OPENBMC_BASE_URI}  /org/openbmc/
13${BMC_UPD_METHOD}    ${ORG_OPENBMC_BASE_URI}control/flash/bmc/action/update
14${BMC_PREP_METHOD}   ${ORG_OPENBMC_BASE_URI}control/flash/bmc/action/PrepareForUpdate
15${BMC_UPD_ATTR}      ${ORG_OPENBMC_BASE_URI}control/flash/bmc
16${HOST_SETTING}      ${ORG_OPENBMC_BASE_URI}settings/host0
17
18*** Keywords ***
19
20Preserve BMC Network Setting
21    [Documentation]   Preserve Network setting
22    ${policy}=       Set Variable   ${1}
23    ${value}=    create dictionary   data=${policy}
24    Write Attribute   ${BMC_UPD_ATTR}  preserve_network_settings  data=${value}
25    ${data}=      Read Properties   ${BMC_UPD_ATTR}
26    Should Be Equal As Strings    ${data['preserve_network_settings']}   ${True}
27    ...   msg=False indicates network is not preserved.
28
29
30Activate BMC flash image
31    [Documentation]   Activate and verify the update status
32    ...               The status could be either one of these
33    ...               'Deferred for mounted filesystem. reboot BMC to apply.'
34    ...               'Image ready to apply.'
35    @{img_path}=   Create List    /tmp/flashimg
36    ${data}=   create dictionary   data=@{img_path}
37    ${resp}=    openbmc post request    ${BMC_UPD_METHOD}   data=${data}
38    should be equal as strings   ${resp.status_code}   ${HTTP_OK}
39
40    ${data}=      Read Properties     ${BMC_UPD_ATTR}
41    should be equal as strings   ${data["filename"]}   /tmp/flashimg
42    should contain    ${data['status']}   to apply
43
44
45Prepare For Update
46    [Documentation]   Switch to update mode in progress. This method calls
47    ...               the Abort method to remove the pending update if there
48    ...               is any before code activation.
49    ${data}=  Create Dictionary  data=@{EMPTY}
50    ${resp}=  Openbmc Post Request  ${BMC_PREP_METHOD}  data=${data}
51
52    # Update method will reset the BMC, adding delay for reboot to
53    # come into force.
54    Sleep  10s
55
56
57SCP Tar Image File to BMC
58    [Documentation]  Copy BMC tar image to BMC.
59    [Arguments]  ${image_file_path}
60    # Description of argument(s):
61    # image_file_path  Downloaded BMC tar file image path.
62
63
64    Open Connection for SCP
65    Open Connection And Log In
66    Loop SCP Retry  ${image_file_path}
67
68
69Loop SCP Retry
70    [Documentation]  Try transferring the file 4 times.
71    [Arguments]  ${image_file_path}
72    # Description of argument(s):
73    # image_file_path  Downloaded BMC tar file image path.
74
75    : FOR  ${index}  IN RANGE  0  4
76    \  ${status}=  Retry SCP  ${image_file_path}
77    \  Exit For Loop If  '${status}' == '${True}'
78
79
80Retry SCP
81    [Documentation]  Delete the incomplete file and scp file.
82    [Arguments]  ${image_file_path}
83    # Description of argument(s):
84    # image_file_path  Downloaded BMC tar file image path.
85
86    ${targ_file_path}=  Set Variable  /tmp/flashimg
87
88    # TODO: Need to remove this when new code update in place.
89    # Example output:
90    # root@witherspoon:~# ls -lh /tmp/flashimg
91    # -rwxr-xr-x    1 root     root       32.0M Jun 29 01:12 /tmp/flashimg
92    BMC Execute Command  rm -f /tmp/flashimg
93    scp.Put File  ${image_file_path}  ${targ_file_path}
94
95    ${file_size}  ${stderr}  ${rc}=  BMC Execute Command
96    ...  ls -lh ${targ_file_path}
97    ${status}=  Run Keyword And Return Status
98    ...  Should Contain  ${file_size}  32.0M  msg=Incomplete file transfer.
99    [return]  ${status}
100
101
102Check If File Exist
103    [Documentation]  Verify that the file exists on this machine.
104    [Arguments]  ${filepath}
105    Log   \n PATH: ${filepath}
106    OperatingSystem.File Should Exist  ${filepath}
107    ...    msg=${filepath} doesn't exist [ ERROR ]
108
109    Set Global Variable   ${FILE_PATH}  ${filepath}
110
111
112System Readiness Test
113    [Documentation]  Verify that the system can be pinged and authenticated through REST.
114    ${l_status}=   Run Keyword and Return Status
115    ...   Verify Ping and REST Authentication
116    Run Keyword If  '${l_status}' == '${False}'
117    ...   Fail  msg=System not in ideal state to use [ERROR]
118
119
120Validate BMC Version
121    [Documentation]  Get BMC version from /etc/os-release and compare.
122    [Arguments]  ${version}
123
124    # Description of argument(s):
125    # version  Software version (e.g. "v1.99.8-41-g86a4abc").
126
127    Open Connection And Log In
128    ${cmd}=  Set Variable  grep ^VERSION_ID= /etc/os-release | cut -f 2 -d '='
129    ${output}  ${stderr}  ${rc}=  BMC Execute Command  ${cmd}
130    Should Be Equal As Strings  ${version}  ${output[1:-1]}
131
132
133Trigger Warm Reset via Reboot
134    [Documentation]    Execute reboot command on the remote BMC and
135    ...                returns immediately. This keyword "Start Command"
136    ...                returns nothing and does not wait for the command
137    ...                execution to be finished.
138    Open Connection And Log In
139
140    Start Command   /sbin/reboot
141
142Set Policy Setting
143    [Documentation]   Set the given test policy
144    [Arguments]   ${policy}
145
146    ${valueDict}=     create dictionary  data=${policy}
147    Write Attribute    ${HOST_SETTING}    power_policy   data=${valueDict}
148    ${currentPolicy}=  Read Attribute     ${HOST_SETTING}   power_policy
149    Should Be Equal    ${currentPolicy}   ${policy}
150