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

*** Variables ***
${OPENSTACK_NOVA_API_VERSION}    /v2
${OPENSTACK_NOVA_KEYPAIR_PATH}    /os-keypairs
${OPENSTACK_NOVA_KEYPAIR_ADD_BODY_FILE}    robot/assets/templates/nova_add_keypair.template
${OPENSTACK_NOVA_KEYPAIR_SSH_KEY}    robot/assets/keys/robot_ssh_public_key.txt
${OPENSTACK_NOVA_FLAVORS_PATH}    /flavors
${OPENSTACK_NOVA_SERVERS_PATH}    /servers
${OPENSTACK_NOVA_IMAGES_PATH}    /images
${OPENSTACK_NOVA_SERVERS_REBOOT_BODY}    {"reboot" : { "type" : "SOFT" }}
${OPENSTACK_NOVA_SERVER_ADD_BODY_FILE}    robot/assets/templates/nova_add_server.template


*** Keywords ***
Get Openstack Keypair
    [Documentation]    Runs an Openstack Request and returns the keypair info
    [Arguments]    ${alias}    ${keypair_name}
    ${resp}=    Internal Get Openstack    ${alias}    ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE}    ${GLOBAL_OPENSTACK_SERVICE_REGION}    ${OPENSTACK_NOVA_KEYPAIR_PATH}    /${keypair_name}
    [Return]    ${resp.json()}

Add Openstack Keypair
    [Documentation]    Runs an Openstack Request to add a keypair and returns the keypair name
    [Arguments]    ${alias}    ${name}
    ${data_template}=    OperatingSystem.Get File    ${OPENSTACK_NOVA_KEYPAIR_ADD_BODY_FILE}
    ${ssh_key}=    OperatingSystem.Get File     ${OPENSTACK_NOVA_KEYPAIR_SSH_KEY}
    ${arguments}=    Create Dictionary    name=${name}	    publickey=${ssh_key}
    ${data}=	Fill JSON Template    ${data_template}    ${arguments}
    ${resp}=    Internal Post Openstack    ${alias}    ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE}    ${GLOBAL_OPENSTACK_SERVICE_REGION}    ${OPENSTACK_NOVA_KEYPAIR_PATH}    data_path=    data=${data}
    Should Be Equal As Strings    200  ${resp.status_code}
    [Return]    ${resp.json()['keypair']['name']}

Delete Openstack Keypair
    [Documentation]    Runs an Openstack Request to delete a keypair
    [Arguments]    ${alias}    ${keypair_name}
    ${resp}=    Internal Delete Openstack    ${alias}    ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE}    ${GLOBAL_OPENSTACK_SERVICE_REGION}    ${OPENSTACK_NOVA_KEYPAIR_PATH}	  /${keypair_name}  
    ${status_string}=    Convert To String    ${resp.status_code}
    Should Match Regexp    ${status_string}    ^(204|202|200)$    
    [Return]    ${resp.text}


Get Openstack Servers
    [Documentation]    Returns the list of servers as a dictionary by name
    [Arguments]    ${alias}
    ${resp}=    Internal Get Openstack    ${alias}    ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE}    ${GLOBAL_OPENSTACK_SERVICE_REGION}    ${OPENSTACK_NOVA_SERVERS_PATH}    /detail
    Log    Returned from Internal Get Openstack
    ${by_name}=    Make List Into Dict    ${resp.json()['servers']}    name
    Log    got it
    [Return]    ${by_name}
    
Get Openstack Server By Id
    [Documentation]    Returns the openstack stacks info for the given stack name
    [Arguments]    ${alias}    ${server_id}        
    ${resp}=    Internal Get Openstack    ${alias}    ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE}    ${GLOBAL_OPENSTACK_SERVICE_REGION}    ${OPENSTACK_NOVA_SERVERS_PATH}    /${server_id}
    [Return]    ${resp}
    
Get Openstack Flavors
    [Documentation]    Runs an Openstack Request and returns the flavor list
    [Arguments]    ${alias}
    ${resp}=    Internal Get Openstack    ${alias}    ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE}    ${GLOBAL_OPENSTACK_SERVICE_REGION}    ${OPENSTACK_NOVA_FLAVORS_PATH}
    [Return]    ${resp.json()}

Get Openstack Images
    [Documentation]    Runs an Openstack Request and returns the flavor list
    [Arguments]    ${alias}
    ${resp}=    Internal Get Openstack    ${alias}    ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE}    ${GLOBAL_OPENSTACK_SERVICE_REGION}    ${OPENSTACK_NOVA_IMAGES_PATH}
    [Return]    ${resp.json()}

