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             30 minutes
31
32Force Tags               BMC_Code_Update
33
34*** Variables ***
35
36${FORCE_UPDATE}          ${0}
37${LOOP_COUNT}            20
38
39*** Test Cases ***
40
41Redfish BMC Code Update
42    [Documentation]  Update the firmware image.
43    [Tags]  Redfish_BMC_Code_Update
44
45    ${image_version}=  Get Version Tar  ${IMAGE_FILE_PATH}
46    Rprint Vars  image_version
47
48    ${bmc_release_info}=  Get BMC Release Info
49    ${functional_version}=  Set Variable  ${bmc_release_info['version_id']}
50    Rprint Vars  functional_version
51
52    ${post_code_update_actions}=  Get Post Boot Action
53    ${state}=  Get Pre Reboot State
54    Rprint Vars  state
55
56    # Check if the existing firmware is functional.
57    Pass Execution If  '${functional_version}' == '${image_version}'
58    ...  The existing ${image_version} firmware is already functional.
59
60    ${sw_inv}=  Get Functional Firmware  BMC image
61    ${nonfunctional_sw_inv}=  Get Non Functional Firmware  ${sw_inv}  False
62
63    # Redfish active software image API.
64    Run Keyword If  not ${FORCE_UPDATE}
65    ...  Run Keyword If  ${num_records} > 0
66    ...    Run Keyword If  '${nonfunctional_sw_inv['version']}' == '${image_version}'
67    ...      Run Keywords  Switch Backup Firmware Image To Functional  AND
68    ...      Wait For Reboot  start_boot_seconds=${state['epoch_seconds']}  AND
69    ...      Redfish Verify BMC Version  ${IMAGE_FILE_PATH}  AND
70    ...      Pass Execution  The firmware ${image_version} is backup image.
71
72    # Firmware inventory record of the given image version.
73    ${image_info}=  Get Software Inventory State By Version  ${image_version}
74
75    ${image_info_len}=  Get Length  ${image_info}
76
77    # REST delete the image to fresh code update for a given same image object
78    # which is already ACTIVE but on the alternate side. Irrespective of when
79    # REST is disabled in near future or the below operation fails, is purely
80    # done to give a chance.
81
82    Run Keyword If  '${image_info_len}' != 0
83    ...  Run Keywords  Print Timen
84    ...  The ${image_version} version is installed but not functional, delete and continue update.
85    ...    AND
86    ...  Run Keyword And Ignore Error
87    ...    Delete Software Object  /xyz/openbmc_project/software/${image_info['image_id']}
88
89    Redfish Update Firmware
90
91
92Redfish Firmware Update Loop
93    [Documentation]  Update the firmware image in loop.
94    [Tags]  Redfish_Firmware_Update_Loop
95    [Template]  Redfish Firmware Update In Loop
96
97    ${LOOP_COUNT}
98
99
100*** Keywords ***
101
102Suite Setup Execution
103    [Documentation]  Do the suite setup.
104
105    Redfish.Login
106    # Delete BMC dump and Error logs.
107    Run Keyword And Ignore Error  Delete All BMC Dump
108    Run Keyword And Ignore Error  Redfish Delete All BMC Dumps
109    Run Keyword And Ignore Error  Redfish Purge Event Log
110    # Checking for file existence.
111    Valid File Path  IMAGE_FILE_PATH
112
113
114Redfish Firmware Update In Loop
115    [Documentation]  Update the firmware in loop.
116    [Arguments]  ${update_loop_count}
117
118    # Description of argument(s):
119    # update_loop_count    This value is used to run the firmware update in loop.
120
121    ${before_image_state}=  Get BMC Functional Firmware
122    ${temp_update_loop_count}=  Evaluate  ${update_loop_count} + 1
123
124    FOR  ${count}  IN RANGE  1  ${temp_update_loop_count}
125      Print Timen  **************************************
126      Print Timen  * The Current Loop Count is ${count} of ${update_loop_count} *
127      Print Timen  **************************************
128      Redfish Update Firmware
129      ${sw_inv}=  Get Functional Firmware  BMC update
130      ${nonfunctional_sw_inv}=  Get Non Functional Firmware  ${sw_inv}  False
131      Run Keyword If  ${nonfunctional_sw_inv['functional']} == False
132      ...  Set BMC Image Priority To Least  ${nonfunctional_sw_inv['version']}  ${nonfunctional_sw_inv}
133      Redfish.Login
134      ${sw_inv}=  Get Functional Firmware  BMC update
135      ${nonfunctional_sw_inv}=  Get Non Functional Firmware  ${sw_inv}  False
136      Delete BMC Image
137    END
138
139    ${after_image_state}=  Get BMC Functional Firmware
140    Valid Value  before_image_state["version"]  ['${after_image_state["version"]}']
141
142
143Delete BMC Image
144    [Documentation]  Delete a BMC image from the BMC flash chip.
145
146    ${software_object}=  Get Non Running BMC Software Object
147    Delete Image And Verify  ${software_object}  ${VERSION_PURPOSE_BMC}
148
149
150Activate Existing Firmware
151    [Documentation]  Set firmware image to lower priority.
152    [Arguments]  ${image_version}
153
154    # Description of argument(s):
155    # image_version     Version of image.
156
157    ${software_inventory_record}=  Get Software Inventory State By Version
158    ...  ${image_version}
159    ${num_keys}=  Get Length  ${software_inventory_record}
160
161    Rprint Vars  software_inventory_record
162
163    # If no software inventory record was found, there is no existing
164    # firmware for the given version and therefore no action to be taken.
165    Return From Keyword If  not ${num_keys}
166
167    # Check if the existing firmware is functional.
168    Pass Execution If  ${software_inventory_record['functional']}
169    ...  The existing ${image_version} firmware is already functional.
170
171    # If existing firmware is not functional, then set the priority to least.
172    Print Timen  The existing ${image_version} firmware is not yet functional.
173    Set BMC Image Priority To Least  ${image_version}  ${software_inventory_record}
174
175    Pass Execution  The existing ${image_version} firmware is now functional.
176
177
178Get Image Priority
179    [Documentation]  Get Current Image Priority.
180    [Arguments]  ${image_version}
181
182    # Description of argument(s):
183    # image_version       The Firmware image version (e.g. 2.8.0-dev-1107-g512028d95).
184
185    ${software_info}=  Read Properties
186    ...  ${SOFTWARE_VERSION_URI}/enumerate  quiet=1
187    # Get only the record associated with our image_version.
188
189    ${software_info}=  Filter Struct
190    ...  ${software_info}  [('Version', '${image_version}')]
191    # Convert from dict to list.
192    ${software_info}=  Get Dictionary Values  ${software_info}
193
194    [Return]  ${software_info[0]['Priority']}
195
196
197Set BMC Image Priority To Least
198    [Documentation]  Set BMC image priority to least value.
199    [Arguments]  ${image_version}  ${software_inventory}
200
201    # Description of argument(s):
202    # image_version       The Firmware image version (e.g. 2.8.0-dev-1107-g512028d95).
203    # software_inventory  Software inventory details.
204
205    ${least_priority}=  Get Least Value Priority Image  ${VERSION_PURPOSE_BMC}
206    ${cur_priority}=  Get Image Priority  ${image_version}
207    Rprint Vars  least_priority  cur_priority
208
209    Return From Keyword If  '${least_priority}' == ${cur_priority}
210    Set Host Software Property
211    ...  ${SOFTWARE_VERSION_URI}${software_inventory['image_id']}
212    ...  Priority  ${least_priority}
213
214    Redfish OBMC Reboot (off)
215
216
217Redfish Update Firmware
218    [Documentation]  Update the BMC firmware via redfish interface.
219
220    ${post_code_update_actions}=  Get Post Boot Action
221    ${state}=  Get Pre Reboot State
222    Rprint Vars  state
223    Run Keyword And Ignore Error  Set ApplyTime  policy=OnReset
224    Redfish Upload Image And Check Progress State
225    ${tar_version}=  Get Version Tar  ${IMAGE_FILE_PATH}
226    ${image_info}=  Get Software Inventory State By Version  ${tar_version}
227    Run Key  ${post_code_update_actions['${image_info["image_type"]}']['OnReset']}
228    Redfish.Login
229    Redfish Verify BMC Version  ${IMAGE_FILE_PATH}
230
231