xref: /openbmc/openbmc-test-automation/redfish/update_service/test_redfish_bmc_code_update.robot (revision ee0103d5f448d381b29594c98c48ae1a76db44c9)
1*** Settings ***
2Documentation            Update firmware 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/dump_utils.robot
18Resource                 ../../lib/logging_utils.robot
19Resource                 ../../lib/redfish_code_update_utils.robot
20Resource                 ../../lib/utils.robot
21Resource                 ../../lib/bmc_redfish_utils.robot
22Resource                 ../../lib/external_intf/management_console_utils.robot
23Resource                 ../../lib/bmc_network_utils.robot
24Resource                 ../../lib/certificate_utils.robot
25Library                  ../../lib/gen_robot_valid.py
26Library                  ../../lib/tftp_update_utils.py
27Library                  ../../lib/gen_robot_keyword.py
28
29Suite Setup              Suite Setup Execution
30Suite Teardown           Redfish.Logout
31Test Setup               Printn
32Test Teardown            FFDC On Test Case Fail
33
34Force Tags               Redfish_Bmc_Code_Update
35
36*** Variables ***
37
38@{ADMIN}                 admin_user  TestPwd123
39&{USERS}                 Administrator=${ADMIN}
40${LOOP_COUNT}            ${2}
41@{HOSTNAME}              bmc_system01  bmc_system02  bmc_system03  bmc_system04  bmc_system05
42
43*** Test Cases ***
44
45Redfish Code Update With ApplyTime OnReset
46    [Documentation]  Update the firmware image with ApplyTime of OnReset.
47    [Tags]  Redfish_Code_Update_With_ApplyTime_OnReset
48    [Template]  Redfish Update Firmware
49
50    # policy
51    OnReset
52
53
54Redfish Code Update With ApplyTime Immediate
55    [Documentation]  Update the firmware image with ApplyTime of Immediate.
56    [Tags]  Redfish_Code_Update_With_ApplyTime_Immediate
57    [Template]  Redfish Update Firmware
58
59    # policy
60    Immediate
61
62
63Redfish Code Update Same Firmware Multiple Times
64    [Documentation]  Multiple times update the firmware image for update service.
65    [Tags]  Redfish_Code_Update_Same_Firmware_Multiple_Times
66
67    ${temp_update_loop_count}=  Evaluate  ${LOOP_COUNT} + 1
68
69    FOR  ${count}  IN RANGE  1  ${temp_update_loop_count}
70       Print Timen  ***************************************
71       Print Timen  * The Current Loop Count is ${count} of ${LOOP_COUNT} *
72       Print Timen  ***************************************
73
74       Redfish Update Firmware  apply_time=OnReset
75    END
76
77
78
79Redfish Code Update With Multiple Firmware
80    [Documentation]  Update the firmware image with ApplyTime of Immediate.
81    [Tags]  Redfish_Code_Update_With_Multiple_Firmware
82    [Template]  Redfish Multiple Upload Image And Check Progress State
83
84    # policy   image_file_path     alternate_image_file_path
85    OnReset  ${IMAGE_FILE_PATH}  ${ALTERNATE_IMAGE_FILE_PATH}
86
87
88Post BMC Reset Perform Redfish Code Update
89    [Documentation]  Test to reset BMC at standby and then perform BMC firmware update and
90    ...              ensure there is not error or dump logs post update.
91    [Tags]  Post_BMC_Reset_Perform_Redfish_Code_Update
92
93    Redfish Delete All BMC Dumps
94    Redfish Purge Event Log
95
96    Redfish OBMC Reboot (off)
97
98    Redfish Update Firmware  apply_time=OnReset
99
100    Event Log Should Not Exist
101    Redfish BMC Dump Should Not Exist
102
103    Redfish Power Off
104
105
106Post BMC Reset Perform Image Switched To Backup Multiple Times
107    [Documentation]  Test to reset BMC at standby and then perform switch
108    ...              to backup image multiple times.
109    ...              Then ensure no event and dump logs exist.
110    [Tags]  Post_BMC_Reset_Perform_Image_Switched_To_Backup_Multiple_Times
111
112    Redfish Delete All BMC Dumps
113    Redfish Purge Event Log
114
115    Redfish OBMC Reboot (off)
116
117    ${temp_update_loop_count}=  Evaluate  ${LOOP_COUNT} + 1
118
119    FOR  ${count}  IN RANGE  1  ${temp_update_loop_count}
120      ${state}=  Get Pre Reboot State
121
122      # change to backup image and reset the BMC.
123      Switch Backup Firmware Image To Functional
124
125      Wait For Reboot  start_boot_seconds=${state['epoch_seconds']}
126    END
127
128    Event Log Should Not Exist
129    Redfish BMC Dump Should Not Exist
130
131
132Verify If The Modified Admin Credential Is Valid Post Image Switched To Backup
133    [Documentation]  Verify updated admin credential remain same post switch to back up image.
134    [Tags]  Verify_If_The_Modified_Admin_Credential_Is_Valid_Post_Image_Switched_To_Backup
135    [Setup]  Create Users With Different Roles  users=${USERS}  force=${True}
136    [Teardown]  Run Keywords  Redfish.Login  AND  Delete BMC Users Via Redfish  users=${USERS}
137
138    ${post_code_update_actions}=  Get Post Boot Action
139    ${state}=  Get Pre Reboot State
140    Expire And Update New Password Via Redfish  ${ADMIN[0]}  ${ADMIN[1]}  0penBmc123
141
142    Redfish.Login
143    # change to backup image and reset the BMC.
144    Switch Backup Firmware Image To Functional
145    Wait For Reboot  start_boot_seconds=${state['epoch_seconds']}
146
147    # verify modified admin password on backup image.
148    Redfish.Login  admin_user  0penBmc123
149    Redfish.Logout
150
151
152Verify If The Modified Admin Credential Is Valid Post Update
153    [Documentation]  Verify updated admin credential remain same post code update image.
154    [Tags]  Verify_If_The_Modified_Admin_Credential_Is_Valid_Post_Update
155    [Setup]  Create Users With Different Roles  users=${USERS}  force=${True}
156    [Teardown]  Run Keywords  Redfish.Login  AND  Delete BMC Users Via Redfish  users=${USERS}
157
158    Expire And Update New Password Via Redfish  ${ADMIN[0]}  ${ADMIN[1]}  0penBmc123
159
160    Redfish.Login
161    # Flash latest firmware using redfish.
162    Redfish Update Firmware  OnReset
163
164    # verify modified admin credentails on latest image.
165    Redfish.Login  admin_user  0penBmc123
166    Redfish.Logout
167
168
169Redfish Code Update With Different Interrupted Operation
170    [Documentation]  Ensure firmware update is successful when different interrupted operation executed
171    ...              i.e. change the hostname, updating https certificate and firmware update fail
172    ...              when kernel panic.
173    [Tags]  Redfish_Code_Update_With_Different_Interrupted_Operation
174    [Template]  Verify Redfish Code Update With Different Interrupted Operation
175    [Teardown]  Code Update Interrupted Operation Teardown
176
177    # operation          count
178    host_name            1
179    kernel_panic         1
180    https_certificate    1
181
182*** Keywords ***
183
184Suite Setup Execution
185    [Documentation]  Do the suite setup.
186
187    Valid File Path  IMAGE_FILE_PATH
188    Redfish.Login
189
190    Redfish Delete All BMC Dumps
191    Redfish Purge Event Log
192
193    Redfish Power Off  stack_mode=skip
194
195
196Code Update Interrupted Operation Teardown
197    [Documentation]  Code update interrupted operation teardown.
198
199    ${task_inv_dict}=  Get Task State from File
200
201    ${redfish_update_uri}=  Get Redfish Update Service URI
202
203    IF  '${TEST STATUS}' == 'FAIL'
204
205      ${task_inv}=  Check Task With Match TargetUri  ${redfish_update_uri}
206      Rprint Vars  task_inv
207
208      Wait Until Keyword Succeeds  2 min  10 sec
209      ...  Verify Task Progress State  ${task_inv}  ${task_inv_dict['TaskStarting']}
210
211      Wait Until Keyword Succeeds  5 min  10 sec
212      ...  Verify Task Progress State  ${task_inv}  ${task_inv_dict['TaskCompleted']}
213
214      Redfish BMC Reset Operation
215      Is BMC Standby
216
217    END
218
219
220Get Redfish Update Service URI
221    [Documentation]  Get Redfish firmware update URI.
222
223    ${update_url}=  Redfish.Get Attribute  ${REDFISH_BASE_URI}UpdateService  HttpPushUri
224
225    Log To Console  Firmware update URI: ${update_url}
226
227    [Return]  ${update_url}
228
229
230Redfish Multiple Upload Image And Check Progress State
231    [Documentation]  Update multiple BMC firmware via redfish interface and check status.
232    [Arguments]  ${apply_time}  ${IMAGE_FILE_PATH}  ${ALTERNATE_IMAGE_FILE_PATH}
233
234    # Description of argument(s):
235    # apply_time                 ApplyTime allowed values (e.g. "OnReset", "Immediate").
236    # IMAGE_FILE_PATH            The path to BMC image file.
237    # ALTERNATE_IMAGE_FILE_PATH  The path to alternate BMC image file.
238
239
240    ${task_inv_dict}=  Get Task State from File
241
242    ${post_code_update_actions}=  Get Post Boot Action
243
244    Valid File Path  ALTERNATE_IMAGE_FILE_PATH
245
246    ${state}=  Get Pre Reboot State
247    Rprint Vars  state
248
249    Set ApplyTime  policy=${apply_time}
250
251    # URI : /redfish/v1/UpdateService
252    # "HttpPushUri": "/redfish/v1/UpdateService/update",
253
254    ${redfish_update_uri}=  Get Redfish Update Service URI
255
256    ${file_bin_data1}=  OperatingSystem.Get Binary File  ${IMAGE_FILE_PATH}
257    ${file_bin_data2}=  OperatingSystem.Get Binary File  ${ALTERNATE_IMAGE_FILE_PATH}
258
259    Log To Console  Uploading first image.
260    ${resp1}=  Upload Image To BMC  ${redfish_update_uri}  timeout=${600}  data=${file_bin_data1}
261
262    Log To Console  Uploading second image.
263    ${resp2}=  Upload Image To BMC  ${redfish_update_uri}  timeout=${600}  data=${file_bin_data2}
264
265    ${task_info2}=    evaluate    json.loads('''${resp2.content}''')    json
266
267    Sleep  3s
268
269    ${task_inv2}=  Get Task Inventory  ${task_info2}
270    Log  ${task_inv2}
271
272    Wait Until Keyword Succeeds  5 min  10 sec
273    ...  Verify Task Progress State  ${task_inv2}  ${task_inv_dict['TaskException']}
274
275    ${task_info1}=    evaluate    json.loads('''${resp1.content}''')    json
276    Log  ${task_info1}
277
278    ${task_inv1}=  Get Task Inventory  ${task_info1}
279    Log  ${task_inv1}
280
281    Wait Until Keyword Succeeds  5 min  10 sec
282    ...  Verify Task Progress State  ${task_inv1}  ${task_inv_dict['TaskCompleted']}
283
284    Run Key  ${post_code_update_actions['BMC image']['${apply_time}']}
285    Redfish.Login
286    Redfish Verify BMC Version  ${IMAGE_FILE_PATH}
287
288
289Run Configure BMC Hostname In Loop
290    [Documentation]  Update hostname in loop.
291    [Arguments]  ${count}
292
293    # Description of argument(s):
294    # count    Loop count.
295
296    FOR  ${index}  IN RANGE  ${count}
297      Configure Hostname  hostname=${HOSTNAME}[${index}]  status_code=[${HTTP_OK}]
298    END
299
300
301Redfish Update Certificate Upload In Loop
302    [Documentation]  Upload HTTPS server certificate via Redfish and verify using OpenSSL.
303    [Arguments]  ${count}
304
305    # Description of argument(s):
306    # count    Loop count.
307
308    FOR  ${index}  IN RANGE  ${count}
309      ${resp}=  Run Keyword And Return Status  Redfish.Get  ${REDFISH_HTTPS_CERTIFICATE_URI}/1  valid_status_codes=[${HTTP_OK}]
310      Should Be Equal As Strings  ${resp}  ${True}
311
312      ${cert_file_path}=  Generate Certificate File Via Openssl  Valid Certificate Valid Privatekey
313      ${bytes}=  OperatingSystem.Get Binary File  ${cert_file_path}
314      ${file_data}=  Decode Bytes To String  ${bytes}  UTF-8
315
316      ${certificate_dict}=  Create Dictionary
317      ...  @odata.id=${REDFISH_HTTPS_CERTIFICATE_URI}/1
318      ${payload}=  Create Dictionary  CertificateString=${file_data}
319      ...  CertificateType=PEM  CertificateUri=${certificate_dict}
320
321      ${resp}=  Redfish.Post  /redfish/v1/CertificateService/Actions/CertificateService.ReplaceCertificate
322      ...  body=${payload}
323
324      Verify Certificate Visible Via OpenSSL  ${cert_file_path}
325    END
326
327
328Run Operation On BMC
329    [Documentation]  Run operation on BMC.
330    [Arguments]  ${operation}  ${count}
331
332    # Description of argument(s):
333    # operation    Supports different variables.
334    #              If host_name then change hostname,
335    #              If kernel_panic then perform kernel panic,
336    #              If https_certificate then change the https certificate.
337    # count        Loop count.
338
339    # Below directory is required by keyword.
340    # Redfish Update Certificate Upload In Loop
341
342    IF  '${operation}' == 'https_certificate'
343      Run  rm -r certificate_dir
344      Run  mkdir certificate_dir
345    END
346
347    Run Keyword If  '${operation}' == 'host_name'
348    ...    Run Configure BMC Hostname In Loop  count=${count}
349    ...  ELSE IF  '${operation}' == 'kernel_panic'
350    ...    Run Keywords  Kernel Panic BMC Reset Operation  AND
351    ...    Is BMC Unpingable
352    ...  ELSE IF  '${operation}' == 'https_certificate'
353    ...    Redfish Update Certificate Upload In Loop  count=${count}
354    ...  ELSE
355    ...    Fail  msg=Operation not handled.
356
357
358Get Active Firmware Image
359    [Documentation]  Return get active firmware image.
360
361    ${active_image}=  Redfish.Get Attribute  /redfish/v1/Managers/${MANAGER_ID}  Links
362    Rprint Vars  active_image
363
364    [Return]  ${active_image}
365
366
367Get New Image ID
368    [Documentation]  Return the ID of the most recently extracted image.
369
370    ${image_id}=   Get Image Id   Updating
371
372    [Return]  ${image_id}
373
374
375Verify Redfish Code Update With Different Interrupted Operation
376    [Documentation]  Verify code update is successful when other operation
377    ...              getting executed i.e. change the hostname, updating http certificate
378    ...              and code update will fail for kernel panic.
379    [Arguments]  ${operation}  ${count}
380
381    # Description of argument(s):
382    # operation    host_name to change Hostname, kernel_panic to perform kernel panic.
383    # count        Number of times loop will get executed.
384
385    ${before_update_activeswimage}=  Get Active Firmware Image
386
387    ${post_code_update_actions}=  Get Post Boot Action
388
389    Set ApplyTime  policy=OnReset
390
391    ${task_inv_dict}=  Get Task State from File
392
393    ${file_bin_data}=  OperatingSystem.Get Binary File  ${image_file_path}
394
395    Log To Console   Start uploading image to BMC.
396
397    # URI : /redfish/v1/UpdateService
398    # "HttpPushUri": "/redfish/v1/UpdateService/update",
399
400    ${redfish_update_uri}=  Get Redfish Update Service URI
401    Upload Image To BMC  ${redfish_update_uri}  timeout=${600}  data=${file_bin_data}
402    Log To Console   Completed image upload to BMC.
403
404    Sleep  8
405
406    ${image_id}=  Get New Image ID
407    Rprint Vars  image_id
408
409    ${task_inv}=  Check Task With Match TargetUri  ${redfish_update_uri}
410    Rprint Vars  task_inv
411
412    Wait Until Keyword Succeeds  2 min  10 sec
413    ...  Verify Task Progress State  ${task_inv}  ${task_inv_dict['TaskStarting']}
414
415    Run Operation On BMC  ${operation}  ${count}
416
417    IF  '${operation}' == 'kernel_panic'
418        Wait Until Keyword Succeeds  10 min  10 sec  Is BMC Standby
419    ELSE IF  '${operation}' == 'host_name'
420        Wait Until Keyword Succeeds  5 min  10 sec
421        ...  Verify Task Progress State  ${task_inv}  ${task_inv_dict['TaskCompleted']}
422        Run Key  ${post_code_update_actions['BMC image']['OnReset']}
423        Redfish Verify BMC Version  ${IMAGE_FILE_PATH}
424    ELSE IF  '${operation}' == 'https_certificate'
425        Check Image Update Progress State
426        ...  match_state='Updating'  image_id=${image_id}
427        Wait Until Keyword Succeeds  8 min  20 sec
428        ...  Check Image Update Progress State
429        ...  match_state='Enabled'  image_id=${image_id}
430        Run Key  ${post_code_update_actions['BMC image']['OnReset']}
431        Redfish Verify BMC Version  ${IMAGE_FILE_PATH}
432    ELSE
433        Fail  msg=Operation not handled.
434    END
435
436    ${after_update_activeswimage}=  Get Active Firmware Image
437
438    ${status}=  Run Keyword And Return Status  Should Be Equal As Strings
439    ...  ${before_update_activeswimage['ActiveSoftwareImage']['@odata.id']}
440    ...  ${after_update_activeswimage['ActiveSoftwareImage']['@odata.id']}
441
442    Run Keyword If  '${operation}' == 'kernel_panic'
443    ...    Should Be True  ${status}
444    ...  ELSE
445    ...    Should Not Be True  ${status}
446
447    Verify Get ApplyTime  OnReset
448
449