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