xref: /openbmc/openbmc-test-automation/extended/code_update/host_code_update.robot (revision 1e9f2f3ad99a95d660bd97af35b0ef76cab257fc)
1*** Settings ***
2Documentation     Update the PNOR code on a target BMC.
3...               Execution Method:
4...               python -m robot -v OPENBMC_HOST:<hostname>
5...               -v DELETE_OLD_PNOR_IMAGES:<"true" or "false">
6...               -v IMAGE_FILE_PATH:<path/*.tar>
7...               -v ALTERNATE_IMAGE_FILE_PATH:<path/*.tar>
8...               host_code_update.robot
9...
10...               Code update method BMC
11...               Update work flow sequence:
12...                 - Upload image via REST
13...                 - Verify that the file exists on the BMC
14...                 - Check that software "Activation" is set to "Ready"
15...                 - Set "Requested Activation" to "Active"
16...                 - Wait for code update to complete
17...                 - Verify the new version
18
19Library           ../../lib/bmc_ssh_utils.py
20Library           ../../lib/code_update_utils.py
21Library           ../../lib/gen_robot_keyword.py
22Variables         ../../data/variables.py
23Resource          ../../lib/boot_utils.robot
24Resource          code_update_utils.robot
25Resource          ../../lib/code_update_utils.robot
26Resource          ../../lib/openbmc_ffdc.robot
27Resource          ../../lib/state_manager.robot
28Resource          ../../lib/dump_utils.robot
29
30Test Teardown     Code Update Test Teardown
31
32Test Tags        Host_Code_Update
33
34*** Variables ***
35
36${QUIET}                         ${1}
37${IMAGE_FILE_PATH}               ${EMPTY}
38${DELETE_OLD_PNOR_IMAGES}        false
39${DELETE_OLD_GUARD_FILE}         false
40${ALTERNATE_IMAGE_FILE_PATH}     ${EMPTY}
41${SKIP_UPDATE_IF_ACTIVE}         false
42${cache_files_dir_path}          /var/lib/phosphor-software-manager/pnor/prsv/
43
44*** Test Cases ***
45
46REST Host Code Update
47    [Documentation]  Do a PNOR code update by uploading image on BMC via REST.
48    # 1. Delete error logs if there is any.
49    # 1. Do code update.
50    # 2. Do post update the following:
51    #    - Collect FFDC if error log exist and delete error logs.
52    [Tags]  REST_Host_Code_Update
53    [Setup]  Code Update Setup
54
55    Run Keyword And Ignore Error  List Installed Images  Host
56
57    Upload And Activate Image  ${IMAGE_FILE_PATH}
58    ...  skip_if_active=${SKIP_UPDATE_IF_ACTIVE}
59    OBMC Reboot (off)
60
61
62Post Update Boot To OS
63    [Documentation]  Boot the host OS
64    [Tags]  Post_Update_Boot_To_OS
65    [Setup]  Start SOL Console Logging
66    [Teardown]  Run Keywords  Stop SOL Console Logging
67    ...         AND  Code Update Test Teardown
68
69    IF  '${PREV_TEST_STATUS}' == 'FAIL'
70        Fail  Code update failed. No need to boot to OS.
71    END
72    Delete All Error Logs
73    REST Power On
74    Verify Running Host Image  ${IMAGE_FILE_PATH}
75
76
77Test Boot With No VPD Cache
78    [Documentation]  After having done a PNOR update and
79    ...  booted the OS in the tests above, remove the cached
80    ...  VPD files and verify that the OS can still boot.
81    [Tags]  Test_Boot_With_No_VPD_Cache
82    [Setup]  Start SOL Console Logging
83    [Teardown]  Run Keywords  Stop SOL Console Logging
84    ...         AND  Code Update Test Teardown
85
86    ${num_vpd_files}  ${stderr}  ${rc}=  BMC Execute Command
87    ...  ls ${cache_files_dir_path} | grep VPD -c
88    # Typically, vpd files = "CVPD DJVPD MVPD NVRAM".
89    Should Be Equal As Integers  ${num_vpd_files}  ${3}
90    ...  msg=Missing VPD files at ${cache_files_dir_path}.
91
92    # Delete the *VPD* files.
93    BMC Execute Command  rm -f ${xxx_dir_path}*VPD*
94
95    REST Power On
96
97    # After powering-on the system, the VPD files should be present.
98    ${num_vpd_files}  ${stderr}  ${rc}=  BMC Execute Command
99    ...  ls ${cache_files_dir_path} | grep VPD -c
100    Should Be Equal As Integers  ${num_vpd_files}  ${3}
101    ...  msg=Three VPD files expected at ${cache_files_dir_path}.
102
103    # Power off.  The next test case will boot the OS with the new VPD files.
104    REST Power Off
105
106
107REST Host Code Update While OS Is Running
108    [Documentation]  Do a PNOR code update while the host is running.
109    [Tags]  REST_Host_Code_Update_While_OS_Is_Running
110    [Teardown]  Run Keywords  REST Power Off  stack_mode=skip
111    ...         AND  Code Update Test Teardown
112
113    IF  '${PREV_TEST_STATUS}' == 'FAIL'  Fail  Cannot boot the OS.
114
115    REST Power On  stack_mode=skip
116    Upload And Activate Image
117    ...  ${ALTERNATE_IMAGE_FILE_PATH}  skip_if_active=true
118    REST Power On  stack_mode=normal
119    Verify Running Host Image  ${ALTERNATE_IMAGE_FILE_PATH}
120
121Host Image Priority Attribute Test
122    [Documentation]  Set "Priority" attribute.
123    [Tags]  Host_Image_Priority_Attribute_Test
124    [Template]  Temporarily Set PNOR Attribute
125
126    # Property        Value
127    Priority          ${0}
128    Priority          ${1}
129    Priority          ${127}
130    Priority          ${255}
131
132
133Host Set Priority To Invalid Values
134    [Documentation]  Attempt to set the priority of an image to an invalid
135    ...              value and expect an error.
136    [Tags]  Host_Set_Priority_To_Invalid_Values
137    [Template]  Set Priority To Invalid Value And Expect Error
138
139    # Version Type              Priority
140    ${VERSION_PURPOSE_HOST}    ${-1}
141    ${VERSION_PURPOSE_HOST}    ${256}
142
143
144Set RequestedActivation To None
145    [Documentation]  Set the RequestedActivation of the image to None and
146    ...              verify that it is in fact set to None.
147    [Tags]  Set_RequestedActivation_To_None
148
149    ${software_objects}=  Get Software Objects
150    Set Host Software Property  @{software_objects}[0]  RequestedActivation
151    ...  ${REQUESTED_NONE}
152    ${software_properties}=  Get Host Software Property  @{software_objects}[0]
153    Should Be Equal As Strings  ${software_properties}[RequestedActivation]
154    ...  ${REQUESTED_NONE}
155
156
157Set RequestedActivation And Activation To Invalid Value
158    [Documentation]  Set the RequestedActivation and Activation properties of
159    ...              the image to an invalid value and verify that it was not
160    ...              changed.
161    [Template]  Set Property To Invalid Value And Verify No Change
162    [Tags]  Set_RequestedActivation_And_Activation_To_Invalid_Value
163
164    # Property              Version Type
165    RequestedActivation     ${VERSION_PURPOSE_HOST}
166    Activation              ${VERSION_PURPOSE_HOST}
167
168
169Upload And Activate Multiple Host Images
170    [Documentation]  Upload another PNOR image and verify that its state is
171    ...              different from all others.
172    [Tags]  Upload_And_Activate_Multiple_Host_Images
173    [Template]  Activate Image And Verify No Duplicate Priorities
174    [Setup]  Upload And Activate Multiple BMC Images Setup
175
176    # Image File Path              Image Purpose
177    ${ALTERNATE_IMAGE_FILE_PATH}   ${VERSION_PURPOSE_HOST}
178
179
180Set Same Priority For Multiple Host Images
181    [Documentation]  Attempt to set the priority to be the same for two PNOR
182    ...              images and verify that the priorities are not the same.
183    [Tags]  Set_Same_Priority_For_Multiple_Host_Images
184
185    IF  '${PREV_TEST_STATUS}' == 'FAIL'
186        Fail  Activation of alternate image failed. Cannot set priority.
187    END
188    Set Same Priority For Multiple Images  ${VERSION_PURPOSE_HOST}
189
190
191Delete Host Image
192    [Documentation]  Delete a PNOR image from the BMC and PNOR flash chip.
193    [Tags]  Delete_Host_Image
194    [Setup]  Initiate Host PowerOff
195
196    ${software_objects}=  Get Software Objects
197    ...  version_type=${VERSION_PURPOSE_HOST}
198    ${num_images}=  Get Length  ${software_objects}
199    Should Be True  0 < ${num_images}
200    ...  msg=There are no PNOR images on the BMC to delete.
201    Delete Image And Verify  @{software_objects}[0]  ${VERSION_PURPOSE_HOST}
202
203
204Verify Host Update When Host Reboot During Activation In Progress
205    [Documentation]  Attempt to reboot the host while an image is activating.
206    [Tags]  Verify_Host_Update_When_Host_Reboot_During_Activation_In_Progress
207
208    Upload And Activate Image  ${IMAGE_FILE_PATH}
209    REST Power On
210    Delete All Error Logs
211
212    ${version_id}=  Upload And Activate Image  ${ALTERNATE_IMAGE_FILE_PATH}
213    ...  wait=${0}
214
215    ${resp}=  OpenBMC Get Request  ${SOFTWARE_VERSION_URI}${version_id}
216    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
217
218    # Reboot Host during activation.
219    Host Reboot
220
221    Wait For Activation State Change  ${version_id}  ${ACTIVATING}
222
223    # New image priority should be 0.
224    ${new_host_properties}=
225    ...  Get Host Software Property  ${SOFTWARE_VERSION_URI}${version_id}
226    Should Be Equal As Integers  ${new_host_properties["Priority"]}  ${0}
227
228    # Reboot host to boot up with the new host image version.
229    Host Reboot
230    Verify Running Host Image  ${ALTERNATE_IMAGE_FILE_PATH}
231
232
233*** Keywords ***
234
235Temporarily Set PNOR Attribute
236    [Documentation]  Update the PNOR attribute value.
237    [Arguments]  ${attribute_name}  ${attribute_value}
238
239    # Description of argument(s):
240    # attribute_name    Host software attribute name (e.g. "Priority").
241    # attribute_value   Value to be written.
242
243    ${image_ids}=  Get Software Objects
244    ${init_host_properties}=  Get Host Software Property  ${image_ids[0]}
245    ${initial_priority}=  Set Variable  ${init_host_properties["Priority"]}
246
247    Set Host Software Property  ${image_ids[0]}  ${attribute_name}
248    ...  ${attribute_value}
249
250    ${cur_host_properties}=  Get Host Software Property  ${image_ids[0]}
251    Should Be Equal As Integers  ${cur_host_properties["Priority"]}
252    ...  ${attribute_value}
253
254    # Revert to to initial value.
255    Set Host Software Property
256    ...  ${image_ids[0]}  ${attribute_name}  ${initial_priority}
257
258
259Code Update Setup
260    [Documentation]  Do code update test case setup.
261    # - Clean up all existing BMC dumps.
262    # - Clean up all currently install PNOR images.
263
264    Run Keyword And Ignore Error  Smart Power Off
265    Run Key  Delete All Dumps  ignore=1
266    Run Key  Delete All Error Logs  ignore=1
267    IF  'true' == '${DELETE_OLD_PNOR_IMAGES}'  Delete All PNOR Images
268    IF  'true' == '${DELETE_OLD_GUARD_FILE}'
269        BMC Execute Command
270        ...  rm -f /var/lib/phosphor-software-manager/pnor/prsv/GUARD
271    END
272
273    BMC Execute Command  rm -rf /tmp/images/*
274
275Upload And Activate Multiple BMC Images Setup
276    [Documentation]  Check that the ALTERNATE_FILE_PATH variable is set.
277
278    Should Not Be Empty  ${ALTERNATE_IMAGE_FILE_PATH}
279    Delete All PNOR Images
280    Upload And Activate Image  ${IMAGE_FILE_PATH}  skip_if_active=true
281
282Get PNOR Extended Version
283    [Documentation]  Return the PNOR extended version.
284    [Arguments]  ${manifest_path}
285
286    # Description of argument(s):
287    # manifest_path  Path of the MANIFEST file
288    #                (e.g. "/tmp/images/abc123/MANIFEST").
289
290    ${version}= BMC Execute Command
291    ...  grep extended_version= ${manifest_path}
292    RETURN   ${version.split(",")}
293
294
295Code Update Test Teardown
296    [Documentation]  Do code update test case teardown.
297    # 1. Collect FFDC if test case failed.
298    # 2. Collect FFDC if test PASS but error log exists.
299
300    FFDC On Test Case Fail
301    IF  '${TEST_STATUS}' == 'PASS'  Check Error And Collect FFDC
302