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 &{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 # kwargs Any additional arguments to be passed directly to the 116 # Delete Request call. For example, the caller might 117 # set kwargs as follows: 118 # ${kwargs}= Create Dictionary allow_redirect=${True}. 119 120 Initialize OpenBMC ${timeout} 121 ${base_uri}= Catenate SEPARATOR= ${DBUS_PREFIX} ${uri} 122 ${headers}= Create Dictionary Content-Type=application/json 123 ... X-Auth-Token=${XAUTH_TOKEN} 124 Set To Dictionary ${kwargs} headers ${headers} 125 Log Request method=Delete base_uri=${base_uri} args=&{kwargs} 126 ${ret}= Delete Request openbmc ${base_uri} &{kwargs} timeout=${timeout} 127 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 Request openbmc /login data=${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 Request openbmc 200 ... /login data=${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 Request openbmc 216 ... /logout data=${data} headers=${headers} 217 218 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 219 ... msg=${resp} 220 221Log Request 222 [Documentation] Log the specific REST URI, method name on the console. 223 [Arguments] &{kwargs} 224 ${msg}= Catenate SEPARATOR= URI: ${AUTH_URI} ${kwargs["base_uri"]} 225 ... , method: ${kwargs["method"]} , args: ${kwargs["args"]} 226 Logging ${msg} console=True 227 228Log Response 229 [Documentation] Log the response code on the console. 230 [Arguments] ${resp} 231 ${msg}= Catenate SEPARATOR= Response code: ${resp.status_code} 232 ... , Content: ${resp.content} 233 Logging ${msg} console=True 234 235Logging 236 [Documentation] Log the specified message on the console. 237 [Arguments] ${msg} ${console}=default False 238 Log ${msg} console=True 239 240Read Attribute 241 [Documentation] Retrieve attribute value from URI and return result. 242 # Example result data for the attribute 'FieldModeEnabled' in 243 # "/xyz/openbmc_project/software/attr/" : 244 # 0 245 [Arguments] ${uri} ${attr} ${timeout}=10 ${quiet}=${QUIET} 246 ... ${expected_value}=${EMPTY} 247 # Description of argument(s): 248 # uri URI of the object that the attribute lives on 249 # (e.g. '/xyz/openbmc_project/software/'). 250 # attr Name of the attribute (e.g. 'FieldModeEnabled'). 251 # timeout Timeout for the REST call. 252 # quiet If enabled, turns off logging to console. 253 # expected_value If this argument is not empty, the retrieved value 254 # must match this value. 255 256 # Make sure uri ends with slash. 257 ${uri}= Add Trailing Slash ${uri} 258 259 ${resp}= OpenBMC Get Request ${uri}attr/${attr} timeout=${timeout} 260 ... quiet=${quiet} 261 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 262 ${content}= To Json ${resp.content} 263 Run Keyword If '${expected_value}' != '${EMPTY}' 264 ... Should Be Equal As Strings ${expected_value} ${content["data"]} 265 [Return] ${content["data"]} 266 267 268Write Attribute 269 [Documentation] Write a D-Bus attribute with REST. 270 [Arguments] ${uri} ${attr} ${timeout}=10 ${verify}=${FALSE} 271 ... ${expected_value}=${EMPTY} &{kwargs} 272 273 # Description of argument(s): 274 # uri URI of the object that the attribute lives on 275 # (e.g. '/xyz/openbmc_project/software/'). 276 # attr Name of the attribute (e.g. 'FieldModeEnabled'). 277 # timeout Timeout for the REST call. 278 # verify If set to ${TRUE}, the attribute will be read back to 279 # ensure that its value is set to ${verify_attr}. 280 # expected_value Only used if verify is set to ${TRUE}. The value that 281 # ${attr} should be set to. This defaults to 282 # ${kwargs['data']. There are cases where the caller 283 # expects some other value in which case this value can 284 # be explicitly specified. 285 # kwargs Arguments passed to the REST call. This should always 286 # contain the value to set the property to at the 'data' 287 # key (e.g. data={"data": 1}). 288 289 # Make sure uri ends with slash. 290 ${uri}= Add Trailing Slash ${uri} 291 292 ${base_uri}= Catenate SEPARATOR= ${DBUS_PREFIX} ${uri} 293 ${resp}= Openbmc Put Request ${base_uri}attr/${attr} 294 ... timeout=${timeout} &{kwargs} 295 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 296 297 # Verify the attribute was set correctly if the caller requested it. 298 Return From Keyword If ${verify} == ${FALSE} 299 300 ${expected_value}= Set Variable If '${expected_value}' == '${EMPTY}' 301 ... ${kwargs['data']['data']} ${expected_value} 302 ${value}= Read Attribute ${uri} ${attr} 303 Should Be Equal ${value} ${expected_value} 304 305Read Properties 306 [Documentation] Read data part of the URI object and return result. 307 # Example result data: 308 # [u'/xyz/openbmc_project/software/cf7bf9d5', 309 # u'/xyz/openbmc_project/software/5ecb8b2c', 310 # u'/xyz/openbmc_project/software/active', 311 # u'/xyz/openbmc_project/software/functional'] 312 [Arguments] ${uri} ${timeout}=10 ${quiet}=${QUIET} 313 # Description of argument(s): 314 # uri URI of the object 315 # (e.g. '/xyz/openbmc_project/software/'). 316 # timeout Timeout for the REST call. 317 # quiet If enabled, turns off logging to console. 318 319 ${resp}= OpenBMC Get Request ${uri} timeout=${timeout} quiet=${quiet} 320 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 321 ${content}= To Json Ordered ${resp.content} 322 323 [Return] ${content["data"]} 324 325Call Method 326 [Documentation] Invoke the specific REST service method. 327 [Arguments] ${uri} ${method} ${timeout}=10 ${quiet}=${QUIET} &{kwargs} 328 # Description of arguments: 329 # uri The URI to establish connection with 330 # (e.g. '/xyz/openbmc_project/software/'). 331 # timeout Timeout in seconds to establish connection with URI. 332 # quiet If enabled, turns off logging to console. 333 # kwargs Arguments passed to the REST call. 334 335 ${base_uri}= Catenate SEPARATOR= ${DBUS_PREFIX} ${uri} 336 ${resp}= OpenBmc Post Request ${base_uri}action/${method} 337 ... timeout=${timeout} quiet=${quiet} &{kwargs} 338 [Return] ${resp} 339 340 341Upload Image To BMC 342 [Documentation] Upload image to BMC via REST and return status code. 343 [Arguments] ${uri} ${timeout}=10 ${quiet}=${1} 344 ... ${valid_status_codes}=[${HTTP_OK}, ${HTTP_ACCEPTED}] &{kwargs} 345 346 # Description of argument(s): 347 # uri URI for uploading image via REST e.g. 348 # "/upload/image". 349 # timeout Time allocated for the REST command to 350 # return status (specified in Robot 351 # Framework Time Format e.g. "3 mins"). 352 # quiet If enabled, turns off logging to console. 353 # valid_status_codes A list of status codes that are valid for 354 # the REST post command. This can be 355 # specified as a string the evaluates to a 356 # python object (e.g. [${HTTP_OK}]). 357 # kwargs A dictionary keys/values to be passed 358 # directly to Post Request. 359 360 Initialize OpenBMC ${timeout} quiet=${quiet} 361 ${base_uri}= Catenate SEPARATOR= ${DBUS_PREFIX} ${uri} 362 ${headers}= Create Dictionary Content-Type=application/octet-stream 363 ... X-Auth-Token=${XAUTH_TOKEN} Accept=application/octet-stream 364 Set To Dictionary ${kwargs} headers ${headers} 365 Run Keyword If '${quiet}' == '${0}' Log Request method=Post 366 ... base_uri=${base_uri} args=&{kwargs} 367 ${ret}= Post Request openbmc ${base_uri} &{kwargs} timeout=${timeout} 368 Run Keyword If '${quiet}' == '${0}' Log Response ${ret} 369 Valid Value ret.status_code ${valid_status_codes} 370 Delete All Sessions 371 372 [Return] ${ret.status_code} 373 374 375Redfish Login 376 [Documentation] Do BMC web-based login. 377 [Arguments] ${timeout}=20 ${rest_username}=${REST_USERNAME} 378 ... ${rest_password}=${REST_PASSWORD} ${kwargs}=${EMPTY} 379 380 # Description of argument(s): 381 # timeout REST login attempt time out. 382 # rest_username The REST username. 383 # rest_password The REST password. 384 # kwargs Any additional arguments to be passed directly to the 385 # Get Request call. For example, the caller might 386 # set kwargs as follows: 387 # ${kwargs}= Create Dictionary allow_redirect=${True}. 388 389 Create Session openbmc ${AUTH_URI} timeout=${timeout} 390 ${headers}= Create Dictionary Content-Type=application/json 391 ${data}= Set Variable If '${kwargs}' == '${EMPTY}' 392 ... {"UserName":"${rest_username}", "Password":"${rest_password}"} 393 ... {"UserName":"${rest_username}", "Password":"${rest_password}", ${kwargs}} 394 395 ${resp}= Post Request openbmc /redfish/v1/SessionService/Sessions 396 ... data=${data} headers=${headers} 397 Should Be Equal As Strings ${resp.status_code} ${HTTP_CREATED} 398 399 Set Global Variable ${XAUTH_TOKEN} ${resp.headers["X-Auth-Token"]} 400 401 [Return] ${resp} 402