blob: 886edaa9a1993aa161c001faee6983e1b78f6e8a [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}'
Charles Paul Hoferb420c572017-10-31 09:24:12 -0500183 ... Run Keywords
184 ... Set Host Software Property ${SOFTWARE_VERSION_URI}${version_id}
185 ... Priority ${0}
186 ... AND
187 ... Return From Keyword
188
Charles Paul Hofercef61992017-08-18 10:14:18 -0500189 Should Be Equal As Strings &{software_state}[Activation] ${READY}
190
191 # Request the image to be activated.
192 ${args}= Create Dictionary data=${REQUESTED_ACTIVE}
193 Write Attribute ${SOFTWARE_VERSION_URI}${version_id}
194 ... RequestedActivation data=${args}
195 ${software_state}= Read Properties ${SOFTWARE_VERSION_URI}${version_id}
196 Should Be Equal As Strings &{software_state}[RequestedActivation]
197 ... ${REQUESTED_ACTIVE}
198
George Keishing71c24ed2017-09-25 13:11:10 -0500199 # Does caller want to wait for activation to complete?
Charles Paul Hofere0e17802017-09-21 09:19:33 -0500200 Return From Keyword If '${wait}' == '${0}' ${version_id}
George Keishing71c24ed2017-09-25 13:11:10 -0500201
Charles Paul Hofercef61992017-08-18 10:14:18 -0500202 # Verify code update was successful and Activation state is Active.
203 Wait For Activation State Change ${version_id} ${ACTIVATING}
204 ${software_state}= Read Properties ${SOFTWARE_VERSION_URI}${version_id}
205 Should Be Equal As Strings &{software_state}[Activation] ${ACTIVE}
206
Charles Paul Hofere0e17802017-09-21 09:19:33 -0500207 [Return] ${version_id}
208
Charles Paul Hofercef61992017-08-18 10:14:18 -0500209
Charles Paul Hofere09408d2017-10-02 14:42:38 -0500210Attempt To Reboot BMC During Image Activation
211 [Documentation] Attempt to reboot the BMC while an image is activating and
212 ... check that the BMC ignores the reboot command and finishes
213 ... activation.
214 [Arguments] ${image_file_path}
215
216 # Description of argument(s):
217 # image_file_path Path to the image to update to.
218
219 # Attempt to reboot during activation.
220 ${version_id}= Upload And Activate Image ${image_file_path}
221 ... wait=${0}
George Keishingfd346d12017-11-20 23:23:01 -0600222 ${resp}= OpenBMC Get Request ${SOFTWARE_VERSION_URI}${version_id}
223 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK}
Charles Paul Hofere09408d2017-10-02 14:42:38 -0500224
George Keishingfd346d12017-11-20 23:23:01 -0600225 OBMC Reboot (off)
Charles Paul Hofere09408d2017-10-02 14:42:38 -0500226
George Keishingfd346d12017-11-20 23:23:01 -0600227 ${resp}= OpenBMC Get Request ${SOFTWARE_VERSION_URI}${version_id}
228 Should Be Equal As Strings ${resp.status_code} ${HTTP_NOT_FOUND}
Charles Paul Hofere09408d2017-10-02 14:42:38 -0500229
230
Charles Paul Hoferc1fa2bc2017-08-18 16:44:03 -0500231Activate Image And Verify No Duplicate Priorities
232 [Documentation] Upload an image, and then check that no images have the
233 ... same priority.
234 [Arguments] ${image_file_path} ${image_purpose}
235
236 # Description of argument(s):
237 # image_file_path The path to the image to upload.
238 # image_purpose The purpose in the image's MANIFEST file.
239
George Keishing72373f82017-11-20 09:18:41 -0600240 Upload And Activate Image ${image_file_path} skip_if_active=true
Charles Paul Hoferc1fa2bc2017-08-18 16:44:03 -0500241 Verify No Duplicate Image Priorities ${image_purpose}
242
243
Charles Paul Hofera5673162017-08-30 09:49:16 -0500244Set Same Priority For Multiple Images
245 [Documentation] Find two images, set the priorities to be the same, and
246 ... verify that the priorities are not the same.
247 [Arguments] ${version_purpose}
248
249 # Description of argument(s):
250 # version_purpose Either BMC or host version purpose.
251 # (e.g. "xyz.openbmc_project.Software.Version.VersionPurpose.BMC"
252 # "xyz.openbmc_project.Software.Version.VersionPurpose.Host").
253
254 # Make sure we have more than two images.
255 ${software_objects}= Get Software Objects version_type=${version_purpose}
256 ${num_images}= Get Length ${software_objects}
257 Should Be True 1 < ${num_images}
258 ... msg=Only found one image on the BMC with purpose ${version_purpose}.
259
260 # Set the priority of the second image to the priority of the first.
261 ${properties}= Get Host Software Property @{software_objects}[0]
262 Set Host Software Property @{software_objects}[1] Priority
263 ... &{properties}[Priority]
264 Verify No Duplicate Image Priorities ${version_purpose}
265
266 # Set the priority of the first image back to what it was before
267 Set Host Software Property @{software_objects}[0] Priority
268 ... &{properties}[Priority]
269
270
Charles Paul Hoferda24d0a2017-08-09 15:03:40 -0500271Delete Software Object
272 [Documentation] Deletes an image from the BMC.
273 [Arguments] ${software_object}
274
275 # Description of argument(s):
276 # software_object The URI to the software image to delete.
277
278 ${arglist}= Create List
279 ${args}= Create Dictionary data=${arglist}
280 ${resp}= OpenBMC Post Request ${software_object}/action/delete
281 ... data=${args}
282 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK}
Charles Paul Hofercef61992017-08-18 10:14:18 -0500283
284
285Delete Image And Verify
286 [Documentation] Delete an image from the BMC and verify that it was
287 ... removed from software and the /tmp/images directory.
288 [Arguments] ${software_object} ${version_type}
289
290 # Description of argument(s):
291 # software_object The URI of the software object to delete.
292 # version_type The type of the software object, e.g.
293 # xyz.openbmc_project.Software.Version.VersionPurpose.Host
294 # or xyz.openbmc_project.Software.Version.VersionPurpose.BMC.
295
Charles Paul Hofer9f74d3a2017-08-18 09:54:28 -0500296 Log To Console Deleteing ${software_object}
297
Charles Paul Hofercef61992017-08-18 10:14:18 -0500298 # Delete the image.
299 Delete Software Object ${software_object}
300 # TODO: If/when we don't have to delete twice anymore, take this out
301 Run Keyword And Ignore Error Delete Software Object ${software_object}
302
303 # Verify that it's gone from software.
304 ${software_objects}= Get Software Objects version_type=${version_type}
305 Should Not Contain ${software_objects} ${software_object}
306
307 # Check that there is no file in the /tmp/images directory.
308 ${image_id}= Fetch From Right ${software_object} /
309 BMC Execute Command
310 ... [ ! -d "/tmp/images/${image_id}" ]
George Keishing00715492017-08-18 11:46:37 -0500311
312
Charles Paul Hofere8dc5252017-10-10 13:50:18 -0500313Delete All Non Running BMC Images
314 [Documentation] Delete all BMC images that are not running on the BMC.
315
316 @{datalist}= Create List
317 ${data}= Create Dictionary data=@{datalist}
318 Call Method ${SOFTWARE_VERSION_URI} DeleteAll data=${data}
319
320
George Keishing00715492017-08-18 11:46:37 -0500321Check Error And Collect FFDC
322 [Documentation] Collect FFDC if error log exists.
323
324 ${status}= Run Keyword And Return Status Error Logs Should Not Exist
325 Run Keyword If '${status}' == 'False' FFDC
326 Delete Error Logs
Charles Paul Hofere43fb2f2017-09-26 15:36:18 -0500327
328
329Verify Running BMC Image
330 [Documentation] Verify that the version on the BMC is the same as the
331 ... version in the given image.
332 [Arguments] ${image_file_path}
333
334 # Description of argument(s):
335 # image_file_path Path to the BMC image tarball.
336
337 ${tar_version}= Get Version Tar ${image_file_path}
338 ${bmc_version}= Get BMC Version
339 ${bmc_version}= Remove String ${bmc_version} "
340 Should Be Equal ${tar_version} ${bmc_version}
341
342
343Verify Running Host Image
344 [Documentation] Verify that the version of the PNOR image that is on the
345 ... BMC is the same as the one in the given image.
346 [Arguments] ${image_file_path}
347
348 # Description of argument(s):
349 # image_file_path Path to the PNOR image tarball.
350
351 ${tar_version}= Get Version Tar ${image_file_path}
352 ${pnor_version}= Get PNOR Version
353 Should Be Equal ${tar_version} ${pnor_version}
Charles Paul Hofere0e17802017-09-21 09:19:33 -0500354
George Keishing81ae45b2017-09-28 14:05:04 -0500355
356Get Least Value Priority Image
357 [Documentation] Find the least value in "Priority" attribute and return.
358 [Arguments] ${version_type}
359
360 # Description of argument(s):
361 # version_type Either BMC or host version purpose.
362
363 ${priority_value_list}= Create List
364 ${sw_list}= Get Software Objects version_type=${version_type}
365
366 :FOR ${index} IN @{sw_list}
367 \ ${priority_value}=
368 ... Read Software Attribute ${index} Priority
369 \ Append To List ${priority_value_list} ${priority_value}
370
371 ${min_value}= Min List Value ${priority_value_list}
372
373 [Return] ${min_value}
George Keishingfb762032017-11-14 11:18:21 -0600374
375
376Enable Field Mode And Verify Unmount
377 [Documentation] Enable field mode and check that /usr/local is unmounted.
378
379 # After running, /xyz/openbmc_project/software should look like this:
380 # /xyz/openbmc_project/software
381 # {
382 # "FieldModeEnabled": 1,
383 # "associations": [
384 # [
385 # "active",
386 # "software_version",
387 # "/xyz/openbmc_project/software/fcf8e182"
388 # ],
389 # [
390 # "functional",
391 # "software_version",
392 # "/xyz/openbmc_project/software/fcf8e182"
393 # ]
394 # ]
395 # }
396
397 ${args}= Create Dictionary data=${1}
398 Write Attribute ${SOFTWARE_VERSION_URI} FieldModeEnabled data=${args}
399 Sleep 5s
400 BMC Execute Command [ ! -d "/usr/local/share" ]
401
George Keishingef97f3f2017-11-15 10:32:59 -0600402
403Disable Field Mode And Verify Unmount
404 [Documentation] Disable field mode, unmask usr local mount and reboot.
405
406 BMC Execute Command /sbin/fw_setenv fieldmode
407 BMC Execute Command /bin/systemctl unmask usr-local.mount
408 OBMC Reboot (off) quiet=${1}
409 BMC Execute Command [ -d "/usr/local/share" ]
410
George Keishing13b8a212017-11-17 00:35:13 -0600411
412Field Mode Should Be Enabled
413 [Documentation] Check that field mode is enabled.
414
415 ${value}= Read Attribute ${SOFTWARE_VERSION_URI} FieldModeEnabled
416 Should Be True ${value} ${1}