| George Keishing | 27bf693 | 2017-08-07 14:30:40 -0500 | [diff] [blame] | 1 | *** Settings *** | 
|  | 2 | Documentation  BMC and PNOR update utilities keywords. | 
|  | 3 |  | 
| Charles Paul Hofer | cef6199 | 2017-08-18 10:14:18 -0500 | [diff] [blame] | 4 | Library     code_update_utils.py | 
|  | 5 | Library     OperatingSystem | 
|  | 6 | Library     String | 
|  | 7 | Variables   ../data/variables.py | 
|  | 8 | Resource    rest_client.robot | 
| George Keishing | 0071549 | 2017-08-18 11:46:37 -0500 | [diff] [blame] | 9 | Resource    openbmc_ffdc.robot | 
| George Keishing | 27bf693 | 2017-08-07 14:30:40 -0500 | [diff] [blame] | 10 |  | 
|  | 11 | *** Keywords *** | 
|  | 12 |  | 
|  | 13 | Get Software Objects | 
|  | 14 | [Documentation]  Get the host software objects and return as a list. | 
|  | 15 | [Arguments]  ${version_type}=${VERSION_PURPOSE_HOST} | 
|  | 16 |  | 
|  | 17 | # Description of argument(s): | 
|  | 18 | # version_type  Either BMC or host version purpose. | 
|  | 19 | #               By default host version purpose string. | 
|  | 20 | #  (e.g. "xyz.openbmc_project.Software.Version.VersionPurpose.BMC" | 
|  | 21 | #        "xyz.openbmc_project.Software.Version.VersionPurpose.Host"). | 
|  | 22 |  | 
|  | 23 | # Example: | 
|  | 24 | # "data": [ | 
|  | 25 | #      "/xyz/openbmc_project/software/f3b29aa8", | 
|  | 26 | #      "/xyz/openbmc_project/software/e49bc78e", | 
|  | 27 | # ], | 
|  | 28 | # Iterate the list and return the host object name path list. | 
|  | 29 |  | 
|  | 30 | ${host_list}=  Create List | 
|  | 31 | ${sw_list}=  Read Properties  ${SOFTWARE_VERSION_URI} | 
|  | 32 |  | 
|  | 33 | :FOR  ${index}  IN  @{sw_list} | 
| George Keishing | d62db0f | 2017-09-13 08:50:33 -0500 | [diff] [blame] | 34 | \  ${attr_purpose}=  Read Software Attribute  ${index}  Purpose | 
| George Keishing | 27bf693 | 2017-08-07 14:30:40 -0500 | [diff] [blame] | 35 | \  Continue For Loop If  '${attr_purpose}' != '${version_type}' | 
|  | 36 | \  Append To List  ${host_list}  ${index} | 
|  | 37 |  | 
| George Keishing | d62db0f | 2017-09-13 08:50:33 -0500 | [diff] [blame] | 38 | [Return]  ${host_list} | 
|  | 39 |  | 
|  | 40 |  | 
|  | 41 | Read Software Attribute | 
|  | 42 | [Documentation]  Return software attribute data. | 
|  | 43 | [Arguments]  ${software_object}  ${attribute_name} | 
|  | 44 |  | 
|  | 45 | # Description of argument(s): | 
|  | 46 | # software_object   Software object path. | 
|  | 47 | #                   (e.g. "/xyz/openbmc_project/software/f3b29aa8"). | 
|  | 48 | # attribute_name    Software object attribute name. | 
|  | 49 |  | 
|  | 50 | ${resp}=  OpenBMC Get Request  ${software_object}/attr/${attribute_name} | 
|  | 51 | ...  quiet=${1} | 
|  | 52 | Return From Keyword If  ${resp.status_code} != ${HTTP_OK} | 
|  | 53 | ${content}=  To JSON  ${resp.content} | 
|  | 54 | [Return]  ${content["data"]} | 
| George Keishing | 27bf693 | 2017-08-07 14:30:40 -0500 | [diff] [blame] | 55 |  | 
|  | 56 |  | 
|  | 57 | Get Host Software Property | 
|  | 58 | [Documentation]  Return a dictionary of host software properties. | 
|  | 59 | [Arguments]  ${host_object} | 
|  | 60 |  | 
|  | 61 | # Description of argument(s): | 
|  | 62 | # host_object  Host software object path. | 
|  | 63 | #             (e.g. "/xyz/openbmc_project/software/f3b29aa8"). | 
|  | 64 |  | 
|  | 65 | ${sw_attributes}=  Read Properties  ${host_object} | 
|  | 66 | [return]  ${sw_attributes} | 
|  | 67 |  | 
| Sweta Potthuri | cd96634 | 2017-09-06 03:41:32 -0500 | [diff] [blame] | 68 | Get Host Software Objects Details | 
|  | 69 | [Documentation]  Return software object details as a list of dictionaries. | 
|  | 70 | [Arguments]  ${quiet}=${QUIET} | 
|  | 71 |  | 
|  | 72 | ${software}=  Create List | 
|  | 73 |  | 
|  | 74 | ${pnor_details}=  Get Software Objects  ${VERSION_PURPOSE_HOST} | 
|  | 75 | :FOR  ${pnor}  IN  @{pnor_details} | 
|  | 76 | \  ${resp}=  OpenBMC Get Request  ${pnor}  quiet=${1} | 
|  | 77 | \  ${json}=  To JSON  ${resp.content} | 
|  | 78 | \  Append To List  ${software}  ${json["data"]} | 
|  | 79 |  | 
|  | 80 | [Return]  ${software} | 
| George Keishing | 27bf693 | 2017-08-07 14:30:40 -0500 | [diff] [blame] | 81 |  | 
|  | 82 | Set Host Software Property | 
|  | 83 | [Documentation]  Set the host software properties of a given object. | 
|  | 84 | [Arguments]  ${host_object}  ${sw_attribute}  ${data} | 
|  | 85 |  | 
|  | 86 | # Description of argument(s): | 
|  | 87 | # host_object   Host software object name. | 
|  | 88 | # sw_attribute  Host software attribute name. | 
|  | 89 | #               (e.g. "Activation", "Priority", "RequestedActivation" etc). | 
|  | 90 | # data          Value to be written. | 
|  | 91 |  | 
|  | 92 | ${args}=  Create Dictionary  data=${data} | 
|  | 93 | Write Attribute  ${host_object}  ${sw_attribute}  data=${args} | 
|  | 94 |  | 
| Charles Paul Hofer | cef6199 | 2017-08-18 10:14:18 -0500 | [diff] [blame] | 95 |  | 
|  | 96 | Set Property To Invalid Value And Verify No Change | 
|  | 97 | [Documentation]  Attempt to set a property and check that the value didn't | 
|  | 98 | ...              change. | 
| Charles Paul Hofer | 9f74d3a | 2017-08-18 09:54:28 -0500 | [diff] [blame] | 99 | [Arguments]  ${property}  ${version_type} | 
| Charles Paul Hofer | cef6199 | 2017-08-18 10:14:18 -0500 | [diff] [blame] | 100 |  | 
|  | 101 | # Description of argument(s): | 
| Charles Paul Hofer | 9f74d3a | 2017-08-18 09:54:28 -0500 | [diff] [blame] | 102 | # property      The property to attempt to set. | 
|  | 103 | # version_type  Either BMC or host version purpose. | 
|  | 104 | #               By default host version purpose string. | 
|  | 105 | #  (e.g. "xyz.openbmc_project.Software.Version.VersionPurpose.BMC" | 
|  | 106 | #        "xyz.openbmc_project.Software.Version.VersionPurpose.Host"). | 
| Charles Paul Hofer | cef6199 | 2017-08-18 10:14:18 -0500 | [diff] [blame] | 107 |  | 
| Charles Paul Hofer | 9f74d3a | 2017-08-18 09:54:28 -0500 | [diff] [blame] | 108 | ${software_objects}=  Get Software Objects  version_type=${version_type} | 
|  | 109 | ${prev_properties}=  Get Host Software Property  @{software_objects}[0] | 
| Charles Paul Hofer | cef6199 | 2017-08-18 10:14:18 -0500 | [diff] [blame] | 110 | Run Keyword And Expect Error  500 != 200 | 
| Charles Paul Hofer | 9f74d3a | 2017-08-18 09:54:28 -0500 | [diff] [blame] | 111 | ...  Set Host Software Property  @{software_objects}[0]  ${property}  foo | 
|  | 112 | ${cur_properties}=  Get Host Software Property  @{software_objects}[0] | 
|  | 113 | Should Be Equal As Strings  &{prev_properties}[${property}] | 
|  | 114 | ...  &{cur_properties}[${property}] | 
| Charles Paul Hofer | cef6199 | 2017-08-18 10:14:18 -0500 | [diff] [blame] | 115 |  | 
|  | 116 |  | 
| Charles Paul Hofer | 42f1746 | 2017-09-12 14:09:32 -0500 | [diff] [blame] | 117 | Set Priority To Invalid Value And Expect Error | 
|  | 118 | [Documentation]  Set the priority of an image to an invalid value and | 
|  | 119 | ...              check that an error was returned. | 
|  | 120 | [Arguments]  ${version_type}  ${priority} | 
|  | 121 |  | 
|  | 122 | # Description of argument(s): | 
|  | 123 | # version_type  Either BMC or host version purpose. | 
|  | 124 | #               (e.g. "xyz.openbmc_project.Software.Version.VersionPurpose.BMC" | 
|  | 125 | #                     "xyz.openbmc_project.Software.Version.VersionPurpose.Host"). | 
|  | 126 | # priority      The priority value to set. Should be an integer outside of | 
|  | 127 | #               the range of 0 through 255. | 
|  | 128 |  | 
|  | 129 | ${images}=  Get Software Objects  version_type=${version_type} | 
|  | 130 | ${num_images}=  Get Length  ${images} | 
|  | 131 | Should Be True  0 < ${num_images} | 
|  | 132 |  | 
|  | 133 | Run Keyword And Expect Error  403 != 200 | 
|  | 134 | ...  Set Host Software Property  @{images}[0]  Priority  ${priority} | 
|  | 135 |  | 
|  | 136 |  | 
| Charles Paul Hofer | cef6199 | 2017-08-18 10:14:18 -0500 | [diff] [blame] | 137 | Upload And Activate Image | 
| Charles Paul Hofer | 9f74d3a | 2017-08-18 09:54:28 -0500 | [diff] [blame] | 138 | [Documentation]  Upload an image to the BMC and activate it with REST. | 
| Charles Paul Hofer | b7842a5 | 2017-09-22 10:11:33 -0500 | [diff] [blame] | 139 | [Arguments]  ${image_file_path}  ${wait}=${1}  ${skip_if_active}=false | 
| Charles Paul Hofer | cef6199 | 2017-08-18 10:14:18 -0500 | [diff] [blame] | 140 |  | 
|  | 141 | # Description of argument(s): | 
| George Keishing | 71c24ed | 2017-09-25 13:11:10 -0500 | [diff] [blame] | 142 | # image_file_path     The path to the image tarball to upload and activate. | 
|  | 143 | # wait                Indicates that this keyword should wait for host or | 
|  | 144 | #                     BMC activation is completed. | 
| Charles Paul Hofer | b7842a5 | 2017-09-22 10:11:33 -0500 | [diff] [blame] | 145 | # skip_if_active      If set to true, will skip the code update if this | 
|  | 146 | #                     image is already on the BMC. | 
| Charles Paul Hofer | cef6199 | 2017-08-18 10:14:18 -0500 | [diff] [blame] | 147 |  | 
|  | 148 | OperatingSystem.File Should Exist  ${image_file_path} | 
|  | 149 | ${image_version}=  Get Version Tar  ${image_file_path} | 
|  | 150 |  | 
|  | 151 | ${image_data}=  OperatingSystem.Get Binary File  ${image_file_path} | 
|  | 152 | Upload Image To BMC  /upload/image  data=${image_data} | 
|  | 153 | ${ret}  ${version_id}=  Verify Image Upload  ${image_version} | 
|  | 154 | Should Be True  ${ret} | 
|  | 155 |  | 
| Charles Paul Hofer | b7842a5 | 2017-09-22 10:11:33 -0500 | [diff] [blame] | 156 | # Verify the image is 'READY' to be activated or if it's already active, | 
|  | 157 | # set priority to 0 and reboot the BMC. | 
| Charles Paul Hofer | cef6199 | 2017-08-18 10:14:18 -0500 | [diff] [blame] | 158 | ${software_state}=  Read Properties  ${SOFTWARE_VERSION_URI}${version_id} | 
| Charles Paul Hofer | b7842a5 | 2017-09-22 10:11:33 -0500 | [diff] [blame] | 159 | ${activation}=  Set Variable  &{software_state}[Activation] | 
|  | 160 | Run Keyword If | 
|  | 161 | ...  '${skip_if_active}' == 'true' and '${activation}' == '${ACTIVE}' | 
|  | 162 | ...  Switch To Active Image And Pass  ${SOFTWARE_VERSION_URI}${version_id} | 
| Charles Paul Hofer | cef6199 | 2017-08-18 10:14:18 -0500 | [diff] [blame] | 163 | Should Be Equal As Strings  &{software_state}[Activation]  ${READY} | 
|  | 164 |  | 
|  | 165 | # Request the image to be activated. | 
|  | 166 | ${args}=  Create Dictionary  data=${REQUESTED_ACTIVE} | 
|  | 167 | Write Attribute  ${SOFTWARE_VERSION_URI}${version_id} | 
|  | 168 | ...  RequestedActivation  data=${args} | 
|  | 169 | ${software_state}=  Read Properties  ${SOFTWARE_VERSION_URI}${version_id} | 
|  | 170 | Should Be Equal As Strings  &{software_state}[RequestedActivation] | 
|  | 171 | ...  ${REQUESTED_ACTIVE} | 
|  | 172 |  | 
| George Keishing | 71c24ed | 2017-09-25 13:11:10 -0500 | [diff] [blame] | 173 | # Does caller want to wait for activation to complete? | 
|  | 174 | Run Keyword If  '${wait}' == '${0}'  Return From Keyword | 
|  | 175 |  | 
| Charles Paul Hofer | cef6199 | 2017-08-18 10:14:18 -0500 | [diff] [blame] | 176 | # Verify code update was successful and Activation state is Active. | 
|  | 177 | Wait For Activation State Change  ${version_id}  ${ACTIVATING} | 
|  | 178 | ${software_state}=  Read Properties  ${SOFTWARE_VERSION_URI}${version_id} | 
|  | 179 | Should Be Equal As Strings  &{software_state}[Activation]  ${ACTIVE} | 
|  | 180 |  | 
|  | 181 |  | 
| Charles Paul Hofer | b7842a5 | 2017-09-22 10:11:33 -0500 | [diff] [blame] | 182 | Switch To Active Image And Pass | 
|  | 183 | [Documentation]  Make the given active image the image running on the BMC | 
|  | 184 | ...              and pass the test. | 
|  | 185 | [Arguments]  ${software_object} | 
|  | 186 |  | 
|  | 187 | # Description of argument(s): | 
|  | 188 | # software_object  Software object path. | 
|  | 189 | #                  (e.g. "/xyz/openbmc_project/software/f3b29aa8"). | 
|  | 190 |  | 
|  | 191 | Set Host Software Property  ${software_object}  Priority  ${0} | 
|  | 192 | OBMC Reboot (off) | 
|  | 193 | Pass Execution  ${software_object} was already on the BMC. | 
|  | 194 |  | 
|  | 195 |  | 
| Charles Paul Hofer | c1fa2bc | 2017-08-18 16:44:03 -0500 | [diff] [blame] | 196 | Activate Image And Verify No Duplicate Priorities | 
|  | 197 | [Documentation]  Upload an image, and then check that no images have the | 
|  | 198 | ...              same priority. | 
|  | 199 | [Arguments]  ${image_file_path}  ${image_purpose} | 
|  | 200 |  | 
|  | 201 | # Description of argument(s): | 
|  | 202 | # image_file_path  The path to the image to upload. | 
|  | 203 | # image_purpose    The purpose in the image's MANIFEST file. | 
|  | 204 |  | 
|  | 205 | Upload And Activate Image  ${image_file_path} | 
|  | 206 | Verify No Duplicate Image Priorities  ${image_purpose} | 
|  | 207 |  | 
|  | 208 |  | 
| Charles Paul Hofer | a567316 | 2017-08-30 09:49:16 -0500 | [diff] [blame] | 209 | Set Same Priority For Multiple Images | 
|  | 210 | [Documentation]  Find two images, set the priorities to be the same, and | 
|  | 211 | ...              verify that the priorities are not the same. | 
|  | 212 | [Arguments]  ${version_purpose} | 
|  | 213 |  | 
|  | 214 | # Description of argument(s): | 
|  | 215 | # version_purpose  Either BMC or host version purpose. | 
|  | 216 | #                  (e.g. "xyz.openbmc_project.Software.Version.VersionPurpose.BMC" | 
|  | 217 | #                        "xyz.openbmc_project.Software.Version.VersionPurpose.Host"). | 
|  | 218 |  | 
|  | 219 | # Make sure we have more than two images. | 
|  | 220 | ${software_objects}=  Get Software Objects  version_type=${version_purpose} | 
|  | 221 | ${num_images}=  Get Length  ${software_objects} | 
|  | 222 | Should Be True  1 < ${num_images} | 
|  | 223 | ...  msg=Only found one image on the BMC with purpose ${version_purpose}. | 
|  | 224 |  | 
|  | 225 | # Set the priority of the second image to the priority of the first. | 
|  | 226 | ${properties}=  Get Host Software Property  @{software_objects}[0] | 
|  | 227 | Set Host Software Property  @{software_objects}[1]  Priority | 
|  | 228 | ...  &{properties}[Priority] | 
|  | 229 | Verify No Duplicate Image Priorities  ${version_purpose} | 
|  | 230 |  | 
|  | 231 | # Set the priority of the first image back to what it was before | 
|  | 232 | Set Host Software Property  @{software_objects}[0]  Priority | 
|  | 233 | ...  &{properties}[Priority] | 
|  | 234 |  | 
|  | 235 |  | 
| Charles Paul Hofer | da24d0a | 2017-08-09 15:03:40 -0500 | [diff] [blame] | 236 | Delete Software Object | 
|  | 237 | [Documentation]  Deletes an image from the BMC. | 
|  | 238 | [Arguments]  ${software_object} | 
|  | 239 |  | 
|  | 240 | # Description of argument(s): | 
|  | 241 | # software_object  The URI to the software image to delete. | 
|  | 242 |  | 
|  | 243 | ${arglist}=  Create List | 
|  | 244 | ${args}=  Create Dictionary  data=${arglist} | 
|  | 245 | ${resp}=  OpenBMC Post Request  ${software_object}/action/delete | 
|  | 246 | ...  data=${args} | 
|  | 247 | Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK} | 
| Charles Paul Hofer | cef6199 | 2017-08-18 10:14:18 -0500 | [diff] [blame] | 248 |  | 
|  | 249 |  | 
|  | 250 | Delete Image And Verify | 
|  | 251 | [Documentation]  Delete an image from the BMC and verify that it was | 
|  | 252 | ...              removed from software and the /tmp/images directory. | 
|  | 253 | [Arguments]  ${software_object}  ${version_type} | 
|  | 254 |  | 
|  | 255 | # Description of argument(s): | 
|  | 256 | # software_object        The URI of the software object to delete. | 
|  | 257 | # version_type  The type of the software object, e.g. | 
|  | 258 | #               xyz.openbmc_project.Software.Version.VersionPurpose.Host | 
|  | 259 | #               or xyz.openbmc_project.Software.Version.VersionPurpose.BMC. | 
|  | 260 |  | 
| Charles Paul Hofer | 9f74d3a | 2017-08-18 09:54:28 -0500 | [diff] [blame] | 261 | Log To Console  Deleteing ${software_object} | 
|  | 262 |  | 
| Charles Paul Hofer | cef6199 | 2017-08-18 10:14:18 -0500 | [diff] [blame] | 263 | # Delete the image. | 
|  | 264 | Delete Software Object  ${software_object} | 
|  | 265 | # TODO: If/when we don't have to delete twice anymore, take this out | 
|  | 266 | Run Keyword And Ignore Error  Delete Software Object  ${software_object} | 
|  | 267 |  | 
|  | 268 | # Verify that it's gone from software. | 
|  | 269 | ${software_objects}=  Get Software Objects  version_type=${version_type} | 
|  | 270 | Should Not Contain  ${software_objects}  ${software_object} | 
|  | 271 |  | 
|  | 272 | # Check that there is no file in the /tmp/images directory. | 
|  | 273 | ${image_id}=  Fetch From Right  ${software_object}  / | 
|  | 274 | BMC Execute Command | 
|  | 275 | ...  [ ! -d "/tmp/images/${image_id}" ] | 
| George Keishing | 0071549 | 2017-08-18 11:46:37 -0500 | [diff] [blame] | 276 |  | 
|  | 277 |  | 
|  | 278 | Check Error And Collect FFDC | 
|  | 279 | [Documentation]  Collect FFDC if error log exists. | 
|  | 280 |  | 
|  | 281 | ${status}=  Run Keyword And Return Status  Error Logs Should Not Exist | 
|  | 282 | Run Keyword If  '${status}' == 'False'  FFDC | 
|  | 283 | Delete Error Logs |