*** Settings ***
Documentation     The main interface for interacting with Openstack Keystone API. It handles low level stuff like managing the authtoken and Openstack required fields
Library           OpenstackLibrary
Library 	      RequestsLibrary
Library 	      HTTPUtils
Library	          UUID
Library	          Collections
Library    OperatingSystem
Library    String
Library    HttpLibrary.HTTP
Resource    ../global_properties.robot
Resource    ../json_templater.robot
Resource    openstack_common.robot

*** Variables ***
${OPENSTACK_KEYSTONE_API_v3_VERSION}   /v3
${OPENSTACK_KEYSTONE_API_v2_VERSION}   /v2.0
${OPENSTACK_KEYSTONE_AUTH_v3_PATH}    /auth/tokens
${OPENSTACK_KEYSTONE_AUTH_v2_PATH}    /tokens
${OPENSTACK_KEYSTONE_AUTH_v2_BODY_FILE}    robot/assets/templates/keystone_get_v2_auth.template
${OPENSTACK_KEYSTONE_AUTH_v3_BODY_FILE}    robot/assets/templates/keystone_get_v3_auth.template
${OPENSTACK_KEYSTONE_TENANT_PATH}    /tenants

*** Keywords ***
Run Openstack Auth Request
    [Documentation]    Runs an Openstack Auth Request and returns the token and service catalog. you need to include the token in future request's x-auth-token headers. Service catalog describes what can be called
    [Arguments]    ${alias}    ${username}=    ${password}=
    ${username}    ${password}=   Set Openstack Credentials   ${username}    ${password}
    ${keystone_api_version}=    Run Keyword If    '${GLOBAL_INJECTED_OPENSTACK_KEYSTONE_API_VERSION}'==''    Get KeystoneAPIVersion 
    ...    ELSE    Set Variable   ${GLOBAL_INJECTED_OPENSTACK_KEYSTONE_API_VERSION}
    ${url}   ${path}=   Get Keystone Url And Path   ${keystone_api_version}
    ${session}=    Create Session 	keystone 	${url}    verify=True
    ${uuid}=    Generate UUID
    ${data_path}   ${data}=   Run Keyword If   '${keystone_api_version}'=='v2.0'   Get KeyStoneAuthv2 Data   ${username}    ${password}    ${path}
    ...   ELSE   Get KeyStoneAuthv3 Data   ${username}    ${password}   ${path}
    ${headers}=  Create Dictionary     Accept=application/json    Content-Type=application/json    X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid}    X-FromAppId=${GLOBAL_APPLICATION_ID}
    Log    Sending authenticate post request ${data_path} with headers ${headers} and data ${data}
    ${resp}= 	Post Request 	keystone 	${data_path}     data=${data}    headers=${headers}
    Should Be True    200 <= ${resp.status_code} < 300
    ${auth_token}=    Evaluate    ''
    ${auth_token}=    Run Keyword If    '${keystone_api_version}'=='v3'    Get From Dictionary    ${resp.headers}    X-Subject-Token
    Log    Keystone API Version is ${keystone_api_version}
    Save Openstack Auth    ${alias}    ${resp.text}    ${auth_token}    ${keystone_api_version}
    Log    Received response from keystone ${resp.text}

Get KeystoneAPIVersion
    [Documentation]    Get Keystone API version
    ${pieces}=    Url Parse    ${GLOBAL_INJECTED_KEYSTONE}
    ${url}=    Catenate    ${pieces.scheme}://${pieces.netloc}
    Log   Keystone URL is ${url}
    ${session}=    Create Session    keystone    ${url}    verify=True
    ${uuid}=    Generate UUID
    ${headers}=    Create Dictionary    Accept=application/json    Content-Type=application/json    
    ${resp}=    Get Request    keystone  /   headers=${headers}
    Log    Received response from keystone ${resp.text}
    Should Be Equal As Strings    ${resp.status_code}    300
    ${json}=    Parse Json    ${resp.content}
    ${versions}=   Get From Dictionary    ${json}   versions
    ${values}=   Get From Dictionary    ${versions}   values
    : FOR    ${value}    IN    @{values}
       \  ${status}=    Get Variable Value    ${value["status"]}
       \  Run Keyword If    '${status}'=='stable'   Exit For Loop
    ${href}=  Set Variable     ${value["links"][0]["href"]}
    ${keystone}=  Set Variable   ${GLOBAL_INJECTED_KEYSTONE}  
    ${version}=    Remove String  ${href}   ${keystone}  /
    Return From Keyword If   '${version}'=='v2.0' or '${version}'=='v3'    ${version}
    Fail   Keystone API version not found or not supported    
	
