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