xref: /openbmc/openbmc-test-automation/redfish/extended/redfish_bmc_code_update.robot (revision 49c1b53931191184251a4d1d9ba9ab127ee9f9fb)
1*** Settings ***
2Documentation            Update the BMC code on a target BMC via Redifsh.
3
4# Test Parameters:
5# IMAGE_FILE_PATH        The path to the BMC image file.
6#
7# Firmware update states:
8#     Enabled            Image is installed and either functional or active.
9#     Disabled           Image installation failed or ready for activation.
10#     Updating           Image installation currently in progress.
11
12Resource                 ../../lib/resource.robot
13Resource                 ../../lib/bmc_redfish_resource.robot
14Resource                 ../../lib/openbmc_ffdc.robot
15Resource                 ../../lib/common_utils.robot
16Resource                 ../../lib/code_update_utils.robot
17Resource                 ../../lib/redfish_code_update_utils.robot
18Resource                 ../../lib/utils.robot
19Library                  ../../lib/gen_robot_valid.py
20Library                  ../../lib/var_funcs.py
21Library                  ../../lib/gen_robot_keyword.py
22Library                  ../../lib/code_update_utils.py
23
24Suite Setup              Suite Setup Execution
25Suite Teardown           Redfish.Logout
26Test Setup               Printn
27Test Teardown            FFDC On Test Case Fail
28
29# Force the test to timedout to prevent test hanging.
30Test Timeout             45 minutes
31
32Test Tags               Bmc_Code_Update
33
34*** Variables ***
35
36${FORCE_UPDATE}             ${0}
37${LOOP_COUNT}               ${2}
38${DELETE_ERRLOGS}           ${1}
39# Refer: https://github.com/open-power/guard
40${DELETE_OLD_GUARD_FILE}    ${0}
41
42${ACTIVATION_WAIT_TIMEOUT}     8 min
43
44# New code update path.
45${REDFISH_UPDATE_URI}    /redfish/v1/UpdateService/update
46
47*** Test Cases ***
48
49Redfish BMC Code Update
50    [Documentation]  Update the firmware image.
51    [Tags]  Redfish_BMC_Code_Update
52
53    # Python module:  get_version_tar(tar_file_path)
54    ${image_version}=  code_update_utils.Get Version Tar  ${IMAGE_FILE_PATH}
55    Rprint Vars  image_version
56
57    # Python module: get_bmc_release_info()
58    ${bmc_release_info}=  utils.Get BMC Release Info
59    ${functional_version}=  Set Variable  ${bmc_release_info['version_id']}
60    Rprint Vars  functional_version
61
62    ${post_code_update_actions}=  Get Post Boot Action
63    ${state}=  Get Pre Reboot State
64    Rprint Vars  state
65
66    # Check if the existing firmware is functional.
67    Pass Execution If  '${functional_version}' == '${image_version}'
68    ...  The existing ${image_version} firmware is already functional.
69
70    ${sw_inv}=  Get Functional Firmware  BMC image
71    ${nonfunctional_sw_inv}=  Get Non Functional Firmware  ${sw_inv}  False
72
73    # Redfish active software image API.
74    IF  ${num_records} > 0
75        IF  '${nonfunctional_sw_inv['version']}' == '${image_version}'
76            Set Backup Firmware To Functional  ${image_version}  ${state}
77        END
78    END
79
80    Print Timen  Performing firmware update ${image_version}.
81
82    Redfish Update Firmware
83
84
85Redfish BMC Code Update Running And Backup Image With Same Firmware
86    [Documentation]  Perform the firmware update with same image back to back, so that
87    ...              the running (functional Image) and backup image (alternate image)
88    ...              with same firmware.
89    [Tags]  Redfish_BMC_Code_Update_Running_And_Backup_Image_With_Same_Firmware
90
91    # Python module:  get_version_tar(tar_file_path)
92    ${image_version}=  code_update_utils.Get Version Tar  ${IMAGE_FILE_PATH}
93    Rprint Vars  image_version
94
95    # Python module: get_bmc_release_info()
96    ${bmc_release_info}=  utils.Get BMC Release Info
97    ${functional_version}=  Set Variable  ${bmc_release_info['version_id']}
98    Rprint Vars  functional_version
99
100    # First update.
101    Print Timen  Performing firmware update ${image_version}.
102    Redfish Update Firmware
103
104    # Second update.
105    Print Timen  Performing firmware update ${image_version}.
106    Redfish Update Firmware
107
108
109Redfish Firmware Update Loop
110    [Documentation]  Update the same firmware image in loop.
111    [Tags]  Redfish_Firmware_Update_Loop
112    [Template]  Redfish Firmware Update In Loop
113    [Timeout]    NONE
114    # Override default 30 minutes, Disabling timeout with NONE explicitly
115    # else this test will fail for longer loop runs.
116
117    ${LOOP_COUNT}
118
119
120*** Keywords ***
121
122Suite Setup Execution
123    [Documentation]  Do the suite setup.
124
125    Redfish.Login
126    # Delete BMC dump and Error logs.
127    Run Keyword And Ignore Error  Redfish Delete All BMC Dumps
128    IF  ${DELETE_ERRLOGS} == ${1}
129        Run Keyword And Ignore Error  Redfish Purge Event Log
130    END
131    # To invalidate all the guard records.
132    IF  '${DELETE_OLD_GUARD_FILE}' == '${1}'
133        BMC Execute Command  guard -I
134    END
135
136    # Checking for file existence.
137    Valid File Path  IMAGE_FILE_PATH
138
139    # Check and set the update path.
140    # Old - /redfish/v1/UpdateService/
141    # New - /redfish/v1/UpdateService/update
142    ${resp}=  Redfish.Get  /redfish/v1/UpdateService/update
143    ...  valid_status_codes=[${HTTP_OK},${HTTP_NOT_FOUND},${HTTP_METHOD_NOT_ALLOWED}]
144
145    # If the method is not found, set update URI to old method.
146    IF  ${resp.status} == ${HTTP_NOT_FOUND}
147        Set Suite Variable  ${REDFISH_UPDATE_URI}  /redfish/v1/UpdateService
148    END
149
150    Log To Console  Update URI: ${REDFISH_UPDATE_URI}
151
152    Redfish Power Off  stack_mode=skip
153
154
155Redfish Firmware Update In Loop
156    [Documentation]  Update the firmware in loop.
157    [Arguments]  ${update_loop_count}
158
159    # Description of argument(s):
160    # update_loop_count    This value is used to run the firmware update in loop.
161
162    # Python module:  get_version_tar(tar_file_path)
163    ${image_version}=  code_update_utils.Get Version Tar  ${IMAGE_FILE_PATH}
164    Rprint Vars  image_version
165
166    # Python module: get_bmc_release_info()
167    ${bmc_release_info}=  utils.Get BMC Release Info
168    ${functional_version}=  Set Variable  ${bmc_release_info['version_id']}
169    Print Timen  Starting firmware information:
170    Rprint Vars  functional_version
171
172    ${temp_update_loop_count}=  Evaluate  ${update_loop_count} + 1
173
174    FOR  ${count}  IN RANGE  1  ${temp_update_loop_count}
175       Print Timen  **************************************
176       Print Timen  * The Current Loop Count is ${count} of ${update_loop_count} *
177       Print Timen  **************************************
178       Print Timen  Performing firmware update ${image_version}.
179       Redfish Update Firmware
180    END
181
182
183Delete BMC Image
184    [Documentation]  Delete a BMC image from the BMC flash chip.
185
186    ${software_object}=  Get Non Running BMC Software Object
187    Delete Image And Verify  ${software_object}  ${VERSION_PURPOSE_BMC}
188
189
190Activate Existing Firmware
191    [Documentation]  Set firmware image to lower priority.
192    [Arguments]  ${image_version}
193
194    # Description of argument(s):
195    # image_version     Version of image.
196
197    ${software_inventory_record}=  Get Software Inventory State By Version
198    ...  ${image_version}
199    ${num_keys}=  Get Length  ${software_inventory_record}
200
201    Rprint Vars  software_inventory_record
202
203    # If no software inventory record was found, there is no existing
204    # firmware for the given version and therefore no action to be taken.
205    IF  not ${num_keys}  RETURN
206
207    # Check if the existing firmware is functional.
208    Pass Execution If  ${software_inventory_record['functional']}
209    ...  The existing ${image_version} firmware is already functional.
210
211    # If existing firmware is not functional, then set the priority to least.
212    Print Timen  The existing ${image_version} firmware is not yet functional.
213    Set BMC Image Priority To Least  ${image_version}  ${software_inventory_record}
214
215    Pass Execution  The existing ${image_version} firmware is now functional.
216
217
218Get Image Priority
219    [Documentation]  Get Current Image Priority.
220    [Arguments]  ${image_version}
221
222    # Description of argument(s):
223    # image_version       The Firmware image version (e.g. 2.8.0-dev-1107-g512028d95).
224
225    ${software_info}=  Read Properties
226    ...  ${SOFTWARE_VERSION_URI}/enumerate  quiet=1
227    # Get only the record associated with our image_version.
228
229    ${software_info}=  Filter Struct
230    ...  ${software_info}  [('Version', '${image_version}')]
231    # Convert from dict to list.
232    ${software_info}=  Get Dictionary Values  ${software_info}
233
234    RETURN  ${software_info[0]['Priority']}
235
236
237Set BMC Image Priority To Least
238    [Documentation]  Set BMC image priority to least value.
239    [Arguments]  ${image_version}  ${software_inventory}
240
241    # Description of argument(s):
242    # image_version       The Firmware image version (e.g. 2.8.0-dev-1107-g512028d95).
243    # software_inventory  Software inventory details.
244
245    ${least_priority}=  Get Least Value Priority Image  ${VERSION_PURPOSE_BMC}
246    ${cur_priority}=  Get Image Priority  ${image_version}
247    Rprint Vars  least_priority  cur_priority
248
249    IF  '${least_priority}' == ${cur_priority}  RETURN
250
251    Set Host Software Property
252    ...  ${SOFTWARE_VERSION_URI}${software_inventory['image_id']}
253    ...  Priority  ${least_priority}
254
255    Redfish OBMC Reboot (off)
256
257
258Set Backup Firmware To Functional
259    [Documentation]  Set the backup firmware to functional.
260    [Arguments]  ${image_version}  ${state}
261
262    # Description of argument(s):
263    # image_version     Version of image.
264    # state             Pre reboot state.
265
266    Print Timen  Switch to back up and rebooting.
267    Switch Backup Firmware Image To Functional
268    Wait For Reboot  start_boot_seconds=${state['epoch_seconds']}
269    Redfish Verify BMC Version  ${IMAGE_FILE_PATH}
270    Pass Execution  The backup firmware image ${image_version} is now functional.
271
272
273Redfish Update Firmware
274    [Documentation]  Update the BMC firmware via redfish interface.
275
276    ${post_code_update_actions}=  Get Post Boot Action
277    ${state}=  Get Pre Reboot State
278    Rprint Vars  state
279    Run Keyword And Ignore Error  Set ApplyTime  policy=OnReset
280
281    # Python module:  get_member_list(resource_path)
282    ${before_inv_list}=  redfish_utils.Get Member List  /redfish/v1/UpdateService/FirmwareInventory
283    Log To Console   Current images on the BMC before upload: ${before_inv_list}
284
285    Print Timen  Start uploading image to BMC.
286    Redfish Upload Image  ${REDFISH_UPDATE_URI}  ${IMAGE_FILE_PATH}
287    Print Timen  Completed image upload to BMC.
288
289    # Python module:  get_member_list(resource_path)
290    ${after_inv_list}=  redfish_utils.Get Member List  /redfish/v1/UpdateService/FirmwareInventory
291    Log To Console  Current images on the BMC after upload: ${after_inv_list}
292
293    ${image_id}=  Evaluate  set(${after_inv_list}) - set(${before_inv_list})
294    Should Not Be Empty    ${image_id}
295    ${image_id}=  Evaluate  list(${image_id})[0].split('/')[-1]
296    Log To Console  Firmware installation in progress with image id:: ${image_id}
297
298    Wait Until Keyword Succeeds  ${ACTIVATION_WAIT_TIMEOUT}  10 sec
299    ...  Check Image Update Progress State  match_state='Enabled'  image_id=${image_id}
300
301    # Python module:  get_version_tar(tar_file_path)
302    ${tar_version}=  code_update_utils.Get Version Tar  ${IMAGE_FILE_PATH}
303    ${image_info}=  Get Software Inventory State By Version  ${tar_version}
304
305    Run Key  ${post_code_update_actions['${image_info["image_type"]}']['OnReset']}
306    Redfish.Login
307    Redfish Verify BMC Version  ${IMAGE_FILE_PATH}
308
309