Merge pull request #35 from pingping-lin/sdnip_teston_branch

Sdnip teston branch
diff --git a/TestON/drivers/common/cli/quaggaclidriver.py b/TestON/drivers/common/cli/quaggaclidriver.py
index e0f793b..77e1fab 100644
--- a/TestON/drivers/common/cli/quaggaclidriver.py
+++ b/TestON/drivers/common/cli/quaggaclidriver.py
@@ -22,17 +22,24 @@
         self.name = self.options['name']
         # self.handle = super(QuaggaCliDriver,self).connect(user_name = self.user_name, ip_address = self.ip_address,port = self.port, pwd = self.pwd)
         self.handle = super(QuaggaCliDriver, self).connect(user_name=self.user_name, ip_address="1.1.1.1", port=self.port, pwd=self.pwd)
+        main.log.info("quagga handle" + str(self.handle) )
+        main.log.info("where is this timeout from?")
         main.log.info("connect parameters:" + str(self.user_name) + ";" + str(self.ip_address) + ";" + str(self.port) + ";" + str(self.pwd))
 
         if self.handle:
-            self.handle.expect("")
-            self.handle.expect("\$")
+            #self.handle.expect("",timeout=10)
+            #self.handle.expect("\$",timeout=10)
+            #main.log.info(self.handle.before)
+            #main.log.info(self.handle.after)
             self.handle.sendline("telnet localhost 2605")
-            self.handle.expect("Password:", timeout=5)
+            #self.handle.expect("Password:", timeout=5)
+            self.handle.expect("Password:")
             self.handle.sendline("hello")
-            self.handle.expect("bgpd", timeout=5)
+            #self.handle.expect("bgpd", timeout=5)
+            self.handle.expect("bgpd")
             self.handle.sendline("enable")
-            self.handle.expect("bgpd#", timeout=5)
+            #self.handle.expect("bgpd#", timeout=5)
+            self.handle.expect("bgpd#")
             return self.handle
         else :
             main.log.info("NO HANDLE")
@@ -47,14 +54,17 @@
         + str(self.ip_address) + ";" + str(self.port) + ";" + str(self.pwd))
 
         if self.handle:
-            self.handle.expect("")
-            self.handle.expect("\$")
+            #self.handle.expect("")
+            #self.handle.expect("\$")
             self.handle.sendline("telnet localhost 2605")
-            self.handle.expect("Password:", timeout=5)
+            #self.handle.expect("Password:", timeout=5)
+            self.handle.expect("Password:")
             self.handle.sendline("hello")
-            self.handle.expect("bgpd", timeout=5)
+            #self.handle.expect("bgpd", timeout=5)
+            self.handle.expect("bgpd")
             self.handle.sendline("enable")
-            self.handle.expect("bgpd#", timeout=5)
+            #self.handle.expect("bgpd#", timeout=5)
+            self.handle.expect("bgpd#")
             main.log.info("I in quagga on host " + str(ip_address))
 
             return self.handle
@@ -310,8 +320,8 @@
         + str(self.ip_address) + ";" + str(self.port) + ";" + str(self.pwd))
 
         if self.handle:
-            self.handle.expect("")
-            self.handle.expect("\$")
+            #self.handle.expect("")
+            #self.handle.expect("\$")
             main.log.info("I in host " + str(ip_address))
             main.log.info(ping_test_file + " > " + ping_test_result_file + " &")
             self.handle.sendline(ping_test_file + " > " + ping_test_result_file + " &")
diff --git a/TestON/tests/SdnIpTest/SdnIpTest.params b/TestON/tests/SdnIpTest/SdnIpTest.params
index e9121a9..bb5826d 100755
--- a/TestON/tests/SdnIpTest/SdnIpTest.params
+++ b/TestON/tests/SdnIpTest/SdnIpTest.params
@@ -1,6 +1,6 @@
 <PARAMS>
     
-    <testcases>1</testcases>
+    <testcases>1,2</testcases>
 
     #Environment variables
     <ENV>
