*** Settings ***
Documentation     Test suite for checking the subscriber status after discovery
Suite Setup       Setup
Test Template     Subscriber Status Test
Library           Collections
Library           String
Library           OperatingSystem
Library           XML
Library           RequestsLibrary
Library           ../Framework/utils/utils.py
Resource          ../Framework/utils/utils.robot
Library           ../Framework/restApi.py

*** Variables ***
${PATHFILE}       ${CURDIR}/data/Subscriber_TopDown.json
&{input_dict}    mac_address=test    ip_address=test2
&{status}    status=test
${src_ip}         X.X.X.X
${src_gateway}    X.X.X.X
${src_user}       user
${src_pass}       pass
${dst_ip}         X.X.X.X
${dst_user}        user
${dst_pass}       pass
${dst_gateway}    X.X.X.X
${dst_host_ip}    X.X.X.X

*** Test Cases ***    TYPE                         LISTINDEX
Test Status Subscriber-1
                      STATUS                       0
Change Subscriber status
                      STATUSCHANGE             0
Push MACandIP Subscriber-1
                      PUSH                     0

*** Keywords ***
Setup
    [Documentation]    Read input file and send arping requests from host/dst to their gateways
    Read InputFile
    Run Keyword And Ignore Error    Wait Until Keyword Succeeds    300s    5s    Ping Gateway    ${src_ip}    ${src_user}    ${src_pass}    ${src_gateway}
    Run Keyword And Ignore Error    Wait Until Keyword Succeeds    300s    5s    Ping Gateway    ${dst_ip}    ${dst_user}    ${dst_pass}    ${dst_gateway}

Read InputFile
    ${SubscriberList}=    utils.jsonToList    ${PATHFILE}   SubscriberInfo 
    Set Suite Variable    ${slist}    ${SubscriberList}
    Set Global Variable    ${Subscriber_Id}    ${EMPTY}
    Set Global Variable    ${status}    ${EMPTY}

Subscriber Status Test
    [Arguments]    ${type}    ${listIndex}
    Run Keyword If    "${type}" == "PUSH"    Push MAC and IP For Subscriber    ${listIndex}
    Run Keyword If    "${type}" == "STATUS"    Wait Until Keyword Succeeds    60s    5s    Subscriber Status Check    ${listIndex}
    Run Keyword If    "${type}" == "STATUSCHANGE"    Subscriber Status Change   ${listIndex}

Subscriber Status Check
    [Arguments]    ${listIndex}
    Set Global Variable    ${Subscriber_Id}    ${EMPTY}
    Log    ${Subscriber_Id}
    ${json_result}=    restApi.ApiGet    VOLT_SUBSCRIBER
    Log    ${json_result}
    ${SubscriberList} =    Get Variable Value    ${slist}
    ${SubscriberDict}=    utils.listToDict    ${SubscriberList}    ${listIndex}
    Log    ${SubscriberDict}
    ${onu_device}=    utils.getFieldValueFromDict    ${subscriberDict}   onu_device
    ${json_result_list}=    Get From dictionary    ${json_result}    items
    ${getJsonDict}=    utils.getDictFromListOfDict    ${json_result_list}    onu_device    ${onu_device}
    ${status}=	Get From Dictionary    ${getJsonDict}    status
    ${Subscriber_Id}=    Get From Dictionary    ${getJsonDict}   id
    Set Global Variable    ${Subscriber_Id}
    ${expected_status}=    utils.getFieldValueFromDict    ${subscriberDict}   status
    Should Be Equal    ${status}    ${expected_status}
    Wait Until Keyword Succeeds    60s    2s    Test Ping    ${ENABLE_STATUS}    ${src_ip}    ${src_user}    ${src_pass}    ${dst_host_ip}
    #Set Global Variable    ${Subscriber_Id}

Subscriber Status Change
    [Arguments]    ${listIndex}
    ${status}=    Create Dictionary    status=enabled
    ${api_result_status}=    restApi.ApiChameleonPut    VOLT_SUBSCRIBER    ${status}    ${Subscriber_Id}
    Should Be True    ${api_result_status}
    Wait Until Keyword Succeeds    60s    2s    Test Ping    ${ENABLE_STATUS}    ${src_ip}    ${src_user}    ${src_pass}    ${dst_host_ip}

Push MAC and IP For Subscriber
    [Arguments]    ${listIndex}
    ${SubscriberList} =    Get Variable Value    ${slist}
    ${SubscriberDict}=    utils.listToDict    ${SubscriberList}    ${listIndex}
    ${mac_address}=    utils.getFieldValueFromDict    ${subscriberDict}   mac_address
    ${ip_address}=    utils.getFieldValueFromDict    ${subscriberDict}   ip_address
    ${input_dict}=    Create Dictionary    mac_address=${mac_address}    ip_address=${ip_address}
    ${api_result_status}=    restApi.ApiChameleonPut    VOLT_SUBSCRIBER    ${input_dict}    ${Subscriber_Id}
    Should Be True    ${api_result_status}
    Wait Until Keyword Succeeds    60s    2s    Test Ping    ${MACIP_STATUS}    ${src_ip}    ${src_user}    ${src_pass}    ${dst_host_ip}

Ping Gateway
    [Documentation]    SSH's into a host and sends an arping to its gateway for host discovery
    [Arguments]    ${ip}    ${user}    ${pass}    ${gateway}    ${prompt}=$    ${prompt_timeout}=60s
    ${conn_id}=    SSHLibrary.Open Connection    ${ip}    prompt=${prompt}    timeout=${prompt_timeout}
    SSHLibrary.Login    ${user}    ${pass}
    SSHLibrary.Write    sudo arping -c 1 ${gateway}
    Read Until    [sudo] password for ${user}:
    SSHLibrary.Write    ${pass}
    ${result}=    Read Until    ${prompt}
    Should Not Contain    ${result}    100% unanswered
    Should Contain    ${result}    0% unanswered
    Log To Console    \n ${result}
    SSHLibrary.Close Connection
