Add ip/route configuration for subscriber test

Change-Id: I2034aa19a514782e54f6a161649b1b8d1b920e20
diff --git a/Jenkinsfile-rcordlite-topdown b/Jenkinsfile-rcordlite-topdown
index ad9f5de..e2d106e 100644
--- a/Jenkinsfile-rcordlite-topdown
+++ b/Jenkinsfile-rcordlite-topdown
@@ -256,7 +256,7 @@
                     sh """
                     export KUBECONFIG=$WORKSPACE/${configBaseDir}/${configKubernetesDir}/${configFileName}.conf
                     cd $WORKSPACE/cord-tester/src/test/cord-api/Tests/
-                    pybot -d Log -T -v src_ip:${deployment_config.srcHost.ip} -v src_user:${deployment_config.srcHost.user} -v src_pass:${deployment_config.srcHost.pass} -v dst_user:${deployment_config.dstHost.user} -v dst_pass:${deployment_config.dstHost.pass} -v dst_ip:${deployment_config.dstHost.ip} -v dst_host_ip:${deployment_config.dstHost.hostIp} -v src_gateway:${deployment_config.srcHost.gateway} -v dst_gateway:${deployment_config.dstHost.gateway} -v init_state:disabled -v INITIAL_STATUS:FAIL -v ENABLE_STATUS:PASS -e zerotouch Subscriber_StatusChecks.txt || true
+                    pybot -d Log -T -v src_ip:${deployment_config.srcHost.ip} -v src_user:${deployment_config.srcHost.user} -v src_pass:${deployment_config.srcHost.pass} -v src_host_ip:${deployment_config.srcHost.hostIp} -v src_iface:${deployment_config.srcHost.iface} -v dst_user:${deployment_config.dstHost.user} -v dst_pass:${deployment_config.dstHost.pass} -v dst_ip:${deployment_config.dstHost.ip} -v dst_host_ip:${deployment_config.dstHost.hostIp} -v dst_iface:${deployment_config.dstHost.iface} -v src_gateway:${deployment_config.srcHost.gateway} -v dst_gateway:${deployment_config.dstHost.gateway} -v init_state:disabled -v INITIAL_STATUS:FAIL -v ENABLE_STATUS:PASS -e zerotouch Subscriber_StatusChecks.txt || true
                     """
                 }
             }
