|  | *** Settings *** | 
|  | Documentation     Verify REST services Get/Put/Post/Delete. | 
|  |  | 
|  | Resource          ../lib/rest_client.robot | 
|  | Resource          ../lib/openbmc_ffdc.robot | 
|  | Resource          ../lib/resource.robot | 
|  | Resource          ../lib/utils.robot | 
|  | Library           Collections | 
|  |  | 
|  | Test Teardown     FFDC On Test Case Fail | 
|  |  | 
|  | *** Variables *** | 
|  |  | 
|  | *** Test Cases *** | 
|  |  | 
|  | REST Login Session To BMC | 
|  | [Documentation]  Test REST session log-in. | 
|  | [Tags]  REST_Login_Session_To_BMC | 
|  |  | 
|  | Initialize OpenBMC | 
|  | # Raw GET REST operation to verify session is established. | 
|  | ${resp}=  Get Request  openbmc  /xyz/openbmc_project/ | 
|  | Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK} | 
|  |  | 
|  |  | 
|  | REST Logout Session To BMC | 
|  | [Documentation]  Test REST session log-out. | 
|  | [Tags]  REST_Logout_Session_To_BMC | 
|  |  | 
|  | Initialize OpenBMC | 
|  | Log Out OpenBMC | 
|  | # Raw GET REST operation to verify session is logout. | 
|  | ${resp}=  Get Request  openbmc  /xyz/openbmc_project/ | 
|  | Should Be Equal As Strings  ${resp.status_code}  ${HTTP_UNAUTHORIZED} | 
|  |  | 
|  |  | 
|  | REST Delete All Sessions And Expect Error | 
|  | [Documentation]  Test REST empty cache using delete operation. | 
|  | [Tags]  REST_Delete_All_Sessions_And_Expect_Error | 
|  |  | 
|  | # Throws exception: | 
|  | # Non-existing index or alias 'openbmc'. | 
|  |  | 
|  | Initialize OpenBMC | 
|  | Delete All Sessions | 
|  | # Raw GET REST operation and expect exception error. | 
|  | Run Keyword And Expect Error | 
|  | ...  Non-existing index or alias 'openbmc'. | 
|  | ...  Get Request  openbmc  /xyz/openbmc_project/ | 
|  |  | 
|  |  | 
|  | Multiple Requests On BMC Using Single REST Session | 
|  | [Documentation]  Trigger multiple REST operations using an active | 
|  | ...  connection session. | 
|  | [Tags]  Multiple_Requests_On_BMC_Using_Single_REST_Session | 
|  |  | 
|  | Initialize OpenBMC | 
|  |  | 
|  | # Session object "openbmc". | 
|  | ${resp}=  Get Request  openbmc  /xyz/openbmc_project/state/ | 
|  | Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK} | 
|  |  | 
|  | ${resp}=  Get Request  openbmc  /xyz/openbmc_project/software/enumerate | 
|  | Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK} | 
|  |  | 
|  |  | 
|  | Verify REST JSON Data On Success | 
|  | [Documentation]  Verify JSON data success response messages. | 
|  | [Tags]  Verify_REST_JSON_Data_On_Success | 
|  | # Example: | 
|  | # Response code:200, Content:{ | 
|  | # "data": [ | 
|  | #         "/xyz/openbmc_project/sensors", | 
|  | #         "/xyz/openbmc_project/inventory", | 
|  | #         "/xyz/openbmc_project/software", | 
|  | #         "/xyz/openbmc_project/object_mapper", | 
|  | #         "/xyz/openbmc_project/logging" | 
|  | #         ], | 
|  | # "message": "200 OK", | 
|  | # "status": "ok" | 
|  | # } | 
|  |  | 
|  | ${resp}=  OpenBMC Get Request  /xyz/openbmc_project/ | 
|  | ${jsondata}=  To JSON  ${resp.content} | 
|  | Should Not Be Empty  ${jsondata["data"]} | 
|  | Should Be Equal As Strings  ${jsondata["message"]}  200 OK | 
|  | Should Be Equal As Strings  ${jsondata["status"]}  ok | 
|  |  | 
|  |  | 
|  | Verify REST JSON Data On Failure | 
|  | [Documentation]  Verify JSON data failure response messages. | 
|  | [Tags]  Verify_REST_JSON_Data_On_Failure | 
|  | # Example: | 
|  | # Response code:404, Content:{ | 
|  | # "data": { | 
|  | #        "description": "org.freedesktop.DBus.Error.FileNotFound: path or object not found: | 
|  | #         /xyz/idont/exist" | 
|  | #         }, | 
|  | # "message": "404 Not Found", | 
|  | # "status": "error" | 
|  | # } | 
|  |  | 
|  | ${resp}=  OpenBMC Get Request  /xyz/idont/exist/ | 
|  | ${jsondata}=  To JSON  ${resp.content} | 
|  | Should Contain  ${jsondata["data"]["description"]} | 
|  | ...  org.freedesktop.DBus.Error.FileNotFound: path or object not found | 
|  | Should Be Equal As Strings  ${jsondata["message"]}  404 Not Found | 
|  | Should Be Equal As Strings  ${jsondata["status"]}  error | 
|  |  | 
|  |  | 
|  | Verify REST Get Message JSON Compliant | 
|  | [Documentation]  Verify REST "GET" message is JSON format compliant. | 
|  | [Tags]  Verify_REST_Get_Message_JSON_Compliant | 
|  | # For testing if the REST message is JSON format compliant using a | 
|  | # generic BMC state path /xyz/openbmc_project/state object and path | 
|  | # walking through to ensure the parent object, trailing slash and | 
|  | # attribute message response are intact. | 
|  |  | 
|  | # Object attribute data. | 
|  | # Example: | 
|  | # Response code:200, Content:{ | 
|  | #   "data": { | 
|  | #      "CurrentBMCState": "xyz.openbmc_project.State.BMC.BMCState.Ready", | 
|  | #      "RequestedBMCTransition": "xyz.openbmc_project.State.BMC.Transition.None" | 
|  | #   }, | 
|  | #   "message": "200 OK", | 
|  | #   "status": "ok" | 
|  | # } | 
|  |  | 
|  | Verify JSON Response Content | 
|  | ...  /xyz/openbmc_project/state/bmc0  DATA_NOT_EMPTY | 
|  |  | 
|  | # Object trailing slash attribute data. | 
|  | # Example: | 
|  | # Response code:200, Content:{ | 
|  | #    "data": [], | 
|  | #    "message": "200 OK", | 
|  | #    "status": "ok" | 
|  | # } | 
|  |  | 
|  | Verify JSON Response Content  /xyz/openbmc_project/state/bmc0/ | 
|  |  | 
|  | # Attribute data. | 
|  | # Example: | 
|  | # Response code:200, Content:{ | 
|  | #   "data": "xyz.openbmc_project.State.BMC.BMCState.Ready", | 
|  | #   "message": "200 OK", | 
|  | #   "status": "ok" | 
|  | # } | 
|  |  | 
|  | Verify JSON Response Content | 
|  | ...  /xyz/openbmc_project/state/bmc0/attr/CurrentBMCState  DATA_NOT_EMPTY | 
|  |  | 
|  |  | 
|  | Verify REST Post Message JSON Compliant | 
|  | [Documentation]  Verify REST "POST" message is JSON format compliant. | 
|  | [Tags]  Verify_REST_Post_Message_JSON_Compliant | 
|  | # Example: | 
|  | # Response code:200, Content:{ | 
|  | #  "data": null, | 
|  | #  "message": "200 OK", | 
|  | #  "status": "ok" | 
|  | # } | 
|  |  | 
|  | # Clear existing gard records, if any. | 
|  | ${data}=  Create Dictionary  data=@{EMPTY} | 
|  | ${resp}=  Openbmc Post Request  ${OPENPOWER_CONTROL}gard/action/Reset | 
|  | ...  data=${data} | 
|  | Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK} | 
|  | ${jsondata}=  To JSON  ${resp.content} | 
|  | Should Be Equal  ${jsondata["data"]}  ${None} | 
|  | Should Be Equal As Strings  ${jsondata["message"]}  200 OK | 
|  | Should Be Equal As Strings  ${jsondata["status"]}  ok | 
|  |  | 
|  |  | 
|  | Verify REST Bad Request Post Message JSON Compliant | 
|  | [Documentation]  Verify REST "POST" message is JSON format compliant. | 
|  | [Tags]  Verify_REST_Bad_Request_Post_Message_JSON_Compliant | 
|  | # Example: | 
|  | # { | 
|  | #   "data": { | 
|  | #        "description": "Version already exists or failed to be extracted" | 
|  | #    }, | 
|  | #    "message": "400 Bad Request", | 
|  | #    "status": "error" | 
|  | # } | 
|  |  | 
|  | # Generate 1KB file size | 
|  | Run  dd if=/dev/zero of=dummyfile bs=1 count=0 seek=1KB | 
|  | OperatingSystem.File Should Exist  dummyfile | 
|  |  | 
|  | # Get the content of the file and upload to BMC | 
|  | ${image_data}=  OperatingSystem.Get Binary File  dummyfile | 
|  |  | 
|  | # Get REST session to BMC | 
|  | Initialize OpenBMC | 
|  |  | 
|  | # Create the REST payload headers and data | 
|  | ${data}=  Create Dictionary  data  ${image_data} | 
|  | ${headers}=  Create Dictionary  Content-Type=application/octet-stream | 
|  | ...  X-Auth-Token=${XAUTH_TOKEN}  Accept=application/octet-stream | 
|  | Set To Dictionary  ${data}  headers  ${headers} | 
|  |  | 
|  | ${resp}=  Post Request  openbmc  /upload/image  &{data} | 
|  | Should Be Equal As Strings  ${resp.status_code}  ${HTTP_BAD_REQUEST} | 
|  | ${jsondata}=  To JSON  ${resp.content} | 
|  | Should Be Equal  ${jsondata["data"]["description"]} | 
|  | ...  Version already exists or failed to be extracted | 
|  | Should Be Equal As Strings  ${jsondata["message"]}  400 Bad Request | 
|  | Should Be Equal As Strings  ${jsondata["status"]}  error | 
|  | Delete All Error Logs | 
|  |  | 
|  |  | 
|  | Check Response Codes HTTP_UNSUPPORTED_MEDIA_TYPE | 
|  | [Documentation]  REST "Post" response status test for | 
|  | ...              HTTP_UNSUPPORTED_MEDIA_TYPE. | 
|  | [Tags]  Check_Response_Codes_HTTP_UNSUPPORTED_MEDIA_TYPE | 
|  |  | 
|  | # Example: | 
|  | # Response code:415, Content:{ | 
|  | # "data": { | 
|  | #         "description": "Expecting content type 'application/octet-stream', got 'application/json'" | 
|  | #         }, | 
|  | # "message": "415 Unsupported Media Type", | 
|  | # "status": "error" | 
|  | # } | 
|  |  | 
|  | Initialize OpenBMC | 
|  |  | 
|  | # Create the REST payload headers and EMPTY data | 
|  | ${data}=  Create Dictionary  data  ${EMPTY} | 
|  | ${headers}=  Create Dictionary  Content-Type=application/json  X-Auth-Token=${XAUTH_TOKEN} | 
|  | Set To Dictionary  ${data}  headers  ${headers} | 
|  |  | 
|  | ${resp}=  Post Request  openbmc  /upload/image  &{data} | 
|  | Should Be Equal As Strings | 
|  | ...  ${resp.status_code}  ${HTTP_UNSUPPORTED_MEDIA_TYPE} | 
|  |  | 
|  | ${jsondata}=  To JSON  ${resp.content} | 
|  | Should Be Equal As Strings  ${jsondata["data"]["description"]} | 
|  | ...  Expecting content type 'application/octet-stream', got 'application/json' | 
|  | Should Be Equal As Strings | 
|  | ...  ${jsondata["message"]}  415 Unsupported Media Type | 
|  | Should Be Equal As Strings  ${jsondata["status"]}  error | 
|  |  | 
|  |  | 
|  | Get Response Codes | 
|  | [Documentation]  REST "Get" response status test. | 
|  | [Tags]  Get_Response_Codes | 
|  | [Template]  Execute Get And Check Response | 
|  |  | 
|  | # Expect status      URL Path | 
|  | ${HTTP_OK}           /xyz/openbmc_project/ | 
|  | ${HTTP_OK}           /xyz/openbmc_project/state/enumerate | 
|  | ${HTTP_NOT_FOUND}    /xyz/i/dont/exist/ | 
|  |  | 
|  |  | 
|  | Get Data | 
|  | [Documentation]  REST "Get" request url and expect the | 
|  | ...              response OK and data non empty. | 
|  | [Tags]  Get_Data | 
|  | [Template]  Execute Get And Check Data | 
|  |  | 
|  | # URL Path | 
|  | /xyz/openbmc_project/ | 
|  | /xyz/openbmc_project/list | 
|  | /xyz/openbmc_project/state/enumerate | 
|  |  | 
|  |  | 
|  | Get Data Validation | 
|  | [Documentation]  REST "Get" request url and expect the | 
|  | ...              pre-defined string in response data. | 
|  | [Tags]  Get_Data_Validation | 
|  | [Template]  Execute Get And Verify Data | 
|  |  | 
|  | # URL Path                  Expect Data | 
|  | /xyz/openbmc_project/       /xyz/openbmc_project/logging | 
|  | /org/i/dont/exist/          path or object not found | 
|  |  | 
|  |  | 
|  | Put Response Codes | 
|  | [Documentation]  REST "Put" request url and expect the REST pre-defined | 
|  | ...              codes. | 
|  | [Tags]  Put_Response_Codes | 
|  | [Template]  Execute Put And Check Response | 
|  |  | 
|  | # Expect status                 URL Path | 
|  | ${HTTP_METHOD_NOT_ALLOWED}      / | 
|  | ${HTTP_NOT_FOUND}               /xyz/ | 
|  | ${HTTP_FORBIDDEN}               /xyz/i/dont/exist/ | 
|  |  | 
|  |  | 
|  | Put Data Validation | 
|  | [Documentation]  REST "Put" request url and expect success. | 
|  | [Tags]  Put_Data_Validation | 
|  | [Template]  Execute Put And Expect Success | 
|  |  | 
|  | # URL Path                      Parm Data | 
|  | /xyz/openbmc_project/state/host0/attr/RequestedHostTransition | 
|  | ...  xyz.openbmc_project.State.Host.Transition.Off | 
|  |  | 
|  |  | 
|  | Post Response Code | 
|  | [Documentation]  REST Post request url and expect the | 
|  | ...              REST response code pre define. | 
|  | [Tags]  Post_Response_Code | 
|  | [Template]  Execute Post And Check Response | 
|  |  | 
|  | # Expect status                 URL Path | 
|  | ${HTTP_METHOD_NOT_ALLOWED}      / | 
|  | ${HTTP_NOT_FOUND}               /xyz/ | 
|  | ${HTTP_METHOD_NOT_ALLOWED}      /xyz/i/dont/exist/ | 
|  | ${HTTP_METHOD_NOT_ALLOWED}      /xyz/login | 
|  |  | 
|  |  | 
|  | Delete Response Code | 
|  | [Documentation]  REST "Delete" request url and expect the | 
|  | ...              REST response code pre define. | 
|  | [Tags]  Delete_Response_Code | 
|  | [Template]  Execute Delete And Check Response | 
|  |  | 
|  | # Expect status                 URL Path | 
|  | ${HTTP_METHOD_NOT_ALLOWED}      / | 
|  | ${HTTP_NOT_FOUND}               /xyz/ | 
|  | ${HTTP_METHOD_NOT_ALLOWED}      /xyz/nothere/ | 
|  | ${HTTP_METHOD_NOT_ALLOWED}      /xyz/openbmc_project/state/ | 
|  |  | 
|  |  | 
|  | Verify All REST Objects Are Accessible | 
|  | [Documentation]  Verify all the REST objects are accessible using "GET". | 
|  | [Tags]           Verify_All_REST_Objects_Are_Accessible | 
|  |  | 
|  | ${uri_list}=  Get Sub URI List  ${OPENBMC_BASE_URI} | 
|  |  | 
|  | # URI's which won't support GET request. | 
|  | Remove Values From List  ${uri_list} | 
|  | ...  /xyz/openbmc_project/certs/client/ldap | 
|  | ...  /xyz/openbmc_project/certs/server/https | 
|  | ...  /xyz/openbmc_project/certs/authority/ldap | 
|  | ...  /xyz/openbmc_project/ipmi | 
|  | ...  /xyz/openbmc_project/ipmi/internal | 
|  | ...  /xyz/openbmc_project/ipmi/internal/soft_power_off | 
|  |  | 
|  | ${error_uri_list}=  Create List | 
|  | FOR  ${uri}  IN  @{uri_list} | 
|  | ${resp}=  Openbmc Get Request  ${uri}  quiet=${1} | 
|  | Run keyword if  '${resp.status_code}' != '${HTTP_OK}' | 
|  | ...  Append To List  ${error_uri_list}  ${uri} : ${resp.status_code} | 
|  | END | 
|  | Should Be Empty  ${error_uri_list} | 
|  |  | 
|  |  | 
|  | Verify REST Put Message JSON Compliant | 
|  | [Documentation]  Verify REST "PUT" message is JSON format compliant. | 
|  | [Tags]  Verify_REST_Put_Message_JSON_Compliant | 
|  | # Example: | 
|  | # Response code:200, Content:{ | 
|  | #  "data": null, | 
|  | #  "message": "200 OK", | 
|  | #  "status": "ok" | 
|  | # } | 
|  |  | 
|  | ${dict_data}=  Create Dictionary  data=${HOST_POWEROFF_TRANS} | 
|  | ${resp}=  Openbmc Put Request | 
|  | ...  ${HOST_STATE_URI}attr/RequestedHostTransition  data=${dict_data} | 
|  | Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK} | 
|  | ${jsondata}=  To JSON  ${resp.content} | 
|  | Should Be Equal  ${jsondata["data"]}  ${None} | 
|  | Should Be Equal As Strings  ${jsondata["message"]}  200 OK | 
|  | Should Be Equal As Strings  ${jsondata["status"]}  ok | 
|  | # Intention is not to test poweroff but to check the REST operation | 
|  | # sink time allowing to kick poweroff. | 
|  | Sleep  10s | 
|  |  | 
|  | *** Keywords *** | 
|  |  | 
|  | Get Sub URI List | 
|  | [Documentation]  Return list of sub URIs inside the URI sent by caller. | 
|  | [Arguments]      ${uri} | 
|  | # Description of argument(s): | 
|  | # uri  The URI for which all the sub URIs are returned. | 
|  | # Example: | 
|  | # "/xyz/openbmc_project/" | 
|  | ${resp}=  Openbmc Get Request  ${uri}list  quiet=${1} | 
|  | ${sub_uris}=  Collections.Get From Dictionary  ${resp.json()}  data | 
|  | [Return]  ${sub_uris} | 
|  |  | 
|  | Execute Get And Check Response | 
|  | [Documentation]  Request "Get" url path and expect REST response code. | 
|  | [Arguments]  ${expected_response_code}  ${url_path} | 
|  | # Description of arguments: | 
|  | # expected_response_code   Expected REST status codes. | 
|  | # url_path                 URL path. | 
|  | ${resp}=  Openbmc Get Request  ${url_path} | 
|  | Should Be Equal As Strings  ${resp.status_code}  ${expected_response_code} | 
|  |  | 
|  | Execute Get And Check Data | 
|  | [Documentation]  Request "Get" url path and expect non empty data. | 
|  | [Arguments]  ${url_path} | 
|  | # Description of arguments: | 
|  | # url_path     URL path. | 
|  | ${resp}=  Openbmc Get Request  ${url_path} | 
|  | Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK} | 
|  | ${jsondata}=  To JSON  ${resp.content} | 
|  | Should Not Be Empty  ${jsondata["data"]} | 
|  |  | 
|  | Execute Get And Verify Data | 
|  | [Documentation]  Request "Get" url path and verify data. | 
|  | [Arguments]  ${url_path}  ${expected_response_code} | 
|  | # Description of arguments: | 
|  | # expected_response_code   Expected REST status codes. | 
|  | # url_path                 URL path. | 
|  | ${resp}=  Openbmc Get Request  ${url_path} | 
|  | ${jsondata}=  To JSON  ${resp.content} | 
|  | Run Keyword If  '${resp.status_code}' == '${HTTP_OK}' | 
|  | ...  Should Contain  ${jsondata["data"]}  ${expected_response_code} | 
|  | ...  ELSE | 
|  | ...  Should Contain  ${jsondata["data"]["description"]}  ${expected_response_code} | 
|  |  | 
|  | Execute Put And Check Response | 
|  | [Documentation]  Request "Put" url path and expect REST response code. | 
|  | [Arguments]  ${expected_response_code}  ${url_path} | 
|  | # Description of arguments: | 
|  | # expected_response_code   Expected REST status codes. | 
|  | # url_path                 URL path. | 
|  | ${resp}=  Openbmc Put Request  ${url_path} | 
|  | Should Be Equal As Strings  ${resp.status_code}  ${expected_response_code} | 
|  |  | 
|  | Execute Put And Expect Success | 
|  | [Documentation]  Request "Put" on url path. | 
|  | [Arguments]  ${url_path}  ${parm} | 
|  | # Description of arguments: | 
|  | # url_path     URL path. | 
|  | # parm         Value/string to be set. | 
|  | # expected_response_code   Expected REST status codes. | 
|  | ${parmDict}=  Create Dictionary  data=${parm} | 
|  | ${resp}=  Openbmc Put Request  ${url_path}  data=${parmDict} | 
|  | Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK} | 
|  |  | 
|  | Execute Post And Check Response | 
|  | [Documentation]  Request Post url path and expect REST response code. | 
|  | [Arguments]  ${expected_response_code}  ${url_path} | 
|  | # Description of arguments: | 
|  | # expected_response_code   Expected REST status codes. | 
|  | # url_path                 URL path. | 
|  | ${resp}=  Openbmc Post Request  ${url_path} | 
|  | Should Be Equal As Strings  ${resp.status_code}  ${expected_response_code} | 
|  |  | 
|  | Execute Post And Check Data | 
|  | [Arguments]  ${url_path}  ${parm} | 
|  | [Documentation]  Request Post on url path and expected non empty data. | 
|  | # Description of arguments: | 
|  | # url_path     URL path. | 
|  | ${data}=  Create Dictionary  data=@{parm} | 
|  | ${resp}=  Openbmc Post Request  ${url_path}  data=${data} | 
|  | Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK} | 
|  | ${jsondata}=  To JSON  ${resp.content} | 
|  | Should Not Be Empty  ${jsondata["data"]} | 
|  |  | 
|  | Execute Delete And Check Response | 
|  | [Documentation]  Request "Delete" url path and expected REST response code. | 
|  | [Arguments]  ${expected_response_code}  ${url_path} | 
|  | # Description of arguments: | 
|  | # expected_response_code   Expected REST status codes. | 
|  | # url_path     URL path. | 
|  | ${data}=  Create Dictionary  data=@{EMPTY} | 
|  | ${resp}=  Openbmc Delete Request  ${url_path}  data=${data} | 
|  | Should Be Equal As Strings  ${resp.status_code}  ${expected_response_code} | 
|  |  | 
|  | Verify JSON Response Content | 
|  | [Documentation]  Verify JSON response data is intact. | 
|  | [Arguments]  ${url_path}  ${data_empty}=${EMPTY} | 
|  |  | 
|  | # Description of argument(s): | 
|  | # url_path     URL path. | 
|  | # data_empty   JSON data element. | 
|  |  | 
|  | ${resp}=  OpenBMC Get Request  ${url_path} | 
|  | ${jsondata}=  To JSON  ${resp.content} | 
|  | Run Keyword If  '${data_empty}' == '${EMPTY}' | 
|  | ...  Should Be Empty  ${jsondata["data"]} | 
|  | ...  ELSE | 
|  | ...  Should Not Be Empty  ${jsondata["data"]} | 
|  | Should Be Equal As Strings  ${jsondata["message"]}  200 OK | 
|  | Should Be Equal As Strings  ${jsondata["status"]}  ok |