1*** Settings ***
2Documentation    Firmware image (BMC and Host) upload test using TFTP protocol.
3
4# Test Parameters:
5# TFTP_SERVER        The TFTP server host name or IP address.
6# IMAGE_FILE_NAME    The BMC or Host image file name.
7#
8# Firmware update states:
9#     Enabled  -> Image is installed and either functional or active.
10#     Disabled -> Image installation failed or ready for activation.
11#     Updating -> Image installation currently in progress.
12
13Resource         ../../lib/resource.robot
14Resource         ../../lib/boot_utils.robot
15Resource         ../../lib/bmc_redfish_resource.robot
16Resource         ../../lib/openbmc_ffdc.robot
17Resource         ../../lib/code_update_utils.robot
18Resource         ../../lib/redfish_code_update_utils.robot
19Library          ../../lib/code_update_utils.py
20Library          ../../lib/gen_robot_valid.py
21Library          ../../lib/tftp_update_utils.py
22
23Suite Setup      Suite Setup Execution
24Suite Teardown   Redfish.Logout
25Test Setup       Run Keywords  Redfish Power Off  stack_mode=skip  quiet=1  AND  Redfish.Login
26Test Teardown    FFDC On Test Case Fail
27
28Force Tags       tftp_update
29
30*** Test Cases ***
31
32TFTP Download Install With ApplyTime OnReset Policy
33    [Documentation]  Download image to BMC using TFTP with OnReset policy and verify installation.
34    [Tags]  TFTP_Download_Install_With_ApplyTime_OnReset_Policy
35    [Template]  TFTP Download Install
36
37    # policy
38    OnReset
39
40
41TFTP Download Install With ApplyTime Immediate Policy
42    [Documentation]  Download image to BMC using TFTP with Immediate policy and verify installation.
43    [Tags]  TFTP_Download_Install_With_ApplyTime_Immediate_Policy
44    [Template]  TFTP Download Install
45
46    # policy
47    Immediate
48
49
50ImageURI Download Install With ApplyTime OnReset Policy
51    [Documentation]  Download image to BMC using ImageURI with OnReset policy and verify installation.
52    [Tags]  ImageURI_Download_Install_With_ApplyTime_OnReset_Policy
53    [Template]  ImageURI Download Install
54
55    # policy
56    OnReset
57
58
59ImageURI Download Install With ApplyTime Immediate Policy
60    [Documentation]  Download image to BMC using ImageURI with Immediate policy and verify installation.
61    [Tags]  ImageURI_Download_Install_With_ApplyTime_Immediate_Policy
62    [Template]  ImageURI Download Install
63
64    # policy
65    Immediate
66
67
68Install Same Image Two Times
69    [Documentation]  Install firmware image and re-try using the same image which should fail.
70    [Tags]  Install_Same_Image_Two_Times
71    [Template]  Same Firmware Install Two Times
72
73    # policy
74    Immediate
75
76
77*** Keywords ***
78
79Suite Setup Execution
80    [Documentation]  Do the suite setup.
81
82    Redfish.Login
83    Valid Value  TFTP_SERVER
84    Valid Value  IMAGE_FILE_NAME
85
86
87TFTP Download Install
88    [Documentation]  Download image to BMC using TFTP with ApplyTime policy and verify installation.
89    [Arguments]  ${policy}
90
91    # Description of argument(s):
92    # policy     ApplyTime allowed values (e.g. "OnReset", "Immediate").
93
94    ${state}=  Get Pre Reboot State
95    Rprint Vars  state
96
97    Set ApplyTime  policy=${policy}
98
99    # Download image from TFTP server to BMC.
100    Redfish.Post  /redfish/v1/UpdateService/Actions/UpdateService.SimpleUpdate
101    ...  body={"TransferProtocol" : "TFTP", "ImageURI" : "${TFTP_SERVER}/${IMAGE_FILE_NAME}"}
102
103    # Wait for image tar file to download complete.
104    ${image_id}=  Wait Until Keyword Succeeds  60 sec  10 sec  Get Latest Image ID
105    Rprint Vars  image_id
106
107    # Let the image get extracted and it should not fail.
108    Sleep  5s
109    Check Image Update Progress State  match_state='Disabled', 'Updating'  image_id=${image_id}
110
111    # Get image version currently installation in progress.
112    ${install_version}=  Get Firmware Image Version  image_id=${image_id}
113    Rprint Vars  install_version
114
115    Check Image Update Progress State  match_state='Updating'  image_id=${image_id}
116
117    # Wait for the image to install complete.
118    Wait Until Keyword Succeeds  8 min  15 sec
119    ...  Check Image Update Progress State  match_state='Enabled'  image_id=${image_id}
120
121    Reboot And Wait For BMC Standby  policy=${policy}  start_boot_seconds=${state['epoch_seconds']}
122
123    # Verify the image is installed and functional.
124    ${cmd}=  Set Variable  grep ^VERSION_ID= /etc/os-release | cut -f 2 -d '=' | sed 's/"//g'
125    ${functional_version}  ${stderr}  ${rc}=  BMC Execute Command  ${cmd}
126    Valid Value  functional_version  valid_values=['${install_version}']
127    Rprint Vars  functional_version
128
129
130ImageURI Download Install
131    [Documentation]  Download image to BMC using ImageURI with ApplyTime policy and verify installation.
132    [Arguments]  ${policy}
133
134    # Description of argument(s):
135    # policy     ApplyTime allowed values (e.g. "OnReset", "Immediate").
136
137    ${state}=  Get Pre Reboot State
138    Rprint Vars  state
139
140    Set ApplyTime  policy=${policy}
141
142    # Download image from TFTP server via ImageURI to BMC.
143    Redfish.Post  /redfish/v1/UpdateService/Actions/UpdateService.SimpleUpdate
144    ...  body={"ImageURI": "tftp://${TFTP_SERVER}/${IMAGE_FILE_NAME}"}
145
146    # Wait for image tar file download to complete.
147    ${image_id}=  Wait Until Keyword Succeeds  60 sec  10 sec  Get Latest Image ID
148    Rprint Vars  image_id
149
150    # Let the image get extracted and it should not fail.
151    Sleep  5s
152    Check Image Update Progress State  match_state='Disabled', 'Updating'  image_id=${image_id}
153
154    ${install_version}=  Get Firmware Image Version  image_id=${image_id}
155    Rprint Vars  install_version
156
157    Check Image Update Progress State  match_state='Updating'  image_id=${image_id}
158
159    # Wait for the image to install complete.
160    Wait Until Keyword Succeeds  8 min  15 sec
161    ...  Check Image Update Progress State  match_state='Enabled'  image_id=${image_id}
162
163    Reboot And Wait For BMC Standby  policy=${policy}  start_boot_seconds=${state['epoch_seconds']}
164
165    # Verify the image is installed and functional.
166    ${cmd}=  Set Variable  grep ^VERSION_ID= /etc/os-release | cut -f 2 -d '=' | sed 's/"//g'
167    ${functional_version}  ${stderr}  ${rc}=  BMC Execute Command  ${cmd}
168    Valid Value  functional_version  valid_values=['${install_version}']
169    Rprint Vars  functional_version
170
171
172Same Firmware Install Two Times
173    [Documentation]  Download same image twice to BMC via ImageURI. Second attempt would fail.
174    [Arguments]  ${apply_time}  ${tftp_server}=${TFTP_SERVER}  ${image_file_name}=${IMAGE_FILE_NAME}
175
176    # Description of argument(s):
177    # apply_time       ApplyTime allowed values (e.g. "OnReset", "Immediate").
178    # tftp_server      Server IP.
179    # image_file_name  Image file name.
180
181    ImageURI Download Install  ${apply_time}
182
183    # Download image from TFTP server via ImageURI to BMC.
184    Redfish.Post  /redfish/v1/UpdateService/Actions/UpdateService.SimpleUpdate
185    ...  body={"ImageURI": "tftp://${tftp_server}/${image_file_name}"}
186
187    ${image_version}=  Get Image Version From TFTP Server  ${tftp_server}  ${image_file_name}
188    ${software_inventory_record}=  Get Software Inventory State By Version
189    ...  ${image_version}
190    Rprint Vars  software_inventory_record
191
192    ${image_id}=  Wait Until Keyword Succeeds  60 sec  10 sec  Get Latest Image ID
193    Rprint Vars  image_id
194
195    Check Image Update Progress State  match_state='Enabled'  image_id=${image_id}
196    # Check if the existing firmware is functional.
197    Pass Execution If  ${software_inventory_record['functional']}
198    ...  The existing ${image_version} firmware is already functional.
199
200
201Reboot And Wait For BMC Standby
202    [Documentation]  Reboot or wait for BMC standby post reboot.
203    [Arguments]  ${policy}  ${start_boot_seconds}
204
205    # Description of argument(s):
206    # policy                ApplyTime allowed values (e.g. "OnReset", "Immediate").
207    # start_boot_seconds    See 'Wait For Reboot' for details.
208
209    Run Keyword If  '${policy}' == 'OnReset'
210    ...    Redfish OBMC Reboot (off)
211    ...  ELSE
212    ...    Wait For Reboot  start_boot_seconds=${start_boot_seconds}
213