SEBA-167 checking in initial workflow validation test with kafka event emulations

Change-Id: I7cd0e4c86c844f16ed621fe213769eacd7136277
diff --git a/src/test/cord-api/Tests/WorkflowValidations/ATT_Workflow.robot b/src/test/cord-api/Tests/WorkflowValidations/ATT_Workflow.robot
new file mode 100644
index 0000000..bb1bbf1
--- /dev/null
+++ b/src/test/cord-api/Tests/WorkflowValidations/ATT_Workflow.robot
@@ -0,0 +1,243 @@
+*** Settings ***
+Library           KafkaLibrary
+Library           RequestsLibrary
+Library           HttpLibrary.HTTP
+Library           Collections
+Library           String
+Library           OperatingSystem
+Suite Setup       Setup
+Suite Teardown    Teardown
+
+*** Variables ***
+${cord_kafka}         cord-kafka
+${server_ip}          xos-chameleon
+${server_port}        9101
+${subscriber_api}     /xosapi/v1/rcord/rcordsubscribers
+${att_si_api}         /xosapi/v1/att-workflow-driver/attworkflowdriverserviceinstances
+${onu_device_api}     /xosapi/v1/volt/onudevices
+${onu_serial_no}      onudevice123
+${onu_invalid_sn}     invalid_serial_no
+${mac_address}        00:AA:00:00:00:01
+${ip_address}         192.168.3.5
+${deviceId}           of:robot_test
+${ponportno}          10
+${uniportno}          100
+
+*** Test Cases ***
+Create Two ONU Devices
+    [Documentation]    Create two onu devices to be tested for valid + invalid paths
+    [Tags]    play
+    ${resp}=    CORD Get    /xosapi/v1/volt/voltservices
+    ${jsondata}=    To Json    ${resp.content}
+    ${voltservice}=    Get From List    ${jsondata['items']}    0
+    ${voltservice_id}=    Get From Dictionary    ${voltservice}    id
+    ${resp}=    CORD Get    /xosapi/v1/att-workflow-driver/attworkflowdriverservices
+    ${jsondata}=    To Json    ${resp.content}
+    ${attworkflowservice}=    Get From List    ${jsondata['items']}    0
+    ${attworkflowservice_id}=    Get From Dictionary    ${attworkflowservice}    id
+    Set Suite Variable    ${attworkflowservice_id}
+    ${resp}=    CORD Post    /xosapi/v1/rcord/rcordsubscribers    {"onu_device": "${onu_serial_no}", "status": "pre-provisioned"}
+    ${subscriber_id}=    Get Json Value    ${resp.content}    /id
+    Set Suite Variable    ${subscriber_id}
+    ${resp}=    CORD Post    /xosapi/v1/volt/oltdevices    {"volt_service_id": ${voltservice_id}, "name": "testoltdevice1", "device_type": "ponism", "host": "172.17.0.1", "port": 50060, "switch_port": "1", "dp_id": "${deviceId}", "outer_tpid": "0x8100"}
+    ${oltdevice_id}=    Get Json Value    ${resp.content}    /id
+    Set Suite Variable    ${oltdevice_id}
+    ${resp}=    CORD Post    /xosapi/v1/volt/ponports    {"olt_device_id": ${oltdevice_id}, "port_no": "${ponportno}", "name": "testponport1"}
+    ${ponport_id}=    Get Json Value    ${resp.content}    /id
+    Set Suite Variable    ${ponport_id}
+    ${resp}=    CORD Post    /xosapi/v1/volt/onudevices    {"serial_number": "${onu_serial_no}", "pon_port_id": ${ponport_id}, "vendor": "abcdefg"}
+    ${onu_device1_id}=    Get Json Value    ${resp.content}    /id
+    Set Suite Variable    ${onu_device1_id}
+    ${resp}=    CORD Post    /xosapi/v1/volt/uniports    {"onu_device_id": "${onu_device1_id}", "port_no": ${uniportno}, "name": "testuniport"}
+    ${uni_port_id}=    Get Json Value    ${resp.content}    /id
+    Set Suite Variable    ${uni_port_id}
+    ${resp}=    CORD Post    /xosapi/v1/volt/onudevices    {"serial_number": "${onu_invalid_sn}", "pon_port_id": ${ponport_id}, "vendor": "abcdefg"}
+    ${onu_device2_id}=    Get Json Value    ${resp.content}    /id
+    Set Suite Variable    ${onu_device2_id}
+    ${resp}=    CORD Post    /xosapi/v1/att-workflow-driver/attworkflowdriverwhitelistentries    {"serial_number": "${onu_serial_no}", "device_id": "${deviceId}", "pon_port_id": ${ponportno}, "owner_id": ${attworkflowservice_id}}
+    ${whitelist_entry_id}=    Get Json Value    ${resp.content}    /id
+    Set Suite Variable    ${whitelist_entry_id}
+
+Activate Non-Whitelisted ONU
+    [Documentation]    Validate that activating an ONU not in whitelist sets onu device to DISABLED
+    Send Kafka Event    onu.events    {'status': 'activated','serial_number': '${onu_invalid_sn}','uni_port_id': ${uniportno}, 'of_dpid': '${deviceId}'}
+    Wait Until Keyword Succeeds    30s    5s    Validate ONU Device Status    ${onu_invalid_sn}    DISABLED
+
+Activate Whitelisted ONU in Wrong Location
+    [Documentation]    Validate that activating an ONU in the whitelist but in the wrong location DISABLES the onu device
+    Send Kafka Event    onu.events    {'status': 'activated','serial_number': '${onu_serial_no}','uni_port_id': 52, 'of_dpid': '${deviceId}'}
+    ${att_wf_driver_si_id}=    Wait Until Keyword Succeeds    30s    5s    Get ATT Service Instance ID    ${onu_serial_no}    DISABLED
+
+Activate Whitelisted ONU
+    [Documentation]    Validate that activating an ONU in the whitelist creates a attworkflow-driver-serviceinstance
+    Send Kafka Event    onu.events    {'status': 'activated','serial_number': '${onu_serial_no}','uni_port_id': ${uniportno}, 'of_dpid': '${deviceId}'}
+    ${att_wf_driver_si_id}=    Wait Until Keyword Succeeds    30s    5s    Get ATT Service Instance ID    ${onu_serial_no}    AWAITING
+
+Send Denied Auth Request
+    [Documentation]    Validate that denied auth request to the onu will disabled the subscriber and remove a service chain
+    Send Kafka Event    authentication.events    {'authenticationState': 'DENIED', 'deviceId': '${deviceId}','portNumber': ${uniportno}}
+    Wait Until Keyword Succeeds    30s    5s    Validate Subscriber Status    ${onu_serial_no}    disabled
+    Wait Until Keyword Succeeds    30s    5s    Validate Subscriber Service Chain    ${onu_serial_no}    0
+    ${att_wf_driver_si_id}=    Wait Until Keyword Succeeds    30s    5s    Get ATT Service Instance ID    ${onu_serial_no}    AWAITING
+
+Send Auth Request
+    [Documentation]    Validate that sending an auth request to the onu will enable the subscriber and create a service chain
+    Send Kafka Event    authentication.events    {'authenticationState': 'APPROVED', 'deviceId': '${deviceId}','portNumber': ${uniportno}}
+    Wait Until Keyword Succeeds    30s    5s    Validate Subscriber Status    ${onu_serial_no}    enabled
+    Wait Until Keyword Succeeds    30s    5s    Validate Subscriber Service Chain    ${onu_serial_no}    1
+    ${att_wf_driver_si_id}=    Wait Until Keyword Succeeds    30s    5s    Get ATT Service Instance ID    ${onu_serial_no}    APPROVED
+
+Send DHCP Request
+    [Documentation]    Validate that sending an dhcp request to update the subscriber's mac+ip address
+    Send Kafka Event    dhcp.events    {'macAddress': '${mac_address}','ipAddress': '${ip_address}', 'deviceId': '${deviceId}', 'portNumber': ${uniportno}}
+    Wait Until Keyword Succeeds    30s    5s    Validate Subscriber Settings    ${onu_serial_no}
+
+Create New Whitelist Entry
+    [Documentation]    Validate that creating a new whitelist entry for the "invalid" onu device will enable the onu
+    [Tags]    notready
+    ${resp}=    CORD Post    /xosapi/v1/att-workflow-driver/attworkflowdriverwhitelistentries    {"serial_number": "${onu_invalid_sn}", "device_id": "${deviceId}", "pon_port_id": ${ponportno}, "owner_id": ${attworkflowservice_id}}
+    ${whitelist_entry2_id}=    Get Json Value    ${resp.content}    /id
+    Set Suite Variable    ${whitelist_entry2_id}
+    Wait Until Keyword Succeeds    30s    5s    Validate ONU Device Status    ${onu_invalid_sn}    ENABLED
+
+*** Keywords ***
+Setup
+    Connect Producer    ${cord_kafka}:9092    onu.events
+    Connect Producer    ${cord_kafka}:9092    authentication.events
+    Connect Producer    ${cord_kafka}:9092    dhcp.events
+    ${auth} =    Create List    admin@opencord.org    letmein
+    ${HEADERS}    Create Dictionary    Content-Type=application/json
+    Create Session    ${server_ip}    http://${server_ip}:${server_port}    auth=${AUTH}    headers=${HEADERS}
+
+Teardown
+    [Documentation]    Delete all models create
+    Sleep    30
+    CORD Get    /xosapi/v1/rcord/rcordsubscribers
+    CORD Delete    /xosapi/v1/rcord/rcordsubscribers    ${subscriber_id}
+    CORD Delete    /xosapi/v1/volt/oltdevices    ${oltdevice_id}
+    CORD Delete    /xosapi/v1/att-workflow-driver/attworkflowdriverwhitelistentries    ${whitelist_entry_id}
+    CORD Delete    /xosapi/v1/att-workflow-driver/attworkflowdriverwhitelistentries    ${whitelist_entry2_id}
+
+Send Kafka Event
+    [Documentation]    Send event
+    [Arguments]    ${topic}    ${message}
+    Log    Sending event
+    ${event}=    evaluate    json.dumps(${message})    json
+    Send    ${topic}    ${event}
+    Flush
+
+CORD Get
+    [Documentation]    Make a GET call to XOS
+    [Arguments]    ${service}
+    ${resp}=    Get Request    ${server_ip}    ${service}
+    Log    ${resp.content}
+    Should Be Equal As Strings    ${resp.status_code}    200
+    [Return]    ${resp}
+
+CORD Post
+    [Documentation]    Make a POST call to XOS
+    [Arguments]    ${service}    ${data}
+    ${data}=    Evaluate    json.dumps(${data})    json
+    ${resp}=    Post Request    ${server_ip}    uri=${service}    data=${data}
+    Log    ${resp.content}
+    Should Be Equal As Strings    ${resp.status_code}    200
+    ${id}=    Get Json Value    ${resp.content}    /id
+    Set Suite Variable    ${id}
+    [Return]    ${resp}
+
+CORD Delete
+    [Documentation]    Make a DELETE call to the CORD controller
+    [Arguments]    ${service}    ${data_id}
+    ${resp}=    Delete Request    ${SERVER_IP}    uri=${service}/${data_id}
+    Log    ${resp.content}
+    Should Be Equal As Strings    ${resp.status_code}    200
+    [Return]    ${resp}
+
+Get ATT Service Instance ID
+    [Documentation]    Returns the id of the newly created onu's att workflow service instance
+    [Arguments]    ${serial_no}    ${auth_state}
+    ${resp}=    Get Request    ${server_ip}    ${att_si_api}
+    Log    ${resp.content}
+    Should Be Equal As Strings    ${resp.status_code}    200
+    ## validate sn exists
+    Should Contain    ${resp.content}    ${serial_no}
+    ${jsondata}=    To Json    ${resp.content}
+    Log    ${jsondata}
+    ${length}=    Get Length    ${jsondata['items']}
+    : FOR    ${INDEX}    IN RANGE    0    ${length}
+    \    ${value}=    Get From List    ${jsondata['items']}    ${INDEX}
+    \    ${id}=    Get From Dictionary    ${value}    id
+    \    ${sn}=    Get From Dictionary    ${value}    serial_number
+    \    ${as}=    Get From Dictionary    ${value}    authentication_state
+    \    Run Keyword If    '${sn}' == '${serial_no}'    Exit For Loop
+    Should Be Equal    ${as}    ${auth_state}
+    [Return]    ${id}
+
+Validate Service Chain Links
+    [Arguments]    ${serial_no}    ${expected_links}
+    ${resp}=    CORD Get    ${subscriber_api}
+    ${jsondata}=    To Json    ${resp.content}
+    Log    ${jsondata}
+    ${length}=    Get Length    ${jsondata['items']}
+    : FOR    ${INDEX}    IN RANGE    0    ${length}
+    \    ${value}=    Get From List    ${jsondata['items']}    ${INDEX}
+    \    ${subscribed_links}=    Get From Dictionary    ${value}    subscribed_links_ids
+    \    ${id}=    Get From Dictionary    ${value}    id
+    \    ${sn}=    Get From Dictionary    ${value}    onu_device
+    \    Run Keyword If    '${sn}' == '${serial_no}'    Exit For Loop
+    Should Be Equal    ${expected_links}    ${subscribed_links}
+
+Validate Subscriber Status
+    [Arguments]    ${serial_no}    ${expected_status}
+    ${resp}=    CORD Get    ${subscriber_api}
+    ${jsondata}=    To Json    ${resp.content}
+    Log    ${jsondata}
+    ${length}=    Get Length    ${jsondata['items']}
+    : FOR    ${INDEX}    IN RANGE    0    ${length}
+    \    ${value}=    Get From List    ${jsondata['items']}    ${INDEX}
+    \    ${status}=    Get From Dictionary    ${value}    status
+    \    ${sn}=    Get From Dictionary    ${value}    onu_device
+    \    Run Keyword If    '${sn}' == '${serial_no}'    Exit For Loop
+    Should Be Equal    ${status}    ${expected_status}
+
+Validate Subscriber Service Chain
+    [Arguments]    ${serial_no}    ${expected_no_sc}
+    ${resp}=    CORD Get    ${subscriber_api}
+    ${jsondata}=    To Json    ${resp.content}
+    Log    ${jsondata}
+    ${length}=    Get Length    ${jsondata['items']}
+    : FOR    ${INDEX}    IN RANGE    0    ${length}
+    \    ${value}=    Get From List    ${jsondata['items']}    ${INDEX}
+    \    ${sl}=    Get From Dictionary    ${value}    subscribed_links_ids
+    \    ${sl}=    Get From List    ${sl}    0
+    \    ${sn}=    Get From Dictionary    ${value}    onu_device
+    \    Run Keyword If    '${sn}' == '${serial_no}'    Exit For Loop
+    Should Be Equal As Integers    ${sl}    ${expected_no_sc}
+
+Validate ONU Device Status
+    [Arguments]    ${serial_no}    ${expected_status}
+    ${resp}=    CORD Get    ${onu_device_api}
+    ${jsondata}=    To Json    ${resp.content}
+    Log    ${jsondata}
+    ${length}=    Get Length    ${jsondata['items']}
+    : FOR    ${INDEX}    IN RANGE    0    ${length}
+    \    ${value}=    Get From List    ${jsondata['items']}    ${INDEX}
+    \    ${status}=    Get From Dictionary    ${value}    admin_state
+    \    ${sn}=    Get From Dictionary    ${value}    serial_number
+    \    Run Keyword If    '${sn}' == '${serial_no}'    Exit For Loop
+    Should Be Equal    ${status}    ${expected_status}
+
+Validate Subscriber Settings
+    [Arguments]    ${serial_no}
+    ${resp}=    CORD Get    ${subscriber_api}
+    ${jsondata}=    To Json    ${resp.content}
+    Log    ${jsondata}
+    ${length}=    Get Length    ${jsondata['items']}
+    : FOR    ${INDEX}    IN RANGE    0    ${length}
+    \    ${value}=    Get From List    ${jsondata['items']}    ${INDEX}
+    \    ${macAddress}=    Get From Dictionary    ${value}    mac_address
+    \    ${ipAddress}=    Get From Dictionary    ${value}    ip_address
+    \    ${sn}=    Get From Dictionary    ${value}    onu_device
+    \    Run Keyword If    '${sn}' == '${serial_no}'    Exit For Loop
+    Should Be Equal    ${macAddress}    ${mac_address}
+    Should Be Equal    ${ipAddress}    ${ip_address}
\ No newline at end of file