1*** Settings ***
2Documentation   Redfish BMC and PNOR software utilities keywords.
3
4Library         code_update_utils.py
5Library         gen_robot_valid.py
6Library         tftp_update_utils.py
7Resource        bmc_redfish_utils.robot
8Resource        boot_utils.robot
9
10*** Keywords ***
11
12Get Software Functional State
13    [Documentation]  Return functional or active state of the software (i.e. True/False).
14    [Arguments]  ${image_id}
15
16    # Description of argument(s):
17    # image_id   The image ID (e.g. "acc9e073").
18
19    ${image_info}=  Redfish.Get Properties  /redfish/v1/UpdateService/FirmwareInventory/${image_id}
20
21    ${sw_functional}=  Run Keyword If
22    ...   '${image_info["Description"]}' == 'BMC image' or '${image_info["Description"]}' == 'BMC update'
23    ...    Redfish.Get Attribute  /redfish/v1/Managers/bmc  FirmwareVersion
24    ...  ELSE
25    ...    Redfish.Get Attribute  /redfish/v1/Systems/system  BiosVersion
26
27    ${functional}=  Run Keyword And Return Status
28    ...   Should Be Equal  ${sw_functional}  ${image_info["Version"]}
29
30    [Return]  ${functional}
31
32
33Get Software Inventory State
34    [Documentation]  Return dictionary of the image type, version and functional state
35    ...  of the software objects active on the system.
36
37    # User defined state for software objects.
38    # Note: "Functional" term refers to firmware which system is currently booted with.
39    # sw_inv_dict:
40    #   [ace821ef]:
41    #     [image_type]:                 Host update
42    #     [image_id]:                   ace821ef
43    #     [functional]:                 True
44    #     [version]:                    witherspoon-xx.xx.xx.xx
45    #   [b9101858]:
46    #     [image_type]:                 BMC update
47    #     [image_id]:                   b9101858
48    #     [functional]:                 True
49    #     [version]:                    2.8.0-dev-150-g04508dc9f
50    #   [c45eafa5]:
51    #     [image_type]:                 BMC update
52    #     [image_id]:                   c45eafa5
53    #     [functional]:                 False
54    #     [version]:                    2.8.0-dev-149-g1a8df5077
55
56    ${sw_member_list}=  Redfish_Utils.Get Member List  /redfish/v1/UpdateService/FirmwareInventory
57    &{sw_inv_dict}=  Create Dictionary
58
59    # sw_member_list:
60    #   [0]:                            /redfish/v1/UpdateService/FirmwareInventory/98744d76
61    #   [1]:                            /redfish/v1/UpdateService/FirmwareInventory/9a8028ec
62    #   [2]:                            /redfish/v1/UpdateService/FirmwareInventory/acc9e073
63
64    FOR  ${uri_path}  IN  @{sw_member_list}
65        &{tmp_dict}=  Create Dictionary
66        ${image_info}=  Redfish.Get Properties  ${uri_path}
67        Set To Dictionary  ${tmp_dict}  image_type  ${image_info["Description"]}
68        Set To Dictionary  ${tmp_dict}  image_id  ${uri_path.split("/")[-1]}
69        ${functional}=  Get Software Functional State  ${uri_path.split("/")[-1]}
70        Set To Dictionary  ${tmp_dict}  functional  ${functional}
71        Set To Dictionary  ${tmp_dict}  version  ${image_info["Version"]}
72        Set To Dictionary  ${sw_inv_dict}  ${uri_path.split("/")[-1]}  ${tmp_dict}
73    END
74
75    [Return]  &{sw_inv_dict}
76
77
78Get Software Inventory State By Version
79    [Documentation]  Return the software inventory record that matches the given software version.
80    [Arguments]  ${software_version}
81
82    # If no matchine record can be found, return ${EMPTY}.
83
84    # Example of returned data:
85    # software_inventory_record:
86    #   [image_type]:      BMC update
87    #   [image_id]:        1e662ba8
88    #   [functional]:      True
89    #   [version]:         2.8.0-dev-150-g04508dc9f
90
91    # Description of argument(s):
92    # software_version     A BMC or Host version (e.g "2.8.0-dev-150-g04508dc9f").
93
94    ${software_inventory}=  Get Software Inventory State
95    # Filter out entries that don't match the criterion..
96    ${software_inventory}=  Filter Struct  ${software_inventory}  [('version', '${software_version}')]
97    # Convert from dictionary to list.
98    ${software_inventory}=  Get Dictionary Values  ${software_inventory}
99    ${num_records}=  Get Length  ${software_inventory}
100
101    Return From Keyword If  ${num_records} == ${0}  ${EMPTY}
102
103    # Return the first list entry.
104    [Return]  ${software_inventory}[0]
105
106
107Get BMC Functional Firmware
108    [Documentation]  Get BMC functional firmware details.
109
110    ${sw_inv}=  Get Functional Firmware  BMC update
111    ${sw_inv}=  Get Non Functional Firmware  ${sw_inv}  True
112
113    [Return]  ${sw_inv}
114
115
116Get Functional Firmware
117    [Documentation]  Get all the BMC firmware details.
118    [Arguments]  ${image_type}
119
120    # Description of argument(s):
121    # image_type    Image value can be either BMC update or Host update.
122
123    ${software_inventory}=  Get Software Inventory State
124    ${bmc_inv}=  Get BMC Firmware  ${image_type}  ${software_inventory}
125
126    [Return]  ${bmc_inv}
127
128
129Get Non Functional Firmware
130    [Documentation]  Get BMC non functional firmware details.
131    [Arguments]  ${sw_inv}  ${functional_state}
132
133    # Description of argument(s):
134    # sw_inv            This dictionary contains all the BMC firmware details.
135    # functional_state  Functional state can be either True or False.
136
137    ${resp}=  Filter Struct  ${sw_inv}  [('functional', ${functional_state})]
138    ${list_inv_dict}=  Get Dictionary Values  ${resp}
139
140    [Return]  ${list_inv_dict}[0]
141
142
143Redfish Upload Image And Check Progress State
144    [Documentation]  Code update with ApplyTime.
145
146    Redfish Upload Image  ${REDFISH_BASE_URI}UpdateService  ${IMAGE_FILE_PATH}
147
148    ${image_id}=  Get Latest Image ID
149    Rprint Vars  image_id
150
151    ${manifest}  ${stderr}  ${rc}=  BMC Execute Command  cat /tmp/images/${image_id}/MANIFEST
152    Rprint Vars  manifest
153
154    Wait Until Keyword Succeeds  1 min  05 sec
155    ...  Check Image Update Progress State  match_state='Disabled', 'Updating'  image_id=${image_id}
156
157    # Wait a few seconds to check if the update progress started.
158    Sleep  5s
159
160    Check Image Update Progress State
161    ...  match_state='Updating'  image_id=${image_id}
162
163    Wait Until Keyword Succeeds  8 min  20 sec
164    ...  Check Image Update Progress State
165    ...    match_state='Enabled'  image_id=${image_id}
166
167
168Get Host Power State
169    [Documentation]  Get host power state.
170    [Arguments]  ${quiet}=0
171
172    # Description of arguments:
173    # quiet    Indicates whether results should be printed.
174
175    ${state}=  Redfish.Get Attribute
176    ...  ${REDFISH_BASE_URI}Systems/system  PowerState
177    Rqprint Vars  state
178
179    [Return]  ${state}
180
181
182Check Host Power State
183    [Documentation]  Check that the machine's host state matches
184    ...  the caller's required host state.
185    [Arguments]  ${match_state}
186
187    # Description of argument(s):
188    # match_state    The expected state. This may be one or more
189    #                comma-separated values (e.g. "On", "Off").
190    #                If the actual state matches any of the
191    #                states named in this argument,
192    #                this keyword passes.
193
194    ${state}=  Get Host Power State
195    Rvalid Value  state  valid_values=[${match_state}]
196
197
198Get System Firmware Details
199    [Documentation]  Return dictionary of system firmware details.
200
201    # {
202    #    FirmwareVersion: 2.8.0-dev-1067-gdc66ce1c5,
203    #    BiosVersion: witherspoon-XXX-XX.X-X
204    # }
205
206    ${firmware_version}=  Redfish Get BMC Version
207    ${bios_version}=  Redfish Get Host Version
208
209    &{sys_firmware_dict}=  Create Dictionary
210    Set To Dictionary
211    ...  ${sys_firmware_dict}  FirmwareVersion  ${firmware_version}  BiosVersion  ${bios_version}
212    Rprint Vars  sys_firmware_dict
213
214    [Return]  &{sys_firmware_dict}
215
216
217Switch Backup Firmware Image To Functional
218   [Documentation]  Switch the backup firmware image to make functional.
219
220   ${sw_inv}=  Get Functional Firmware  BMC image
221   ${nonfunctional_sw_inv}=  Get Non Functional Firmware  ${sw_inv}  False
222
223   ${firmware_inv_path}=  Set Variable  /redfish/v1/UpdateService/FirmwareInventory/${nonfunctional_sw_inv['image_id']}
224
225   # Below URI, change to backup image and reset the BMC.
226   Redfish.Patch  /redfish/v1/Managers/bmc
227   ...  body={'Links': {'ActiveSoftwareImage': {'@odata.id': '${firmware_inv_path}'}}}
228
229