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']}   ${1}
27    ...   msg=0 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    should be equal as strings   ${resp.status_code}   ${HTTP_OK}
52
53    # Update method will reset the BMC, adding delay for reboot to
54    # come into force.
55    Sleep  10s
56
57
58SCP Tar Image File to BMC
59    [Documentation]  Copy BMC tar image to BMC.
60    [Arguments]  ${image_file_path}
61    # Description of argument(s):
62    # image_file_path  Downloaded BMC tar file image path.
63
64
65    Open Connection for SCP
66    Open Connection And Log In
67    Loop SCP Retry  ${image_file_path}
68
69
70Loop SCP Retry
71    [Documentation]  Try transferring the file 4 times.
72    [Arguments]  ${image_file_path}
73    # Description of argument(s):
74    # image_file_path  Downloaded BMC tar file image path.
75
76    : FOR  ${index}  IN RANGE  0  4
77    \  ${status}=  Retry SCP  ${image_file_path}
78    \  Exit For Loop If  '${status}' == '${True}'
79
80
81Retry SCP
82    [Documentation]  Delete the incomplete file and scp file.
83    [Arguments]  ${image_file_path}
84    # Description of argument(s):
85    # image_file_path  Downloaded BMC tar file image path.
86
87    ${targ_file_path}=  Set Variable  /tmp/flashimg
88
89    # TODO: Need to remove this when new code update in place.
90    # Example output:
91    # root@witherspoon:~# ls -lh /tmp/flashimg
92    # -rwxr-xr-x    1 root     root       32.0M Jun 29 01:12 /tmp/flashimg
93    BMC Execute Command  rm -f /tmp/flashimg
94    scp.Put File  ${image_file_path}  ${targ_file_path}
95
96    ${file_size}  ${stderr}  ${rc}=  BMC Execute Command
97    ...  ls -lh ${targ_file_path}
98    ${status}=  Run Keyword And Return Status
99    ...  Should Contain  ${file_size}  32.0M  msg=Incomplete file transfer.
100    [return]  ${status}
101
102
103Check If File Exist
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    ${l_status}=   Run Keyword and Return Status
114    ...   Verify Ping and REST Authentication
115    Run Keyword If  '${l_status}' == '${False}'
116    ...   Fail  msg=System not in ideal state to use [ERROR]
117
118
119Validate BMC Version
120    [Documentation]  Get BMC version from /etc/os-release and compare.
121    [Arguments]  ${version}
122
123    # Description of argument(s):
124    # version  Software version (e.g. "v1.99.8-41-g86a4abc").
125
126    Open Connection And Log In
127    ${cmd}=  Set Variable  grep ^VERSION_ID= /etc/os-release | cut -f 2 -d '='
128    ${output}  ${stderr}  ${rc}=  BMC Execute Command  ${cmd}
129    Should Be Equal As Strings  ${version}  ${output[1:-1]}
130
131
132Trigger Warm Reset via Reboot
133    [Documentation]    Execute reboot command on the remote BMC and
134    ...                returns immediately. This keyword "Start Command"
135    ...                returns nothing and does not wait for the command
136    ...                execution to be finished.
137    Open Connection And Log In
138
139    Start Command   /sbin/reboot
140
141Set Policy Setting
142    [Documentation]   Set the given test policy
143    [Arguments]   ${policy}
144
145    ${valueDict}=     create dictionary  data=${policy}
146    Write Attribute    ${HOST_SETTING}    power_policy   data=${valueDict}
147    ${currentPolicy}=  Read Attribute     ${HOST_SETTING}   power_policy
148    Should Be Equal    ${currentPolicy}   ${policy}
149