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  '${image_info["Description"]}' == 'BMC update'
22    ...    Redfish.Get Attribute  /redfish/v1/Managers/bmc  FirmwareVersion
23    ...  ELSE
24    ...    Redfish.Get Attribute  /redfish/v1/Systems/system  BiosVersion
25
26    ${functional}=  Run Keyword And Return Status
27    ...   Should Be Equal  ${sw_functional}  ${image_info["Version"]}
28
29    [Return]  ${functional}
30
31
32Get Software Inventory State
33    [Documentation]  Return dictionary of the image type, version and functional state
34    ...  of the software objects active on the system.
35
36    # User defined state for software objects.
37    # Note: "Functional" term refers to firmware which system is currently booted with.
38    # sw_inv_dict:
39    #   [ace821ef]:
40    #     [image_type]:                 Host update
41    #     [image_id]:                   ace821ef
42    #     [functional]:                 True
43    #     [version]:                    witherspoon-xx.xx.xx.xx
44    #   [b9101858]:
45    #     [image_type]:                 BMC update
46    #     [image_id]:                   b9101858
47    #     [functional]:                 True
48    #     [version]:                    2.8.0-dev-150-g04508dc9f
49    #   [c45eafa5]:
50    #     [image_type]:                 BMC update
51    #     [image_id]:                   c45eafa5
52    #     [functional]:                 False
53    #     [version]:                    2.8.0-dev-149-g1a8df5077
54
55    ${sw_member_list}=  Redfish_Utils.Get Member List  /redfish/v1/UpdateService/FirmwareInventory
56    &{sw_inv_dict}=  Create Dictionary
57
58    # sw_member_list:
59    #   [0]:                            /redfish/v1/UpdateService/FirmwareInventory/98744d76
60    #   [1]:                            /redfish/v1/UpdateService/FirmwareInventory/9a8028ec
61    #   [2]:                            /redfish/v1/UpdateService/FirmwareInventory/acc9e073
62
63    FOR  ${uri_path}  IN  @{sw_member_list}
64        &{tmp_dict}=  Create Dictionary
65        ${image_info}=  Redfish.Get Properties  ${uri_path}
66        Set To Dictionary  ${tmp_dict}  image_type  ${image_info["Description"]}
67        Set To Dictionary  ${tmp_dict}  image_id  ${uri_path.split("/")[-1]}
68        ${functional}=  Get Software Functional State  ${uri_path.split("/")[-1]}
69        Set To Dictionary  ${tmp_dict}  functional  ${functional}
70        Set To Dictionary  ${tmp_dict}  version  ${image_info["Version"]}
71        Set To Dictionary  ${sw_inv_dict}  ${uri_path.split("/")[-1]}  ${tmp_dict}
72    END
73
74    [Return]  &{sw_inv_dict}
75
76
77Get Software Inventory State By Version
78    [Documentation]  Return the software inventory record that matches the given software version.
79    [Arguments]  ${software_version}
80
81    # If no matchine record can be found, return ${EMPTY}.
82
83    # Example of returned data:
84    # software_inventory_record:
85    #   [image_type]:      BMC update
86    #   [image_id]:        1e662ba8
87    #   [functional]:      True
88    #   [version]:         2.8.0-dev-150-g04508dc9f
89
90    # Description of argument(s):
91    # software_version     A BMC or Host version (e.g "2.8.0-dev-150-g04508dc9f").
92
93    ${software_inventory}=  Get Software Inventory State
94    # Filter out entries that don't match the criterion..
95    ${software_inventory}=  Filter Struct  ${software_inventory}  [('version', '${software_version}')]
96    # Convert from dictionary to list.
97    ${software_inventory}=  Get Dictionary Values  ${software_inventory}
98    ${num_records}=  Get Length  ${software_inventory}
99
100    Return From Keyword If  ${num_records} == ${0}  ${EMPTY}
101
102    # Return the first list entry.
103    [Return]  ${software_inventory}[0]
104
105
106Redfish Upload Image And Check Progress State
107    [Documentation]  Code update with ApplyTime.
108    [Arguments]  ${apply_time}
109
110    # Description of argument(s):
111    # apply_time     ApplyTime allowed values (e.g. "OnReset", "Immediate").
112
113    Set ApplyTime  policy=${apply_Time}
114    Redfish Upload Image  ${REDFISH_BASE_URI}UpdateService  ${IMAGE_FILE_PATH}
115
116    ${image_id}=  Get Latest Image ID
117    Rprint Vars  image_id
118
119    Check Image Update Progress State
120    ...  match_state='Disabled', 'Updating'  image_id=${image_id}
121
122    # Wait a few seconds to check if the update progress started.
123    Sleep  5s
124    Check Image Update Progress State
125    ...  match_state='Updating'  image_id=${image_id}
126
127    Wait Until Keyword Succeeds  8 min  20 sec
128    ...  Check Image Update Progress State
129    ...    match_state='Enabled'  image_id=${image_id}
130
131
132Reboot BMC And Verify BMC Image
133    [Documentation]  Reboot or wait for BMC standby post reboot and
134    ...  verify installed image is functional.
135    [Arguments]  ${apply_time}  ${start_boot_seconds}
136
137    # Description of argument(s):
138    # apply_time            ApplyTime allowed values
139    #                       (e.g. "OnReset", "Immediate").
140    # start_boot_seconds    See 'Wait For Reboot' for details.
141
142    Run Keyword if  'OnReset' == '${apply_time}'
143    ...  Run Keyword
144    ...      Redfish OBMC Reboot (off)
145    ...  ELSE
146    ...    Run Keyword
147    ...        Wait For Reboot  start_boot_seconds=${start_boot_seconds}
148    Redfish.Login
149    Redfish Verify BMC Version  ${IMAGE_FILE_PATH}
150
151
152Poweron Host And Verify Host Image
153    [Documentation]  Power on Host and verify installed image is functional.
154    [Arguments]  ${apply_time}
155
156    # Description of argument(s):
157    # apply_time            ApplyTime allowed values
158    #                       (e.g. "OnReset", "Immediate").
159
160    Run Keyword if  'OnReset' == '${apply_time}'
161    ...    Redfish Host Reboot
162    ...  ELSE
163    ...    Wait State  os_running_match_state  10 mins
164    Redfish.Login
165    Redfish Verify Host Version  ${IMAGE_FILE_PATH}
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