diff --git a/src/test/cord-api/Framework/Subscriber.robot b/src/test/cord-api/Framework/Subscriber.robot
new file mode 100644
index 0000000..e4791f0
--- /dev/null
+++ b/src/test/cord-api/Framework/Subscriber.robot
@@ -0,0 +1,140 @@
+# Copyright 2017-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 ***
+Documentation     Library of functions related to RG (source host)
+Library           OperatingSystem
+Library           SSHLibrary
+Library           restApi.py
+
+*** Keywords ***
+Send EAPOL Message
+    [Arguments]    ${ip}    ${user}    ${pass}    ${iface}    ${conf_file}    ${prompt}=$    ${prompt_timeout}=60s
+    [Documentation]    SSH's into the RG (src) and executes a particular auth request via wpa_supplicant client. Requested packet should exist on src.
+    ${conn_id}=    SSHLibrary.Open Connection    ${ip}    prompt=${prompt}    timeout=${prompt_timeout}
+    SSHLibrary.Login    ${user}    ${pass}
+    SSHLibrary.Write    sudo wpa_supplicant -B -i ${iface} -Dwired -c /etc/wpa_supplicant/${conf_file}
+    Read Until    [sudo] password for ${user}:
+    SSHLibrary.Write    ${pass}
+    ${result}=    Read Until    wpa_supplicant
+    Log To Console    \n\n ${result}\n
+    SSHLibrary.Close Connection
+    Should Contain    ${result}    Successfully initialized wpa_supplicant
+    [Return]    ${result}
+
+Delete IP Addresses from Interface on Remote Host
+    [Arguments]    ${ip}    ${user}    ${pass}    ${interface}    ${prompt}=$    ${prompt_timeout}=60s
+    ${conn_id}=    SSHLibrary.Open Connection    ${ip}    prompt=${prompt}    timeout=${prompt_timeout}
+    SSHLibrary.Login    ${user}    ${pass}
+    SSHLibrary.Write    sudo ip addr flush dev ${interface}; echo $?
+    Read Until    [sudo] password for ${user}:
+    SSHLibrary.Write    ${pass}
+    ${result}=    Read Until    ${prompt}
+    SSHLibrary.Close Connection
+
+Subscriber Status Check
+    [Arguments]    ${onu_device}
+    [Documentation]    Returns Status from Subscribers List for a particular ONU device
+    ${json_result}=    restApi.ApiGet    VOLT_SUBSCRIBER
+    Log    ${json_result}
+    ${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
+    [Return]    ${status}
+
+Create Subscriber
+    [Arguments]    ${subscriber_list}    ${list_index}
+    [Documentation]    Sends a POST to create a subscriber in XOS
+    ${slist} =    Get Variable Value    ${subscriber_list}
+    ${subscriber_dictionary}=    utils.listToDict    ${slist}    ${list_index}
+    ${api_result}=    restApi.ApiPost    VOLT_SUBSCRIBER    ${subscriber_dictionary}
+    Should Be True    ${api_result}
+    ${Subscriber_id}=    Get From Dictionary    ${api_result}    id
+    Set Global Variable    ${Subscriber_id}
+    [Return]    ${Subscriber_id}
+
+Retrieve Subscriber
+    [Arguments]    ${ctag}
+    [Documentation]    Returns the subscriber id based on the subscriber's C-Tag
+    ${json_result}=    restApi.ApiGet    VOLT_SUBSCRIBER
+    Log    ${json_result}
+    ${json_result_list}=    Get From dictionary    ${json_result}    items
+    ${getJsonDict}=    utils.getDictFromListOfDict    ${json_result_list}    c_tag    ${ctag}
+    ${id}=    Get From Dictionary    ${getJsonDict}   id
+    [Return]    ${id}
+
+Delete Subscriber
+    [Arguments]    ${ctag}
+    [Documentation]    Deletes a given subscriber based on its c_tag
+    ${id}=    Retrieve Subscriber    ${ctag}
+    ${api_result}=    restApi.ApiChameleonDelete    VOLT_SUBSCRIBER    ${id}
+    Should Be True    ${api_result}
+
+Add Double Vlan Interface on Host
+    [Arguments]    ${ip}    ${user}    ${pass}    ${interface}    ${stag}    ${ctag}    ${prompt}=$    ${prompt_timeout}=60s
+    ${conn_id}=    SSHLibrary.Open Connection    ${ip}    prompt=${prompt}    timeout=${prompt_timeout}
+    SSHLibrary.Login    ${user}    ${pass}
+    SSHLibrary.Write    sudo ip link add link ${interface} name ${interface}.${stag} type vlan id ${stag}
+    Read Until    [sudo] password for ${user}:
+    SSHLibrary.Write    ${pass}
+    SSHLibrary.Write    sudo ip link set ${interface}.${stag} up
+    ${result}=    Read Until    ${prompt}
+    SSHLibrary.Write    sudo ip link add link ${interface}.${stag} name ${interface}.${stag}.${ctag} type vlan id ${ctag}
+    ${result}=    Read Until    ${prompt}
+    SSHLibrary.Write    sudo ip link set ${interface}.${stag}.${ctag} up
+    ${result}=    Read Until    ${prompt}
+    SSHLibrary.Write    ifconfig ${interface}.${stag}.${ctag}
+    ${result}=    Read Until    ${prompt}
+    SSHLibrary.Close Connection
+
+Delete Interface on Remote Host
+    [Arguments]    ${ip}    ${user}    ${pass}    ${interface}    ${prompt}=$    ${prompt_timeout}=60s
+    ${conn_id}=    SSHLibrary.Open Connection    ${ip}    prompt=${prompt}    timeout=${prompt_timeout}
+    SSHLibrary.Login    ${user}    ${pass}
+    SSHLibrary.Write    sudo ip link del ${interface}
+    Read Until    [sudo] password for ${user}:
+    SSHLibrary.Write    ${pass}
+    Read Until    ${prompt}
+    SSHLibrary.Close Connection
+
+Add Ip Address on Interface on Host
+    [Arguments]    ${ip}    ${user}    ${pass}    ${ip_address}    ${interface}    ${prompt}=$    ${prompt_timeout}=60s
+    ${conn_id}=    SSHLibrary.Open Connection    ${ip}    prompt=${prompt}    timeout=${prompt_timeout}
+    SSHLibrary.Login    ${user}    ${pass}
+    SSHLibrary.Write    sudo ip addr add ${ip_address} dev ${interface}
+    Read Until    [sudo] password for ${user}:
+    SSHLibrary.Write    ${pass}
+    Read Until    ${prompt}
+    SSHLibrary.Close Connection
+
+Start DHCP Server on Remote Host
+    [Arguments]    ${ip}    ${user}    ${pass}    ${interface}    ${prompt}=$    ${prompt_timeout}=60s
+    ${conn_id}=    SSHLibrary.Open Connection    ${ip}    prompt=${prompt}    timeout=${prompt_timeout}
+    SSHLibrary.Login    ${user}    ${pass}
+    SSHLibrary.Write    sudo dhcpd -cf /etc/dhcp/dhcpd.conf ${interface}
+    Read Until    [sudo] password for ${user}:
+    SSHLibrary.Write    ${pass}
+    ${result}=    Read Until    ${prompt}
+    Should Contain    ${result}    Listening on LPF/${interface}
+    SSHLibrary.Close Connection
+
+Add Route to Remote Host
+    [Arguments]    ${ip}    ${user}    ${pass}    ${subnet}    ${gateway}    ${interface}    ${prompt}=$    ${prompt_timeout}=60s
+    ${conn_id}=    SSHLibrary.Open Connection    ${ip}    prompt=${prompt}    timeout=${prompt_timeout}
+    SSHLibrary.Login    ${user}    ${pass}
+    SSHLibrary.Write    sudo ip route add ${subnet} via ${gateway} dev ${interface}
+    Read Until    [sudo] password for ${user}:
+    SSHLibrary.Write    ${pass}
+    ${result}=    Read Until    ${prompt}
+    SSHLibrary.Close Connection
\ No newline at end of file
diff --git a/src/test/cord-api/Tests/Subscriber_StatusChecks.txt b/src/test/cord-api/Tests/Subscriber_StatusChecks.txt
index cebb7ff..9b969f4 100644
--- a/src/test/cord-api/Tests/Subscriber_StatusChecks.txt
+++ b/src/test/cord-api/Tests/Subscriber_StatusChecks.txt
@@ -1,6 +1,7 @@
 *** Settings ***
 Documentation     Test suite for checking the subscriber status after discovery
 Suite Setup       Setup
+Suite Teardown    Teardown
 Test Template     Subscriber Status Test
 Library           Collections
 Library           String
@@ -9,6 +10,7 @@
 Library           RequestsLibrary
 Library           ../Framework/utils/utils.py
 Resource          ../Framework/utils/utils.robot
+Resource          ../Framework/Subscriber.robot
 Library           ../Framework/restApi.py
 
 *** Variables ***
@@ -17,6 +19,8 @@
 &{status}    status=test
 ${src_ip}         X.X.X.X
 ${src_gateway}    X.X.X.X
+${src_host_ip}    X.X.X.X
+${src_iface}      eth0
 ${src_user}       user
 ${src_pass}       pass
 ${dst_ip}         X.X.X.X
@@ -24,6 +28,7 @@
 ${dst_pass}       pass
 ${dst_gateway}    X.X.X.X
 ${dst_host_ip}    X.X.X.X
+${dst_iface}      eth0
 ${init_state}     xxxxxxx
 
 *** Test Cases ***    TYPE                         LISTINDEX
@@ -37,13 +42,17 @@
 
 *** Keywords ***
 Setup
-    [Documentation]    Read input file and send arping requests from host/dst to their gateways
+    [Documentation]    Read input file and setup IP/route and send arping requests from host/dst to their gateways
     Read InputFile
+    Add IP Address on Interface on Host    ${src_ip}    ${src_user}    ${src_pass}    ${src_host_ip}/24    ${src_iface}
+    Add Route to Remote Host    ${src_ip}    ${src_user}    ${src_pass}    ${src_host_ip}    ${dst_gateway}    ${src_iface}
+    Add IP Address on Interface on Host    ${dst_ip}    ${dst_user}    ${dst_pass}    ${dst_host_ip}/24    ${dst_iface}
+    Add Route to Remote Host    ${dst_ip}    ${dst_user}    ${dst_pass}    ${dst_host_ip}    ${src_gateway}    ${dst_iface}
     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 
+    ${SubscriberList}=    utils.jsonToList    ${PATHFILE}   SubscriberInfo
     Set Suite Variable    ${slist}    ${SubscriberList}
     Set Global Variable    ${Subscriber_Id}    ${EMPTY}
     Set Global Variable    ${status}    ${EMPTY}
@@ -104,3 +113,8 @@
     Should Contain    ${result}    0% unanswered
     Log To Console    \n ${result}
     SSHLibrary.Close Connection
+
+Teardown
+    [Documentation]    Delete IP on src/dst host
+    Delete IP Addresses from Interface on Remote Host    ${src_ip}    ${src_user}    ${src_pass}    ${src_iface}
+    Delete IP Addresses from Interface on Remote Host    ${dst_ip}    ${dst_user}    ${dst_pass}    ${dst_iface}