Get KeyStoneAuthv2 Data
    [Documentation]    Returns all the data for keystone auth v2 api
    [Arguments]    ${username}    ${password}    ${path}
    ${data_template}=    OperatingSystem.Get File    ${OPENSTACK_KEYSTONE_AUTH_v2_BODY_FILE}
    ${arguments}=    Create Dictionary    username=${username}    password=${password}   tenantId=${GLOBAL_INJECTED_OPENSTACK_TENANT_ID}
    ${data}=    Fill JSON Template    ${data_template}    ${arguments}
    ${data_path}=    Catenate    ${path}${OPENSTACK_KEYSTONE_AUTH_v2_PATH}
    [Return]    ${data_path}    ${data}

Get KeyStoneAuthv3 Data
    [Documentation]    Returns all the data for keystone auth v3 api
    [Arguments]    ${username}    ${password}    ${path}
    ${data_template}=    OperatingSystem.Get File    ${OPENSTACK_KEYSTONE_AUTH_v3_BODY_FILE}
    ${arguments}=    Create Dictionary    username=${username}    password=${password}   domain_id=${GLOBAL_INJECTED_OPENSTACK_DOMAIN_ID}    project_name=${GLOBAL_INJECTED_OPENSTACK_PROJECT_NAME}
    ${data}=    Fill JSON Template    ${data_template}    ${arguments}
    ${data_path}=    Catenate    ${path}${OPENSTACK_KEYSTONE_AUTH_v3_PATH}
    [Return]    ${data_path}    ${data}

Get Openstack Tenants
    [Documentation]    Returns all the openstack tenant info
    [Arguments]    ${alias}
    ${resp}=    Internal Get Openstack With Region    ${alias}    ${GLOBAL_OPENSTACK_KEYSTONE_SERVICE_TYPE}    region=    url_ext=${OPENSTACK_KEYSTONE_TENANT_PATH}    data_path=
    [Return]    ${resp.json()}

Get Openstack Tenant
    [Documentation]    Returns the openstack tenant info for the specified tenantid
    [Arguments]    ${alias}     ${tenant_id}
    ${resp}=    Internal Get Openstack With Region    ${alias}    ${GLOBAL_OPENSTACK_KEYSTONE_SERVICE_TYPE}    region=    url_ext=${OPENSTACK_KEYSTONE_TENANT_PATH}    data_path=/${tenant_id}
    [Return]    ${resp.json()}

Set Openstack Credentials
    [Arguments]    ${username}    ${password}
    Return From Keyword If    '${username}' != ''   ${username}    ${password}
    ${user}   ${pass}=   Get Openstack Credentials
    [Return]   ${user}   ${pass}

Get Openstack Credentials
    [Documentation]   Returns the Decripted Password and openstack username using same api_key.txt as SO
    ${DECRYPTED_OPENSTACK_PASSWORD}=   Run    echo -n ${GLOBAL_INJECTED_OPENSTACK_API_KEY} | xxd -r -p | openssl enc -aes-128-ecb -d -nosalt -K aa3871669d893c7fb8abbcda31b88b4f | tr -d '\x08'
    [Return]   ${GLOBAL_INJECTED_OPENSTACK_USERNAME}    ${DECRYPTED_OPENSTACK_PASSWORD}


Get Keystone Url And Path
    [Arguments]    ${keystone_api_version}
    [Documentation]    Handle arbitrary keystone identiit url. Add v2.0 if not present.
    ${url}    ${path}=    Run Keyword If    '${keystone_api_version}'=='v2.0'    Set API Version    ${OPENSTACK_KEYSTONE_API_v2_VERSION}
    ...    ELSE    Set API Version    ${OPENSTACK_KEYSTONE_API_v3_VERSION}
    Log    Path is ${url} ${path}
    [Return]   ${url}   ${path}

Set API Version
    [Documentation]    Decides the API version to be used
    [Arguments]    ${openstack_version}
    ${pieces}=   Url Parse   ${GLOBAL_INJECTED_KEYSTONE}
    ${url}=      Catenate   ${pieces.scheme}://${pieces.netloc}
    ${version}=  Evaluate   ''
    ${version}=  Set Variable If   '${openstack_version}' not in '${pieces.path}'   ${openstack_version}   ${version}
    ${path}=     Catenate   ${pieces.path}${version}
    [Return]   ${url}   ${path}