Reboot Server
    [Documentation]    Requests a reboot of the passed server id
    [Arguments]    ${alias}    ${server_id}        
    ${resp}=    Internal Post Openstack    ${alias}    ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE}    ${GLOBAL_OPENSTACK_SERVICE_REGION}    ${OPENSTACK_NOVA_SERVERS_PATH}    /${server_id}/action    ${OPENSTACK_NOVA_SERVERS_REBOOT_BODY}
    [Return]    ${resp}

Add Server
    [Documentation]    Adds a server for the passed if
    [Arguments]    ${alias}    ${name}    ${imageRef}    ${flavorRef}
    ${dict}=    Create Dictionary   name=${name}   imageRef=${imageRef}   flavorRef=${flavorRef}
    ${data}=    Fill JSON Template File    ${OPENSTACK_NOVA_SERVER_ADD_BODY_FILE}    ${dict}        
    ${resp}=    Internal Post Openstack    ${alias}    ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE}    ${GLOBAL_OPENSTACK_SERVICE_REGION}    ${OPENSTACK_NOVA_SERVERS_PATH}   data_path=    data=${data}     
    [Return]    ${resp}

Add Server For Image Name
    [Documentation]    Adds a server for the passed if
    [Arguments]    ${alias}    ${name}    ${imageName}    ${flavorName}
    ${images}=  Get Openstack Images    ${alias}
    ${flavors}=  Get Openstack Flavors    ${alias}
    ${images}=   Get From Dictionary   ${images}   images
    ${flavors}=   Get From Dictionary   ${flavors}   flavors
    ${imageRef}=    Get Id For Name   ${images}    ${imageName}
    ${flavorRef}=   Get Id For Name   ${flavors}    ${flavorName}
    ${dict}=    Create Dictionary   name=${name}   imageRef=${imageRef}   flavorRef=${flavorRef}
    ${data}=    Fill JSON Template File    ${OPENSTACK_NOVA_SERVER_ADD_BODY_FILE}    ${dict}        
    ${resp}=    Internal Post Openstack    ${alias}    ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE}    ${GLOBAL_OPENSTACK_SERVICE_REGION}    ${OPENSTACK_NOVA_SERVERS_PATH}   data_path=    data=${data}     
    ${status_string}=    Convert To String    ${resp.status_code}
    Should Match Regexp    ${status_string}    ^(202)$
    [Return]    ${resp.json()}

Wait for Server to Be Active
    [Arguments]    ${alias}   ${server_id}    ${timeout}=300s
    ${server_info}=    Wait Until Keyword Succeeds    ${timeout}    10 sec    Get Active Server    ${alias}    ${server_id}    
    ${status}=   Get From Dictionary    ${server_info}    status
    Should Be Equal    ${status}    ACTIVE
    [Return]    ${server_info}

 Get Active Server
    [Arguments]    ${alias}    ${server_id}    
    ${resp}=    Get Openstack Server By Id    ${alias}    ${server_id}
    Should Be Equal As Strings   ${resp.status_code}    200
    ${server_info}=    Set Variable    ${resp.json()}   
    ${server_info}=    Get From Dictionary   ${server_info}    server
    ${status}=   Get From Dictionary    ${server_info}    status
    Should Not Be Equal    ${status}    BUILD
    [Return]    ${server_info}     

Wait for Server to Be Deleted
    [Arguments]    ${alias}    ${server_id}
    Wait Until Keyword Succeeds    300s   10s    Get Deleted Server   ${alias}    ${server_id}

Get Deleted Server
    [Arguments]    ${alias}    ${server_id}
    ${resp}=  Get Openstack Server By Id   ${alias}    ${server_id}
    Should Be Equal As Strings    ${resp.status_code}    404

Delete Server
    [Documentation]    Runs an Openstack Request to delete a keypair
    [Arguments]    ${alias}    ${server_id}
    ${resp}=    Internal Delete Openstack    ${alias}    ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE}    ${GLOBAL_OPENSTACK_SERVICE_REGION}    ${OPENSTACK_NOVA_SERVERS_PATH}	  /${server_id}  
    ${status_string}=    Convert To String    ${resp.status_code}
    Should Match Regexp    ${status_string}    ^(204)$    
    [Return]    ${resp.text}

Get Id For Name
    [Arguments]    ${list}    ${name}
    :for   ${item}   in   @{list}
    \    ${id}=    Get From Dictionary    ${item}    id 
    \    ${n}=    Get From Dictionary    ${item}    name
    \    Return from Keyword If   '${n}' == '${name}'   ${id} 
    [Return]   None    