diff --git a/TestON/tests/SdnIpTest/SdnIpTest.py b/TestON/tests/SdnIpTest/SdnIpTest.py
index 6580c20..4f55c02 100755
--- a/TestON/tests/SdnIpTest/SdnIpTest.py
+++ b/TestON/tests/SdnIpTest/SdnIpTest.py
@@ -1,4 +1,4 @@
-#from cupshelpers.config import prefix
+# from cupshelpers.config import prefix
 
 # Testing the basic functionality of SDN-IP
 
@@ -11,11 +11,11 @@
         '''
         Test the SDN-IP functionality
         allRoutes_expected: all expected routes for all BGP peers
-		routeIntents_expected: all expected MultiPointToSinglePointIntent intents
-		bgpIntents_expected: expected PointToPointIntent intents
-		allRoutes_actual: all routes from ONOS LCI
-		routeIntents_actual: actual MultiPointToSinglePointIntent intents from ONOS CLI
-		bgpIntents_actual: actual PointToPointIntent intents from ONOS CLI
+        routeIntents_expected: all expected MultiPointToSinglePointIntent intents
+        bgpIntents_expected: expected PointToPointIntent intents
+        allRoutes_actual: all routes from ONOS LCI
+        routeIntents_actual: actual MultiPointToSinglePointIntent intents from ONOS CLI
+        bgpIntents_actual: actual PointToPointIntent intents from ONOS CLI
         '''
         import time
         import json
@@ -57,20 +57,6 @@
 
         routeIntents_expected = routeIntents_expected_host3 + routeIntents_expected_host4
 
-        main.step("Login all BGP peers and add routes into peers")
-        main.log.info("Login Quagga CLI on host3")
-        main.QuaggaCliHost3.loginQuagga("1.168.30.2")
-        main.log.info("Enter configuration model of Quagga CLI on host3")
-        main.QuaggaCliHost3.enter_config(64514)
-        main.log.info("Add routes to Quagga on host3")
-        main.QuaggaCliHost3.add_routes(prefixes_host3, 1)
-
-        main.log.info("Login Quagga CLI on host4")
-        main.QuaggaCliHost4.loginQuagga("1.168.30.3")
-        main.log.info("Enter configuration model of Quagga CLI on host4")
-        main.QuaggaCliHost4.enter_config(64516)
-        main.log.info("Add routes to Quagga on host4")
-        main.QuaggaCliHost4.add_routes(prefixes_host4, 1)
 
         cell_name = main.params['ENV']['cellName']
         ONOS1_ip = main.params['CTRL']['ip1']
@@ -86,10 +72,10 @@
 
         main.step("Starting ONOS service")
         # TODO: start ONOS from Mininet Script
-        #start_result = main.ONOSbench.onos_start("127.0.0.1")
+        # start_result = main.ONOSbench.onos_start("127.0.0.1")
         main.step("Installing ONOS package")
         onos1_install_result = main.ONOSbench.onos_install(options="-f", node=ONOS1_ip)
-        
+
         main.step("Checking if ONOS is up yet")
         time.sleep(60)
         onos1_isup = main.ONOSbench.isup(ONOS1_ip)
@@ -107,7 +93,22 @@
         time.sleep(10)
         main.log.info("Installing sdn-ip feature")
         main.ONOScli.feature_install("onos-app-sdnip")
-        time.sleep(30)
+        time.sleep(10)
+        main.step("Login all BGP peers and add routes into peers")
+        main.log.info("Login Quagga CLI on host3")
+        main.QuaggaCliHost3.loginQuagga("1.168.30.2")
+        main.log.info("Enter configuration model of Quagga CLI on host3")
+        main.QuaggaCliHost3.enter_config(64514)
+        main.log.info("Add routes to Quagga on host3")
+        main.QuaggaCliHost3.add_routes(prefixes_host3, 1)
+
+        main.log.info("Login Quagga CLI on host4")
+        main.QuaggaCliHost4.loginQuagga("1.168.30.3")
+        main.log.info("Enter configuration model of Quagga CLI on host4")
+        main.QuaggaCliHost4.enter_config(64516)
+        main.log.info("Add routes to Quagga on host4")
+        main.QuaggaCliHost4.add_routes(prefixes_host4, 1)
+        time.sleep(60)
 
         # get all routes inside SDN-IP
         get_routes_result = main.ONOScli.routes(json_format=True)
