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
128Delete BMC Image
129    [Documentation]  Delete a BMC image from the BMC flash chip.
130
131    ${software_object}=  Get Non Running BMC Software Object
132    Delete Image And Verify  ${software_object}  ${VERSION_PURPOSE_BMC}
133
134
135Activate Existing Firmware
136    [Documentation]  Set fimware image to lower priority.
137    [Arguments]  ${image_version}
138
139    # Description of argument(s):
140    # image_version     Version of image.
141
142    ${software_inventory_record}=  Get Software Inventory State By Version
143    ...  ${image_version}
144    ${num_keys}=  Get Length  ${software_inventory_record}
145
146    Rprint Vars  software_inventory_record
147
148    # If no software inventory record was found, there is no existing
149    # firmware for the given version and therefore no action to be taken.
150    Return From Keyword If  not ${num_keys}
151
152    # Check if the existing firmware is functional.
153    Pass Execution If  ${software_inventory_record['functional']}
154    ...  The existing ${image_version} firmware is already functional.
155
156    # If existing firmware is not functional, then set the priority to least.
157    Print Timen  The existing ${image_version} firmware is not yet functional.
158    Set BMC Image Priority To Least  ${image_version}  ${software_inventory_record}
159
160    Pass Execution  The existing ${image_version} firmware is now functional.
161
162
163Get Image Priority
164    [Documentation]  Get Current Image Priority.
165    [Arguments]  ${image_version}
166
167    # Description of argument(s):
168    # image_version       The Fimware image version (e.g. 2.8.0-dev-1107-g512028d95).
169
170    ${software_info}=  Read Properties
171    ...  ${SOFTWARE_VERSION_URI}/enumerate  quiet=1
172    # Get only the record associated with our image_version.
173
174    ${software_info}=  Filter Struct
175    ...  ${software_info}  [('Version', '${image_version}')]
176    # Convert from dict to list.
177    ${software_info}=  Get Dictionary Values  ${software_info}
178
179    [Return]  ${software_info[0]['Priority']}
180
181
182Set BMC Image Priority To Least
183    [Documentation]  Set BMC image priority to least value.
184    [Arguments]  ${image_version}  ${software_inventory}
185
186    # Description of argument(s):
187    # image_version       The Fimware image version (e.g. 2.8.0-dev-1107-g512028d95).
188    # software_inventory  Software inventory details.
189
190    ${least_priority}=  Get Least Value Priority Image  ${VERSION_PURPOSE_BMC}
191    ${cur_priority}=  Get Image Priority  ${image_version}
192    Rprint Vars  least_priority  cur_priority
193
194    Return From Keyword If  '${least_priority}' == ${cur_priority}
195    Set Host Software Property
196    ...  ${SOFTWARE_VERSION_URI}${software_inventory['image_id']}
197    ...  Priority  ${least_priority}
198
199    Redfish OBMC Reboot (off)
200
201
202Redfish Update Firmware
203    [Documentation]  Update the BMC firmware via redfish interface.
204
205    ${post_code_update_actions}=  Get Post Boot Action
206    ${state}=  Get Pre Reboot State
207    Rprint Vars  state
208    Run Keyword And Ignore Error  Set ApplyTime  policy=OnReset
209    Redfish Upload Image And Check Progress State
210    ${tar_version}=  Get Version Tar  ${IMAGE_FILE_PATH}
211    ${image_info}=  Get Software Inventory State By Version  ${tar_version}
212    Run Key  ${post_code_update_actions['${image_info["image_type"]}']['OnReset']}
213    Redfish.Login
214    Redfish Verify BMC Version  ${IMAGE_FILE_PATH}
215
216