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
22
23Suite Setup              Suite Setup Execution
24Suite Teardown           Redfish.Logout
25Test Setup               Printn
26Test Teardown            FFDC On Test Case Fail
27
28Force Tags               BMC_Code_Update
29
30*** Variables ***
31
32${FORCE_UPDATE}          ${0}
33
34
35*** Test Cases ***
36
37Redfish BMC Code Update
38    [Documentation]  Update the firmware image.
39    [Tags]  Redfish_BMC_Code_Update
40
41    ${image_version}=  Get Version Tar  ${IMAGE_FILE_PATH}
42    Rprint Vars  image_version
43
44    ${bmc_release_info}=  Get BMC Release Info
45    ${functional_version}=  Set Variable  ${bmc_release_info['version_id']}
46    Rprint Vars  functional_version
47
48    # Check if the existing firmware is functional.
49    Pass Execution If  '${functional_version}' == '${image_version}'
50    ...  The existing ${image_version} firmware is already functional.
51
52    Run Keyword If  not ${FORCE_UPDATE}
53    ...  Activate Existing Firmware  ${image_version}
54    Redfish Update Firmware
55
56*** Keywords ***
57
58Suite Setup Execution
59    [Documentation]  Do the suite setup.
60
61    Redfish.Login
62    # Delete BMC dump and Error logs.
63    Delete All BMC Dump
64    Run Keyword And Ignore Error  Redfish Purge Event Log
65    # Checking for file existence.
66    Valid File Path  IMAGE_FILE_PATH
67
68Activate Existing Firmware
69    [Documentation]  Set fimware image to lower priority.
70    [Arguments]  ${image_version}
71
72    # Description of argument(s):
73    # image_version     Version of image.
74
75    ${software_inventory_record}=  Get Software Inventory State By Version
76    ...  ${image_version}
77    ${num_keys}=  Get Length  ${software_inventory_record}
78
79    Rprint Vars  software_inventory_record
80
81    # If no software inventory record was found, there is no existing
82    # firmware for the given version and therefore no action to be taken.
83    Return From Keyword If  not ${num_keys}
84
85    # Check if the existing firmware is functional.
86    Pass Execution If  ${software_inventory_record['functional']}
87    ...  The existing ${image_version} firmware is already functional.
88
89    # If existing firmware is not functional, then set the priority to least.
90    Print Timen  The existing ${image_version} firmware is not yet functional.
91    Set BMC Image Priority To Least  ${image_version}  ${software_inventory_record}
92
93    Pass Execution  The existing ${image_version} firmware is now functional.
94
95
96Get Image Priority
97    [Documentation]  Get Current Image Priority.
98    [Arguments]  ${image_version}
99
100    # Description of argument(s):
101    # image_version       The Fimware image version (e.g. 2.8.0-dev-1107-g512028d95).
102
103    ${software_info}=  Read Properties
104    ...  ${SOFTWARE_VERSION_URI}/enumerate  quiet=1
105    # Get only the record associated with our image_version.
106
107    ${software_info}=  Filter Struct
108    ...  ${software_info}  [('Version', '${image_version}')]
109    # Convert from dict to list.
110    ${software_info}=  Get Dictionary Values  ${software_info}
111
112    [Return]  ${software_info[0]['Priority']}
113
114
115Set BMC Image Priority To Least
116    [Documentation]  Set BMC image priority to least value.
117    [Arguments]  ${image_version}  ${software_inventory}
118
119    # Description of argument(s):
120    # image_version       The Fimware image version (e.g. 2.8.0-dev-1107-g512028d95).
121    # software_inventory  Software inventory details.
122
123    ${least_priority}=  Get Least Value Priority Image  ${VERSION_PURPOSE_BMC}
124    ${cur_priority}=  Get Image Priority  ${image_version}
125    Rprint Vars  least_priority  cur_priority
126
127    Return From Keyword If  '${least_priority}' == ${cur_priority}
128    Set Host Software Property
129    ...  ${SOFTWARE_VERSION_URI}${software_inventory['image_id']}
130    ...  Priority  ${least_priority}
131
132    Redfish OBMC Reboot (off)
133
134
135Redfish Update Firmware
136    [Documentation]  Update the BMC firmware via redfish interface.
137
138    ${post_code_update_actions}=  Get Post Boot Action
139    ${state}=  Get Pre Reboot State
140    Rprint Vars  state
141    Run Keyword And Ignore Error  Set ApplyTime  policy=OnReset
142    Redfish Upload Image And Check Progress State
143    ${tar_version}=  Get Version Tar  ${IMAGE_FILE_PATH}
144    ${image_info}=  Get Software Inventory State By Version  ${tar_version}
145    Run Key  ${post_code_update_actions['${image_info["image_type"]}']['OnReset']}
146    Redfish.Login
147    Redfish Verify BMC Version  ${IMAGE_FILE_PATH}
148
149