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