@@ -125,6 +126,10 @@
         utilities.assert_equals(expect=allRoutes_str_expected, actual=allRoutes_str_actual,
                                 onpass="***Routes in SDN-IP are correct!***",
                                 onfail="***Routes in SDN-IP are wrong!***")
+        if(eq(allRoutes_str_expected, allRoutes_str_actual)):
+            main.log.report("***Routes in SDN-IP after adding routes are correct!***")
+        else:
+            main.log.report("***Routes in SDN-IP after adding routes are wrong!***")
 
         time.sleep(20)
         get_intents_result = main.ONOScli.intents(json_format=True)
@@ -144,6 +149,10 @@
                                 onpass="***MultiPointToSinglePoint Intents in SDN-IP are correct!***",
                                 onfail="***MultiPointToSinglePoint Intents in SDN-IP are wrong!***")
 
+        if(eq(routeIntents_str_expected, routeIntents_str_actual)):
+            main.log.report("***MultiPointToSinglePoint Intents before deleting routes correct!***")
+        else:
+            main.log.report("***MultiPointToSinglePoint Intents before deleting routes wrong!***")
 
         main.step("Check BGP PointToPointIntent intents installed")
         # bgp intents expected
@@ -162,11 +171,19 @@
                                 onpass="***PointToPointIntent Intents in SDN-IP are correct!***",
                                 onfail="***PointToPointIntent Intents in SDN-IP are wrong!***")
 
+
+        if (eq(bgpIntents_str_expected, bgpIntents_str_actual)):
+            main.log.report("***PointToPointIntent Intents in SDN-IP are correct!***")
+        else:
+            main.log.report("***PointToPointIntent Intents in SDN-IP are wrong!***")
+
+
+
         #============================= Ping Test ========================
         # wait until all MultiPointToSinglePoint
         time.sleep(20)
         ping_test_script = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
-        ping_test_results_file = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-results-before-delete-routes-" + strftime("%Y-%m-%d_%H:%M:%S", localtime()) + ".txt"
+        ping_test_results_file = "~/SDNIP/SdnIpIntentDemo/log/CASE1-ping-results-before-delete-routes-" + strftime("%Y-%m-%d_%H:%M:%S", localtime()) + ".txt"
         ping_test_results = main.QuaggaCliHost.ping_test("1.168.30.100", ping_test_script, ping_test_results_file)
         main.log.info(ping_test_results)
 
@@ -189,6 +206,11 @@
                                 onpass="***Route number in SDN-IP is 0, correct!***",
                                 onfail="***Routes number in SDN-IP is not 0, wrong!***")
 
+        if(eq(allRoutes_str_expected, allRoutes_str_actual)):
+            main.log.report("***Routes in SDN-IP after deleting correct!***")
+        else:
+            main.log.report("***Routes in SDN-IP after deleting wrong!***")
+
         main.step("Check intents after deleting routes")
         get_intents_result = main.ONOScli.intents(json_format=True)
         routeIntents_actual = main.QuaggaCliHost3.extract_actual_routeIntents(get_intents_result)
@@ -198,10 +220,14 @@
                                 onpass="***MultiPointToSinglePoint Intents number in SDN-IP is 0, correct!***",
                                 onfail="***MultiPointToSinglePoint Intents number in SDN-IP is 0, wrong!***")
 
+        if(eq(routeIntents_str_expected, routeIntents_str_actual)):
+            main.log.report("***MultiPointToSinglePoint Intents after deleting routes correct!***")
+        else:
+            main.log.report("***MultiPointToSinglePoint Intents after deleting routes wrong!***")
 
         time.sleep(20)
         ping_test_script = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
-        ping_test_results_file = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-results-after-delete-routes-" + strftime("%Y-%m-%d_%H:%M:%S", localtime()) + ".txt"
+        ping_test_results_file = "~/SDNIP/SdnIpIntentDemo/log/CASE1-ping-results-after-delete-routes-" + strftime("%Y-%m-%d_%H:%M:%S", localtime()) + ".txt"
         ping_test_results = main.QuaggaCliHost.ping_test("1.168.30.100", ping_test_script, ping_test_results_file)
         main.log.info(ping_test_results)
         time.sleep(30)
