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