*** Settings ***
Documentation     This module is for SSH connection override to QEMU
...               based openbmc systems.

Library           SSHLibrary   timeout=30 seconds
Library           OperatingSystem
Library           Collections

*** Variables ***

*** Keywords ***
Open Connection And Log In
    [Documentation]  Opens a connection with the given arguments, and logs in.
    ...  Defaults to logging into the BMC.
    [Arguments]  ${username}=${OPENBMC_USERNAME}
    ...          ${password}=${OPENBMC_PASSWORD}  &{connection_args}

    # username          The username to log into the connection with.
    # password          The password to log into the connection with.
    # connection_args   A dictionary of acceptable inputs to the Open Connection
    #                   keyword. This includes, but is not limited to, the
    #                   following:
    #                   host, alias, port, timeout, newline, prompt, term_type,
    #                   width, height, path_separator, endcoding
    #                   (For more information, please visit the SSHLibrary doc)

    #                   Of the above arguments to Open Connection, this keyword
    #                   will provide the following default values:
    #                   host             ${OPENBMC_HOST}

    # If no host was provided, add ${OPENBMC_HOST} to the dictionary
    ${has_host}=  Run Keyword and Return Status
    ...           Dictionary Should Contain Key  ${connection_args}  host
    Run Keyword If  ${has_host} == ${FALSE}
    ...             Set To Dictionary  ${connection_args}  host=${OPENBMC_HOST}

    Run Keyword If
    ...   '${SSH_PORT}' != '${EMPTY}' and '${HTTPS_PORT}' != '${EMPTY}'
    ...   User input SSH and HTTPs Ports

    # Check to see if a port to connect to was provided.
    ${has_port}=  Run Keyword and Return Status
    ...           Dictionary Should Contain Key  ${connection_args}  port

    # If the ${SSH_PORT} is set and no port was provided, add the defined port
    # to the dictionary and open the connection. Otherwise, open the connection
    # with the either the provided port or the default port.
    Run Keyword If  '${SSH_PORT}' != '${EMPTY}' and ${has_port} == ${FALSE}
    ...            Run Keywords
    ...            Set To Dictionary  ${connection_args}  port=${SSH_PORT}  AND
    ...            SSHLibrary.Open connection  &{connection_args}
    ...   ELSE  Run Keyword   SSHLibrary.Open connection  &{connection_args}

    Login  ${username}  ${password}

Open Connection for SCP
    Import Library      SCPLibrary      WITH NAME       scp
    Run Keyword If  '${SSH_PORT}' == '${EMPTY}'  scp.Open connection  ${OPENBMC_HOST}
    ...  username=${OPENBMC_USERNAME}  password=${OPENBMC_PASSWORD}
    ...  ELSE   Run Keyword    scp.Open connection  ${OPENBMC_HOST}  port=${SSH_PORT}
    ...  username=${OPENBMC_USERNAME}  password=${OPENBMC_PASSWORD}


User input SSH and HTTPs Ports
    [Documentation]   Update the global SSH and HTTPs port variable for QEMU
    ${port_num}=    Convert To Integer    ${SSH_PORT}
    ${SSH_PORT}=    Replace Variables     ${port_num}

    ${https_num}=   Convert To Integer    ${HTTPS_PORT}
    Set Global Variable     ${AUTH_URI}    https://${OPENBMC_HOST}:${https_num}

Validate Or Open Connection
    [Documentation]  Checks for an open connection to a host or alias.
    [Arguments]  ${alias}=None  ${host}=${EMPTY}  &{connection_args}

    # alias            The alias of the connection to validate.
    # host             The DNS name or IP of the host to validate.
    # connection_args  A dictionary of arguments to pass to Open Connection
    #                  and Log In (see above) if the connection is not open. May
    #                  contain, but does not need to contain, the host or alias.

    # Check to make sure we have an alias or host to search for.
    Run Keyword If  '${host}' == '${EMPTY}'  Should Not Be Equal  ${alias}  None
    ...  msg=Need to provide a host or an alias.  values=False

    # Search the dictionary to see if it includes the host and alias.
    ${host_exists}=  Run Keyword and Return Status
    ...              Dictionary Should Contain Key  ${connection_args}  host
    ${alias_exists}=  Run Keyword and Return Status
    ...               Dictionary Should Contain Key  ${connection_args}  alias

    # Add the alias and host back into the dictionary of connection arguments,
    # if needed.
    Run Keyword If  '${host}' != '${EMPTY}' and ${host_exists} == ${FALSE}
    ...             Set to Dictionary  ${connection_args}  host  ${host}
    Run Keyword If  '${alias}' != 'None' and ${alias_exists} == ${FALSE}
    ...             Set to Dictionary  ${connection_args}  alias  ${alias}

    @{open_connections}=  Get Connections
    # If there are no open connections, open one and return.
    Run Keyword If  '${open_connections}' == '[]'
    ...             Open Connection and Log In  &{connection_args}
    Return From Keyword If  '${open_connections}' == '[]'

    # Connect to the alias or host that matches. If both are given, only connect
    # to a connection that has both.
    :FOR  ${connection}  IN  @{open_connections}
    \  Log  ${connection}
    \  ${alias_match}=  Evaluate  '${alias}' == '${connection.alias}'
    \  ${host_match}=  Evaluate  '${host}' == '${connection.host}'
    \  ${given_alias}=  Evaluate  '${alias}' != 'None'
    \  ${no_alias}=  Evaluate  '${alias}' == 'None'
    \  ${given_host}=  Evaluate  '${host}' != '${EMPTY}'
    \  ${no_host}=  Evaluate  '${host}' == '${EMPTY}'
    \  Run Keyword If
    ...    ${given_alias} and ${given_host} and ${alias_match} and ${host_match}
    ...    Run Keywords
    ...      Switch Connection  ${alias}  AND
    ...      Log to Console  Found connection. Switched to ${alias} ${host}  AND
    ...      Return From Keyword If  ${alias_match} and ${host_match}
    ...    ELSE  Run Keyword If
    ...      ${given_alias} and ${no_host} and ${alias_match}
    ...      Run Keywords
    ...        Switch Connection  ${alias}  AND
    ...        Log to Console  Found connection. Switched to: ${alias}  AND
    ...        Return From Keyword If  ${alias_match}
    ...    ELSE  Run Keyword If
    ...       ${given_host} and ${no_alias} and ${host_match}
    ...       Run Keywords
    ...         Switch Connection  ${connection.index}  AND
    ...         Log to Console  Found Connection. Switched to: ${host}  AND
    ...         Return From Keyword If  ${host_match}

    # If no connections are found, open a connection with the provided args.
    Log  No connection with provided arguments.  Opening a connection.
    Open Connection and Log In  &{connection_args}


Clear System Entry From Knownhosts
    [Documentation]   Delete OPENBMC_HOST entry from known_hosts file.
    ${cmd}=  Set Variable  sed '/${OPENBMC_HOST}/d' -i ~/.ssh/known_hosts
    ${rc}  ${output}=  Run and Return RC and Output  ${cmd}

