*** Settings ***
Documentation     Test successful ping from end-end
Suite Setup       Read InputFile
#Suite Teardown    Teardown
Library           Collections
Library           String
Library           OperatingSystem
Library           XML
Library           RequestsLibrary
Library           ../../Framework/utils/utils.py
Resource           ../../Framework/utils/utils.robot
Library           ../../Framework/restApi.py
Resource           ../../Framework/Subscriber.robot
Resource           ../../Framework/ATTWorkFlowDriver.robot
Resource           ../../Framework/ONU.robot
Resource           ../../Framework/DHCP.robot
Variables           ../../Properties/RestApiProperties.py

*** Variables ***
${WHITELIST_PATHFILE}     ${CURDIR}/data/ATTWhiteList.json
${SUBSCRIBER_PATHFILE}    ${CURDIR}/data/ATTSubscriber.json
${src_ip}         X.X.X.X
${src_gateway}    X.X.X.X
${src_user}       user
${src_pass}       pass
${src_iface}      eth0
${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 ***
Validate ONU States
    [Documentation]    Validate status field in ONU List
    Wait Until Keyword Succeeds    60s    2s    Validate ONU States    ACTIVE    ENABLED

Validate states in ATT WorkFlowDriver Service Instances
    [Documentation]    Validates necessary states for entries in workflow driver service instance list
    Wait Until Keyword Succeeds    60s    2s    Validate ATT Workflow Driver SI    valid    AWAITING

Validate Subscriber State
    [Documentation]    Validate subscriber status in the rcordsubscriber list
    Wait Until Keyword Succeeds    60s    2s    Validate Subscriber Status    AWAITING-AUTH

Send Subscriber Authentication
    [Documentation]    Sends a successful 802.1x EAPOL message from the subscriber
    Send EAPOL Message    ${src_ip}    ${src_user}    ${src_pass}    ${src_iface}    wpa_supplicant.conf

Validate states in ATT WorkFlowDriver instances after subscriber authentication
    [Documentation]    Validate proper states on the service instances after authentication
    Wait Until Keyword Succeeds    60s    2s    Validate ATT Workflow Driver SI    valid    APPROVED

Re-Validate Subscriber State
    [Documentation]    Validate subscriber status in the rcordsubscriber list
    Wait Until Keyword Succeeds    60s    2s    Validate Subscriber Status    ENABLED

Execute Dhclient on RG
    [Documentation]    Run dhclient on the dataplane interface on the RG
    Send Dhclient Request    ${src_ip}    ${src_user}    ${src_pass}    ${src_iface}

Test E2E Connectivity
    [Documentation]    Test pings after subscriber has been authenticated + enabled
    Wait Until Keyword Succeeds    60s    2s    Test Ping    PASS    ${src_ip}    ${src_user}    ${src_pass}    ${dst_host_ip}

*** Keywords ***
Read InputFile
    ${AttWhiteListList}=    utils.jsonToList    ${WHITELIST_PATHFILE}   AttWhiteListInfo
    Set Suite Variable    ${alist}    ${AttWhiteListList}
    ${AttWhiteListList} =    Get Variable Value    ${alist}
    ${AttWhiteListDict}=    utils.listToDict    ${AttWhiteListList}    0
    ${onu_device}=   Get From Dictionary    ${AttWhiteListDict}    serial_number
    Log    ${onu_device}
    Set Global Variable    ${onu_device}
    ${SubscriberList}=    utils.jsonToList    ${SUBSCRIBER_PATHFILE}   SubscriberInfo
    Set Global Variable    ${slist}    ${SubscriberList}

Teardown
    [Documentation]    Delete xos objects and kill process on src host
    ##in some tests, these processes will not get started
    Run Keyword And Ignore Error    Kill Linux Process    ${src_ip}    ${src_user}    ${src_pass}    [w]pa_supplicant
    Run Keyword And Ignore Error    Kill Linux Process    ${src_ip}    ${src_user}    ${src_pass}    [d]hclient
    Delete IP Addresses from Interface on Remote Host    ${src_ip}    ${src_user}    ${src_pass}    ${src_iface}
    Clean Up Objects   ${VOLT_SUBSCRIBER}
    ##need to keep retrying to delete olt device until subscriber is completely removed from xos
    Wait Until Keyword Succeeds    60s    2s    Clean Up Objects   ${VOLT_DEVICE}
    Clean Up Objects   ${ATT_WHITELIST}

Validate ONU States
    [Arguments]    ${expected_op_status}    ${expected_admin_status}
    ${operational_status}    ${admin_status}    ONU Status Check    ${onu_device}
    Should Be Equal    ${operational_status}    ${expected_op_status}
    Should Be Equal    ${admin_status}    ${expected_admin_status}

Validate ATT Workflow Driver SI
    [Arguments]    ${expected_status}    ${expected_auth_status}
    ${status}   ${authentication_status}   Service Instance Status Check    ${onu_device}
    Should Be Equal    ${status}    ${expected_status}
    Should Be Equal    ${authentication_status}    ${expected_auth_status}

Validate Subscriber Status
    [Arguments]    ${exepected_status}
    ${status}    Subscriber Status Check    ${onu_device}
    Should Be Equal    ${status}    ${exepected_status}
