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