@@ -210,3 +236,228 @@
         # main.Mininet2.handle.sendline("xterm host1")
         # main.Mininet2.handle.expect("mininet>")
 
+
+    def CASE2(self, main):
+
+        '''
+        Test the SDN-IP functionality
+        allRoutes_expected: all expected routes for all BGP peers
+        routeIntents_expected: all expected MultiPointToSinglePointIntent intents
+        bgpIntents_expected: expected PointToPointIntent intents
+        allRoutes_actual: all routes from ONOS LCI
+        routeIntents_actual: actual MultiPointToSinglePointIntent intents from ONOS CLI
+        bgpIntents_actual: actual PointToPointIntent intents from ONOS CLI
+        '''
+        import time
+        import json
+        from operator import eq
+        from time import localtime, strftime
+
+        main.case("The test case is to help to setup the TestON environment and test new drivers")
+        SDNIP_JSON_FILE_PATH = "../tests/SdnIpTest/sdnip.json"
+        # all expected routes for all BGP peers
+        allRoutes_expected = []
+        main.step("Start to generate routes for all BGP peers")
+
+        main.log.info("Generate prefixes for host3")
+        prefixes_host3 = main.QuaggaCliHost3.generate_prefixes(3, 10)
+        main.log.info(prefixes_host3)
+        # generate route with next hop
+        for prefix in prefixes_host3:
+            allRoutes_expected.append(prefix + "/" + "192.168.20.1")
+        routeIntents_expected_host3 = main.QuaggaCliHost3.generate_expected_onePeerRouteIntents(prefixes_host3, "192.168.20.1", "00:00:00:00:02:02", SDNIP_JSON_FILE_PATH)
+
+        main.log.info("Generate prefixes for host4")
+        prefixes_host4 = main.QuaggaCliHost4.generate_prefixes(4, 10)
+        main.log.info(prefixes_host4)
+        # generate route with next hop
+        for prefix in prefixes_host4:
+            allRoutes_expected.append(prefix + "/" + "192.168.30.1")
+        routeIntents_expected_host4 = main.QuaggaCliHost4.generate_expected_onePeerRouteIntents(prefixes_host4, "192.168.30.1", "00:00:00:00:03:01", SDNIP_JSON_FILE_PATH)
+
+        routeIntents_expected = routeIntents_expected_host3 + routeIntents_expected_host4
+
+        main.log.report("Removing raft logs")
+        main.ONOSbench.onos_remove_raft_logs()
+        main.log.report("Uninstalling ONOS")
+        main.ONOSbench.onos_uninstall(ONOS1_ip)
+
+        cell_name = main.params['ENV']['cellName']
+        ONOS1_ip = main.params['CTRL']['ip1']
+        main.step("Set cell for ONOS-cli environment")
+        main.ONOScli.set_cell(cell_name)
+        verify_result = main.ONOSbench.verify_cell()
+        #main.log.report("Removing raft logs")
+        #main.ONOSbench.onos_remove_raft_logs()
+        #main.log.report("Uninstalling ONOS")
+        #main.ONOSbench.onos_uninstall(ONOS1_ip)
+        main.step("Creating ONOS package")
+        package_result = main.ONOSbench.onos_package()
+
+        main.step("Installing ONOS package")
+        onos1_install_result = main.ONOSbench.onos_install(options="-f", node=ONOS1_ip)
+
+        main.step("Checking if ONOS is up yet")
+        time.sleep(60)
+        onos1_isup = main.ONOSbench.isup(ONOS1_ip)
+        if not onos1_isup:
+            main.log.report("ONOS1 didn't start!")
+
+        main.step("Start ONOS-cli")
+        main.ONOScli.start_onos_cli(ONOS1_ip)
+
+        main.step("Get devices in the network")
+        list_result = main.ONOScli.devices(json_format=False)
+        main.log.info(list_result)
+        time.sleep(10)
+        main.log.info("Installing sdn-ip feature")
+        main.ONOScli.feature_install("onos-app-sdnip")
+        time.sleep(10)
+
+
+        main.step("Check BGP PointToPointIntent intents installed")
+        # bgp intents expected
+        bgpIntents_expected = main.QuaggaCliHost3.generate_expected_bgpIntents(SDNIP_JSON_FILE_PATH)
+        # get BGP intents from ONOS CLI
+        get_intents_result = main.ONOScli.intents(json_format=True)
+        bgpIntents_actual = main.QuaggaCliHost3.extract_actual_bgpIntents(get_intents_result)
+
+        bgpIntents_str_expected = str(bgpIntents_expected).replace('u', "")
+        bgpIntents_str_actual = str(bgpIntents_actual)
+        main.log.info("PointToPointIntent intents expected:")
+        main.log.info(bgpIntents_str_expected)
+        main.log.info("PointToPointIntent intents get from ONOS CLI:")
+        main.log.info(bgpIntents_str_actual)
+
+        utilities.assert_equals(expect=True, actual=eq(bgpIntents_str_expected, bgpIntents_str_actual),
+                                onpass="***PointToPointIntent Intents in SDN-IP are correct!***",
+                                onfail="***PointToPointIntent Intents in SDN-IP are wrong!***")
+
+        if (eq(bgpIntents_str_expected, bgpIntents_str_actual)):
+            main.log.report("***PointToPointIntent Intents in SDN-IP are correct!***")
+        else:
+            main.log.report("***PointToPointIntent Intents in SDN-IP are wrong!***")
+
+
+        allRoutes_str_expected = str(sorted(allRoutes_expected))
+        routeIntents_str_expected = str(sorted(routeIntents_expected))
+        ping_test_script = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
+        # round_num = 0;
+        # while(True):
+        for round_num in range(1, 6):
+            # round = round + 1;
+            main.log.report("The Round " + str(round_num) + " test starts........................................")
+
+            main.step("Login all BGP peers and add routes into peers")
+            main.log.info("Login Quagga CLI on host3")
+            main.QuaggaCliHost3.loginQuagga("1.168.30.2")
+            main.log.info("Enter configuration model of Quagga CLI on host3")
+            main.QuaggaCliHost3.enter_config(64514)
+            main.log.info("Add routes to Quagga on host3")
+            main.QuaggaCliHost3.add_routes(prefixes_host3, 1)
+
+            main.log.info("Login Quagga CLI on host4")
+            main.QuaggaCliHost4.loginQuagga("1.168.30.3")
+            main.log.info("Enter configuration model of Quagga CLI on host4")
+            main.QuaggaCliHost4.enter_config(64516)
+            main.log.info("Add routes to Quagga on host4")
+            main.QuaggaCliHost4.add_routes(prefixes_host4, 1)
+            time.sleep(60)
+
+            # get all routes inside SDN-IP
+            get_routes_result = main.ONOScli.routes(json_format=True)
+
+            # parse routes from ONOS CLI
+            allRoutes_actual = main.QuaggaCliHost3.extract_actual_routes(get_routes_result)
+
+            # allRoutes_str_expected = str(sorted(allRoutes_expected))
+            allRoutes_str_actual = str(allRoutes_actual).replace('u', "")
+            main.step("Check routes installed")
+            main.log.info("Routes expected:")
+            main.log.info(allRoutes_str_expected)
+            main.log.info("Routes get from ONOS CLI:")
+            main.log.info(allRoutes_str_actual)
+            utilities.assert_equals(expect=allRoutes_str_expected, actual=allRoutes_str_actual,
+                                    onpass="***Routes in SDN-IP are correct!***",
+                                    onfail="***Routes in SDN-IP are wrong!***")
+            if(eq(allRoutes_str_expected, allRoutes_str_actual)):
+                main.log.report("***Routes in SDN-IP after adding correct!***")
+            else:
+                main.log.report("***Routes in SDN-IP after adding wrong!***")
+
+            time.sleep(20)
+            get_intents_result = main.ONOScli.intents(json_format=True)
+
+
+            main.step("Check MultiPointToSinglePointIntent intents installed")
+            # route_intents_expected are generated when generating routes
+            # get route intents from ONOS CLI
+            routeIntents_actual = main.QuaggaCliHost3.extract_actual_routeIntents(get_intents_result)
+            # routeIntents_str_expected = str(sorted(routeIntents_expected))
+            routeIntents_str_actual = str(routeIntents_actual).replace('u', "")
+            main.log.info("MultiPointToSinglePoint intents expected:")
+            main.log.info(routeIntents_str_expected)
+            main.log.info("MultiPointToSinglePoint intents get from ONOS CLI:")
+            main.log.info(routeIntents_str_actual)
+            utilities.assert_equals(expect=True, actual=eq(routeIntents_str_expected, routeIntents_str_actual),
+                                    onpass="***MultiPointToSinglePoint Intents in SDN-IP are correct!***",
+                                    onfail="***MultiPointToSinglePoint Intents in SDN-IP are wrong!***")
+
+            if(eq(routeIntents_str_expected, routeIntents_str_actual)):
+                main.log.report("***MultiPointToSinglePoint Intents after adding routes correct!***")
+            else:
+                main.log.report("***MultiPointToSinglePoint Intents after adding routes wrong!***")
+
+            #============================= Ping Test ========================
+            # wait until all MultiPointToSinglePoint
+            time.sleep(20)
+            # ping_test_script = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
+            ping_test_results_file = "~/SDNIP/SdnIpIntentDemo/log/CASE2-Round" + str(round_num) + "-ping-results-before-delete-routes-" + strftime("%Y-%m-%d_%H:%M:%S", localtime()) + ".txt"
+            ping_test_results = main.QuaggaCliHost.ping_test("1.168.30.100", ping_test_script, ping_test_results_file)
+            main.log.info(ping_test_results)
+            # ping test
+
+            #============================= Deleting Routes ==================
+            main.step("Check deleting routes installed")
+            main.log.info("Delete routes to Quagga on host3")
+            main.QuaggaCliHost3.delete_routes(prefixes_host3, 1)
+            main.log.info("Delete routes to Quagga on host4")
+            main.QuaggaCliHost4.delete_routes(prefixes_host4, 1)
+
+            get_routes_result = main.ONOScli.routes(json_format=True)
+            allRoutes_actual = main.QuaggaCliHost3.extract_actual_routes(get_routes_result)
+            main.log.info("allRoutes_actual = ")
+            main.log.info(allRoutes_actual)
+
+            utilities.assert_equals(expect="[]", actual=str(allRoutes_actual),
+                                    onpass="***Route number in SDN-IP is 0, correct!***",
+                                    onfail="***Routes number in SDN-IP is not 0, wrong!***")
+
+            if(eq(allRoutes_str_expected, allRoutes_str_actual)):
+                main.log.report("***Routes in SDN-IP after deleting correct!***")
+            else:
+                main.log.report("***Routes in SDN-IP after deleting wrong!***")
+
+            main.step("Check intents after deleting routes")
+            get_intents_result = main.ONOScli.intents(json_format=True)
+            routeIntents_actual = main.QuaggaCliHost3.extract_actual_routeIntents(get_intents_result)
+            main.log.info("main.ONOScli.intents()= ")
+            main.log.info(routeIntents_actual)
+            utilities.assert_equals(expect="[]", actual=str(routeIntents_actual),
+                                    onpass="***MultiPointToSinglePoint Intents number in SDN-IP is 0, correct!***",
+                                    onfail="***MultiPointToSinglePoint Intents number in SDN-IP is 0, wrong!***")
+
+            if(eq(routeIntents_str_expected, routeIntents_str_actual)):
+                main.log.report("***MultiPointToSinglePoint Intents after deleting routes correct!***")
+            else:
+                main.log.report("***MultiPointToSinglePoint Intents after deleting routes wrong!***")
+
+            time.sleep(20)
+            # ping_test_script = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
+            ping_test_results_file = "~/SDNIP/SdnIpIntentDemo/log/CASE2-Round" + str(round_num) + "-ping-results-after-delete-routes-" + strftime("%Y-%m-%d_%H:%M:%S", localtime()) + ".txt"
+            ping_test_results = main.QuaggaCliHost.ping_test("1.168.30.100", ping_test_script, ping_test_results_file)
+            main.log.info(ping_test_results)
+            time.sleep(30)
+
+
+