*** Comments ***
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License


*** Settings ***
Documentation   Library with sol003 keywords and variables .

Library   String
Library   OperatingSystem
Library   RequestsLibrary
Library   JsonValidator
Library   yaml
Library   JSONLibrary

Resource   ../lib/vim_lib.resource


*** Variables ***
@{SUCCESS_STATUS_CODE_LIST}   200   201   202   204
${AUTH_TOKEN_URI}   /osm/admin/v1/tokens
${REST_API_HOST}   ${EMPTY}
${OSM_USER}   %{OSM_USER=admin}
${OSM_PASSWORD}   %{OSM_PASSWORD=admin}
${OSM_PROJECT}   %{OSM_PROJECT=admin}


*** Keywords ***
Get Auth Token
    [Documentation]   Send a REST POST message to OSM to get an authentication token,
    ...               and store the authentication token in a suite variable to be used later on.
    Set REST API Host
    Create Session   osmhit   ${REST_API_HOST}   disable_warnings=1
    &{headers}=   Create Dictionary   Content-Type=application/json   Accept=application/json
    &{data}=   Create Dictionary   username=${OSM_USER}   password=${OSM_PASSWORD}   project-id=${OSM_PROJECT}
    ${resp}=   Post On Session   osmhit   ${AUTH_TOKEN_URI}   json=${data}   headers=${headers}
    Log   ${resp}
    Pass Execution If   ${resp.status_code} in ${SUCCESS_STATUS_CODE_LIST}   Get Auth Token completed
    Set Suite Variable   ${TOKEN_STATUS_CODE}   ${resp.status_code}
    ${access_token}=   Get Value From Json   ${resp.json()}   $..id
    Set Test Variable   ${ACCESS_TOKEN}   ${access_token[0]}
    Set Test Variable   ${TOKEN_RESPONSE}   ${resp}
    Sleep   2s

Set Dockerized Host
    [Documentation]   Set the suite variable REST_API_HOST to be used in this library and the testsuites using it.
    ...               This method must be used if the tests are run from a container in the same K8s cluster where OSM is running.
    [Arguments]   ${env_host}
    Set Suite Variable   ${REST_API_HOST}   https://${env_host}

Set Standalone Host
    [Documentation]   Set a suite variable REST_API_HOST to be used in this library and the testsuites using it.
    ...               This method must be used if the tests are run from any place outside the K8s cluster where OSM is running.
    [Arguments]   ${env_host}
    Set Suite Variable   ${REST_API_HOST}   https://${env_host}:443

Get Resource Directory
    [Documentation]   Return Directory corresponding to the resources folder
    ${Directory}=   Replace String   ${CURDIR}   lib   resources
    RETURN   ${Directory}

Post Api Request
    [Documentation]   Send to OSM a POST API message to OSM to the given uri with the given json data,
    ...               and save response and status code in suite variables to be used later on.
    [Arguments]   ${PostApi}   ${json_data}
    Create Session   APISession   ${REST_API_HOST}
    &{headers}=   Create Dictionary   Content-Type=application/json   Accept=application/json   Authorization=Bearer ${ACCESS_TOKEN}
    ${request_response}=   Post On Session   APISession   ${PostApi}   json=${json_data}   headers=${headers}
    Set Suite Variable   ${REQUEST_RESPONSE}   ${request_response}
    ${response_statuscode}=   Convert To String   ${request_response.status_code}
    Set Suite Variable   ${RESPONSE_STATUSCODE}   ${response_statuscode}

Set REST API Host
    [Documentation]   Set the REST_API_HOST suite variable from OSM_HOSTNAME env variable
    ${nbi_host}=   Get Environment Variable   OSM_HOSTNAME
    ${passed}=   Run Keyword And Return Status   Should Contain   ${nbi_host}   :
    IF   ${passed}
        Set Dockerized Host   ${nbi_host}
    ELSE
        Set Standalone Host   ${nbi_host}
    END

Get ID
    [Documentation]   Examine a REQUEST_RESPONSE dictionary as JSON and return the requested key passed as argument.
    [Arguments]   ${Key}
    Pass Execution If   ${REQUEST_RESPONSE.status_code} in ${SUCCESS_STATUS_CODE_LIST}   Get Auth Token completed
    ${id}=   Get Value From Json   ${REQUEST_RESPONSE.json()}   $..${Key}
    RETURN   ${id[0]}

Get Api Request
    [Documentation]   Send to OSM a GET API message to OSM to the given uri,
    ...               and save response and status code in suite variables to be used later on.
    [Arguments]   ${uri}
    Create Session   Session   ${REST_API_HOST}
    &{headers}=   Create Dictionary   Content-Type=application/json   Accept=application/json   Authorization=Bearer ${ACCESS_TOKEN}
    ${request_response}=   Get On Session   Session   ${uri}   headers=${headers}
    Set Suite Variable   ${REQUEST_RESPONSE}   ${request_response}
    ${response_statuscode}=   Convert To String   ${request_response.status_code}
    Set Suite Variable   ${RESPONSE_STATUSCODE}   ${response_statuscode}
