blob: 2815b655f9e980217d96730a07f727ac7f743b4c [file] [log] [blame]
George Keishing27bf6932017-08-07 14:30:40 -05001*** Settings ***
2Documentation BMC and PNOR update utilities keywords.
3
Charles Paul Hofercef61992017-08-18 10:14:18 -05004Library code_update_utils.py
5Library OperatingSystem
6Library String
George Keishing81ae45b2017-09-28 14:05:04 -05007Library utilities.py
Charles Paul Hofercef61992017-08-18 10:14:18 -05008Variables ../data/variables.py
Charles Paul Hofere0e17802017-09-21 09:19:33 -05009Resource boot_utils.robot
Charles Paul Hofercef61992017-08-18 10:14:18 -050010Resource rest_client.robot
George Keishing00715492017-08-18 11:46:37 -050011Resource openbmc_ffdc.robot
George Keishing27bf6932017-08-07 14:30:40 -050012
13*** Keywords ***
14
15Get Software Objects
16 [Documentation] Get the host software objects and return as a list.
17 [Arguments] ${version_type}=${VERSION_PURPOSE_HOST}
18
19 # Description of argument(s):
20 # version_type Either BMC or host version purpose.
21 # By default host version purpose string.
22 # (e.g. "xyz.openbmc_project.Software.Version.VersionPurpose.BMC"
23 # "xyz.openbmc_project.Software.Version.VersionPurpose.Host").
24
25 # Example:
26 # "data": [
27 # "/xyz/openbmc_project/software/f3b29aa8",
28 # "/xyz/openbmc_project/software/e49bc78e",
29 # ],
30 # Iterate the list and return the host object name path list.
31
32 ${host_list}= Create List
33 ${sw_list}= Read Properties ${SOFTWARE_VERSION_URI}
34
35 :FOR ${index} IN @{sw_list}
George Keishingd62db0f2017-09-13 08:50:33 -050036 \ ${attr_purpose}= Read Software Attribute ${index} Purpose
George Keishing27bf6932017-08-07 14:30:40 -050037 \ Continue For Loop If '${attr_purpose}' != '${version_type}'
38 \ Append To List ${host_list} ${index}
39
George Keishingd62db0f2017-09-13 08:50:33 -050040 [Return] ${host_list}
41
42
43Read Software Attribute
44 [Documentation] Return software attribute data.
45 [Arguments] ${software_object} ${attribute_name}
46
47 # Description of argument(s):
48 # software_object Software object path.
49 # (e.g. "/xyz/openbmc_project/software/f3b29aa8").
50 # attribute_name Software object attribute name.
51
52 ${resp}= OpenBMC Get Request ${software_object}/attr/${attribute_name}
53 ... quiet=${1}
54 Return From Keyword If ${resp.status_code} != ${HTTP_OK}
55 ${content}= To JSON ${resp.content}
56 [Return] ${content["data"]}
George Keishing27bf6932017-08-07 14:30:40 -050057
58
George Keishingfe4ebd22017-09-12 06:05:22 -050059Get Software Objects Id
60 [Documentation] Get the software objects id and return as a list.
61 [Arguments] ${version_type}=${VERSION_PURPOSE_HOST}
62
63 # Description of argument(s):
64 # version_type Either BMC or host version purpose.
65 # By default host version purpose string.
66 # (e.g. "xyz.openbmc_project.Software.Version.VersionPurpose.BMC"
67 # "xyz.openbmc_project.Software.Version.VersionPurpose.Host").
68
69 ${sw_id_list}= Create List
70 ${sw_list}= Get Software Objects ${version_type}
71
72 :FOR ${index} IN @{sw_list}
73 \ Append To List ${sw_id_list} ${index.rsplit('/', 1)[1]}
74
75 [Return] ${sw_id_list}
76
77
George Keishing27bf6932017-08-07 14:30:40 -050078Get Host Software Property
79 [Documentation] Return a dictionary of host software properties.
80 [Arguments] ${host_object}
81
82 # Description of argument(s):
83 # host_object Host software object path.
84 # (e.g. "/xyz/openbmc_project/software/f3b29aa8").
85
86 ${sw_attributes}= Read Properties ${host_object}
87 [return] ${sw_attributes}
88
Sweta Potthuricd966342017-09-06 03:41:32 -050089Get Host Software Objects Details
90 [Documentation] Return software object details as a list of dictionaries.
91 [Arguments] ${quiet}=${QUIET}
92
93 ${software}= Create List
94
95 ${pnor_details}= Get Software Objects ${VERSION_PURPOSE_HOST}
96 :FOR ${pnor} IN @{pnor_details}
97 \ ${resp}= OpenBMC Get Request ${pnor} quiet=${1}
98 \ ${json}= To JSON ${resp.content}
99 \ Append To List ${software} ${json["data"]}
100
101 [Return] ${software}
George Keishing27bf6932017-08-07 14:30:40 -0500102
103Set Host Software Property
104 [Documentation] Set the host software properties of a given object.
105 [Arguments] ${host_object} ${sw_attribute} ${data}
106
107 # Description of argument(s):
108 # host_object Host software object name.
109 # sw_attribute Host software attribute name.
110 # (e.g. "Activation", "Priority", "RequestedActivation" etc).
111 # data Value to be written.
112
113 ${args}= Create Dictionary data=${data}
114 Write Attribute ${host_object} ${sw_attribute} data=${args}
115
Charles Paul Hofercef61992017-08-18 10:14:18 -0500116
117Set Property To Invalid Value And Verify No Change
118 [Documentation] Attempt to set a property and check that the value didn't
119 ... change.
Charles Paul Hofer9f74d3a2017-08-18 09:54:28 -0500120 [Arguments] ${property} ${version_type}
Charles Paul Hofercef61992017-08-18 10:14:18 -0500121
122 # Description of argument(s):
Charles Paul Hofer9f74d3a2017-08-18 09:54:28 -0500123 # property The property to attempt to set.
124 # version_type Either BMC or host version purpose.
125 # By default host version purpose string.
126 # (e.g. "xyz.openbmc_project.Software.Version.VersionPurpose.BMC"
127 # "xyz.openbmc_project.Software.Version.VersionPurpose.Host").
Charles Paul Hofercef61992017-08-18 10:14:18 -0500128
Charles Paul Hofer9f74d3a2017-08-18 09:54:28 -0500129 ${software_objects}= Get Software Objects version_type=${version_type}
130 ${prev_properties}= Get Host Software Property @{software_objects}[0]
Charles Paul Hofercef61992017-08-18 10:14:18 -0500131 Run Keyword And Expect Error 500 != 200
Charles Paul Hofer9f74d3a2017-08-18 09:54:28 -0500132 ... Set Host Software Property @{software_objects}[0] ${property} foo
133 ${cur_properties}= Get Host Software Property @{software_objects}[0]
134 Should Be Equal As Strings &{prev_properties}[${property}]
135 ... &{cur_properties}[${property}]
Charles Paul Hofercef61992017-08-18 10:14:18 -0500136
137
Charles Paul Hofer42f17462017-09-12 14:09:32 -0500138Set Priority To Invalid Value And Expect Error
139 [Documentation] Set the priority of an image to an invalid value and
140 ... check that an error was returned.
141 [Arguments] ${version_type} ${priority}
142
143 # Description of argument(s):
144 # version_type Either BMC or host version purpose.
145 # (e.g. "xyz.openbmc_project.Software.Version.VersionPurpose.BMC"
146 # "xyz.openbmc_project.Software.Version.VersionPurpose.Host").
147 # priority The priority value to set. Should be an integer outside of
148 # the range of 0 through 255.
149
150 ${images}= Get Software Objects version_type=${version_type}
151 ${num_images}= Get Length ${images}
152 Should Be True 0 < ${num_images}
153
154 Run Keyword And Expect Error 403 != 200
155 ... Set Host Software Property @{images}[0] Priority ${priority}
156
157
Charles Paul Hofercef61992017-08-18 10:14:18 -0500158Upload And Activate Image
Charles Paul Hofer9f74d3a2017-08-18 09:54:28 -0500159 [Documentation] Upload an image to the BMC and activate it with REST.
Charles Paul Hoferb7842a52017-09-22 10:11:33 -0500160 [Arguments] ${image_file_path} ${wait}=${1} ${skip_if_active}=false
Charles Paul Hofercef61992017-08-18 10:14:18 -0500161
162 # Description of argument(s):
George Keishing71c24ed2017-09-25 13:11:10 -0500163 # image_file_path The path to the image tarball to upload and activate.
164 # wait Indicates that this keyword should wait for host or
165 # BMC activation is completed.
Charles Paul Hoferb7842a52017-09-22 10:11:33 -0500166 # skip_if_active If set to true, will skip the code update if this
167 # image is already on the BMC.
Charles Paul Hofercef61992017-08-18 10:14:18 -0500168
169 OperatingSystem.File Should Exist ${image_file_path}
170 ${image_version}= Get Version Tar ${image_file_path}
171
172 ${image_data}= OperatingSystem.Get Binary File ${image_file_path}
173 Upload Image To BMC /upload/image data=${image_data}
174 ${ret} ${version_id}= Verify Image Upload ${image_version}
175 Should Be True ${ret}
176
Charles Paul Hoferb7842a52017-09-22 10:11:33 -0500177 # Verify the image is 'READY' to be activated or if it's already active,
178 # set priority to 0 and reboot the BMC.
Charles Paul Hofercef61992017-08-18 10:14:18 -0500179 ${software_state}= Read Properties ${SOFTWARE_VERSION_URI}${version_id}
Charles Paul Hoferb7842a52017-09-22 10:11:33 -0500180 ${activation}= Set Variable &{software_state}[Activation]
181 Run Keyword If
182 ... '${skip_if_active}' == 'true' and '${activation}' == '${ACTIVE}'
183 ... Switch To Active Image And Pass ${SOFTWARE_VERSION_URI}${version_id}
Charles Paul Hofercef61992017-08-18 10:14:18 -0500184 Should Be Equal As Strings &{software_state}[Activation] ${READY}
185
186 # Request the image to be activated.
187 ${args}= Create Dictionary data=${REQUESTED_ACTIVE}
188 Write Attribute ${SOFTWARE_VERSION_URI}${version_id}
189 ... RequestedActivation data=${args}
190 ${software_state}= Read Properties ${SOFTWARE_VERSION_URI}${version_id}
191 Should Be Equal As Strings &{software_state}[RequestedActivation]
192 ... ${REQUESTED_ACTIVE}
193
George Keishing71c24ed2017-09-25 13:11:10 -0500194 # Does caller want to wait for activation to complete?
Charles Paul Hofere0e17802017-09-21 09:19:33 -0500195 Return From Keyword If '${wait}' == '${0}' ${version_id}
George Keishing71c24ed2017-09-25 13:11:10 -0500196
Charles Paul Hofercef61992017-08-18 10:14:18 -0500197 # Verify code update was successful and Activation state is Active.
198 Wait For Activation State Change ${version_id} ${ACTIVATING}
199 ${software_state}= Read Properties ${SOFTWARE_VERSION_URI}${version_id}
200 Should Be Equal As Strings &{software_state}[Activation] ${ACTIVE}
201
Charles Paul Hofere0e17802017-09-21 09:19:33 -0500202 [Return] ${version_id}
203
Charles Paul Hofercef61992017-08-18 10:14:18 -0500204
Charles Paul Hofere09408d2017-10-02 14:42:38 -0500205Attempt To Reboot BMC During Image Activation
206 [Documentation] Attempt to reboot the BMC while an image is activating and
207 ... check that the BMC ignores the reboot command and finishes
208 ... activation.
209 [Arguments] ${image_file_path}
210
211 # Description of argument(s):
212 # image_file_path Path to the image to update to.
213
214 # Attempt to reboot during activation.
215 ${version_id}= Upload And Activate Image ${image_file_path}
216 ... wait=${0}
217 BMC Execute Command /sbin/reboot
218
219 # Wait for activation to finish.
220 Wait For Activation State Change ${version_id} ${ACTIVATING}
221 ${software_state}= Read Properties ${SOFTWARE_VERSION_URI}${version_id}
222 Should Be Equal As Strings &{software_state}[Activation] ${ACTIVE}
223
224 # Verify the image priority is 0.
225 ${priority}= Read Software Attribute ${SOFTWARE_VERSION_URI}${version_id}
226 ... Priority
227 Should Be Equal ${priority} ${0}
228
229
Charles Paul Hoferb7842a52017-09-22 10:11:33 -0500230Switch To Active Image And Pass
231 [Documentation] Make the given active image the image running on the BMC
232 ... and pass the test.
233 [Arguments] ${software_object}
234
235 # Description of argument(s):
236 # software_object Software object path.
237 # (e.g. "/xyz/openbmc_project/software/f3b29aa8").
238
239 Set Host Software Property ${software_object} Priority ${0}
240 OBMC Reboot (off)
241 Pass Execution ${software_object} was already on the BMC.
242
243
Charles Paul Hoferc1fa2bc2017-08-18 16:44:03 -0500244Activate Image And Verify No Duplicate Priorities
245 [Documentation] Upload an image, and then check that no images have the
246 ... same priority.
247 [Arguments] ${image_file_path} ${image_purpose}
248
249 # Description of argument(s):
250 # image_file_path The path to the image to upload.
251 # image_purpose The purpose in the image's MANIFEST file.
252
253 Upload And Activate Image ${image_file_path}
254 Verify No Duplicate Image Priorities ${image_purpose}
255
256
Charles Paul Hofera5673162017-08-30 09:49:16 -0500257Set Same Priority For Multiple Images
258 [Documentation] Find two images, set the priorities to be the same, and
259 ... verify that the priorities are not the same.
260 [Arguments] ${version_purpose}
261
262 # Description of argument(s):
263 # version_purpose Either BMC or host version purpose.
264 # (e.g. "xyz.openbmc_project.Software.Version.VersionPurpose.BMC"
265 # "xyz.openbmc_project.Software.Version.VersionPurpose.Host").
266
267 # Make sure we have more than two images.
268 ${software_objects}= Get Software Objects version_type=${version_purpose}
269 ${num_images}= Get Length ${software_objects}
270 Should Be True 1 < ${num_images}
271 ... msg=Only found one image on the BMC with purpose ${version_purpose}.
272
273 # Set the priority of the second image to the priority of the first.
274 ${properties}= Get Host Software Property @{software_objects}[0]
275 Set Host Software Property @{software_objects}[1] Priority
276 ... &{properties}[Priority]
277 Verify No Duplicate Image Priorities ${version_purpose}
278
279 # Set the priority of the first image back to what it was before
280 Set Host Software Property @{software_objects}[0] Priority
281 ... &{properties}[Priority]
282
283
Charles Paul Hoferda24d0a2017-08-09 15:03:40 -0500284Delete Software Object
285 [Documentation] Deletes an image from the BMC.
286 [Arguments] ${software_object}
287
288 # Description of argument(s):
289 # software_object The URI to the software image to delete.
290
291 ${arglist}= Create List
292 ${args}= Create Dictionary data=${arglist}
293 ${resp}= OpenBMC Post Request ${software_object}/action/delete
294 ... data=${args}
295 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK}
Charles Paul Hofercef61992017-08-18 10:14:18 -0500296
297
298Delete Image And Verify
299 [Documentation] Delete an image from the BMC and verify that it was
300 ... removed from software and the /tmp/images directory.
301 [Arguments] ${software_object} ${version_type}
302
303 # Description of argument(s):
304 # software_object The URI of the software object to delete.
305 # version_type The type of the software object, e.g.
306 # xyz.openbmc_project.Software.Version.VersionPurpose.Host
307 # or xyz.openbmc_project.Software.Version.VersionPurpose.BMC.
308
Charles Paul Hofer9f74d3a2017-08-18 09:54:28 -0500309 Log To Console Deleteing ${software_object}
310
Charles Paul Hofercef61992017-08-18 10:14:18 -0500311 # Delete the image.
312 Delete Software Object ${software_object}
313 # TODO: If/when we don't have to delete twice anymore, take this out
314 Run Keyword And Ignore Error Delete Software Object ${software_object}
315
316 # Verify that it's gone from software.
317 ${software_objects}= Get Software Objects version_type=${version_type}
318 Should Not Contain ${software_objects} ${software_object}
319
320 # Check that there is no file in the /tmp/images directory.
321 ${image_id}= Fetch From Right ${software_object} /
322 BMC Execute Command
323 ... [ ! -d "/tmp/images/${image_id}" ]
George Keishing00715492017-08-18 11:46:37 -0500324
325
326Check Error And Collect FFDC
327 [Documentation] Collect FFDC if error log exists.
328
329 ${status}= Run Keyword And Return Status Error Logs Should Not Exist
330 Run Keyword If '${status}' == 'False' FFDC
331 Delete Error Logs
Charles Paul Hofere43fb2f2017-09-26 15:36:18 -0500332
333
334Verify Running BMC Image
335 [Documentation] Verify that the version on the BMC is the same as the
336 ... version in the given image.
337 [Arguments] ${image_file_path}
338
339 # Description of argument(s):
340 # image_file_path Path to the BMC image tarball.
341
342 ${tar_version}= Get Version Tar ${image_file_path}
343 ${bmc_version}= Get BMC Version
344 ${bmc_version}= Remove String ${bmc_version} "
345 Should Be Equal ${tar_version} ${bmc_version}
346
347
348Verify Running Host Image
349 [Documentation] Verify that the version of the PNOR image that is on the
350 ... BMC is the same as the one in the given image.
351 [Arguments] ${image_file_path}
352
353 # Description of argument(s):
354 # image_file_path Path to the PNOR image tarball.
355
356 ${tar_version}= Get Version Tar ${image_file_path}
357 ${pnor_version}= Get PNOR Version
358 Should Be Equal ${tar_version} ${pnor_version}
Charles Paul Hofere0e17802017-09-21 09:19:33 -0500359
Charles Paul Hofere0e17802017-09-21 09:19:33 -0500360Reset Network Interface During Code Update
361 [Documentation] Disable and re-enable the network while doing code update.
362 [Arguments] ${image_file_path} ${reboot}
363
364 # Reseting the network will be done via the serial console.
365 #
366 # Description of argument(s):
367 # image_file_path Path to the image file to update to.
368 # reboot If set to true, will reboot the BMC after the code
369 # update is finished.
370
371 ${version_id}= Upload And Activate Image ${image_file_path} wait=${0}
372 Reset Network Interface
373
374 # Verify code update was successful and 'Activation' state is 'Active'.
375 Wait For Activation State Change ${version_id} ${ACTIVATING}
376 ${software_state}= Read Properties ${SOFTWARE_VERSION_URI}${version_id}
377 Should Be Equal As Strings &{software_state}[Activation] ${ACTIVE}
378
379 Run Keyword If '${reboot}' OBMC Reboot (off) stack_mode=normal
380
381
382Reset Network Interface
383 [Documentation] Turn the ethernet network interface off and then on again
384 ... through the serial console.
385
386 Import Resource ${CURDIR}/oem/ibm/serial_console_client.robot
387 Set Library Search Order SSHLibrary Telnet
388 Execute Command On Serial Console ifconfig eth0 down
389 Sleep 30s
390 Execute Command On Serial Console ifconfig eth0 up
George Keishing81ae45b2017-09-28 14:05:04 -0500391
392
393Get Least Value Priority Image
394 [Documentation] Find the least value in "Priority" attribute and return.
395 [Arguments] ${version_type}
396
397 # Description of argument(s):
398 # version_type Either BMC or host version purpose.
399
400 ${priority_value_list}= Create List
401 ${sw_list}= Get Software Objects version_type=${version_type}
402
403 :FOR ${index} IN @{sw_list}
404 \ ${priority_value}=
405 ... Read Software Attribute ${index} Priority
406 \ Append To List ${priority_value_list} ${priority_value}
407
408 ${min_value}= Min List Value ${priority_value_list}
409
410 [Return] ${min_value}