1*** Settings *** 2Library Collections 3Library String 4Library RequestsLibrary.RequestsKeywords 5Library OperatingSystem 6Resource resource.robot 7Library disable_warning_urllib.py 8Library utils.py 9Library gen_misc.py 10Library var_funcs.py 11Resource rest_response_code.robot 12 13*** Variables *** 14# Assign default value to QUIET for programs which may not define it. 15${QUIET} ${0} 16 17${XAUTH_TOKEN} ${EMPTY} 18 19*** Keywords *** 20OpenBMC Get Request 21 [Documentation] Do REST GET request and return the result. 22 # Example result data: 23 # Response code:200, Content:{ 24 # "data": [ 25 # "/xyz/openbmc_project/state/host0", 26 # "/xyz/openbmc_project/state/chassis0", 27 # "/xyz/openbmc_project/state/bmc0" 28 # ], 29 # "message": "200 OK", 30 # "status": "ok" 31 # } 32 [Arguments] ${uri} ${timeout}=30 ${quiet}=${QUIET} &{kwargs} 33 # Description of argument(s): 34 # uri The URI to establish connection with 35 # (e.g. '/xyz/openbmc_project/software/'). 36 # timeout Timeout in seconds to establish connection with URI. 37 # quiet If enabled, turns off logging to console. 38 # kwargs Any additional arguments to be passed directly to the 39 # Get Request call. For example, the caller might 40 # set kwargs as follows: 41 # ${kwargs}= Create Dictionary allow_redirect=${True}. 42 43 Initialize OpenBMC ${timeout} quiet=${quiet} 44 45 ${base_uri}= Catenate SEPARATOR= ${DBUS_PREFIX} ${uri} 46 ${headers}= Create Dictionary Content-Type=application/octet-stream 47 ... X-Auth-Token=${XAUTH_TOKEN} Accept=application/octet-stream 48 Set To Dictionary ${kwargs} headers ${headers} 49 Run Keyword If '${quiet}' == '${0}' Log Request method=Get 50 ... base_uri=${base_uri} args=&{kwargs} 51 ${ret}= Get Request openbmc ${base_uri} &{kwargs} timeout=${timeout} 52 Run Keyword If '${quiet}' == '${0}' Log Response ${ret} 53 Delete All Sessions 54 [Return] ${ret} 55 56OpenBMC Post Request 57 [Documentation] Do REST POST request and return the result. 58 # Example result data: 59 # <Response [200]> 60 [Arguments] ${uri} ${timeout}=10 ${quiet}=${QUIET} &{kwargs} 61 # Description of argument(s): 62 # uri The URI to establish connection with 63 # (e.g. '/xyz/openbmc_project/software/'). 64 # timeout Timeout in seconds to establish connection with URI. 65 # quiet If enabled, turns off logging to console. 66 # kwargs Any additional arguments to be passed directly to the 67 # Post Request call. For example, the caller might 68 # set kwargs as follows: 69 # ${kwargs}= Create Dictionary allow_redirect=${True}. 70 71 Initialize OpenBMC ${timeout} quiet=${quiet} 72 ${base_uri}= Catenate SEPARATOR= ${DBUS_PREFIX} ${uri} 73 ${headers}= Create Dictionary Content-Type=application/json 74 ... X-Auth-Token=${XAUTH_TOKEN} 75 set to dictionary ${kwargs} headers ${headers} 76 Run Keyword If '${quiet}' == '${0}' Log Request method=Post 77 ... base_uri=${base_uri} args=&{kwargs} 78 ${ret}= Post Request openbmc ${base_uri} &{kwargs} timeout=${timeout} 79 Run Keyword If '${quiet}' == '${0}' Log Response ${ret} 80 Delete All Sessions 81 [Return] ${ret} 82 83OpenBMC Put Request 84 [Documentation] Do REST PUT request on the resource identified by the URI. 85 [Arguments] ${uri} ${timeout}=10 &{kwargs} 86 # Description of argument(s): 87 # uri The URI to establish connection with 88 # (e.g. '/xyz/openbmc_project/software/'). 89 # timeout Timeout in seconds to establish connection with URI. 90 # kwargs Arguments passed to the REST call. 91 # kwargs Any additional arguments to be passed directly to the 92 # Put Request call. For example, the caller might 93 # set kwargs as follows: 94 # ${kwargs}= Create Dictionary allow_redirect=${True}. 95 96 Initialize OpenBMC ${timeout} 97 ${base_uri}= Catenate SEPARATOR= ${DBUS_PREFIX} ${uri} 98 ${headers}= Create Dictionary Content-Type=application/json 99 ... X-Auth-Token=${XAUTH_TOKEN} 100 set to dictionary ${kwargs} headers ${headers} 101 Log Request method=Put base_uri=${base_uri} args=&{kwargs} 102 ${ret}= Put Request openbmc ${base_uri} &{kwargs} timeout=${timeout} 103 Log Response ${ret} 104 Delete All Sessions 105 [Return] ${ret} 106 107OpenBMC Delete Request 108 [Documentation] Do REST request to delete the resource identified by the 109 ... URI. 110 [Arguments] ${uri} ${timeout}=10 ${quiet}=${QUIET} &{kwargs} 111 # Description of argument(s): 112 # uri The URI to establish connection with 113 # (e.g. '/xyz/openbmc_project/software/'). 114 # timeout Timeout in seconds to establish connection with URI. 115 # quiet If enabled, turns off logging to console. 116 # kwargs Any additional arguments to be passed directly to the 117 # Delete Request call. For example, the caller might 118 # set kwargs as follows: 119 # ${kwargs}= Create Dictionary allow_redirect=${True}. 120 121 Initialize OpenBMC ${timeout} 122 ${base_uri}= Catenate SEPARATOR= ${DBUS_PREFIX} ${uri} 123 ${headers}= Create Dictionary Content-Type=application/json 124 ... X-Auth-Token=${XAUTH_TOKEN} 125 Set To Dictionary ${kwargs} headers ${headers} 126 Run Keyword If '${quiet}' == '${0}' Log Request method=Delete 127 ... base_uri=${base_uri} args=&{kwargs} 128 ${ret}= Delete Request openbmc ${base_uri} &{kwargs} timeout=${timeout} 129 Run Keyword If '${quiet}' == '${0}' Log Response ${ret} 130 Delete All Sessions 131 [Return] ${ret} 132 133Initialize OpenBMC 134 [Documentation] Do a REST login connection within specified time. 135 [Arguments] ${timeout}=20 ${quiet}=${1} 136 ... ${rest_username}=${REST_USERNAME} 137 ... ${rest_password}=${REST_PASSWORD} 138 139 # Description of argument(s): 140 # timeout REST login attempt time out. 141 # quiet Suppress console log if set. 142 # rest_username The REST username. 143 # rest_password The REST password. 144 145 ${bmcweb_status}= Run Keyword And Return Status BMC Web Login Request 146 ... ${timeout} ${rest_username} ${rest_password} 147 148 Return From Keyword If ${bmcweb_status} == ${True} 149 150 # This will retry at 20 second interval. 151 Wait Until Keyword Succeeds 40 sec 20 sec 152 ... Post Login Request ${timeout} ${quiet} 153 ... ${rest_username} ${rest_password} 154 155 156BMC Web Login Request 157 [Documentation] Do BMC web-based login. 158 [Arguments] ${timeout}=20 ${rest_username}=${REST_USERNAME} 159 ... ${rest_password}=${REST_PASSWORD} 160 161 # Description of argument(s): 162 # timeout REST login attempt time out. 163 # rest_username The REST username. 164 # rest_password The REST password. 165 166 Create Session openbmc ${AUTH_URI} timeout=${timeout} 167 168 ${headers}= Create Dictionary Content-Type=application/json 169 @{credentials}= Create List ${rest_username} ${rest_password} 170 ${data}= Create Dictionary data=@{credentials} 171 ${resp}= Post Request openbmc /login data=${data} headers=${headers} 172 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 173 174 ${processed_token_data}= 175 ... Evaluate re.split(r'[;,]', '${resp.headers["Set-Cookie"]}') modules=re 176 ${result}= Key Value List To Dict ${processed_token_data} delim== 177 178 # Example result data: 179 # 'XSRF-TOKEN=hQuOyDJFEIbrN4aOg2CT; Secure, 180 # SESSION=c4wloTiETumSxPI9nLeg; Secure; HttpOnly' 181 Set Global Variable ${XAUTH_TOKEN} ${result['session']} 182 183 184Post Login Request 185 [Documentation] Do REST login request. 186 [Arguments] ${timeout}=20 ${quiet}=${1} 187 ... ${rest_username}=${REST_USERNAME} 188 ... ${rest_password}=${REST_PASSWORD} 189 190 # Description of argument(s): 191 # timeout REST login attempt time out. 192 # quiet Suppress console log if set. 193 # rest_username The REST username. 194 # rest_password The REST password. 195 196 Create Session openbmc ${AUTH_URI} timeout=${timeout} max_retries=3 197 198 ${headers}= Create Dictionary Content-Type=application/json 199 @{credentials}= Create List ${rest_username} ${rest_password} 200 ${data}= create dictionary data=@{credentials} 201 ${status} ${resp}= Run Keyword And Ignore Error Post Request openbmc 202 ... /login data=${data} headers=${headers} 203 204 Should Be Equal ${status} PASS msg=${resp} 205 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 206 207 208Log Out OpenBMC 209 [Documentation] Log out of the openbmc REST session. 210 211 ${headers}= Create Dictionary Content-Type=application/json 212 ... X-Auth-Token=${XAUTH_TOKEN} 213 ${data}= Create dictionary data=@{EMPTY} 214 215 # If there is no active sesion it will throw the following exception 216 # "Non-existing index or alias 'openbmc'" 217 ${resp}= Post Request openbmc 218 ... /logout data=${data} headers=${headers} 219 220 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 221 ... msg=${resp} 222 223Log Request 224 [Documentation] Log the specific REST URI, method name on the console. 225 [Arguments] &{kwargs} 226 ${msg}= Catenate SEPARATOR= URI: ${AUTH_URI} ${kwargs["base_uri"]} 227 ... , method: ${kwargs["method"]} , args: ${kwargs["args"]} 228 Logging ${msg} console=True 229 230Log Response 231 [Documentation] Log the response code on the console. 232 [Arguments] ${resp} 233 ${msg}= Catenate SEPARATOR= Response code: ${resp.status_code} 234 ... , Content: ${resp.content} 235 Logging ${msg} console=True 236 237Logging 238 [Documentation] Log the specified message on the console. 239 [Arguments] ${msg} ${console}=default False 240 Log ${msg} console=True 241 242Read Attribute 243 [Documentation] Retrieve attribute value from URI and return result. 244 # Example result data for the attribute 'FieldModeEnabled' in 245 # "/xyz/openbmc_project/software/attr/" : 246 # 0 247 [Arguments] ${uri} ${attr} ${timeout}=10 ${quiet}=${QUIET} 248 ... ${expected_value}=${EMPTY} 249 # Description of argument(s): 250 # uri URI of the object that the attribute lives on 251 # (e.g. '/xyz/openbmc_project/software/'). 252 # attr Name of the attribute (e.g. 'FieldModeEnabled'). 253 # timeout Timeout for the REST call. 254 # quiet If enabled, turns off logging to console. 255 # expected_value If this argument is not empty, the retrieved value 256 # must match this value. 257 258 # Make sure uri ends with slash. 259 ${uri}= Add Trailing Slash ${uri} 260 261 ${resp}= OpenBMC Get Request ${uri}attr/${attr} timeout=${timeout} 262 ... quiet=${quiet} 263 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 264 ${content}= To Json ${resp.content} 265 Run Keyword If '${expected_value}' != '${EMPTY}' 266 ... Should Be Equal As Strings ${expected_value} ${content["data"]} 267 [Return] ${content["data"]} 268 269 270Write Attribute 271 [Documentation] Write a D-Bus attribute with REST. 272 [Arguments] ${uri} ${attr} ${timeout}=10 ${verify}=${FALSE} 273 ... ${expected_value}=${EMPTY} &{kwargs} 274 275 # Description of argument(s): 276 # uri URI of the object that the attribute lives on 277 # (e.g. '/xyz/openbmc_project/software/'). 278 # attr Name of the attribute (e.g. 'FieldModeEnabled'). 279 # timeout Timeout for the REST call. 280 # verify If set to ${TRUE}, the attribute will be read back to 281 # ensure that its value is set to ${verify_attr}. 282 # expected_value Only used if verify is set to ${TRUE}. The value that 283 # ${attr} should be set to. This defaults to 284 # ${kwargs['data']. There are cases where the caller 285 # expects some other value in which case this value can 286 # be explicitly specified. 287 # kwargs Arguments passed to the REST call. This should always 288 # contain the value to set the property to at the 'data' 289 # key (e.g. data={"data": 1}). 290 291 # Make sure uri ends with slash. 292 ${uri}= Add Trailing Slash ${uri} 293 294 ${base_uri}= Catenate SEPARATOR= ${DBUS_PREFIX} ${uri} 295 ${resp}= Openbmc Put Request ${base_uri}attr/${attr} 296 ... timeout=${timeout} &{kwargs} 297 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 298 299 # Verify the attribute was set correctly if the caller requested it. 300 Return From Keyword If ${verify} == ${FALSE} 301 302 ${expected_value}= Set Variable If '${expected_value}' == '${EMPTY}' 303 ... ${kwargs['data']['data']} ${expected_value} 304 ${value}= Read Attribute ${uri} ${attr} 305 Should Be Equal ${value} ${expected_value} 306 307Read Properties 308 [Documentation] Read data part of the URI object and return result. 309 # Example result data: 310 # [u'/xyz/openbmc_project/software/cf7bf9d5', 311 # u'/xyz/openbmc_project/software/5ecb8b2c', 312 # u'/xyz/openbmc_project/software/active', 313 # u'/xyz/openbmc_project/software/functional'] 314 [Arguments] ${uri} ${timeout}=10 ${quiet}=${QUIET} 315 # Description of argument(s): 316 # uri URI of the object 317 # (e.g. '/xyz/openbmc_project/software/'). 318 # timeout Timeout for the REST call. 319 # quiet If enabled, turns off logging to console. 320 321 ${resp}= OpenBMC Get Request ${uri} timeout=${timeout} quiet=${quiet} 322 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 323 ${content}= To Json Ordered ${resp.content} 324 325 [Return] ${content["data"]} 326 327Call Method 328 [Documentation] Invoke the specific REST service method. 329 [Arguments] ${uri} ${method} ${timeout}=10 ${quiet}=${QUIET} &{kwargs} 330 # Description of arguments: 331 # uri The URI to establish connection with 332 # (e.g. '/xyz/openbmc_project/software/'). 333 # timeout Timeout in seconds to establish connection with URI. 334 # quiet If enabled, turns off logging to console. 335 # kwargs Arguments passed to the REST call. 336 337 ${base_uri}= Catenate SEPARATOR= ${DBUS_PREFIX} ${uri} 338 ${resp}= OpenBmc Post Request ${base_uri}action/${method} 339 ... timeout=${timeout} quiet=${quiet} &{kwargs} 340 [Return] ${resp} 341 342 343Upload Image To BMC 344 [Documentation] Upload image to BMC via REST and return status code. 345 [Arguments] ${uri} ${timeout}=10 ${quiet}=${1} 346 ... ${valid_status_codes}=[${HTTP_OK}, ${HTTP_ACCEPTED}] &{kwargs} 347 348 # Description of argument(s): 349 # uri URI for uploading image via REST e.g. 350 # "/upload/image". 351 # timeout Time allocated for the REST command to 352 # return status (specified in Robot 353 # Framework Time Format e.g. "3 mins"). 354 # quiet If enabled, turns off logging to console. 355 # valid_status_codes A list of status codes that are valid for 356 # the REST post command. This can be 357 # specified as a string the evaluates to a 358 # python object (e.g. [${HTTP_OK}]). 359 # kwargs A dictionary keys/values to be passed 360 # directly to Post Request. 361 362 Initialize OpenBMC ${timeout} quiet=${quiet} 363 ${base_uri}= Catenate SEPARATOR= ${DBUS_PREFIX} ${uri} 364 ${headers}= Create Dictionary Content-Type=application/octet-stream 365 ... X-Auth-Token=${XAUTH_TOKEN} Accept=application/octet-stream 366 Set To Dictionary ${kwargs} headers ${headers} 367 Run Keyword If '${quiet}' == '${0}' Log Request method=Post 368 ... base_uri=${base_uri} args=&{kwargs} 369 ${ret}= Post Request openbmc ${base_uri} &{kwargs} timeout=${timeout} 370 Run Keyword If '${quiet}' == '${0}' Log Response ${ret} 371 Valid Value ret.status_code ${valid_status_codes} 372 Delete All Sessions 373 374 [Return] ${ret.status_code} 375 376 377Redfish Login 378 [Documentation] Do BMC web-based login. 379 [Arguments] ${timeout}=20 ${rest_username}=${REST_USERNAME} 380 ... ${rest_password}=${REST_PASSWORD} ${kwargs}=${EMPTY} 381 382 # Description of argument(s): 383 # timeout REST login attempt time out. 384 # rest_username The REST username. 385 # rest_password The REST password. 386 # kwargs Any additional arguments to be passed directly to the 387 # Get Request call. For example, the caller might 388 # set kwargs as follows: 389 # ${kwargs}= Create Dictionary allow_redirect=${True}. 390 391 Create Session redfish ${AUTH_URI} timeout=${timeout} 392 ${headers}= Create Dictionary Content-Type=application/json 393 ${data}= Set Variable If '${kwargs}' == '${EMPTY}' 394 ... {"UserName":"${rest_username}", "Password":"${rest_password}"} 395 ... {"UserName":"${rest_username}", "Password":"${rest_password}", ${kwargs}} 396 397 ${resp}= Post Request redfish /redfish/v1/SessionService/Sessions 398 ... data=${data} headers=${headers} 399 Should Be Equal As Strings ${resp.status_code} ${HTTP_CREATED} 400 401 ${content}= To JSON ${resp.content} 402 403 Set Global Variable ${XAUTH_TOKEN} ${resp.headers["X-Auth-Token"]} 404 405 [Return] ${content} 406 407 408Redfish Get Request 409 [Documentation] Do REST POST request and return the result. 410 [Arguments] ${uri} ${timeout}=10 ${quiet}=${QUIET} &{kwargs} 411 412 # Description of argument(s): 413 # uri The URI to establish connection with 414 # (e.g. '/xyz/openbmc_project/software/'). 415 # timeout Timeout in seconds to establish connection with URI. 416 # quiet If enabled, turns off logging to console. 417 # kwargs Any additional arguments to be passed directly to the 418 # Post Request call. For example, the caller might 419 # set kwargs as follows: 420 # ${kwargs}= Create Dictionary allow_redirect=${True}. 421 422 ${base_uri}= Catenate SEPARATOR= ${DBUS_PREFIX} ${uri} 423 ${headers}= Create Dictionary Content-Type=application/json X-Auth-Token=${XAUTH_TOKEN} 424 Set To Dictionary ${kwargs} headers ${headers} 425 Run Keyword If '${quiet}' == '${0}' Log Request method=Post base_uri=${base_uri} args=&{kwargs} 426 ${resp}= Get Request redfish ${base_uri} &{kwargs} timeout=${timeout} 427 Run Keyword If '${quiet}' == '${0}' Log Response ${resp} 428 429 [Return] ${resp} 430 431 432Redfish Post Request 433 [Documentation] Do REST POST request and return the result. 434 [Arguments] ${uri} ${timeout}=10 ${quiet}=${QUIET} &{kwargs} 435 436 # Description of argument(s): 437 # uri The URI to establish connection with 438 # (e.g. '/xyz/openbmc_project/software/'). 439 # timeout Timeout in seconds to establish connection with URI. 440 # quiet If enabled, turns off logging to console. 441 # kwargs Any additional arguments to be passed directly to the 442 # Post Request call. For example, the caller might 443 # set kwargs as follows: 444 # ${kwargs}= Create Dictionary allow_redirect=${True}. 445 446 ${base_uri}= Catenate SEPARATOR= ${DBUS_PREFIX} ${uri} 447 ${headers}= Create Dictionary Content-Type=application/json X-Auth-Token=${XAUTH_TOKEN} 448 Set To Dictionary ${kwargs} headers ${headers} 449 Run Keyword If '${quiet}' == '${0}' Log Request method=Post base_uri=${base_uri} args=&{kwargs} 450 ${resp}= Post Request redfish ${base_uri} &{kwargs} timeout=${timeout} 451 Run Keyword If '${quiet}' == '${0}' Log Response ${resp} 452 453 [Return] ${resp} 454