1*** Settings ***
2Documentation    Verify that Redfish software inventory can be collected.
3
4Resource         ../../lib/resource.robot
5Resource         ../../lib/bmc_redfish_resource.robot
6Resource         ../../lib/openbmc_ffdc.robot
7Resource         ../../lib/redfish_code_update_utils.robot
8Library          ../../lib/gen_robot_valid.py
9
10Test Setup       Test Setup Execution
11Test Teardown    Test Teardown Execution
12
13*** Test Cases ***
14
15Verify Redfish Update Service Enabled
16    [Documentation]  Verify "ServiceEnabled" is enabled.
17    [Tags]  Verify_Update_Service_Enabled
18
19    # Example:
20    # "HttpPushUri": "/redfish/v1/UpdateService",
21    # "Id": "UpdateService",
22    # "Name": "Update Service",
23    # "ServiceEnabled": true
24
25    ${resp}=  Redfish.Get  /redfish/v1/UpdateService
26    Should Be Equal As Strings  ${resp.dict["ServiceEnabled"]}  ${True}
27
28
29Verify Redfish Software Inventory Collection
30    [Documentation]  Verify software inventory collection member and object entries.
31    [Tags]  Verify_Redfish_Software_Inventory_Collection
32
33    # Example:
34    # {
35    #    "@odata.type": "#SoftwareInventoryCollection.SoftwareInventoryCollection",
36    #    "Members": [
37    #      {
38    #        "@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/a3522998"
39    #      },
40    #      {
41    #        "@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/a7c79f71"
42    #      },
43    #      {
44    #        "@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/ace821ef"
45    #      }
46    #   ],
47    #   "Members@odata.count": 3,
48    #   "Name": "Software Inventory Collection"
49    # }
50
51    ${resp}=  Redfish.Get  /redfish/v1/UpdateService/FirmwareInventory
52
53    Should Be True  ${resp.dict["Members@odata.count"]} >= ${1}
54    Length Should Be  ${resp.dict["Members"]}  ${resp.dict["Members@odata.count"]}
55
56
57Redfish Software Inventory Status Check
58    [Documentation]  Get firmware inventory entries and do health check status.
59    [Tags]  Redfish_Software_Inventory_Status_Check
60
61    ${resp}=  Redfish.Get  /redfish/v1/UpdateService/FirmwareInventory
62
63    # Entries "Members@odata.count": 3,
64    # {'@odata.id': '/redfish/v1/UpdateService/FirmwareInventory/a3522998'}
65    # {'@odata.id': '/redfish/v1/UpdateService/FirmwareInventory/a7c79f71'}
66    # {'@odata.id': '/redfish/v1/UpdateService/FirmwareInventory/ace821ef'}
67
68    FOR  ${entry}  IN RANGE  0  ${resp.dict["Members@odata.count"]}
69      ${resp_resource}=  Redfish.Get  ${resp.dict["Members"][${entry}]["@odata.id"]}
70    # Example:
71    # "Status": {
72    #     "Health": "OK",
73    #     "HealthRollup": "OK",
74    #     "State": "Enabled"
75    # },
76      Should Be Equal As Strings  ${resp_resource.dict["Status"]["Health"]}  OK
77      Should Be Equal As Strings  ${resp_resource.dict["Status"]["HealthRollup"]}  OK
78      Should Be Equal As Strings  ${resp_resource.dict["Status"]["State"]}  Enabled
79    END
80
81
82Verify BMC Version Matches With FirmwareInventory
83    [Documentation]  Verify BMC version from FirmwareInventory same as in manager.
84    [Tags]  Verify_BMC_Version_Matches_With_FirmwareInventory
85
86    ${bmc_manager}=  Redfish.Get  /redfish/v1/Managers/bmc
87    ${manager_bmc_version}=  Get BMC Version
88    # Check for manager version and cat /etc/os-release.
89    Should Be Equal As Strings
90    ...  ${bmc_manager.dict["FirmwareVersion"]}  ${manager_bmc_version.strip('"')}
91
92    ${resp}=  Redfish.Get  /redfish/v1/UpdateService/FirmwareInventory
93
94    # Entries "Members@odata.count": 3,
95    # {'@odata.id': '/redfish/v1/UpdateService/FirmwareInventory/a3522998'}
96    # {'@odata.id': '/redfish/v1/UpdateService/FirmwareInventory/a7c79f71'}
97    # {'@odata.id': '/redfish/v1/UpdateService/FirmwareInventory/ace821ef'}
98
99    ${actual_count}=  Evaluate  ${resp.dict["Members@odata.count"]}-1
100    FOR  ${entry}  IN RANGE  0  ${resp.dict["Members@odata.count"]}
101      ${resp_resource}=  Redfish.Get  ${resp.dict["Members"][${entry}]["@odata.id"]}
102    # 3rd comparison of BMC version and verify FirmwareInventory bmc version.
103    # Example:
104    # "Version": 2.7.0-dev-19-g9b44ea7
105      Exit For Loop If  '${resp_resource.dict["Version"]}' == '${manager_bmc_version.strip('"')}'
106      Run Keyword If  '${entry}' == '${actual_count}'  Fail  BMC version not there in Firmware Inventory
107    END
108
109
110Verify UpdateService Supports TransferProtocol TFTP
111    [Documentation]  Verify update service supported values have TFTP protocol.
112    [Tags]  Verify_UpdateService_Supports_TransferProtocol_TFTP
113
114    # Example:
115    #   "Actions": {
116    #     "#UpdateService.SimpleUpdate": {
117    #       "TransferProtocol@Redfish.AllowableValues": [
118    #         "TFTP"
119    #       ],
120    #       "target": "/redfish/v1/UpdateService/Actions/UpdateService.SimpleUpdate"
121    #     }
122    #  },
123
124    ${allowable_values}=  Redfish.Get Attribute  /redfish/v1/UpdateService  Actions
125
126    Valid Value
127    ...  allowable_values["#UpdateService.SimpleUpdate"]["TransferProtocol@Redfish.AllowableValues"][0]
128    ...  valid_values=['TFTP']
129    Valid Value  allowable_values["#UpdateService.SimpleUpdate"]["target"]
130    ...  valid_values=['/redfish/v1/UpdateService/Actions/UpdateService.SimpleUpdate']
131
132
133Verify Redfish Software Hex ID
134    [Documentation]  Verify BMC images have valid 8-digit hex IDs.
135    [Tags]  Verify_Redfish_Software_Hex_ID
136
137    ${sw_inv_dict}=  Get Software Inventory State
138
139    FOR  ${id_key}  IN  @{sw_inv_dict}
140      ${sw_inv}=  Get From Dictionary  ${sw_inv_dict}  ${id_key}
141      Should Be Equal As Strings  ${id_key}  ${sw_inv['image_id']}
142      Length Should Be  ${sw_inv['image_id']}  ${8}
143      Should Match Regexp  ${sw_inv['image_id']}  [0-9a-f]*
144    END
145
146
147Verify Redfish FirmwareInventory Is Updateable
148    [Documentation]  Verify the redfish firmware inventory path is updateable.
149    [Tags]  Verify_Redfish_FirmwareInventory_Is_Updateable
150
151    ${sw_member_list}=  Redfish_Utils.Get Member List  /redfish/v1/UpdateService/FirmwareInventory
152
153    # sw_member_list:
154    #   [0]:                            /redfish/v1/UpdateService/FirmwareInventory/98744d76
155    #   [1]:                            /redfish/v1/UpdateService/FirmwareInventory/9a8028ec
156    #   [2]:                            /redfish/v1/UpdateService/FirmwareInventory/acc9e073
157
158    FOR  ${sw_member}  IN  @{sw_member_list}
159      ${resp}=  Redfish.Get Attribute  ${sw_member}  Updateable
160
161      # Example:
162      # "Updateable": true,
163
164      Should Be Equal As Strings  ${resp}  True
165    END
166
167
168Check Redfish Functional Image Version Is Same
169    [Documentation]  Verify functional image version is same as in Redfish managers.
170    [Tags]  Check_Redfish_Functional_Image_Version_Is_Same
171    [Template]  Verify Redfish Functional Image Version Is Same
172
173    # image
174    functional_image
175    backup_image
176
177
178Check Redfish Backup Image Version Is Same
179    [Documentation]  Switch to backup image and then verify functional image version
180    ...  is same as in Redfish managers..
181    [Tags]  Check_Redfish_Backup_Image_Version_Is_Same
182    [Template]  Verify Redfish Functional Image Version Is Same
183
184    # image
185    switch_backup_image
186
187
188Verify Redfish Software Image And Firmware Inventory Are Same
189    [Documentation]  Verify the firmware software inventory is same as software images of managers.
190    [Tags]  Verify_Redfish_Software_Image_And_Firmware_Inventory_Are_Same
191
192    # SoftwareImages
193    # /redfish/v1/UpdateService/FirmwareInventory/632c5114
194    # /redfish/v1/UpdateService/FirmwareInventory/e702a011
195
196    ${firmware_inv_path}=  Redfish.Get Properties  ${REDFISH_BASE_URI}Managers/bmc
197    ${firmware_inv_path}=  Get From Dictionary  ${firmware_inv_path}  Links
198    ${sw_image}=  Get From Dictionary  ${firmware_inv_path}  SoftwareImages
199
200    ${sw_member_list}=  Redfish_Utils.Get Member List  /redfish/v1/UpdateService/FirmwareInventory
201
202    FOR  ${sw_inv_path}  IN  @{sw_image}
203      List Should Contain Value  ${sw_member_list}  ${sw_inv_path['@odata.id']}
204    END
205
206    ${num_records_sw_image}=  Get Length  ${sw_image}
207    ${num_records_sw_inv}=  Get Length  ${sw_member_list}
208    Should Be Equal  ${num_records_sw_image}  ${num_records_sw_inv}
209
210
211Verify Redfish BIOS Version
212    [Documentation]  Get host firmware version from system inventory.
213    [Tags]  Verify_Redfish_BIOS_Version
214
215    ${bios_version}=  Redfish.Get Attribute  /redfish/v1/Systems/system/  BiosVersion
216    ${pnor_version}=  Get PNOR Version
217    Should Be Equal  ${pnor_version}  ${bios_version}
218
219
220*** Keywords ***
221
222Test Setup Execution
223    [Documentation]  Do test case setup tasks.
224
225    Redfish.Login
226
227
228Test Teardown Execution
229    [Documentation]  Do the post test teardown.
230
231    FFDC On Test Case Fail
232    Redfish.Logout
233
234
235Verify Firmware Version Same In Firmware Inventory And Managers
236    [Documentation]  Verify the redfish firmware inventory path version is same as Redfish managers.
237
238    # User defined state for software objects.
239    # Note: "Functional" term refers to firmware which system is currently booted with.
240
241    # sw_inv_dict:
242    #   [b9101858]:
243    #     [image_type]:                 BMC update
244    #     [image_id]:                   b9101858
245    #     [functional]:                 True
246    #     [version]:                    2.8.0-dev-150-g04508dc9f
247
248    ${sw_inv_list}=  Get Functional Firmware  BMC image
249    ${sw_inv_dict}=  Get Non Functional Firmware  ${sw_inv_list}  True
250
251    # /redfish/v1/Managers/bmc
252    # "FirmwareVersion": "2.8.0-dev-150-g04508dc9f"
253
254    ${firmware_version}=  Redfish.Get Attribute
255    ...  ${REDFISH_BASE_URI}Managers/bmc  FirmwareVersion
256
257    Should Be Equal  ${sw_inv_dict['version']}  ${firmware_version}
258
259
260Verify Firmware Version Is Not Same In Firmware Inventory And Managers
261    [Documentation]  Verify the redfish firmware inventory path version is not same as
262    ...  Redfish managers for backup image.
263
264    # User defined state for software objects.
265    # Note: "Functional" term refers to firmware which system is currently booted with.
266
267    # sw_inv_dict:
268    #   [b9101858]:
269    #     [image_type]:                 BMC update
270    #     [image_id]:                   b9101858
271    #     [functional]:                 True
272    #     [version]:                    2.8.0-dev-150-g04508dc9f
273
274    ${sw_inv_list}=  Get Functional Firmware  BMC image
275    ${sw_inv_list}=  Get Non Functional Firmware List  ${sw_inv_list}  False
276
277    # /redfish/v1/Managers/bmc
278    # "FirmwareVersion": "2.8.0-dev-150-g04508dc9f"
279
280    ${firmware_version}=  Redfish.Get Attribute
281    ...  ${REDFISH_BASE_URI}Managers/bmc  FirmwareVersion
282
283    FOR  ${sw_inv}  IN  @{sw_inv_list}
284      Should Not Be Equal  ${sw_inv['version']}  ${firmware_version}
285    END
286
287
288Set Backup Firmware Image As Functional
289    [Documentation]  Switch to the backup firmware image to make functional.
290
291    ${state}=  Get Pre Reboot State
292    Rprint Vars  state
293
294    Switch Backup Firmware Image To Functional
295    Wait For Reboot  start_boot_seconds=${state['epoch_seconds']}
296
297
298Verify Redfish Functional Image Version Is Same
299    [Documentation]  Verify the functional image version is same as in firmware inventory and managers.
300    [Arguments]  ${image}
301
302    # Description of argument(s):
303    # image           Fucntional Image or Backup Image
304
305    Verify Firmware Version Same In Firmware Inventory And Managers
306
307    Run Keyword If  'backup_image' == '${image}'
308    ...  Verify Firmware Version Is Not Same In Firmware Inventory And Managers
309
310    Run Keyword If  'switch_backup_image' == '${image}'
311    ...  Run Keywords  Set Backup Firmware Image As Functional  AND
312    ...    Verify Firmware Version Same In Firmware Inventory And Managers  AND
313    ...    Set Backup Firmware Image As Functional  AND
314    ...    Verify Firmware Version Same In Firmware Inventory And Managers
315
316