1*** Settings *** 2Library Collections 3Library String 4Library RequestsLibrary.RequestsKeywords 5Library OperatingSystem 6Resource ../lib/resource.txt 7Library ../lib/disable_warning_urllib.py 8 9*** Variables *** 10# Response codes 11${HTTP_CONTINUE} 100 12${HTTP_SWITCHING_PROTOCOLS} 101 13${HTTP_PROCESSING} 102 14${HTTP_OK} 200 15${HTTP_CREATED} 201 16${HTTP_ACCEPTED} 202 17${HTTP_NON_AUTHORITATIVE_INFORMATION} 203 18${HTTP_NO_CONTENT} 204 19${HTTP_RESET_CONTENT} 205 20${HTTP_PARTIAL_CONTENT} 206 21${HTTP_MULTI_STATUS} 207 22${HTTP_IM_USED} 226 23${HTTP_MULTIPLE_CHOICES} 300 24${HTTP_MOVED_PERMANENTLY} 301 25${HTTP_FOUND} 302 26${HTTP_SEE_OTHER} 303 27${HTTP_NOT_MODIFIED} 304 28${HTTP_USE_PROXY} 305 29${HTTP_TEMPORARY_REDIRECT} 307 30${HTTP_BAD_REQUEST} 400 31${HTTP_UNAUTHORIZED} 401 32${HTTP_PAYMENT_REQUIRED} 402 33${HTTP_FORBIDDEN} 403 34${HTTP_NOT_FOUND} 404 35${HTTP_METHOD_NOT_ALLOWED} 405 36${HTTP_NOT_ACCEPTABLE} 406 37${HTTP_PROXY_AUTHENTICATION_REQUIRED} 407 38${HTTP_REQUEST_TIMEOUT} 408 39${HTTP_CONFLICT} 409 40${HTTP_GONE} 410 41${HTTP_LENGTH_REQUIRED} 411 42${HTTP_PRECONDITION_FAILED} 412 43${HTTP_REQUEST_ENTITY_TOO_LARGE} 413 44${HTTP_REQUEST_URI_TOO_LONG} 414 45${HTTP_UNSUPPORTED_MEDIA_TYPE} 415 46${HTTP_REQUESTED_RANGE_NOT_SATISFIABLE} 416 47${HTTP_EXPECTATION_FAILED} 417 48${HTTP_UNPROCESSABLE_ENTITY} 422 49${HTTP_LOCKED} 423 50${HTTP_FAILED_DEPENDENCY} 424 51${HTTP_UPGRADE_REQUIRED} 426 52${HTTP_INTERNAL_SERVER_ERROR} 500 53${HTTP_NOT_IMPLEMENTED} 501 54${HTTP_BAD_GATEWAY} 502 55${HTTP_SERVICE_UNAVAILABLE} 503 56${HTTP_GATEWAY_TIMEOUT} 504 57${HTTP_HTTP_VERSION_NOT_SUPPORTED} 505 58${HTTP_INSUFFICIENT_STORAGE} 507 59${HTTP_NOT_EXTENDED} 510 60# Assign default value to QUIET for programs which may not define it. 61${QUIET} ${0} 62 63*** Keywords *** 64OpenBMC Get Request 65 [Documentation] Do REST GET request and return the result. 66 # Example result data: 67 # Response code:200, Content:{ 68 # "data": [ 69 # "/xyz/openbmc_project/state/host0", 70 # "/xyz/openbmc_project/state/chassis0", 71 # "/xyz/openbmc_project/state/bmc0" 72 # ], 73 # "message": "200 OK", 74 # "status": "ok" 75 # } 76 [Arguments] ${uri} ${timeout}=30 ${quiet}=${QUIET} &{kwargs} 77 # Description of argument(s): 78 # uri The URI to establish connection with 79 # (e.g. '/xyz/openbmc_project/software/'). 80 # timeout Timeout in seconds to establish connection with URI. 81 # quiet If enabled, turns off logging to console. 82 # kwargs Any additional arguments to be passed directly to the 83 # Get Request call. For example, the caller might 84 # set kwargs as follows: 85 # ${kwargs}= Create Dictionary allow_redirect=${True}. 86 87 Initialize OpenBMC ${timeout} quiet=${quiet} 88 ${base_uri}= Catenate SEPARATOR= ${DBUS_PREFIX} ${uri} 89 Run Keyword If '${quiet}' == '${0}' Log Request method=Get 90 ... base_uri=${base_uri} args=&{kwargs} 91 ${ret}= Get Request openbmc ${base_uri} &{kwargs} timeout=${timeout} 92 Run Keyword If '${quiet}' == '${0}' Log Response ${ret} 93 Delete All Sessions 94 [Return] ${ret} 95 96OpenBMC Post Request 97 [Documentation] Do REST POST request and return the result. 98 # Example result data: 99 # <Response [200]> 100 [Arguments] ${uri} ${timeout}=10 ${quiet}=${QUIET} &{kwargs} 101 # Description of argument(s): 102 # uri The URI to establish connection with 103 # (e.g. '/xyz/openbmc_project/software/'). 104 # timeout Timeout in seconds to establish connection with URI. 105 # quiet If enabled, turns off logging to console. 106 # kwargs Any additional arguments to be passed directly to the 107 # Post Request call. For example, the caller might 108 # set kwargs as follows: 109 # ${kwargs}= Create Dictionary allow_redirect=${True}. 110 111 Initialize OpenBMC ${timeout} quiet=${quiet} 112 ${base_uri}= Catenate SEPARATOR= ${DBUS_PREFIX} ${uri} 113 ${headers}= Create Dictionary Content-Type=application/json 114 set to dictionary ${kwargs} headers ${headers} 115 Run Keyword If '${quiet}' == '${0}' Log Request method=Post 116 ... base_uri=${base_uri} args=&{kwargs} 117 ${ret}= Post Request openbmc ${base_uri} &{kwargs} timeout=${timeout} 118 Run Keyword If '${quiet}' == '${0}' Log Response ${ret} 119 Delete All Sessions 120 [Return] ${ret} 121 122OpenBMC Put Request 123 [Documentation] Do REST PUT request on the resource identified by the URI. 124 [Arguments] ${uri} ${timeout}=10 &{kwargs} 125 # Description of argument(s): 126 # uri The URI to establish connection with 127 # (e.g. '/xyz/openbmc_project/software/'). 128 # timeout Timeout in seconds to establish connection with URI. 129 # kwargs Arguments passed to the REST call. 130 # kwargs Any additional arguments to be passed directly to the 131 # Put Request call. For example, the caller might 132 # set kwargs as follows: 133 # ${kwargs}= Create Dictionary allow_redirect=${True}. 134 135 Initialize OpenBMC ${timeout} 136 ${base_uri}= Catenate SEPARATOR= ${DBUS_PREFIX} ${uri} 137 ${headers}= Create Dictionary Content-Type=application/json 138 set to dictionary ${kwargs} headers ${headers} 139 Log Request method=Put base_uri=${base_uri} args=&{kwargs} 140 ${ret}= Put Request openbmc ${base_uri} &{kwargs} timeout=${timeout} 141 Log Response ${ret} 142 Delete All Sessions 143 [Return] ${ret} 144 145OpenBMC Delete Request 146 [Documentation] Do REST request to delete the resource identified by the 147 ... URI. 148 [Arguments] ${uri} ${timeout}=10 &{kwargs} 149 # Description of argument(s): 150 # uri The URI to establish connection with 151 # (e.g. '/xyz/openbmc_project/software/'). 152 # timeout Timeout in seconds to establish connection with URI. 153 # kwargs Any additional arguments to be passed directly to the 154 # Delete Request call. For example, the caller might 155 # set kwargs as follows: 156 # ${kwargs}= Create Dictionary allow_redirect=${True}. 157 158 Initialize OpenBMC ${timeout} 159 ${base_uri}= Catenate SEPARATOR= ${DBUS_PREFIX} ${uri} 160 Log Request method=Delete base_uri=${base_uri} args=&{kwargs} 161 ${ret}= Delete Request openbmc ${base_uri} &{kwargs} timeout=${timeout} 162 Log Response ${ret} 163 Delete All Sessions 164 [Return] ${ret} 165 166Initialize OpenBMC 167 [Documentation] Do a REST login connection within specified time. 168 [Arguments] ${timeout}=20 ${quiet}=${1} 169 ... ${OPENBMC_USERNAME}=${OPENBMC_USERNAME} 170 ... ${OPENBMC_PASSWORD}=${OPENBMC_PASSWORD} 171 172 # Description of argument(s): 173 # timeout REST login attempt time out. 174 # quiet Suppress console log if set. 175 176 # TODO : Task to revert this changes openbmc/openbmc-test-automation#532 177 # This will retry at 20 second interval. 178 Wait Until Keyword Succeeds 40 sec 20 sec 179 ... Post Login Request ${timeout} ${quiet} 180 ... ${OPENBMC_USERNAME} ${OPENBMC_PASSWORD} 181 182Post Login Request 183 [Documentation] Do REST login request. 184 [Arguments] ${timeout}=20 ${quiet}=${1} 185 ... ${OPENBMC_USERNAME}=${OPENBMC_USERNAME} 186 ... ${OPENBMC_PASSWORD}=${OPENBMC_PASSWORD} 187 188 # Description of argument(s): 189 # timeout REST login attempt time out. 190 # quiet Suppress console log if set. 191 192 Create Session openbmc ${AUTH_URI} timeout=${timeout} max_retries=3 193 ${headers}= Create Dictionary Content-Type=application/json 194 @{credentials}= Create List ${OPENBMC_USERNAME} ${OPENBMC_PASSWORD} 195 ${data}= create dictionary data=@{credentials} 196 ${status} ${resp}= Run Keyword And Ignore Error Post Request openbmc 197 ... /login data=${data} headers=${headers} 198 199 Should Be Equal ${status} PASS msg=${resp} 200 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 201 202Log Out OpenBMC 203 [Documentation] Log out of the openbmc REST session. 204 205 ${headers}= Create Dictionary Content-Type=application/json 206 ${data}= Create dictionary data=@{EMPTY} 207 208 # If there is no active sesion it will throw the following exception 209 # "Non-existing index or alias 'openbmc'" 210 ${resp}= Post Request openbmc 211 ... /logout data=${data} headers=${headers} 212 213 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 214 ... msg=${resp} 215 216Log Request 217 [Documentation] Log the specific REST URI, method name on the console. 218 [Arguments] &{kwargs} 219 ${msg}= Catenate SEPARATOR= URI: ${AUTH_URI} ${kwargs["base_uri"]} 220 ... , method: ${kwargs["method"]} , args: ${kwargs["args"]} 221 Logging ${msg} console=True 222 223Log Response 224 [Documentation] Log the response code on the console. 225 [Arguments] ${resp} 226 ${msg}= Catenate SEPARATOR= Response code: ${resp.status_code} 227 ... , Content: ${resp.content} 228 Logging ${msg} console=True 229 230Logging 231 [Documentation] Log the specified message on the console. 232 [Arguments] ${msg} ${console}=default False 233 Log ${msg} console=True 234 235Read Attribute 236 [Documentation] Retrieve attribute value from URI and return result. 237 # Example result data for the attribute 'FieldModeEnabled' in 238 # "/xyz/openbmc_project/software/attr/" : 239 # 0 240 [Arguments] ${uri} ${attr} ${timeout}=10 ${quiet}=${QUIET} 241 ... ${expected_value}=${EMPTY} 242 # Description of argument(s): 243 # uri URI of the object that the attribute lives on 244 # (e.g. '/xyz/openbmc_project/software/'). 245 # attr Name of the attribute (e.g. 'FieldModeEnabled'). 246 # timeout Timeout for the REST call. 247 # quiet If enabled, turns off logging to console. 248 # expected_value If this argument is not empty, the retrieved value 249 # must match this value. 250 251 ${resp}= OpenBMC Get Request ${uri}/attr/${attr} timeout=${timeout} 252 ... quiet=${quiet} 253 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 254 ${content}= To Json ${resp.content} 255 Run Keyword If '${expected_value}' != '${EMPTY}' 256 ... Should Be Equal As Strings ${expected_value} ${content["data"]} 257 [Return] ${content["data"]} 258 259 260Write Attribute 261 [Documentation] Write a D-Bus attribute with REST. 262 [Arguments] ${uri} ${attr} ${timeout}=10 ${verify}=${FALSE} 263 ... ${expected_value}=${EMPTY} &{kwargs} 264 265 # Description of argument(s): 266 # uri URI of the object that the attribute lives on 267 # (e.g. '/xyz/openbmc_project/software/'). 268 # attr Name of the attribute (e.g. 'FieldModeEnabled'). 269 # timeout Timeout for the REST call. 270 # verify If set to ${TRUE}, the attribute will be read back to 271 # ensure that its value is set to ${verify_attr}. 272 # expected_value Only used if verify is set to ${TRUE}. The value that 273 # ${attr} should be set to. This defaults to 274 # ${kwargs['data']. There are cases where the caller 275 # expects some other value in which case this value can 276 # be explicitly specified. 277 # kwargs Arguments passed to the REST call. This should always 278 # contain the value to set the property to at the 'data' 279 # key (e.g. data={"data": 1}). 280 281 ${base_uri}= Catenate SEPARATOR= ${DBUS_PREFIX} ${uri} 282 ${resp}= Openbmc Put Request ${base_uri}/attr/${attr} 283 ... timeout=${timeout} &{kwargs} 284 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 285 286 # Verify the attribute was set correctly if the caller requested it. 287 Return From Keyword If ${verify} == ${FALSE} 288 289 ${expected_value}= Set Variable If '${expected_value}' == '${EMPTY}' 290 ... ${kwargs['data']['data']} ${expected_value} 291 ${value}= Read Attribute ${uri} ${attr} 292 Should Be Equal ${value} ${expected_value} 293 294Read Properties 295 [Documentation] Read data part of the URI object and return result. 296 # Example result data: 297 # [u'/xyz/openbmc_project/software/cf7bf9d5', 298 # u'/xyz/openbmc_project/software/5ecb8b2c', 299 # u'/xyz/openbmc_project/software/active', 300 # u'/xyz/openbmc_project/software/functional'] 301 [Arguments] ${uri} ${timeout}=10 ${quiet}=${QUIET} 302 # Description of argument(s): 303 # uri URI of the object 304 # (e.g. '/xyz/openbmc_project/software/'). 305 # timeout Timeout for the REST call. 306 # quiet If enabled, turns off logging to console. 307 308 ${resp}= OpenBMC Get Request ${uri} timeout=${timeout} quiet=${quiet} 309 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 310 ${content}= To Json ${resp.content} 311 [Return] ${content["data"]} 312 313Call Method 314 [Documentation] Invoke the specific REST service method. 315 [Arguments] ${uri} ${method} ${timeout}=10 ${quiet}=${QUIET} &{kwargs} 316 # Description of arguments: 317 # uri The URI to establish connection with 318 # (e.g. '/xyz/openbmc_project/software/'). 319 # timeout Timeout in seconds to establish connection with URI. 320 # quiet If enabled, turns off logging to console. 321 # kwargs Arguments passed to the REST call. 322 323 ${base_uri}= Catenate SEPARATOR= ${DBUS_PREFIX} ${uri} 324 ${resp}= OpenBmc Post Request ${base_uri}/action/${method} 325 ... timeout=${timeout} quiet=${quiet} &{kwargs} 326 [Return] ${resp} 327 328Upload Image To BMC 329 [Documentation] Upload image to BMC device using REST POST operation. 330 [Arguments] ${uri} ${timeout}=10 ${quiet}=${1} &{kwargs} 331 332 # Description of argument(s): 333 # uri URI for uploading image via REST e.g. "/upload/image". 334 # timeout Time allocated for the REST command to return status 335 # (specified in Robot Framework Time Format e.g. "3 mins"). 336 # quiet If enabled, turns off logging to console. 337 # kwargs A dictionary keys/values to be passed directly to 338 # Post Request. 339 340 Initialize OpenBMC ${timeout} quiet=${quiet} 341 ${base_uri}= Catenate SEPARATOR= ${DBUS_PREFIX} ${uri} 342 ${headers}= Create Dictionary Content-Type=application/octet-stream 343 ... Accept=application/octet-stream 344 Set To Dictionary ${kwargs} headers ${headers} 345 Run Keyword If '${quiet}' == '${0}' Log Request method=Post 346 ... base_uri=${base_uri} args=&{kwargs} 347 ${ret}= Post Request openbmc ${base_uri} &{kwargs} timeout=${timeout} 348 Run Keyword If '${quiet}' == '${0}' Log Response ${ret} 349 Should Be Equal As Strings ${ret.status_code} ${HTTP_OK} 350 Delete All Sessions 351