[VOL-3804] Test for BBSim

Change-Id: I5dbecebb8f876379b34e60cb56388ea681866a03
diff --git a/tests/bbsim/Voltha_BBSimTests.robot b/tests/bbsim/Voltha_BBSimTests.robot
new file mode 100644
index 0000000..a494b0f
--- /dev/null
+++ b/tests/bbsim/Voltha_BBSimTests.robot
@@ -0,0 +1,162 @@
+# Copyright 2020 - present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+Suite Setup       Setup Suite
+Suite Teardown    Teardown Suite
+Test Setup        Setup
+Test Teardown     Teardown
+Library           Collections
+Library           String
+Library           OperatingSystem
+Library           XML
+Library           RequestsLibrary
+Library           ../../libraries/DependencyLibrary.py
+Resource          ../../libraries/onos.robot
+Resource          ../../libraries/voltctl.robot
+Resource          ../../libraries/voltha.robot
+Resource          ../../libraries/utils.robot
+Resource          ../../libraries/k8s.robot
+Resource          ../../libraries/bbsim.robot
+Resource          ../../variables/variables.robot
+
+*** Variables ***
+${NAMESPACE}      voltha
+${timeout}        60s
+${of_id}          0
+${logical_id}     0
+${has_dataplane}    False
+${external_libs}    True
+${teardown_device}    True
+${scripts}        ../../scripts
+# determines the environment workflow: DT, TT or ATT (default)
+# example: -v workflow:TT
+${workflow}    ATT
+# logging flag to enable Collect Logs, can be passed via the command line too
+# example: -v logging:True
+${logging}    False
+# Per-test logging on failure is turned off by default; set this variable to enable
+${container_log_dir}    ${None}
+# Number of times to perform ONU Igmp Join and Leave (valid only for TT)
+${igmp_join_leave_count}    1
+
+*** Test Cases ***
+
+Test Perform BBSim Sanity
+    [Documentation]    Validates the BBSim Functionality for ATT, DT and TT workflows
+    ...    Also Restart Auth (ATT), Restart Dhcp (ATT and TT), Igmp Join and Leave (TT)
+    ...    NOTE: Currently works only for single ONU in case of ATT
+    [Tags]    bbsimSanity
+    [Setup]   Run Keywords    Start Logging    BBSimSanity
+    ...    AND    Setup
+    FOR    ${J}    IN RANGE    0    ${num_olts}
+        ${olt_serial_number}=    Set Variable    ${list_olts}[${J}][sn]
+        ${onu_count}=    Set Variable    ${list_olts}[${J}][onucount]
+        ${of_id}=    Wait Until Keyword Succeeds    ${timeout}    15s    Validate OLT Device in ONOS
+        ...    ${olt_serial_number}
+        ${bbsim_rel}=    Catenate    SEPARATOR=    bbsim    ${J}
+        ${bbsim_pod}=    Get Pod Name By Label    ${NAMESPACE}    release     ${bbsim_rel}
+        Perform BBSim Sanity Test Per OLT    ${bbsim_pod}    ${of_id}    ${olt_serial_number}    ${onu_count}
+    END
+    [Teardown]    Run Keywords    Run Keyword If    ${logging}    Collect Logs
+    ...    AND    Stop Logging    BBSimSanity
+
+*** Keywords ***
+
+Perform ONU Igmp Join and Leave
+    [Documentation]    This keyword performs Igmp Leave and Join for ONU
+    [Arguments]    ${bbsim_pod}    ${of_id}    ${onu}    ${onu_port}
+    FOR    ${Z}    IN RANGE    0    ${igmp_join_leave_count}
+        List Service    ${NAMESPACE}    ${bbsim_pod}
+        JoinOrLeave Igmp    ${NAMESPACE}    ${bbsim_pod}    ${onu}    join
+        Sleep    2s
+        List Service    ${NAMESPACE}    ${bbsim_pod}
+        List ONUs    ${NAMESPACE}    ${bbsim_pod}
+        Run Keyword And Continue On Failure    Wait Until Keyword Succeeds    ${timeout}    2s
+        ...    Verify ONU in Groups    ${ONOS_SSH_IP}    ${ONOS_SSH_PORT}    ${of_id}    ${onu_port}
+        JoinOrLeave Igmp    ${NAMESPACE}    ${bbsim_pod}    ${onu}    leave
+        Sleep    2s
+        List Service    ${NAMESPACE}    ${bbsim_pod}
+        List ONUs    ${NAMESPACE}    ${bbsim_pod}
+        Run Keyword And Continue On Failure    Wait Until Keyword Succeeds    ${timeout}    2s
+        ...    Verify ONU in Groups    ${ONOS_SSH_IP}    ${ONOS_SSH_PORT}    ${of_id}    ${onu_port}    False
+    END
+
+Perform BBSim Sanity Test Per OLT
+    [Documentation]    Validates the BBSim Functionality for ATT, DT and TT workflows
+    ...    Also Restart Auth (ATT), Restart Dhcp (ATT and TT), Igmp Join and Leave (TT)
+    [Arguments]    ${bbsim_pod}    ${of_id}    ${olt_serial_number}   ${num_onus}
+    FOR    ${I}    IN RANGE    0    ${num_all_onus}
+        ${src}=    Set Variable    ${hosts.src[${I}]}
+        ${dst}=    Set Variable    ${hosts.dst[${I}]}
+        Continue For Loop If    "${olt_serial_number}"!="${src['olt']}"
+        ${onu_device_id}=    Get Device ID From SN    ${src['onu']}
+        ${onu_port}=    Run Keyword And Continue On Failure    Wait Until Keyword Succeeds    ${timeout}    2s
+        ...    Get ONU Port in ONOS    ${src['onu']}    ${of_id}
+        # Check ONU port is Enabled in ONOS
+        Run Keyword And Continue On Failure    Wait Until Keyword Succeeds   120s   2s
+        ...    Verify ONU Port Is Enabled   ${ONOS_SSH_IP}    ${ONOS_SSH_PORT}    ${src['onu']}
+        Run Keyword If    "${workflow}"=="ATT"
+        ...    Run Keywords
+        # Verify ONU in AAA-Users (valid only for ATT)
+        ...    Run Keyword And Continue On Failure    Wait Until Keyword Succeeds    ${timeout}    2
+        ...    Verify ONU in AAA-Users    ${ONOS_SSH_IP}    ${ONOS_SSH_PORT}    ${onu_port}
+        ...    AND    List ONUs    ${NAMESPACE}    ${bbsim_pod}
+        # Restart Auth and Verify (valid only for ATT)
+        ...    AND    Execute ONOS CLI Command on open connection     ${onos_ssh_connection}
+        ...    aaa-reset-all-devices
+        ...    AND    Restart Auth    ${NAMESPACE}    ${bbsim_pod}    ${src['onu']}
+        ...    AND    Run Keyword And Continue On Failure    Wait Until Keyword Succeeds    ${timeout}    2
+        ...    Verify ONU in AAA-Users    ${ONOS_SSH_IP}    ${ONOS_SSH_PORT}    ${onu_port}
+        ...    AND    List ONUs    ${NAMESPACE}    ${bbsim_pod}
+        # Add Subscriber
+        Run Keyword And Continue On Failure    Wait Until Keyword Succeeds    ${timeout}    2
+        ...    Execute ONOS CLI Command on open connection    ${onos_ssh_connection}
+        ...    volt-add-subscriber-access ${of_id} ${onu_port}
+        # Verify that no pending flows exist for the ONU port
+        Run Keyword And Continue On Failure    Wait Until Keyword Succeeds    ${timeout}    2s
+        ...    Verify No Pending Flows For ONU    ${ONOS_SSH_IP}    ${ONOS_SSH_PORT}    ${onu_port}
+        # Verify subscriber  dhcp allocations (valid only for ATT and TT)
+        Run Keyword If    "${workflow}"=="ATT" or "${workflow}"=="TT"
+        ...    Run Keywords
+        ...    Run Keyword And Continue On Failure    Wait Until Keyword Succeeds    ${timeout}    2s
+        ...    Validate Subscriber DHCP Allocation    ${ONOS_SSH_IP}    ${ONOS_SSH_PORT}    ${onu_port}
+        ...    AND    List ONUs    ${NAMESPACE}    ${bbsim_pod}
+        # Restart Dhcp and Verify (valid only for ATT and TT)
+        ...    AND    Execute ONOS CLI Command on open connection     ${onos_ssh_connection}
+        ...    dhcpl2relay-remove-allocation ${of_id} ${onu_port}
+        ...    AND    Restart DHCP    ${NAMESPACE}    ${bbsim_pod}    ${src['onu']}
+        ...    AND    Run Keyword And Continue On Failure    Wait Until Keyword Succeeds    ${timeout}    2s
+        ...    Validate Subscriber DHCP Allocation    ${ONOS_SSH_IP}    ${ONOS_SSH_PORT}    ${onu_port}
+        ...    AND    List ONUs    ${NAMESPACE}    ${bbsim_pod}
+        # Perform Igmp Join and Leave (valid only for TT)
+        Run Keyword If    "${workflow}"=="TT"
+        ...    Perform ONU Igmp Join and Leave    ${bbsim_pod}    ${of_id}    ${src['onu']}    ${onu_port}
+    END
+
+Setup Suite
+    [Documentation]    Set up the test suite
+    Common Test Suite Setup
+    #send igmp file to onos (valid only for TT)
+    ${onos_netcfg_file}=    Get Variable Value    ${onos_netcfg.file}
+    Run Keyword If    '${workflow}'=='TT' and '${has_dataplane}'=='False' and '${onos_netcfg_file}'!='${None}'
+    ...    Send File To Onos    ${onos_netcfg_file}    apps/
+    ${onos_ssh_connection}    Open ONOS SSH Connection    ${ONOS_SSH_IP}    ${ONOS_SSH_PORT}
+    Set Suite Variable    ${onos_ssh_connection}
+
+Teardown Suite
+    [Documentation]    Replaces the Suite Teardown in utils.robot.
+    ...    Cleans up and checks all ONU ports disabled in ONOS.
+    Run Keyword If    ${teardown_device}    Delete All Devices and Verify
+    Close All ONOS SSH Connections
diff --git a/tests/data/bbsim-kind.yaml b/tests/data/bbsim-kind.yaml
index 5326f68..cedde9f 100644
--- a/tests/data/bbsim-kind.yaml
+++ b/tests/data/bbsim-kind.yaml
@@ -42,3 +42,7 @@
 
   dst:
     - ip: null
+
+# To read only if workflow is "TT"
+onos_netcfg:
+  file: ${CURDIR}/../../data/onos-igmp.json
diff --git a/tests/data/onos-igmp.json b/tests/data/onos-igmp.json
new file mode 100644
index 0000000..76f4fa4
--- /dev/null
+++ b/tests/data/onos-igmp.json
@@ -0,0 +1,22 @@
+{
+    "org.opencord.igmpproxy" : {
+        "igmpproxy":{
+            "FastLeave":"true",
+            "LastQueryInterval":1,
+            "MaxResp":1,
+            "enableIgmpProvisioning":"false",
+            "globalConnectPointMode":"true",
+            "globalConnectPoint" : "of:0000000000000001/3",
+            "sourceDeviceAndPort":"of:0000000000000001/3",
+            "outgoingIgmpVlanId":550,
+            "outgoingIgmpInnerVlanId":55,
+            "outgoingIgmpWithV3":"true",
+            "IgmpCos":5,
+            "IgmpUniCos":5,
+            "PeriodicQuery":"true",
+            "KeepAliveInterval":60,
+            "KeepAliveCount":5,
+            "requestDsIgmpPackets":false
+        }
+    }
+}